@mitre/hdf-converters 3.3.2 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["CWE_PATTERN","DEFAULT_REMEDIATION_NIST_TAGS","buildAffectedPackage","normalizeStatus","IMPACT_MAPPING","extractSourceLocation","buildDescriptions","buildTags","buildAffectedPackage","CONVERTER_VERSION","ARRAY_TAGS","buildCodeDesc","CONVERTER_VERSION","ARRAY_TAGS","xccdfParsed","extractVersion","BUILD_OPTIONS","buildRequirement","buildAffectedPackage","IMPACT_MAPPING","getImpact","buildCodeDesc","CvssVersion","buildCvssEntries","buildEpss","IMPACT_MAPPING","buildTags","buildResult","CvssVersion","getStatus","buildNistTags","buildCodeDesc","buildRequirement","mapStatus","getImpact","buildRequirement","IMPACT_MAPPING","buildRequirement","DEFAULT_REMEDIATION_NIST_TAGS","buildNistTags","buildCodeDesc","buildNistTags","buildCodeDesc","formatCodeDesc","mapStatus","wrap","buildCodeDesc","buildCodeDesc","buildRequirement","IMPACT_MAPPING","getImpact","formatCodeDesc","buildRequirement","IMPACT_MAPPING","getStatus","getImpact","formatDesc","buildRequirement","buildTitle","CvssVersion","formatCodeDesc","buildRequirement","getImpact","getTitle","buildRequirement","buildAffectedPackage","extractCWEs","formatCodeDesc","buildRequirement","buildAffectedPackage","getImpact","buildRequirement","buildAffectedPackage","buildCodeDesc","buildRequirement","DEFAULT_STATIC_ANALYSIS_NIST_TAGS","getImpact","DEFAULT_REMEDIATION_NIST_TAGS","buildRequirement","buildAffectedPackage","IMPACT_MAPPING","getImpact","formatMessage","buildRequirement","getImpact","getStatus","buildRequirement","buildCodeDesc","IMPACT_MAPPING","DEFAULT_REMEDIATION_NIST_TAGS","buildRequirement","IMPACT_MAPPING","severityToImpact","buildTags","impactToSeverity","impactToSeverity","impactToSeverity","DEFAULT_EXPIRY_HORIZON_MS","identityFor","buildReason","DEFAULT_EXPIRY_HORIZON_MS","buildProductLookup","buildReason","CVE_ID_PATTERN","PRODUCTS_LINE","DEFAULT_PRODUCT_ID","productIDsFor","stripProductsLine","allMilestonesCompleted","CVE_ID_PATTERN","PRODUCTS_LINE","DEFAULT_PRODUCT_ID","allMilestonesCompleted","buildRiskMap"],"sources":["../shared/typescript/converterutil.ts","../converters/legacyhdf-to-hdf/typescript/converter.ts","../converters/sarif-to-hdf/typescript/converter.ts","../converters/junit-to-hdf/typescript/converter.ts","../converters/xccdf-results-to-hdf/typescript/converter.ts","../shared/typescript/checklist/status.ts","../shared/typescript/checklist/ckl.ts","../shared/typescript/checklist/cklb.ts","../shared/typescript/checklist/to-hdf.ts","../shared/typescript/checklist/from-hdf.ts","../converters/ckl-to-hdf/typescript/converter.ts","../converters/cklb-to-hdf/typescript/converter.ts","../converters/hdf-to-ckl/typescript/converter.ts","../converters/hdf-to-cklb/typescript/converter.ts","../converters/snyk-to-hdf/typescript/converter.ts","../converters/grype-to-hdf/typescript/converter.ts","../converters/nessus-to-hdf/typescript/converter.ts","../converters/sonarqube-to-hdf/typescript/converter.ts","../converters/aws-config-to-hdf/typescript/converter.ts","../converters/checkov-to-hdf/typescript/converter.ts","../converters/gosec-to-hdf/typescript/converter.ts","../converters/nikto-to-hdf/typescript/converter.ts","../converters/zap-to-hdf/typescript/converter.ts","../converters/cyclonedx-to-hdf/typescript/converter.ts","../converters/hdf-to-csv/typescript/converter.ts","../converters/splunk-to-hdf/typescript/converter.ts","../converters/hdf-to-xml/typescript/converter.ts","../converters/gitlab-to-hdf/typescript/converter.ts","../converters/trufflehog-to-hdf/typescript/converter.ts","../converters/burpsuite-to-hdf/typescript/converter.ts","../converters/dbprotect-to-hdf/typescript/converter.ts","../converters/twistlock-to-hdf/typescript/converter.ts","../converters/deptrack-to-hdf/typescript/converter.ts","../converters/jfrog-xray-to-hdf/typescript/converter.ts","../converters/neuvector-to-hdf/typescript/converter.ts","../converters/fortify-to-hdf/typescript/converter.ts","../converters/prisma-to-hdf/typescript/converter.ts","../converters/netsparker-to-hdf/typescript/converter.ts","../converters/scoutsuite-to-hdf/typescript/converter.ts","../converters/conveyor-to-hdf/typescript/converter.ts","../converters/veracode-to-hdf/typescript/converter.ts","../converters/msft-secure-score-to-hdf/typescript/converter.ts","../converters/msft-defender-devops-to-hdf/typescript/converter.ts","../converters/msft-defender-cloud-to-hdf/typescript/converter.ts","../converters/msft-defender-endpoint-to-hdf/typescript/converter.ts","../converters/hdf-to-xccdf/typescript/converter.ts","../converters/oscal-to-hdf/typescript/shared.ts","../converters/hdf-to-oscal-sar/typescript/converter.ts","../converters/hdf-to-oscal-poam/typescript/converter.ts","../converters/ionchannel-to-hdf/typescript/converter.ts","../shared/typescript/vex/mapping.ts","../converters/openvex-to-hdf/typescript/converter.ts","../converters/csaf-vex-to-hdf/typescript/converter.ts","../converters/cyclonedx-vex-to-hdf/typescript/converter.ts","../converters/hdf-to-csaf-vex/typescript/converter.ts","../converters/hdf-to-openvex/typescript/converter.ts","../converters/hdf-to-cyclonedx-vex/typescript/converter.ts","../converters/oscal-to-hdf/typescript/detect.ts","../converters/oscal-to-hdf/typescript/converter-catalog.ts","../converters/oscal-to-hdf/typescript/converter-profile.ts","../converters/oscal-to-hdf/typescript/converter-component.ts","../converters/oscal-to-hdf/typescript/converter-ssp.ts","../converters/oscal-to-hdf/typescript/converter-sap.ts","../converters/oscal-to-hdf/typescript/converter-poam.ts","../converters/oscal-to-hdf/typescript/converter-sar.ts"],"sourcesContent":["/**\n * Shared utilities for TypeScript HDF converters.\n *\n * Provides common patterns used across all converter implementations:\n * - Input checksum computation\n * - Re-exports of shared constants and utilities\n */\n\nimport { sha256, trimUtcFraction } from '@mitre/hdf-utilities';\nimport type { AffectedPackage, Checksum, Component, EvaluatedBaseline, EvaluatedRequirement, HDFResults, Integrity, Statistics } from '@mitre/hdf-schema';\nimport { ControlType, Ecosystem, HashAlgorithm, ResultStatus, VerificationMethodEnum } from '@mitre/hdf-schema';\nimport { getCweNistControl, DEFAULT_STATIC_ANALYSIS_NIST_TAGS } from '@mitre/hdf-mappings';\n\nexport { DEFAULT_STATIC_ANALYSIS_NIST_TAGS };\n\n/**\n * Compute a SHA-256 checksum of raw converter input.\n *\n * Wraps the common 3-line pattern used in every converter into a single call.\n * The returned Checksum is suitable for the EvaluatedBaseline.resultsChecksum field.\n *\n * @param input - Raw input string (JSON, XML, etc.)\n * @returns Checksum with algorithm set to SHA-256\n */\nexport async function inputChecksum(input: string): Promise<Checksum> {\n return {\n algorithm: HashAlgorithm.Sha256,\n value: await sha256(input),\n };\n}\n\n/**\n * Compute an Integrity object (for root-level document integrity) from raw input.\n *\n * Returns an Integrity with algorithm and checksum fields, suitable for\n * HDFBaseline.integrity, HDFSystem.integrity, HDFPlan.integrity, etc.\n *\n * @param input - Raw input string (JSON, XML, etc.)\n * @returns Integrity object with SHA-256 algorithm and checksum\n */\nexport async function inputIntegrity(input: string): Promise<Integrity> {\n const checksum = await inputChecksum(input);\n return { algorithm: checksum.algorithm, checksum: checksum.value };\n}\n\n/**\n * Build a tags object with NIST controls and optional CCI mappings.\n *\n * If cci is empty, the \"cci\" key is omitted from the result.\n * Additional key-value pairs can be passed via extras.\n *\n * @param nist - NIST 800-53 control identifiers\n * @param cci - CCI identifiers (omitted if empty)\n * @param extras - Additional tag key-value pairs\n * @returns Tags object for HDF requirement\n */\nexport function buildNistCciTags(\n nist: string[],\n cci: string[],\n extras?: Record<string, unknown>,\n): Record<string, unknown> {\n const tags: Record<string, unknown> = { nist };\n if (cci.length > 0) {\n tags.cci = cci;\n }\n if (extras) {\n Object.assign(tags, extras);\n }\n return tags;\n}\n\n/** Maximum number of items processed from any single input array. */\nconst DEFAULT_MAX_ITEMS = 100_000;\n\n/**\n * Limit an array to at most maxItems elements.\n *\n * Returns the (possibly truncated) array and a flag indicating whether\n * truncation occurred. When truncated, callers should log a warning.\n *\n * @param items - Array to limit\n * @param maxItems - Maximum items (defaults to DEFAULT_MAX_ITEMS)\n * @returns Object with limited items array and truncated flag\n */\nexport function limitArray<T>(\n items: T[],\n maxItems = DEFAULT_MAX_ITEMS,\n): { items: T[]; truncated: boolean } {\n if (items.length <= maxItems) {\n return { items, truncated: false };\n }\n return { items: items.slice(0, maxItems), truncated: true };\n}\n\n// Re-export stripHTML from @mitre/hdf-utilities (canonical location).\n// Named stripHTML (uppercase H) for backwards compatibility with existing\n// converter imports; hdf-utilities exports stripHtml (lowercase h).\nexport { stripHtml as stripHTML } from '@mitre/hdf-utilities';\n\n/**\n * Limit an array and log a warning if truncated.\n *\n * Wraps {@link limitArray} with a console.warn call when items are truncated.\n *\n * @param items - Array to limit\n * @param label - Item type label for warning message (e.g., \"vulnerability\")\n * @param maxItems - Maximum items (defaults to DEFAULT_MAX_ITEMS)\n * @returns Limited array (original if within limit)\n */\nexport function limitArrayWithWarning<T>(\n items: T[],\n label: string,\n maxItems = DEFAULT_MAX_ITEMS,\n): T[] {\n const { items: limited, truncated } = limitArray(items, maxItems);\n if (truncated) {\n // eslint-disable-next-line no-console -- Intentional warning for truncated input\n console.warn(`WARNING: Input truncated at ${limited.length} ${label} items (original: ${items.length})`);\n }\n return limited;\n}\n\n/**\n * Map CWE identifiers to NIST 800-53 controls.\n *\n * Looks up each CWE ID, deduplicates, sorts, and falls back to the provided\n * default when no CWE has a mapping. CWE IDs may optionally have a \"CWE-\"\n * prefix (e.g., \"CWE-79\" or \"79\").\n *\n * @param cweIDs - CWE identifiers (e.g., [\"CWE-79\", \"89\"])\n * @param fallback - Default NIST controls when no mapping is found\n * @returns Sorted, deduplicated NIST control identifiers\n */\nexport function mapCWEToNIST(\n cweIDs: string[],\n fallback: string[],\n): string[] {\n const controls = new Set<string>();\n for (const id of cweIDs) {\n const numericStr = id.replace(/^CWE-/i, '');\n const numericId = parseInt(numericStr, 10);\n if (!isNaN(numericId)) {\n const nistControl = getCweNistControl(numericId);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n }\n return controls.size > 0 ? [...controls].sort() : fallback;\n}\n\n/** Matches CWE identifiers like \"CWE-79\", \"CWE 89\", \"cwe22\". */\nconst CWE_PATTERN = /CWE[- ]?(\\d+)/gi;\n\n/**\n * Extract all numeric CWE IDs from text.\n * Returns deduplicated sorted array of numeric ID strings (e.g., [\"79\", \"89\"]).\n *\n * @param text - Text potentially containing CWE identifiers\n * @returns Sorted, deduplicated numeric CWE ID strings\n */\nexport function extractCWEIDs(text: string): string[] {\n const matches = [...text.matchAll(CWE_PATTERN)];\n if (matches.length === 0) return [];\n const ids = [...new Set(matches.map(m => m[1]!))];\n ids.sort();\n return ids;\n}\n\n/** Default maximum input size for converters (50MB) */\nexport const DEFAULT_MAX_INPUT_SIZE = 50 * 1024 * 1024;\n\n/**\n * Validates that input string doesn't exceed maximum allowed size.\n *\n * Note: string.length gives char count, not bytes. For multi-byte chars this\n * underestimates. This is acceptable as a coarse safety check — exact byte\n * counting would require TextEncoder.\n *\n * @param input - Raw input string to validate\n * @param converterName - Name of the converter (used in error message)\n * @param maxSize - Maximum allowed character count (defaults to DEFAULT_MAX_INPUT_SIZE)\n * @throws Error if input exceeds maxSize\n */\nexport function validateInputSize(\n input: string,\n converterName: string,\n maxSize = DEFAULT_MAX_INPUT_SIZE,\n): void {\n if (input.length > maxSize) {\n throw new Error(\n `${converterName}: input exceeds maximum allowed size of ${maxSize} characters`,\n );\n }\n}\n\n/**\n * Normalise a value that may be a single item, an array, undefined, or null\n * into a guaranteed array.\n *\n * XML-to-JSON parsers often produce a single object when there is one child\n * element and an array when there are multiple. This helper smooths that out.\n *\n * @param value - A single item, an array of items, undefined, or null\n * @returns An array (empty if the input was nullish)\n */\nexport function ensureArray<T>(value: T | T[] | undefined | null): T[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n\n/**\n * Default NIST 800-53 fallback for tools that identify outdated packages or\n * flaws requiring patching (SI-2: Flaw Remediation, RA-5: Vulnerability\n * Monitoring and Scanning).\n *\n * Mirrors Go shared.DefaultRemediationNIST.\n */\nexport const DEFAULT_REMEDIATION_NIST_TAGS = ['SI-2', 'RA-5'];\n\n/**\n * Map a PURL `type` segment to the AffectedPackage `ecosystem` enum.\n * Unknown types fall back to `generic`, which the schema enum permits\n * as a catch-all.\n */\nconst PURL_TYPE_TO_ECOSYSTEM: Record<string, Ecosystem> = {\n npm: Ecosystem.Npm,\n pypi: Ecosystem.Pypi,\n rpm: Ecosystem.RPM,\n deb: Ecosystem.Deb,\n maven: Ecosystem.Maven,\n gem: Ecosystem.Gem,\n nuget: Ecosystem.Nuget,\n golang: Ecosystem.Go,\n go: Ecosystem.Go,\n cargo: Ecosystem.Cargo,\n};\n\n/**\n * Resolve an Ecosystem from a PURL type string. Returns `generic` for\n * unknown types so callers can keep the schema's name+version+ecosystem\n * triple valid without inventing a synthetic ecosystem.\n */\nexport function ecosystemFromPurlType(type: string | undefined): Ecosystem {\n if (!type) return Ecosystem.Generic;\n return PURL_TYPE_TO_ECOSYSTEM[type.toLowerCase()] ?? Ecosystem.Generic;\n}\n\n/**\n * Build an Affected_Package primitive from any combination of the\n * vocabulary the schema accepts (purl / cpe / name+version+ecosystem).\n * Returns undefined when no identifier or full triple is present —\n * callers should skip the entry rather than emit a schema-invalid\n * AffectedPackage. Empty strings are treated as missing.\n *\n * The schema's anyOf requires at least one of:\n * - name + version + ecosystem\n * - purl alone\n * - cpe alone\n */\nexport function buildAffectedPackage(opts: {\n name?: string;\n version?: string;\n ecosystem?: Ecosystem;\n purl?: string;\n cpe?: string;\n fixedInVersion?: string;\n}): AffectedPackage | undefined {\n const pkg: AffectedPackage = {};\n if (opts.purl) pkg.purl = opts.purl;\n if (opts.cpe) pkg.cpe = opts.cpe;\n if (opts.name) pkg.name = opts.name;\n if (opts.version) pkg.version = opts.version;\n if (opts.ecosystem) pkg.ecosystem = opts.ecosystem;\n if (opts.fixedInVersion) pkg.fixedInVersion = opts.fixedInVersion;\n\n const hasTriple = Boolean(pkg.name && pkg.version && pkg.ecosystem);\n if (!hasTriple && !pkg.purl && !pkg.cpe) return undefined;\n return pkg;\n}\n\n/**\n * Options for building an HDF Results document.\n * Mirrors the Go shared.HDFResultsOptions struct.\n */\nexport interface HdfResultsOptions {\n /** Name of the converter that produced this HDF file (e.g., 'grype-to-hdf') */\n generatorName: string;\n /** Version of the converter */\n converterVersion: string;\n /** Name of the source security tool (e.g., 'Grype', 'Nessus') */\n toolName?: string;\n /** Version of the source tool */\n toolVersion?: string;\n /** Output format of the source tool (e.g., 'SARIF', 'XCCDF') */\n toolFormat?: string;\n /** Evaluated baselines with findings */\n baselines: EvaluatedBaseline[];\n /** Components that were assessed */\n components?: Component[];\n /** When the assessment was executed */\n timestamp?: Date;\n /** Assessment statistics */\n statistics?: Statistics;\n}\n\n/**\n * Build an HDF Results document from options.\n *\n * Eliminates the repeated boilerplate of constructing generator, tool,\n * and assembling the top-level HDFResults in every converter. Mirrors\n * the Go shared.BuildHDFResults() function.\n *\n * @returns JSON string of the HDF Results document (pretty-printed)\n */\nexport function buildHdfResults(opts: HdfResultsOptions): string {\n const hdf: HDFResults = {\n baselines: opts.baselines,\n generator: {\n name: opts.generatorName,\n version: opts.converterVersion,\n },\n };\n\n if (opts.toolName || opts.toolVersion || opts.toolFormat) {\n hdf.tool = {};\n if (opts.toolName) hdf.tool.name = opts.toolName;\n if (opts.toolVersion) hdf.tool.version = opts.toolVersion;\n if (opts.toolFormat) hdf.tool.format = opts.toolFormat;\n }\n\n if (opts.components) hdf.components = opts.components;\n if (opts.timestamp) hdf.timestamp = opts.timestamp;\n if (opts.statistics) hdf.statistics = opts.statistics;\n\n return serializeHdf(hdf);\n}\n\n// Full-match ISO-8601 UTC datetime carrying a fractional-second part. Date\n// values serialize via toISOString() as `...sssZ` (fixed 3-digit ms); Go emits\n// RFC3339Nano (trailing zeros trimmed). The replacer rewrites the former into\n// the latter so the two languages produce byte-identical output.\nconst ISO_UTC_WITH_FRACTION = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+Z$/;\n\nfunction hdfTimestampReplacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && ISO_UTC_WITH_FRACTION.test(value)) {\n return trimUtcFraction(value);\n }\n return value;\n}\n\n/**\n * Serialize an HDF document to pretty-printed JSON, normalizing Date-derived\n * timestamps to canonical trimmed-UTC RFC3339 (byte-identical to the Go\n * converters). Use this instead of a bare `JSON.stringify` for any HDF output\n * so the fractional-second trim is applied consistently.\n */\nexport function serializeHdf(doc: unknown, space = 2): string {\n return JSON.stringify(doc, hdfTimestampReplacer, space);\n}\n\n/**\n * Captures a NIST 800-53 control identifier and its base sub-control number,\n * ignoring enhancement suffixes like \"(1)\" or \".1\". Mirrors the Go pattern\n * in shared/go/converterutil.go.\n */\nconst NIST_TAG_PATTERN = /^([A-Z]{2})-(\\d+)/;\n\n/**\n * Maps each recognized NIST 800-53 Rev 5 family to its HDF controlType per\n * SP 800-53 Appendix C / SP 800-53A classification. Unknown families resolve\n * to undefined.\n */\nconst NIST_FAMILY_CONTROL_TYPE: Record<string, ControlType> = {\n AC: ControlType.Technical,\n AT: ControlType.Operational,\n AU: ControlType.Operational,\n CA: ControlType.Management,\n CM: ControlType.Operational,\n CP: ControlType.Operational,\n IA: ControlType.Technical,\n IR: ControlType.Operational,\n MA: ControlType.Operational,\n MP: ControlType.Operational,\n PE: ControlType.Operational,\n PL: ControlType.Management,\n PM: ControlType.Management,\n PS: ControlType.Operational,\n PT: ControlType.Operational,\n RA: ControlType.Management,\n SA: ControlType.Management,\n SC: ControlType.Technical,\n SI: ControlType.Technical,\n SR: ControlType.Management,\n};\n\n/**\n * Derive the HDF `controlType` for a single NIST 800-53 control identifier\n * using a family-prefix heuristic. Returns undefined when the family is\n * unrecognized or the tag is not a NIST control identifier.\n *\n * Heuristic, per NIST SP 800-53 Rev 5 Appendix C and SP 800-53A:\n * - Management: PM, RA, CA, PL, SA, SR families\n * - Operational: AT, AU, CM, CP, IR, MA, MP, PE, PS, PT families\n * - Technical: AC, IA, SC, SI families\n * - Policy: any \"-1\" sub-control (the per-family policy/procedure\n * document, regardless of which family it belongs to). Enhancements of\n * -1 controls (e.g., AC-1(1)) also resolve to policy.\n *\n * The \"-1\" rule takes precedence over the family rule because the per-family\n * policy/procedure document is more usefully classified by its document\n * nature than by the family it documents.\n *\n * @example\n * deriveControlType(\"AC-3\") // ControlType.Technical\n * deriveControlType(\"AC-1\") // ControlType.Policy (any *-1 is policy)\n * deriveControlType(\"AC-3(1)\") // ControlType.Technical (enhancement of AC-3)\n * deriveControlType(\"PM-2\") // ControlType.Management\n * deriveControlType(\"SV-238196\") // undefined (not a NIST tag)\n */\nfunction deriveControlType(nistTag: string): ControlType | undefined {\n const match = NIST_TAG_PATTERN.exec(nistTag.trim().toUpperCase());\n if (!match || match[1] === undefined || match[2] === undefined) return undefined;\n const family = match[1];\n const subControl = match[2];\n const familyClass = NIST_FAMILY_CONTROL_TYPE[family];\n if (familyClass === undefined) return undefined;\n if (subControl === '1') return ControlType.Policy;\n return familyClass;\n}\n\n/**\n * NIST tag sets this package uses as per-converter static fallbacks when no\n * real per-finding mapping is available. When deriveControlTypeFromTags sees\n * an input that exactly matches one of these bundles, it returns undefined —\n * the input carries no real per-finding signal, and stamping every\n * requirement with the same derived controlType is misleading.\n *\n * Keep in sync with DEFAULT_STATIC_ANALYSIS_NIST_TAGS, DEFAULT_REMEDIATION_NIST_TAGS.\n */\nconst NIST_FALLBACK_BUNDLES: string[][] = [\n ['RA-5', 'SA-11'], // DEFAULT_STATIC_ANALYSIS_NIST_TAGS (sorted)\n ['RA-5', 'SI-2'], // DEFAULT_REMEDIATION_NIST_TAGS (sorted)\n ['CM-8'], // DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS\n];\n\nfunction tagsMatchFallback(tags: string[]): boolean {\n if (tags.length === 0) return false;\n const sorted = [...new Set(tags)].sort();\n return NIST_FALLBACK_BUNDLES.some(\n (bundle) =>\n bundle.length === sorted.length &&\n bundle.every((b, i) => b === sorted[i]),\n );\n}\n\n/**\n * Derive the HDF `controlType` for a slice of NIST tags. Resolves each tag\n * via {@link deriveControlType}, then picks the most-specific class by\n * precedence: technical > operational > management > policy > procedure.\n * The rationale is that a control enforced via configuration (technical)\n * is more actionable than the same control's management/policy framing.\n *\n * Returns undefined when no tag resolves to a known classification, OR when\n * the input exactly matches a converter-level static-fallback bundle (e.g.\n * the DEFAULT_STATIC_ANALYSIS_NIST_TAGS set). The fallback gate prevents\n * converters that have no per-finding NIST signal from stamping every\n * requirement with the same misleading controlType.\n */\nexport function deriveControlTypeFromTags(tags: string[]): ControlType | undefined {\n if (tagsMatchFallback(tags)) return undefined;\n const rank: Record<ControlType, number> = {\n [ControlType.Technical]: 0,\n [ControlType.Operational]: 1,\n [ControlType.Management]: 2,\n [ControlType.Policy]: 3,\n [ControlType.Procedure]: 4,\n };\n let best: ControlType | undefined;\n let bestRank = Number.POSITIVE_INFINITY;\n for (const tag of tags) {\n const ct = deriveControlType(tag);\n if (ct === undefined) continue;\n const r = rank[ct];\n if (r < bestRank) {\n bestRank = r;\n best = ct;\n }\n }\n return best;\n}\n\n/**\n * Derive the HDF `verificationMethod` for a requirement based on whether\n * check code is present. Returns `automated` when code is non-empty (a check\n * exists and runs without operator action), and undefined otherwise — the\n * converter is responsible for distinguishing manual-by-design (statement-form,\n * e.g. FedRAMP 20x KSI) from manual-pending-automation (a check that could\n * be automated but isn't yet) when it has the source-format context to do so.\n */\nexport function deriveVerificationMethod(code: string | undefined | null): VerificationMethodEnum | undefined {\n if (code === undefined || code === null || code === '') return undefined;\n return VerificationMethodEnum.Automated;\n}\n\n// Synthesized passed placeholder for tools that ran clean. Required because\n// the HDF schema enforces requirements.minItems=1.\nexport function buildNoFindingsRequirement(\n id: string,\n codeDesc: string,\n startTime: Date,\n): EvaluatedRequirement {\n return {\n id,\n title: 'No findings reported',\n impact: 0,\n descriptions: [{ label: 'default', data: codeDesc }],\n results: [\n {\n status: ResultStatus.Passed,\n codeDesc,\n startTime,\n },\n ],\n tags: {},\n };\n}\n","/**\n * HDF v1.0 to v2.0 converter.\n *\n * Comprehensive transformations:\n * - Top-level: version removed, profiles → baselines, platform → components\n * - Baseline: sha256 → checksum, controls → requirements\n * - Control: source_location → sourceLocation, waiver_data → waiverData, status → effectiveStatus\n * - Results: snake_case → camelCase for all fields\n * - Overlay flattening: merge overlay/wrapper baselines so every requirement has results\n */\n\nimport { flattenOverlays } from '@mitre/hdf-parsers';\nimport type { HDFResults } from '@mitre/hdf-schema';\nimport { impactToSeverity, parseTimestamp, formatTimestamp } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, validateInputSize } from '../../../shared/typescript/converterutil.js';\n\n// ===== V1.0 Type Definitions =====\n\nexport interface V1Result {\n status: string;\n code_desc?: string;\n run_time?: number;\n start_time?: string;\n message?: string;\n exception?: string;\n backtrace?: unknown;\n resource_class?: string;\n resource_params?: string;\n resource_id?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Control {\n id: string;\n title?: string;\n desc?: string;\n descriptions?: Array<{label: string; data: string}>;\n impact: number;\n refs?: unknown[];\n tags?: Record<string, unknown>;\n code?: string;\n source_location?: {\n ref?: string;\n line?: number;\n };\n waiver_data?: Record<string, unknown>;\n results?: V1Result[];\n status?: string; // overall_status in some v1.0 variants\n [key: string]: unknown;\n}\n\nexport interface V1Group {\n id: string;\n title?: string;\n controls: string[]; // Array of control IDs\n [key: string]: unknown;\n}\n\nexport interface V1Dependency {\n name?: string;\n url?: string;\n path?: string;\n git?: string;\n branch?: string;\n tag?: string;\n commit?: string;\n version?: string;\n supermarket?: string;\n compliance?: string;\n status?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Profile {\n name: string;\n version?: string;\n title?: string;\n maintainer?: string;\n summary?: string;\n license?: string;\n copyright?: string;\n copyright_email?: string;\n supports?: unknown[];\n attributes?: unknown[];\n groups?: V1Group[];\n controls?: V1Control[];\n sha256?: string;\n depends?: V1Dependency[];\n parent_profile?: string;\n status?: string;\n status_message?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Platform {\n name: string;\n release?: string;\n target_id?: string;\n [key: string]: unknown;\n}\n\nexport interface HDFV1Results {\n version: string;\n platform: V1Platform;\n profiles: V1Profile[];\n statistics: unknown;\n generator?: unknown;\n timestamp?: string;\n [key: string]: unknown;\n}\n\n// ===== V2.0 Type Definitions =====\n\nexport interface V2Result {\n status: string;\n codeDesc?: string;\n runTime?: number;\n startTime?: string;\n message?: string;\n exception?: string;\n backtrace?: unknown;\n resource?: string;\n resourceId?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Requirement {\n id: string;\n title?: string;\n desc?: string;\n descriptions?: Array<{label: string; data: string}>;\n impact: number;\n refs?: unknown[];\n tags?: Record<string, unknown>;\n code?: string;\n sourceLocation?: {\n ref?: string;\n line?: number;\n };\n waiverData?: Record<string, unknown>;\n results?: V2Result[];\n effectiveStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Group {\n id: string;\n title?: string;\n requirements: string[]; // Array of requirement IDs\n [key: string]: unknown;\n}\n\nexport interface V2Dependency {\n name?: string;\n url?: string;\n path?: string;\n git?: string;\n branch?: string;\n tag?: string;\n commit?: string;\n version?: string;\n supermarket?: string;\n compliance?: string;\n status?: string;\n skipMessage?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Baseline {\n name: string;\n version?: string;\n title?: string;\n maintainer?: string;\n summary?: string;\n license?: string;\n copyright?: string;\n copyrightEmail?: string;\n supports?: unknown[];\n inputs?: unknown[];\n groups?: V2Group[];\n requirements?: V2Requirement[];\n checksum?: {\n algorithm: string;\n value: string;\n };\n depends?: V2Dependency[];\n parentBaseline?: string;\n status?: string;\n statusMessage?: string;\n skipMessage?: string;\n [key: string]: unknown;\n}\n\nexport interface HDFV2Results {\n baselines: V2Baseline[];\n statistics: unknown;\n components?: unknown[];\n generator?: unknown;\n tool?: { name?: string; version?: string; format?: string };\n timestamp?: string;\n id?: string;\n integrity?: unknown;\n runner?: unknown;\n remediation?: unknown;\n extensions?: Record<string, unknown>;\n}\n\n// ===== Severity Helpers =====\n\n/** Valid severity values per HDF v2.0 schema (matches the Go converter). */\nconst VALID_SEVERITIES = new Set(['critical', 'high', 'medium', 'low', 'informational']);\n\n/**\n * Convert tags.severity string to a valid severity value.\n * Returns null if the value is not a recognized severity.\n */\nfunction tagSeverityToSeverity(tagSeverity: unknown): string | null {\n if (typeof tagSeverity !== 'string') return null;\n const normalized = tagSeverity.toLowerCase().trim();\n return VALID_SEVERITIES.has(normalized) ? normalized : null;\n}\n\n// Severity is derived from numeric impact via the canonical\n// @mitre/hdf-utilities impactToSeverity (CVSS-aligned bands: >=0.9 critical,\n// >=0.7 high, >=0.4 medium, >0 low, else informational) — the same helper the\n// Go converter uses (hdfutil.ImpactToSeverity), so both languages agree.\n\n// ===== Conversion Functions =====\n\n/**\n * Normalize status values from v1.0 to v2.0 format.\n * Converts snake_case to camelCase.\n */\nfunction normalizeStatus(status: string): string {\n const statusMap: Record<string, string> = {\n 'passed': 'passed',\n 'failed': 'failed',\n 'error': 'error',\n 'not_applicable': 'notApplicable',\n 'not_reviewed': 'notReviewed',\n 'skipped': 'notReviewed', // v1.0 skipped → v2.0 notReviewed\n };\n return statusMap[status] || 'notReviewed'; // unknown statuses default to notReviewed (matches Go)\n}\n\n/**\n * Compute effectiveStatus from impact and v2 results.\n * Implements InSpec enhanced outcomes precedence:\n * impact=0 → notApplicable\n * error > failed > passed > notApplicable > notReviewed\n *\n * See docs/design/status-determination.md for full specification.\n */\nfunction computeEffectiveStatus(impact: number, results: V2Result[]): string {\n if (impact === 0) return 'notApplicable';\n if (results.length === 0) return 'notReviewed';\n\n let hasFailed = false;\n let hasPassed = false;\n let hasNotApplicable = false;\n\n for (const r of results) {\n switch (r.status) {\n case 'error': return 'error'; // fail-fast: highest precedence\n case 'failed': hasFailed = true; break;\n case 'passed': hasPassed = true; break;\n case 'notApplicable': hasNotApplicable = true; break;\n }\n }\n\n if (hasFailed) return 'failed';\n if (hasPassed) return 'passed';\n if (hasNotApplicable) return 'notApplicable';\n return 'notReviewed';\n}\n\n/**\n * Convert v1.0 result to v2.0 result.\n * Transforms snake_case field names to camelCase.\n */\n// Go's zero time.Time marshals as this; matched when a v1 result carries no\n// (or an unparseable) start_time so startTime — schema-required — stays present.\nconst LEGACY_ZERO_TIME = '0001-01-01T00:00:00Z';\n\n// Match the Go converter's startTime: canonical trimmed-UTC RFC3339 for a\n// parseable value, else Go's zero-value time. Offset-bearing inputs normalize\n// to UTC (ParseTimestamp().UTC() on the Go side).\nfunction legacyStartTime(s: string | undefined): string {\n if (s === undefined) return LEGACY_ZERO_TIME;\n const d = parseTimestamp(s);\n return d ? formatTimestamp(d) : LEGACY_ZERO_TIME;\n}\n\n// Emits only schema-valid Requirement_Result fields, mirroring the Go converter\n// (converter.go convertResult): v1 resource_class becomes v2 `resource`, and\n// the non-schema legacy fields (resource, resource_params, skip_message) are\n// dropped rather than passed through (Requirement_Result is closed).\nfunction convertResult(v1Result: V1Result): V2Result {\n const v2Result: V2Result = {\n status: normalizeStatus(v1Result.status),\n };\n\n // codeDesc and startTime are schema-required; the Go converter always emits\n // them (zero values when absent), so mirror that rather than omitting.\n v2Result.codeDesc = v1Result.code_desc ?? '';\n if (v1Result.run_time !== undefined) v2Result.runTime = v1Result.run_time;\n v2Result.startTime = legacyStartTime(v1Result.start_time);\n // v1 skipped results carry their reason in skip_message; v2 has no dedicated\n // field, so surface it as the result message (without clobbering an explicit\n // message), mirroring the Go converter.\n if (v1Result.message !== undefined) v2Result.message = v1Result.message;\n else if (v1Result.skip_message !== undefined) v2Result.message = v1Result.skip_message;\n if (v1Result.exception !== undefined) v2Result.exception = v1Result.exception;\n if (v1Result.backtrace !== undefined) v2Result.backtrace = v1Result.backtrace;\n if (v1Result.resource_class !== undefined) v2Result.resource = v1Result.resource_class;\n if (v1Result.resource_id !== undefined) v2Result.resourceId = v1Result.resource_id;\n\n return v2Result;\n}\n\n/**\n * Convert a v1 ref value (a string or an array of objects) to the v2\n * Reference.ref union value. Returns undefined when there is no content (e.g.\n * an empty array), so callers can drop empty references — matching the Go\n * converter's toRef.\n */\nfunction toRefValue(raw: unknown): string | Record<string, unknown>[] | undefined {\n if (typeof raw === 'string') return raw === '' ? undefined : raw;\n if (Array.isArray(raw)) {\n const maps = raw.filter(\n (e): e is Record<string, unknown> => !!e && typeof e === 'object' && !Array.isArray(e),\n );\n return maps.length === 0 ? undefined : maps;\n }\n return undefined;\n}\n\n/**\n * Convert a single v1 refs[] element (a bare string or an object with\n * ref/url/uri) to a v2 Reference object. Returns null when the element carries\n * no usable content. Key order (ref, url, uri) matches the Go Reference struct.\n */\nfunction convertRef(raw: unknown): Record<string, unknown> | null {\n if (typeof raw === 'string') {\n return raw === '' ? null : { ref: raw };\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const m = raw as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let has = false;\n const refVal = toRefValue(m.ref);\n if (refVal !== undefined) {\n out.ref = refVal;\n has = true;\n }\n if (typeof m.url === 'string' && m.url !== '') {\n out.url = m.url;\n has = true;\n }\n if (typeof m.uri === 'string' && m.uri !== '') {\n out.uri = m.uri;\n has = true;\n }\n return has ? out : null;\n }\n return null;\n}\n\n/**\n * Map v1 control-level refs to v2 requirement refs, dropping empty/contentless\n * entries. Returns undefined when nothing maps.\n */\nfunction convertRefs(refs: unknown[]): Record<string, unknown>[] | undefined {\n const out: Record<string, unknown>[] = [];\n for (const raw of refs) {\n const ref = convertRef(raw);\n if (ref) out.push(ref);\n }\n return out.length ? out : undefined;\n}\n\n/**\n * Convert v1.0 control to v2.0 requirement.\n * Transforms field names and structure.\n */\nfunction convertControl(v1Control: V1Control): V2Requirement {\n const v2Req: V2Requirement = {\n id: v1Control.id,\n impact: v1Control.impact,\n };\n\n // Copy simple fields. `desc` and `waiver_data` are intentionally dropped:\n // neither is a valid v2 Requirement field (desc → descriptions; waivers are\n // expressed via amendments/overrides in v2), matching the Go converter.\n if (v1Control.title !== undefined) v2Req.title = v1Control.title;\n if (v1Control.descriptions !== undefined) v2Req.descriptions = v1Control.descriptions;\n if (v1Control.tags !== undefined) v2Req.tags = v1Control.tags;\n if (v1Control.code !== undefined) v2Req.code = v1Control.code;\n if (Array.isArray(v1Control.refs)) {\n const refs = convertRefs(v1Control.refs);\n if (refs) v2Req.refs = refs;\n }\n\n // Transform snake_case to camelCase\n if (v1Control.source_location !== undefined) {\n v2Req.sourceLocation = v1Control.source_location;\n }\n\n // Transform status to effectiveStatus with normalization\n if (v1Control.status !== undefined) {\n v2Req.effectiveStatus = normalizeStatus(v1Control.status);\n }\n\n // Transform results array\n if (v1Control.results && Array.isArray(v1Control.results)) {\n v2Req.results = v1Control.results.map(convertResult);\n }\n\n // Always compute effectiveStatus when not explicitly set.\n // Uses InSpec enhanced outcomes precedence:\n // impact=0 → notApplicable, error > failed > passed > notApplicable > notReviewed\n if (!v2Req.effectiveStatus) {\n v2Req.effectiveStatus = computeEffectiveStatus(v1Control.impact, v2Req.results ?? []);\n }\n\n // Populate severity: prefer tags.severity (preserves original STIG severity),\n // fall back to impact-derived. InSpec sets impact=0 for NA controls, losing\n // the original severity — tags.severity preserves it.\n v2Req.severity = tagSeverityToSeverity(v1Control.tags?.severity) ?? impactToSeverity(v1Control.impact);\n\n // Derive controlType from v1 tags.nist if present.\n const rawNist = v1Control.tags?.nist;\n if (Array.isArray(rawNist)) {\n const nistStrs = rawNist.filter((v): v is string => typeof v === 'string');\n const controlType = deriveControlTypeFromTags(nistStrs);\n if (controlType !== undefined) {\n v2Req.controlType = controlType;\n }\n }\n\n // verificationMethod is intentionally NOT set here. legacyhdf is a v1->v3\n // passthrough/upgrade converter; v1 HDF predates the verificationMethod\n // field, so the source carries no such signal. Stamping a value would\n // fabricate data not present in the input.\n\n // No catch-all passthrough: v2 Requirement is a closed shape, and the Go\n // converter emits only the explicit fields above. Carrying arbitrary leftover\n // v1 keys would produce schema-invalid output and diverge from Go.\n\n return v2Req;\n}\n\n/**\n * Convert v1.0 group to v2.0 group.\n * Renames controls array to requirements.\n */\nfunction convertGroup(v1Group: V1Group): V2Group {\n const v2Group: V2Group = {\n id: v1Group.id,\n requirements: v1Group.controls, // Rename controls to requirements\n };\n\n if (v1Group.title !== undefined) {\n v2Group.title = v1Group.title;\n }\n\n // Preserve any other fields\n const knownFields = new Set(['id', 'title', 'controls']);\n for (const [key, value] of Object.entries(v1Group)) {\n if (!knownFields.has(key) && !(key in v2Group)) {\n v2Group[key] = value;\n }\n }\n\n return v2Group;\n}\n\n/**\n * Convert v1.0 dependency to v2.0 dependency.\n * Transforms snake_case to camelCase for skip_message.\n */\nfunction convertDependency(v1Dep: V1Dependency): V2Dependency {\n const v2Dep: V2Dependency = {};\n\n // Copy most fields as-is\n if (v1Dep.name !== undefined) v2Dep.name = v1Dep.name;\n if (v1Dep.url !== undefined) v2Dep.url = v1Dep.url;\n if (v1Dep.path !== undefined) v2Dep.path = v1Dep.path;\n if (v1Dep.git !== undefined) v2Dep.git = v1Dep.git;\n if (v1Dep.branch !== undefined) v2Dep.branch = v1Dep.branch;\n if (v1Dep.tag !== undefined) v2Dep.tag = v1Dep.tag;\n if (v1Dep.commit !== undefined) v2Dep.commit = v1Dep.commit;\n if (v1Dep.version !== undefined) v2Dep.version = v1Dep.version;\n if (v1Dep.supermarket !== undefined) v2Dep.supermarket = v1Dep.supermarket;\n if (v1Dep.compliance !== undefined) v2Dep.compliance = v1Dep.compliance;\n if (v1Dep.status !== undefined) v2Dep.status = v1Dep.status;\n\n // Transform snake_case to camelCase\n if (v1Dep.skip_message !== undefined) {\n v2Dep.skipMessage = v1Dep.skip_message;\n }\n\n // Preserve any other fields\n const knownFields = new Set([\n 'name', 'url', 'path', 'git', 'branch', 'tag', 'commit', 'version',\n 'supermarket', 'compliance', 'status', 'skip_message'\n ]);\n for (const [key, value] of Object.entries(v1Dep)) {\n if (!knownFields.has(key) && !(key in v2Dep)) {\n v2Dep[key] = value;\n }\n }\n\n return v2Dep;\n}\n\n/**\n * Map v1 profile `supports` entries (InSpec hyphenated keys) to v2\n * SupportedPlatform objects. Entries that map no recognized key are dropped.\n * Key order (platform, platformFamily, platformName, release) matches the Go\n * SupportedPlatform struct. Returns undefined when nothing maps.\n */\nfunction convertSupports(supports: unknown[]): Record<string, string>[] | undefined {\n const out: Record<string, string>[] = [];\n for (const raw of supports) {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const s = raw as Record<string, unknown>;\n const sp: Record<string, string> = {};\n if (typeof s.platform === 'string' && s.platform !== '') sp.platform = s.platform;\n if (typeof s['platform-family'] === 'string' && s['platform-family'] !== '')\n sp.platformFamily = s['platform-family'] as string;\n if (typeof s['platform-name'] === 'string' && s['platform-name'] !== '')\n sp.platformName = s['platform-name'] as string;\n if (typeof s.release === 'string' && s.release !== '') sp.release = s.release;\n if (Object.keys(sp).length > 0) out.push(sp);\n }\n return out.length ? out : undefined;\n}\n\n/**\n * Convert v1.0 profile to v2.0 baseline.\n * Transforms field names and nested structures.\n */\nfunction convertProfile(v1Profile: V1Profile): V2Baseline {\n const v2Baseline: V2Baseline = {\n name: v1Profile.name,\n };\n\n // Copy simple fields\n if (v1Profile.version !== undefined) v2Baseline.version = v1Profile.version;\n if (v1Profile.title !== undefined) v2Baseline.title = v1Profile.title;\n if (v1Profile.maintainer !== undefined) v2Baseline.maintainer = v1Profile.maintainer;\n if (v1Profile.summary !== undefined) v2Baseline.summary = v1Profile.summary;\n if (v1Profile.license !== undefined) v2Baseline.license = v1Profile.license;\n if (v1Profile.copyright !== undefined) v2Baseline.copyright = v1Profile.copyright;\n if (v1Profile.copyright_email !== undefined) v2Baseline.copyrightEmail = v1Profile.copyright_email;\n // Omit empty optional arrays so output matches the Go converter (which uses\n // omitempty); only emit when there is data to carry.\n if (v1Profile.supports?.length) {\n const supports = convertSupports(v1Profile.supports);\n if (supports) v2Baseline.supports = supports;\n }\n if (v1Profile.attributes?.length) v2Baseline.inputs = v1Profile.attributes;\n if (v1Profile.status !== undefined) v2Baseline.status = v1Profile.status;\n\n // Transform sha256 to integrity object\n if (v1Profile.sha256) {\n v2Baseline.integrity = {\n algorithm: 'sha256',\n checksum: v1Profile.sha256,\n };\n }\n\n // Transform snake_case to camelCase\n if (v1Profile.parent_profile !== undefined) {\n v2Baseline.parentBaseline = v1Profile.parent_profile;\n }\n if (v1Profile.status_message !== undefined) {\n v2Baseline.statusMessage = v1Profile.status_message;\n }\n if (v1Profile.skip_message !== undefined) {\n v2Baseline.skipMessage = v1Profile.skip_message;\n }\n\n // Transform groups (controls → requirements). Omit when empty to match the\n // Go converter (omitempty).\n if (v1Profile.groups?.length) {\n v2Baseline.groups = v1Profile.groups.map(convertGroup);\n }\n\n // Transform controls to requirements\n if (v1Profile.controls && Array.isArray(v1Profile.controls)) {\n v2Baseline.requirements = v1Profile.controls.map(convertControl);\n }\n\n // Transform depends. Omit when empty to match the Go converter.\n if (v1Profile.depends?.length) {\n v2Baseline.depends = v1Profile.depends.map(convertDependency);\n }\n\n // No catch-all passthrough: the Go converter emits only the explicit fields\n // above, and the v2 baseline is a closed shape.\n return v2Baseline;\n}\n\n/**\n * Convert HDF v1.0 results to v2.0 format.\n *\n * Performs comprehensive transformation at all levels:\n * - Top-level: version removed, profiles → baselines, platform → components\n * - Baselines: sha256 → checksum, controls → requirements, field renaming\n * - Requirements: snake_case → camelCase, status → effectiveStatus\n * - Results: snake_case → camelCase for all fields\n *\n * @param v1Data - HDF v1.0 results object\n * @returns HDF v2.0 results object\n *\n * @example\n * ```typescript\n * const v1 = {\n * version: \"1.0.0\",\n * platform: { name: \"ubuntu\", release: \"20.04\" },\n * profiles: [...],\n * statistics: {...}\n * };\n * const v2 = convertV1ToV2(v1);\n * // v2 = { baselines: [...], components: [{...}], statistics: {...} }\n * ```\n */\nexport function convertV1ToV2(v1Data: HDFV1Results): HDFV2Results {\n validateInputSize(JSON.stringify(v1Data), 'legacyhdf-to-hdf');\n const v2: HDFV2Results = {\n baselines: (v1Data.profiles || []).map(convertProfile),\n statistics: v1Data.statistics || {},\n };\n\n // Transform platform to components array. Mirrors the Go converter: emit only\n // {type, name}, adding osName/osVersion when the platform carries a target_id.\n if (v1Data.platform) {\n const component: { type: string; name: string; osName?: string; osVersion?: string } = {\n type: 'host', // v2.0 uses 'host' instead of 'system'\n name: v1Data.platform.name,\n };\n // Populate OS details whenever the platform carries an OS signal (a release\n // or a target_id). Previously gated on target_id alone, which dropped a\n // release-bearing platform that lacked a target_id.\n if (v1Data.platform.target_id || v1Data.platform.release !== undefined) {\n component.osName = v1Data.platform.name;\n if (v1Data.platform.release !== undefined) component.osVersion = v1Data.platform.release;\n }\n v2.components = [component];\n }\n\n // Copy optional fields\n if (v1Data.generator) {\n v2.generator = v1Data.generator;\n }\n\n v2.tool = { name: 'Heimdall Data Format v1' };\n\n if (v1Data.timestamp) {\n v2.timestamp = v1Data.timestamp;\n }\n\n // Preserve any extension fields not part of core schema\n const knownV1Fields = new Set(['version', 'platform', 'profiles', 'statistics', 'generator', 'timestamp']);\n const extensionFields: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(v1Data)) {\n if (!knownV1Fields.has(key)) {\n extensionFields[key] = value;\n }\n }\n\n if (Object.keys(extensionFields).length > 0) {\n v2.extensions = {\n ...extensionFields,\n v1_version: v1Data.version, // Preserve original version for tracking\n };\n }\n\n // Flatten overlays: merge overlay/wrapper baselines so every requirement\n // has results and consumers don't see duplicated controls (741→247 fix).\n const flat = flattenOverlays(v2 as unknown as HDFResults);\n return flat.results as unknown as HDFV2Results;\n}\n\n/**\n * Validate that data appears to be HDF v1.0 format.\n *\n * @param data - Unknown data to validate\n * @returns true if data looks like HDF v1.0\n */\nexport function isHDFV1(data: unknown): data is HDFV1Results {\n if (typeof data !== 'object' || data === null) {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n // V1.0 has version field, profiles, and platform\n return (\n typeof obj.version === 'string' &&\n Array.isArray(obj.profiles) &&\n typeof obj.platform === 'object' &&\n obj.platform !== null\n );\n}\n","import { parseJSON, parsePurl } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type { EvaluatedBaseline, EvaluatedRequirement, RequirementResult, Checksum, Description } from '@mitre/hdf-schema';\nimport { ResultStatus, VerificationMethodEnum, createMinimalBaseline, createRequirement, createDescription, createResult } from '@mitre/hdf-schema';\n\n// --- SARIF 2.1.0 type definitions ---\n\ninterface SarifFile {\n $schema?: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool?: {\n driver?: SarifDriver;\n };\n results: SarifResult[];\n taxonomies?: SarifTaxonomy[];\n}\n\ninterface SarifDriver {\n name?: string;\n version?: string;\n informationUri?: string;\n rules?: ReportingDescriptor[];\n}\n\ninterface ReportingDescriptor {\n id: string;\n name?: string;\n shortDescription?: MultiformatMessage;\n fullDescription?: MultiformatMessage;\n helpUri?: string;\n help?: MultiformatMessage;\n defaultConfiguration?: ReportingConfiguration;\n relationships?: ReportingDescriptorRelation[];\n properties?: Record<string, unknown>;\n messageStrings?: Record<string, MultiformatMessage>;\n}\n\ninterface MultiformatMessage {\n text: string;\n markdown?: string;\n}\n\ninterface ReportingConfiguration {\n level?: string;\n}\n\ninterface ReportingDescriptorRelation {\n target: DescriptorReference;\n kinds?: string[];\n}\n\ninterface DescriptorReference {\n id: string;\n guid?: string;\n toolComponent?: ToolComponentReference;\n}\n\ninterface ToolComponentReference {\n name: string;\n guid?: string;\n}\n\ninterface SarifTaxonomy {\n name: string;\n version?: string;\n organization?: string;\n taxa?: ReportingDescriptor[];\n}\n\ninterface SarifResult {\n ruleId: string;\n ruleIndex?: number;\n kind?: string;\n level?: string;\n message: {\n text?: string;\n id?: string;\n arguments?: string[];\n };\n locations?: SarifLocation[];\n relatedLocations?: SarifLocation[];\n suppressions?: Suppression[];\n fixes?: Fix[];\n codeFlows?: CodeFlow[];\n fingerprints?: Record<string, string>;\n partialFingerprints?: Record<string, string>;\n /** SCA-SARIF property-bag carrying package identity. Populated by\n * SCA tools (Grype, Trivy, Dependency-Check); empty for SAST. */\n properties?: {\n purl?: string;\n cpe?: string;\n packageName?: string;\n packageVersion?: string;\n name?: string;\n version?: string;\n ecosystem?: string;\n fixedInVersion?: string;\n } & Record<string, unknown>;\n}\n\ninterface Suppression {\n kind: string;\n status?: string;\n justification?: string;\n}\n\ninterface Fix {\n description?: {\n text: string;\n };\n}\n\ninterface CodeFlow {\n threadFlows: ThreadFlow[];\n}\n\ninterface ThreadFlow {\n locations: ThreadFlowLocation[];\n}\n\ninterface ThreadFlowLocation {\n location: SarifLocation;\n importance?: string;\n}\n\ninterface SarifLocation {\n id?: number;\n physicalLocation?: {\n artifactLocation?: {\n uri?: string;\n };\n region?: {\n startLine?: number;\n startColumn?: number;\n endLine?: number;\n endColumn?: number;\n snippet?: {\n text: string;\n };\n };\n };\n message?: {\n text: string;\n };\n}\n\n// --- Impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n error: 0.7,\n warning: 0.5,\n note: 0.3,\n};\n\n// --- Conversion entry point ---\n\nexport async function convertSarifToHdf(input: string): Promise<string> {\n validateInputSize(input, 'sarif');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const sarif = parseJSON<SarifFile>(input);\n\n if (!sarif || typeof sarif !== 'object') {\n throw new Error('Invalid SARIF structure: not a valid JSON object');\n }\n\n if (!Array.isArray(sarif.runs)) {\n throw new Error('Invalid SARIF structure: missing or invalid runs field');\n }\n\n const firstDriver = sarif.runs[0]?.tool?.driver;\n\n const { items: limitedRuns, truncated: truncatedRuns } = limitArray(sarif.runs);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRuns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRuns.length} run items (original: ${sarif.runs.length})`);\n }\n\n const timestamp = new Date();\n\n return buildHdfResults({\n generatorName: 'sarif-to-hdf',\n converterVersion: '1.0.0',\n toolName: firstDriver?.name,\n toolVersion: firstDriver?.version,\n toolFormat: 'SARIF',\n baselines: limitedRuns.map(run => convertRun(run, sarif.version, resultsChecksum, timestamp)),\n components: [],\n timestamp,\n });\n}\n\n// --- Run-level conversion ---\n\nfunction convertRun(run: SarifRun, version: string, resultsChecksum: Checksum, timestamp: Date): EvaluatedBaseline {\n const ruleMap = buildRuleMap(run);\n\n // Group SARIF results by ruleId — each group becomes one EvaluatedRequirement.\n // When ruleId is absent, fall back to message text as the grouping key.\n const { items: limitedResults, truncated: truncatedResults } = limitArray(run.results);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedResults) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedResults.length} result items (original: ${run.results.length})`);\n }\n const groupOrder: string[] = [];\n const groupMap = new Map<string, { rule?: ReportingDescriptor; results: SarifResult[] }>();\n for (const result of limitedResults) {\n const groupKey = result.ruleId || resolveMessageText(result.message, undefined);\n let group = groupMap.get(groupKey);\n if (!group) {\n const rule = ruleMap.get(result.ruleId);\n group = { rule, results: [] };\n groupMap.set(groupKey, group);\n groupOrder.push(groupKey);\n }\n group.results.push(result);\n }\n\n const requirements = groupOrder.map(ruleId => {\n const group = groupMap.get(ruleId)!;\n return convertResultGroup(ruleId, group.rule, group.results);\n });\n\n // Use tool name for baseline name if available\n const baselineName = run.tool?.driver?.name || 'SARIF';\n\n if (requirements.length === 0) {\n const driverName = run.tool?.driver?.name?.trim() || '';\n const target = driverName || 'SARIF analyzer';\n const idPrefix = driverName || 'sarif';\n requirements.push(buildNoFindingsRequirement(\n `${idPrefix}-no-findings`,\n `${target} ran and reported zero findings.`,\n timestamp,\n ));\n }\n\n return createMinimalBaseline(baselineName, requirements, {\n version,\n title: 'Static Analysis Results Interchange Format',\n resultsChecksum,\n });\n}\n\nfunction buildRuleMap(run: SarifRun): Map<string, ReportingDescriptor> {\n const map = new Map<string, ReportingDescriptor>();\n if (run.tool?.driver?.rules) {\n for (const rule of run.tool.driver.rules) {\n map.set(rule.id, rule);\n }\n }\n return map;\n}\n\n// --- Result-group conversion (one EvaluatedRequirement per ruleId) ---\n\nfunction convertResultGroup(ruleId: string, rule: ReportingDescriptor | undefined, sarifResults: SarifResult[]): EvaluatedRequirement {\n const firstResult = sarifResults[0]!;\n\n // Derive requirement-level metadata from the rule and first result\n const { title, description } = deriveMetadata(firstResult, rule);\n\n // Extract CWE IDs from rule (or first result message as fallback)\n let cweIds = extractCweFromRule(rule);\n if (cweIds.length === 0) {\n cweIds = extractCweIds(resolveMessageText(firstResult.message, rule));\n }\n\n const nistControls = mapCWEToNIST(cweIds, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciControls = nistToCci(nistControls);\n\n // Determine requirement-level impact from the rule's inherent severity\n const ruleLevel = resolveRuleLevel(rule, sarifResults);\n const impact = IMPACT_MAPPING[ruleLevel] || 0.1;\n\n // Source location from first result's first location\n const sourceLocation = firstResult.locations && firstResult.locations.length > 0\n ? extractSourceLocation(firstResult.locations[0]!)\n : undefined;\n\n // Convert each SARIF result into RequirementResult(s)\n const results: RequirementResult[] = [];\n for (const sr of sarifResults) {\n results.push(...convertSarifResultToHDFResults(sr));\n }\n\n // Build descriptions from rule metadata and first result\n const descriptions = buildDescriptions(description, rule, firstResult);\n\n // Build tags\n const tags = buildTags(firstResult, rule, ruleLevel, cweIds, nistControls, cciControls);\n\n const options: {\n sourceLocation?: { ref: string; line: number };\n tags: Record<string, unknown>;\n } = { tags };\n\n if (sourceLocation) {\n options.sourceLocation = sourceLocation;\n }\n\n const req = createRequirement(ruleId, title, descriptions, impact, results, options);\n const controlType = deriveControlTypeFromTags(nistControls);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n // SCA-shaped SARIF (Grype, Trivy, Dependency-Check) carries package\n // identity in result.properties. Pure SAST results have empty\n // properties → no affectedPackage. We dedupe by purl/cpe/name@version\n // across the grouped results since SCA tools sometimes emit one\n // SARIF result per occurrence.\n const seenKeys = new Set<string>();\n const packages = [];\n for (const sr of sarifResults) {\n const pkg = packageFromSarifProperties(sr.properties);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n packages.push(pkg);\n }\n if (packages.length > 0) {\n (req as EvaluatedRequirement).affectedPackages = packages;\n }\n return req;\n}\n\n/**\n * Extract an Affected_Package from a SARIF result.properties bag.\n * Recognizes the SCA-tool convention of carrying purl / cpe /\n * packageName+packageVersion / name+version. Returns undefined for\n * SAST results that lack any package identity.\n */\nfunction packageFromSarifProperties(props: SarifResult['properties']): ReturnType<typeof buildAffectedPackage> {\n if (!props) return undefined;\n const name = props.packageName ?? props.name;\n const version = props.packageVersion ?? props.version;\n let ecosystem: Ecosystem | undefined;\n if (props.purl) {\n const parsed = parsePurl(props.purl);\n ecosystem = ecosystemFromPurlType(parsed?.type);\n } else if (props.ecosystem) {\n ecosystem = ecosystemFromPurlType(props.ecosystem);\n } else if (name && version) {\n ecosystem = Ecosystem.Generic;\n }\n return buildAffectedPackage({\n name,\n version,\n ecosystem,\n purl: props.purl,\n cpe: props.cpe,\n fixedInVersion: props.fixedInVersion,\n });\n}\n\n// Determines the inherent severity level for a rule, independent of per-result kind overrides.\nfunction resolveRuleLevel(rule: ReportingDescriptor | undefined, results: SarifResult[]): string {\n if (rule?.defaultConfiguration?.level) {\n return rule.defaultConfiguration.level;\n }\n // Find first result that represents a failure with an explicit level\n for (const r of results) {\n if (!r.kind || r.kind === 'fail') {\n if (r.level) {\n return r.level;\n }\n }\n }\n return 'warning';\n}\n\n// Converts a single SARIF result into one or more HDF RequirementResults.\nfunction convertSarifResultToHDFResults(result: SarifResult): RequirementResult[] {\n // Map kind to HDF status\n let status = mapKindToStatus(result.kind);\n\n // Handle suppressions\n let suppressionJustification = '';\n if (status === ResultStatus.Failed || status === ResultStatus.Passed) {\n const suppResult = applySuppression(result.suppressions);\n if (suppResult.suppressed) {\n status = ResultStatus.NotReviewed;\n suppressionJustification = suppResult.justification;\n }\n }\n\n // Build backtrace from code flows\n const backtrace = extractBacktrace(result.codeFlows);\n\n // Create results for each location\n const results = (result.locations || [])\n .filter(loc => loc.physicalLocation?.artifactLocation?.uri)\n .map(loc => createHDFResult(loc, status, backtrace, suppressionJustification));\n\n // If no locations, create a location-less result so the finding isn't silently dropped\n if (results.length === 0) {\n const locationlessResult: RequirementResult = {\n status,\n codeDesc: 'No source location',\n startTime: new Date(),\n backtrace,\n };\n if (suppressionJustification) {\n locationlessResult.message = `Suppressed: ${suppressionJustification}`;\n }\n results.push(locationlessResult);\n }\n\n return results;\n}\n\n// --- Message resolution ---\n\nfunction resolveMessageText(msg: SarifResult['message'], rule?: ReportingDescriptor): string {\n if (msg?.text) {\n return msg.text;\n }\n if (msg?.id && rule) {\n const tmpl = rule.messageStrings?.[msg.id];\n if (tmpl) {\n let text = tmpl.text;\n for (const [i, arg] of (msg.arguments ?? []).entries()) {\n text = text.split(`{${i}}`).join(arg);\n }\n return text;\n }\n }\n return '';\n}\n\n// --- Metadata derivation ---\n\nfunction deriveMetadata(result: SarifResult, rule?: ReportingDescriptor): { title: string; description: string } {\n const messageText = resolveMessageText(result.message, rule);\n if (rule?.name) {\n return { title: rule.name, description: messageText };\n }\n if (rule?.shortDescription?.text) {\n return { title: rule.shortDescription.text, description: messageText };\n }\n return parseMessage(messageText);\n}\n\nfunction parseMessage(text: string): { title: string; description: string } {\n const colonIndex = (text ?? '').indexOf(':');\n if (colonIndex === -1) {\n return { title: text, description: '' };\n }\n return {\n title: text.substring(0, colonIndex).trim(),\n description: text.substring(colonIndex + 1).trim(),\n };\n}\n\n// --- CWE extraction with priority ---\n\nfunction extractCweFromRule(rule?: ReportingDescriptor): string[] {\n if (!rule) {\n return [];\n }\n\n // Priority 1: rule.relationships where toolComponent.name == \"CWE\"\n if (rule.relationships) {\n const cweIds: string[] = [];\n for (const rel of rule.relationships) {\n if (rel.target.toolComponent?.name?.toLowerCase() === 'cwe') {\n const id = rel.target.id.startsWith('CWE-') ? rel.target.id : `CWE-${rel.target.id}`;\n cweIds.push(id);\n }\n }\n if (cweIds.length > 0) {\n return cweIds;\n }\n }\n\n // Priority 2: rule.properties.tags containing CWE-\\d+ patterns\n if (rule.properties?.tags && Array.isArray(rule.properties.tags)) {\n const cweTagPattern = /^CWE-\\d+$/;\n const cweIds: string[] = [];\n for (const tag of rule.properties.tags as string[]) {\n if (typeof tag === 'string' && cweTagPattern.test(tag)) {\n cweIds.push(tag);\n }\n }\n if (cweIds.length > 0) {\n return cweIds;\n }\n }\n\n return [];\n}\n\nfunction extractCweIds(text: string): string[] {\n const cwePattern = /\\(([^)]+)\\)/g;\n const matches = text.match(cwePattern);\n\n if (!matches) {\n return [];\n }\n\n const cweIds: string[] = [];\n for (const match of matches) {\n const content = match.slice(1, -1);\n if (content.includes('CWE-')) {\n const parts = content.split(/,\\s*|!\\//);\n for (const part of parts) {\n const trimmed = part.trim();\n if (trimmed.startsWith('CWE-')) {\n cweIds.push(trimmed);\n }\n }\n }\n }\n\n return cweIds;\n}\n\n// --- Kind → Status mapping ---\n\nfunction mapKindToStatus(kind?: string): ResultStatus {\n switch (kind) {\n case 'pass':\n return ResultStatus.Passed;\n case 'open':\n return ResultStatus.Failed;\n case 'review':\n return ResultStatus.NotReviewed;\n case 'informational':\n return ResultStatus.NotApplicable;\n case 'notApplicable':\n return ResultStatus.NotApplicable;\n default: // \"fail\" or undefined\n return ResultStatus.Failed;\n }\n}\n\n// --- Suppression handling ---\n\nfunction applySuppression(suppressions?: Suppression[]): { suppressed: boolean; justification: string } {\n if (!suppressions || suppressions.length === 0) {\n return { suppressed: false, justification: '' };\n }\n\n const justifications: string[] = [];\n let hasSuppression = false;\n\n for (const s of suppressions) {\n if (s.status === 'rejected') {\n continue;\n }\n hasSuppression = true;\n if (s.justification) {\n justifications.push(s.justification);\n }\n }\n\n if (!hasSuppression) {\n return { suppressed: false, justification: '' };\n }\n\n return { suppressed: true, justification: justifications.join('; ') };\n}\n\n// --- Code flow → backtrace ---\n\nfunction extractBacktrace(codeFlows?: CodeFlow[]): string[] {\n if (!codeFlows || codeFlows.length === 0) {\n return [];\n }\n\n const backtrace: string[] = [];\n for (const cf of codeFlows) {\n for (const tf of cf.threadFlows) {\n for (const tfl of tf.locations) {\n const loc = tfl.location;\n const uri = loc.physicalLocation?.artifactLocation?.uri || '';\n const line = loc.physicalLocation?.region?.startLine || 0;\n const msg = loc.message?.text || '';\n\n let entry = `${uri}:${line}`;\n if (msg) {\n entry = `${uri}:${line} - ${msg}`;\n }\n backtrace.push(entry);\n }\n }\n }\n\n return backtrace;\n}\n\n// --- Description building ---\n\nfunction buildDescriptions(defaultDesc: string, rule: ReportingDescriptor | undefined, result: SarifResult): Description[] {\n const descriptions: Description[] = [\n createDescription('default', defaultDesc),\n ];\n\n if (rule) {\n if (rule.fullDescription?.text) {\n descriptions.push(createDescription('rationale', rule.fullDescription.text));\n } else if (rule.shortDescription?.text && !defaultDesc) {\n descriptions[0] = createDescription('default', rule.shortDescription.text);\n }\n\n if (rule.help?.text) {\n descriptions.push(createDescription('check', rule.help.text));\n }\n }\n\n if (result.fixes && result.fixes.length > 0 && result.fixes[0]?.description?.text) {\n descriptions.push(createDescription('fix', result.fixes[0].description.text));\n }\n\n return descriptions;\n}\n\n// --- Tag building ---\n\nfunction buildTags(\n result: SarifResult,\n rule: ReportingDescriptor | undefined,\n resolvedLevel: string,\n cweIds: string[],\n nistControls: string[],\n cciControls: string[]\n): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n severity: resolvedLevel,\n cwe: cweIds,\n nist: nistControls,\n cci: cciControls,\n };\n\n if (result.kind) {\n tags.kind = result.kind;\n }\n\n if (rule?.helpUri) {\n tags.helpUri = rule.helpUri;\n }\n\n if (result.suppressions && result.suppressions.length > 0) {\n tags.suppressions = result.suppressions.map(s => {\n const entry: Record<string, string> = { kind: s.kind };\n if (s.status) {\n entry.status = s.status;\n }\n if (s.justification) {\n entry.justification = s.justification;\n }\n return entry;\n });\n }\n\n if ((result.fingerprints && Object.keys(result.fingerprints).length > 0) ||\n (result.partialFingerprints && Object.keys(result.partialFingerprints).length > 0)) {\n const fp: Record<string, unknown> = {};\n if (result.fingerprints && Object.keys(result.fingerprints).length > 0) {\n fp.fingerprints = result.fingerprints;\n }\n if (result.partialFingerprints && Object.keys(result.partialFingerprints).length > 0) {\n fp.partialFingerprints = result.partialFingerprints;\n }\n tags.fingerprints = fp;\n }\n\n return tags;\n}\n\n// --- Location helpers ---\n\nfunction extractSourceLocation(location: SarifLocation): { ref: string; line: number } | undefined {\n const uri = location.physicalLocation?.artifactLocation?.uri;\n const line = location.physicalLocation?.region?.startLine;\n\n if (!uri || !line) {\n return undefined;\n }\n\n return { ref: uri, line };\n}\n\nfunction createHDFResult(\n location: SarifLocation,\n status: ResultStatus,\n backtrace: string[],\n suppressionMessage?: string\n): RequirementResult {\n const uri = location.physicalLocation?.artifactLocation?.uri || '';\n const line = location.physicalLocation?.region?.startLine || 0;\n const column = location.physicalLocation?.region?.startColumn || 0;\n const snippet = location.physicalLocation?.region?.snippet?.text;\n\n let codeDesc = `URL : ${uri} LINE : ${line} COLUMN : ${column}`;\n if (snippet) {\n codeDesc = `${codeDesc}\\n${snippet}`;\n }\n\n const message = suppressionMessage ? `Suppressed: ${suppressionMessage}` : '';\n\n return createResult(\n status,\n message,\n {\n codeDesc,\n startTime: new Date(),\n backtrace,\n }\n );\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport { inputChecksum, limitArray, validateInputSize, buildHdfResults, buildNoFindingsRequirement, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n// JUnit XML parsed types (from fast-xml-parser via parseXmlWithArrays)\n\ninterface JUnitTestSuites {\n testsuites?: {\n name?: string;\n testsuite?: JUnitTestSuite[];\n };\n testsuite?: JUnitTestSuite;\n}\n\ninterface JUnitTestSuite {\n name?: string;\n tests?: number;\n failures?: number;\n errors?: number;\n skipped?: number;\n time?: string;\n timestamp?: string;\n hostname?: string;\n testcase?: JUnitTestCase[];\n}\n\ninterface JUnitTestCase {\n classname?: string;\n name: string;\n time?: string;\n failure?: JUnitFailure;\n error?: JUnitError;\n skipped?: JUnitSkipped | '';\n}\n\ninterface JUnitFailure {\n message?: string;\n type?: string;\n '#text'?: string;\n}\n\ninterface JUnitError {\n message?: string;\n type?: string;\n '#text'?: string;\n}\n\ninterface JUnitSkipped {\n message?: string;\n}\n\nconst DEFAULT_NIST = ['SA-11'];\nconst CONVERTER_VERSION = '1.0.0';\n\n// Tags to always parse as arrays (even when single element)\nconst ARRAY_TAGS = ['testsuite', 'testcase'];\n\n/**\n * Converts JUnit XML test results to HDF format.\n */\nexport async function convertJunitToHdf(input: string): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'junit');\n\n const { suites, name } = parseJUnitXML(input);\n const scanTime = resolveScanTime(suites);\n const requirements = buildRequirements(suites, scanTime);\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'junit-no-findings',\n `JUnit scanned ${noFindingsTarget(name, suites)} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const baseline = createMinimalBaseline(name, requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'junit-to-hdf',\n converterVersion: CONVERTER_VERSION,\n toolName: 'JUnit XML',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{\n type: TargetType.Application,\n name,\n }],\n timestamp: scanTime,\n });\n}\n\n// Computes one timestamp per conversion: the first available <testsuite> timestamp,\n// falling back to conversion time. Used for every result's startTime, the document\n// timestamp, and any no-findings placeholder.\nfunction resolveScanTime(suites: JUnitTestSuite[]): Date {\n for (const suite of suites) {\n if (suite.timestamp) {\n const parsed = parseTimestamp(suite.timestamp);\n if (parsed) {\n return parsed;\n }\n }\n }\n return new Date();\n}\n\nfunction parseJUnitXML(input: string): { suites: JUnitTestSuite[]; name: string } {\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS) as JUnitTestSuites;\n\n // <testsuites> root\n if (parsed.testsuites) {\n const suites = parsed.testsuites.testsuite ?? [];\n const name = parsed.testsuites.name || 'JUnit Test Results';\n return { suites, name };\n }\n\n // <testsuite> root\n if (parsed.testsuite) {\n const suite = parsed.testsuite;\n // When testsuite is root, parseXmlWithArrays may return it directly\n // (not wrapped in an array since ARRAY_TAGS only forces arrays for child elements)\n const suites = Array.isArray(suite) ? (suite as JUnitTestSuite[]) : [suite];\n const name = suites[0]?.name || 'JUnit Test Results';\n return { suites, name };\n }\n\n throw new Error('Input is not a JUnit XML document: expected <testsuites> or <testsuite> root element');\n}\n\nfunction buildRequirements(suites: JUnitTestSuite[], scanTime: Date): EvaluatedRequirement[] {\n const { items: limitedSuites, truncated: truncatedSuites } = limitArray(suites);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedSuites) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedSuites.length} test suite items (original: ${suites.length})`);\n }\n const requirements: EvaluatedRequirement[] = [];\n\n for (const suite of limitedSuites) {\n const testcases = suite.testcase ?? [];\n const { items: limitedTestCases, truncated: truncatedTC } = limitArray(testcases);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedTC) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedTestCases.length} test case items (original: ${testcases.length})`);\n }\n for (const tc of limitedTestCases) {\n requirements.push(testCaseToRequirement(tc, scanTime));\n }\n }\n\n return requirements;\n}\n\nfunction testCaseToRequirement(\n tc: JUnitTestCase,\n scanTime: Date\n): EvaluatedRequirement {\n const id = buildID(tc);\n const { status, message } = resolveStatus(tc);\n const codeDesc = buildCodeDesc(tc);\n\n const resultOptions: Record<string, unknown> = { codeDesc, startTime: scanTime };\n if (tc.time) {\n const parsed = parseFloat(tc.time);\n if (!isNaN(parsed)) {\n resultOptions.runTime = parsed;\n }\n }\n\n const result = createResult(status, message ?? '', resultOptions) as RequirementResult;\n\n const descriptions: Description[] = [\n {\n label: 'default',\n data: `JUnit test: ${tc.name} in ${tc.classname || 'unknown'}`,\n },\n ];\n\n const req = createRequirement(id, tc.name, descriptions, 0.5, [result], {\n tags: { nist: DEFAULT_NIST },\n }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(DEFAULT_NIST);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\nfunction buildID(tc: JUnitTestCase): string {\n if (tc.classname) {\n return `${tc.classname}.${tc.name}`;\n }\n return tc.name;\n}\n\nfunction resolveStatus(tc: JUnitTestCase): { status: ResultStatus; message?: string } {\n if (tc.failure) {\n const msg = buildFailureMessage(\n tc.failure.message ?? '',\n tc.failure.type ?? '',\n tc.failure['#text'] ?? ''\n );\n return { status: ResultStatus.Failed, message: msg };\n }\n if (tc.error) {\n const msg = buildFailureMessage(\n tc.error.message ?? '',\n tc.error.type ?? '',\n tc.error['#text'] ?? ''\n );\n return { status: ResultStatus.Error, message: msg };\n }\n if (tc.skipped !== undefined) {\n const skipped = typeof tc.skipped === 'object' ? tc.skipped : null;\n if (skipped?.message) {\n return { status: ResultStatus.NotReviewed, message: `Skipped: ${skipped.message}` };\n }\n return { status: ResultStatus.NotReviewed, message: 'Skipped' };\n }\n return { status: ResultStatus.Passed };\n}\n\nfunction buildFailureMessage(message: string, typeName: string, body: string): string {\n let result = '';\n if (typeName) {\n result = `${typeName}: `;\n }\n result += message;\n if (body) {\n result += '\\n' + body;\n }\n return result;\n}\n\nfunction buildCodeDesc(tc: JUnitTestCase): string {\n if (tc.classname) {\n return `${tc.classname} :: ${tc.name}`;\n }\n return tc.name;\n}\n\nfunction noFindingsTarget(baselineName: string, suites: JUnitTestSuite[]): string {\n if (baselineName && baselineName !== 'JUnit Test Results') {\n return baselineName;\n }\n for (const s of suites) {\n if (s.name) return s.name;\n }\n return 'JUnit test suite';\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, inputIntegrity, limitArray, validateInputSize, serializeHdf } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n HDFBaseline,\n BaselineRequirement,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n RequirementGroup,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n Severity,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport { getCCINistMappings } from '@mitre/hdf-mappings';\n\n// ---------------------------------------------------------------------------\n// Parsed XCCDF types (post-fast-xml-parser with removeNSPrefix)\n// ---------------------------------------------------------------------------\n\ninterface XccdfBenchmark {\n Benchmark?: BenchmarkElement;\n}\n\ninterface BenchmarkElement {\n id?: string;\n title?: string | TextElement;\n description?: string | TextElement;\n version?: string | VersionElement;\n Group?: GroupElement[];\n Rule?: RuleElement[];\n Profile?: ProfileElement[];\n TestResult?: TestResultElement;\n 'plain-text'?: PlainText | PlainText[];\n}\n\ninterface TextElement {\n '#text'?: string;\n}\n\ninterface VersionElement {\n '#text'?: string;\n update?: string;\n}\n\ninterface PlainText {\n '#text'?: string;\n id?: string;\n}\n\ninterface ProfileElement {\n id?: string;\n title?: string | TextElement;\n}\n\ninterface GroupElement {\n id?: string;\n title?: string | TextElement;\n Rule?: RuleElement[];\n}\n\ninterface RuleElement {\n id?: string;\n severity?: string;\n title?: string | TextElement;\n description?: string | TextElement;\n version?: string | VersionElement;\n fixtext?: string | FixtextElement;\n ident?: IdentElement[];\n check?: CheckElement;\n}\n\ninterface CheckElement {\n system?: string;\n 'check-content'?: string | TextElement;\n}\n\ninterface FixtextElement {\n '#text'?: string;\n fixref?: string;\n}\n\ninterface IdentElement {\n '#text'?: string;\n system?: string;\n}\n\ninterface TestResultElement {\n id?: string;\n 'start-time'?: string;\n 'end-time'?: string;\n title?: string | TextElement;\n target?: string;\n 'target-address'?: string[];\n 'rule-result'?: RuleResultElement[];\n}\n\ninterface RuleResultElement {\n idref?: string;\n time?: string;\n severity?: string;\n version?: string;\n result?: string;\n ident?: IdentElement[];\n}\n\n// ---------------------------------------------------------------------------\n// Parsed ARF types (post-fast-xml-parser with removeNSPrefix)\n// ---------------------------------------------------------------------------\n\ninterface ArfParsed {\n 'asset-report-collection'?: ArfCollectionElement;\n}\n\ninterface ArfCollectionElement {\n relationships?: {\n relationship?: ArfRelationshipElement[];\n };\n 'report-requests'?: {\n 'report-request'?: ArfReportRequestElement[];\n };\n assets?: {\n asset?: ArfAssetElement[];\n };\n reports?: {\n report?: ArfReportElement[];\n };\n}\n\ninterface ArfRelationshipElement {\n type?: string;\n subject?: string;\n ref?: string[];\n}\n\ninterface ArfReportRequestElement {\n id?: string;\n content?: {\n 'data-stream-collection'?: {\n component?: ArfComponentElement[];\n 'data-stream'?: unknown[];\n };\n };\n}\n\ninterface ArfComponentElement {\n id?: string;\n Benchmark?: BenchmarkElement;\n}\n\ninterface ArfAssetElement {\n id?: string;\n 'computing-device'?: {\n connections?: {\n connection?: ArfConnectionElement[];\n };\n fqdn?: string;\n hostname?: string;\n };\n}\n\ninterface ArfConnectionElement {\n 'ip-address'?: {\n 'ip-v4'?: string;\n 'ip-v6'?: string;\n };\n 'mac-address'?: string;\n}\n\ninterface ArfReportElement {\n id?: string;\n content?: {\n TestResult?: TestResultElement;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\nconst CONVERTER_VERSION = '1.0.0';\n\nconst CCI_SYSTEM = 'http://cyber.mil/cci';\n\n/** Tags that must always be parsed as arrays even if only one element exists. */\nconst ARRAY_TAGS = [\n 'Group',\n 'Rule',\n 'Profile',\n 'rule-result',\n 'ident',\n 'select',\n 'set-value',\n 'target-address',\n 'platform',\n 'check-content',\n // ARF-specific array tags\n 'report',\n 'report-request',\n 'asset',\n 'connection',\n 'relationship',\n 'ref',\n 'component',\n 'data-stream',\n];\n\n/** Map XCCDF result values to HDF ResultStatus. */\nconst STATUS_MAP: Record<string, ResultStatus> = {\n pass: ResultStatus.Passed,\n fail: ResultStatus.Failed,\n error: ResultStatus.Error,\n unknown: ResultStatus.Error,\n notapplicable: ResultStatus.NotApplicable,\n notchecked: ResultStatus.NotReviewed,\n notselected: ResultStatus.NotReviewed,\n informational: ResultStatus.NotReviewed,\n fixed: ResultStatus.Passed,\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an XCCDF results document (1.1 or 1.2) or ARF 1.1 XML to HDF Results JSON.\n * The input must contain TestResult elements.\n * For benchmark-only documents (no TestResult), use convertXccdfBenchmarkToHdf.\n *\n * @param input - Raw XML string (XCCDF Benchmark with TestResult, or ARF asset-report-collection)\n * @returns Stringified HDF Results JSON\n */\n\n// Parse an XCCDF start-time attribute, treating a present-but-invalid value the\n// same as missing: fall back to conversion time. An Invalid Date would later\n// throw in JSON.stringify (Date#toISOString RangeError).\nfunction parseStartTime(raw: string | undefined): Date {\n if (raw) {\n const t = parseTimestamp(raw);\n if (t) return t;\n }\n return new Date();\n}\n\nexport async function convertXccdfResultsToHdf(input: string): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf-results');\n\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS);\n\n // Detect input format: ARF or raw XCCDF\n const arfParsed = parsed as ArfParsed;\n if (arfParsed['asset-report-collection']) {\n return convertArfCollection(arfParsed['asset-report-collection'], input);\n }\n\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF document: expected <Benchmark> root element'\n );\n }\n\n if (!benchmark.TestResult) {\n throw new Error(\n \"Input has no TestResult elements — this is a benchmark. Use 'xccdf-benchmark' or 'xccdf' instead\"\n );\n }\n\n return convertBenchmarkResultsToHdf(benchmark, input);\n}\n\n/**\n * Converts an XCCDF benchmark document (no TestResult) to HDF Baseline JSON.\n * Supports both XCCDF 1.1 and 1.2 (namespace-agnostic via fast-xml-parser).\n *\n * @param input - Raw XML string (XCCDF Benchmark without TestResult)\n * @returns Stringified HDF Baseline JSON\n */\nexport async function convertXccdfBenchmarkToHdf(input: string): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf-benchmark');\n\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS);\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF Benchmark document'\n );\n }\n\n if (benchmark.TestResult) {\n throw new Error(\n \"Input contains TestResult elements — this is a results document, not a benchmark. Use 'xccdf-results' or 'xccdf' instead\"\n );\n }\n\n return convertBenchmarkToBaselineJson(benchmark, input);\n}\n\n/**\n * Auto-detects whether the input is an XCCDF benchmark, results, or ARF\n * document and returns the appropriate JSON output.\n *\n * @param input - Raw XML string\n * @returns Object with json output and outputType ('baseline' or 'results')\n */\nexport async function convertXccdfToHdf(input: string): Promise<{ json: string; outputType: 'baseline' | 'results' }> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf');\n\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS);\n\n // Check ARF first\n const arfParsed = parsed as ArfParsed;\n if (arfParsed['asset-report-collection']) {\n const json = await convertArfCollection(arfParsed['asset-report-collection'], input);\n return { json, outputType: 'results' };\n }\n\n // Check XCCDF Benchmark\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF or ARF document'\n );\n }\n\n if (benchmark.TestResult) {\n const json = await convertBenchmarkResultsToHdf(benchmark, input);\n return { json, outputType: 'results' };\n }\n\n const json = await convertBenchmarkToBaselineJson(benchmark, input);\n return { json, outputType: 'baseline' };\n}\n\n// ---------------------------------------------------------------------------\n// XCCDF Benchmark results conversion (existing path)\n// ---------------------------------------------------------------------------\n\nasync function convertBenchmarkResultsToHdf(\n benchmark: BenchmarkElement,\n rawInput: string\n): Promise<string> {\n const testResult = benchmark.TestResult!;\n\n const ruleIndex = buildRuleIndex(benchmark);\n\n const ruleResults = testResult['rule-result'] ?? [];\n const { items: limitedRuleResults, truncated: truncatedRR } = limitArray(ruleResults);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRR) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRuleResults.length} rule-result items (original: ${ruleResults.length})`);\n }\n // The test result's start-time applies to every rule-result; fall back to\n // conversion time when absent or invalid (startTime is required on each result).\n const scanTime = parseStartTime(testResult['start-time']);\n\n const requirements = limitedRuleResults.map((rr) =>\n ruleResultToRequirement(rr, ruleIndex, scanTime)\n );\n\n if (requirements.length === 0) {\n const target = xccdfTargetName(testResult, benchmark);\n requirements.push(\n buildNoFindingsRequirement(\n 'xccdf-results-no-findings',\n `XCCDF scanned ${target} and reported zero findings.`,\n scanTime,\n ),\n );\n }\n\n const resultsChecksum: Checksum = await inputChecksum(rawInput);\n\n const baselineName = extractText(benchmark.title) || 'XCCDF Benchmark';\n\n const baseline = createMinimalBaseline(\n baselineName,\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n const components = buildTargets(testResult);\n\n const timestamp = scanTime;\n\n let durationSeconds: number | undefined;\n if (testResult['start-time'] && testResult['end-time']) {\n const start = parseTimestamp(testResult['start-time'])?.getTime();\n const end = parseTimestamp(testResult['end-time'])?.getTime();\n if (start !== undefined && end !== undefined && end >= start) {\n durationSeconds = (end - start) / 1000;\n }\n }\n\n const hdf: HDFResults = {\n baselines: [baseline],\n generator: { name: 'xccdf-results-to-hdf', version: CONVERTER_VERSION },\n tool: { name: 'XCCDF Results', format: 'XML' },\n components,\n timestamp,\n };\n\n if (durationSeconds !== undefined) {\n hdf.statistics = { duration: durationSeconds };\n }\n\n return serializeHdf(hdf);\n}\n\n// ---------------------------------------------------------------------------\n// Benchmark-to-Baseline conversion\n// ---------------------------------------------------------------------------\n\nasync function convertBenchmarkToBaselineJson(\n benchmark: BenchmarkElement,\n rawInput: string\n): Promise<string> {\n const integrity = await inputIntegrity(rawInput);\n\n const requirements: BaselineRequirement[] = [];\n const groups: RequirementGroup[] = [];\n\n const benchmarkGroups = benchmark.Group ?? [];\n for (const group of benchmarkGroups) {\n const groupRules = group.Rule ?? [];\n for (const rule of groupRules) {\n if (!rule.id) {\n continue;\n }\n const req = ruleToBaselineRequirement(rule, group);\n requirements.push(req);\n groups.push({\n id: group.id ?? '',\n title: extractText(group.title),\n requirements: [req.id],\n });\n }\n }\n\n const topRules = benchmark.Rule ?? [];\n for (const rule of topRules) {\n if (!rule.id) {\n continue;\n }\n const req = ruleToBaselineRequirement(rule, undefined);\n requirements.push(req);\n }\n\n const baselineName = kebabCase(benchmark.id ?? 'xccdf-benchmark');\n\n const baseline: HDFBaseline = {\n name: baselineName,\n title: extractText(benchmark.title),\n version: extractVersion(benchmark.version),\n status: 'loaded',\n summary: extractText(benchmark.description),\n integrity,\n requirements,\n groups,\n generator: { name: 'xccdf-results-to-hdf', version: CONVERTER_VERSION },\n };\n\n return serializeHdf(baseline);\n}\n\n/**\n * Convert a single XCCDF Rule to an HDF BaselineRequirement.\n */\nfunction ruleToBaselineRequirement(\n rule: RuleElement,\n group: GroupElement | undefined\n): BaselineRequirement {\n const id = extractVersion(rule.version) || rule.id || '';\n const title = extractText(rule.title) || id;\n const severity = rule.severity ?? '';\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n const descriptions: Description[] = [];\n const rawDesc = extractText(rule.description);\n if (rawDesc) {\n descriptions.push({\n label: 'default',\n data: extractVulnDiscussion(rawDesc),\n });\n } else {\n descriptions.push({ label: 'default', data: '' });\n }\n\n const checkContent = extractCheckContent(rule.check);\n if (checkContent) {\n descriptions.push({ label: 'check', data: checkContent });\n }\n\n const fixtext = extractFixtext(rule.fixtext);\n if (fixtext) {\n descriptions.push({ label: 'fix', data: fixtext });\n }\n\n const tags: Record<string, unknown> = {};\n let nistTags: string[] = [];\n const cciIds = extractCCIs(rule.ident ?? []);\n if (cciIds.length > 0) {\n tags['cci'] = cciIds;\n nistTags = [...new Set(cciIds.flatMap((cci) => getCCINistMappings(cci) ?? []))];\n if (nistTags.length > 0) {\n tags['nist'] = nistTags;\n }\n }\n\n // STIG-specific tags\n tags['rid'] = rule.id;\n tags['stig_id'] = extractVersion(rule.version);\n if (severity) {\n tags['severity'] = severity.toLowerCase();\n }\n if (rule.check?.system) {\n tags['check_id'] = rule.check.system;\n }\n const fixtextObj = rule.fixtext;\n if (fixtextObj && typeof fixtextObj !== 'string' && fixtextObj.fixref) {\n tags['fix_id'] = fixtextObj.fixref;\n }\n if (group) {\n tags['gid'] = group.id;\n tags['gtitle'] = extractText(group.title);\n }\n\n const req: BaselineRequirement = {\n id,\n title,\n impact,\n descriptions,\n tags,\n };\n\n if (severity) {\n req.severity = severity.toLowerCase() as Severity;\n }\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n// ---------------------------------------------------------------------------\n// ARF conversion\n// ---------------------------------------------------------------------------\n\nasync function convertArfCollection(\n arc: ArfCollectionElement,\n rawInput: string\n): Promise<string> {\n const resultsChecksum: Checksum = await inputChecksum(rawInput);\n\n // Find the Benchmark from data-stream-collection components\n const benchmark = findBenchmarkInArf(arc);\n\n // Build rule index from Benchmark\n const ruleIndex = benchmark\n ? buildRuleIndex(benchmark)\n : new Map<string, RuleElement>();\n\n // Build asset metadata map: asset ID -> asset element\n const assetMap = new Map<string, ArfAssetElement>();\n for (const asset of arc.assets?.asset ?? []) {\n if (asset.id) {\n assetMap.set(asset.id, asset);\n }\n }\n\n // Build relationship map: report ID -> asset IDs (isAbout)\n const reportToAssets = new Map<string, string[]>();\n for (const rel of arc.relationships?.relationship ?? []) {\n if (rel.type?.includes('isAbout') && rel.subject) {\n reportToAssets.set(rel.subject, rel.ref ?? []);\n }\n }\n\n // Process each report\n const baselines: EvaluatedBaseline[] = [];\n const components: Component[] = [];\n let firstTimestamp: Date | undefined;\n let totalDuration = 0;\n\n for (const report of arc.reports?.report ?? []) {\n const testResult = report.content?.TestResult;\n // Skip non-XCCDF reports (e.g. OVAL)\n if (!testResult?.id) {\n continue;\n }\n\n // Timing\n if (testResult['start-time'] && !firstTimestamp) {\n const t = parseTimestamp(testResult['start-time']);\n if (t) firstTimestamp = t;\n }\n if (testResult['start-time'] && testResult['end-time']) {\n const start = parseTimestamp(testResult['start-time'])?.getTime();\n const end = parseTimestamp(testResult['end-time'])?.getTime();\n if (start !== undefined && end !== undefined && end >= start) {\n totalDuration += (end - start) / 1000;\n }\n }\n\n // The test result's start-time applies to its rule-results; fall back to\n // conversion time when absent or invalid (startTime is required on each result).\n const scanTime = parseStartTime(testResult['start-time']);\n\n // Convert rule-results\n const ruleResults = testResult['rule-result'] ?? [];\n const { items: limitedARFRuleResults, truncated: truncatedARFRR } = limitArray(ruleResults);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedARFRR) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedARFRuleResults.length} rule-result items (original: ${ruleResults.length})`);\n }\n const requirements = limitedARFRuleResults.map((rr) =>\n ruleResultToRequirement(rr, ruleIndex, scanTime)\n );\n\n if (requirements.length === 0) {\n const target = xccdfTargetName(testResult, benchmark);\n requirements.push(\n buildNoFindingsRequirement(\n 'xccdf-results-no-findings',\n `XCCDF scanned ${target} and reported zero findings.`,\n scanTime,\n ),\n );\n }\n\n // Baseline name from Benchmark title\n let baselineName = '';\n if (benchmark) {\n baselineName = extractText(benchmark.title) || '';\n }\n if (!baselineName) {\n baselineName = extractText(testResult.title) || testResult.id || 'ARF Report';\n }\n\n const baseline = createMinimalBaseline(\n baselineName,\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n baselines.push(baseline);\n\n // Build target from TestResult, then enrich with ARF asset metadata\n const reportTargets = buildTargets(testResult);\n const target = reportTargets[0];\n if (target && report.id) {\n const assetIds = reportToAssets.get(report.id) ?? [];\n for (const assetId of assetIds) {\n const asset = assetMap.get(assetId);\n if (asset) {\n enrichTargetWithAsset(target, asset);\n }\n }\n }\n components.push(...reportTargets);\n }\n\n if (baselines.length === 0) {\n throw new Error('ARF document contains no XCCDF TestResult reports');\n }\n\n const hdf: HDFResults = {\n baselines,\n generator: { name: 'xccdf-results-to-hdf', version: CONVERTER_VERSION },\n tool: { name: 'ARF', format: 'ARF' },\n components,\n timestamp: firstTimestamp ?? new Date(),\n };\n\n if (totalDuration > 0) {\n hdf.statistics = { duration: totalDuration };\n }\n\n return serializeHdf(hdf);\n}\n\n/**\n * Find the XCCDF Benchmark embedded in an ARF data-stream-collection.\n */\nfunction findBenchmarkInArf(\n arc: ArfCollectionElement\n): BenchmarkElement | undefined {\n for (const req of arc['report-requests']?.['report-request'] ?? []) {\n const components =\n req.content?.['data-stream-collection']?.component ?? [];\n for (const comp of components) {\n if (comp.Benchmark?.id) {\n return comp.Benchmark;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Enrich an HDF Component with metadata from an ARF asset element.\n */\nfunction enrichTargetWithAsset(\n target: Component,\n asset: ArfAssetElement\n): void {\n const cd = asset['computing-device'];\n if (!cd) {\n return;\n }\n\n if (cd.fqdn) {\n target.fqdn = cd.fqdn;\n }\n\n // Extract first non-loopback MAC address\n const connections = cd.connections?.connection ?? [];\n for (const conn of connections) {\n const mac = conn['mac-address'];\n if (mac && mac !== '00:00:00:00:00:00') {\n target.macAddress = mac;\n break;\n }\n }\n\n // If target has no IP yet, try ARF asset connections\n if (!target.ipAddress) {\n for (const conn of connections) {\n const ip = conn['ip-address'];\n if (ip?.['ip-v4']) {\n target.ipAddress = ip['ip-v4'];\n break;\n }\n if (ip?.['ip-v6']) {\n target.ipAddress = ip['ip-v6'];\n break;\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Builds an index of Rule elements keyed by their @id attribute.\n * Rules can appear directly under Benchmark or nested inside Group elements.\n */\nfunction buildRuleIndex(benchmark: BenchmarkElement): Map<string, RuleElement> {\n const index = new Map<string, RuleElement>();\n\n const topRules = benchmark.Rule ?? [];\n for (const rule of topRules) {\n if (rule.id) {\n index.set(rule.id, rule);\n }\n }\n\n const groups = benchmark.Group ?? [];\n for (const group of groups) {\n const rules = group.Rule ?? [];\n for (const rule of rules) {\n if (rule.id) {\n index.set(rule.id, rule);\n }\n }\n }\n\n return index;\n}\n\n/**\n * Convert a single <rule-result> into an EvaluatedRequirement.\n */\nfunction ruleResultToRequirement(\n rr: RuleResultElement,\n ruleIndex: Map<string, RuleElement>,\n scanTime: Date\n): EvaluatedRequirement {\n const ruleId = rr.idref ?? '';\n const ruleDef = ruleIndex.get(ruleId);\n\n const id = extractVersion(ruleDef?.version) || ruleId;\n const title = extractText(ruleDef?.title) || id;\n\n const severity = rr.severity ?? ruleDef?.severity ?? '';\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n const descriptions: Description[] = [];\n const rawDesc = extractText(ruleDef?.description);\n if (rawDesc) {\n descriptions.push({\n label: 'default',\n data: extractVulnDiscussion(rawDesc),\n });\n }\n const fixtext = extractFixtext(ruleDef?.fixtext);\n if (fixtext) {\n descriptions.push({ label: 'fix', data: fixtext });\n }\n // descriptions requires minItems=1; guarantee a default when the rule\n // definition carried neither a description nor a fixtext.\n if (descriptions.length === 0) {\n descriptions.push({ label: 'default', data: '' });\n }\n\n const xccdfResult = (rr.result ?? '').toLowerCase();\n const status = STATUS_MAP[xccdfResult] ?? ResultStatus.NotReviewed;\n\n // Prefer each rule-result's own @time (per-finding evaluation time), matching\n // the Go converter; fall back to the TestResult-level start-time (scanTime).\n const perRuleTime = rr.time ? parseTimestamp(rr.time) : null;\n\n const result = createResult(status, '', {\n codeDesc: `XCCDF rule ${id}`,\n startTime: perRuleTime ?? scanTime,\n }) as RequirementResult;\n\n const tags: Record<string, unknown> = {};\n let nistTags: string[] = [];\n const cciIds = extractCCIs(rr.ident ?? ruleDef?.ident ?? []);\n if (cciIds.length > 0) {\n tags['cci'] = cciIds;\n nistTags = [...new Set(cciIds.flatMap((cci) => getCCINistMappings(cci) ?? []))];\n if (nistTags.length > 0) {\n tags['nist'] = nistTags;\n }\n }\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n impact,\n [result],\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Pick the most specific identifier available for a no-findings codeDesc.\n * Falls back through TestResult target/title, benchmark title/id, then a generic phrase.\n */\nfunction xccdfTargetName(\n testResult: TestResultElement | undefined,\n benchmark: BenchmarkElement | undefined,\n): string {\n const tr = testResult ?? {};\n const target = (tr.target ?? '').trim();\n if (target) {\n return target;\n }\n const trTitle = extractText(tr.title).trim();\n if (trTitle) {\n return trTitle;\n }\n const benchTitle = extractText(benchmark?.title).trim();\n if (benchTitle) {\n return benchTitle;\n }\n const benchId = (benchmark?.id ?? '').trim();\n if (benchId) {\n return benchId;\n }\n return 'the target';\n}\n\n/**\n * Build Component array from TestResult metadata.\n */\nfunction buildTargets(testResult: TestResultElement): Component[] {\n const targetName = testResult.target;\n if (!targetName) {\n return [];\n }\n\n const addresses = testResult['target-address'] ?? [];\n const target: Component = {\n name: targetName,\n type: TargetType.Host,\n labels: {},\n };\n\n if (addresses.length > 0) {\n target.ipAddress = addresses[0];\n }\n\n return [target];\n}\n\n/**\n * Extract plain text from a field that may be a string or {#text: string}.\n */\nfunction extractText(\n field: string | TextElement | VersionElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return field;\n }\n return (field as TextElement)['#text'] ?? '';\n}\n\n/**\n * Extract version string from a version field.\n */\nfunction extractVersion(\n field: string | VersionElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return field;\n }\n return (field as VersionElement)['#text'] ?? '';\n}\n\n/**\n * Extract fixtext content from fixtext field.\n */\nfunction extractFixtext(\n field: string | FixtextElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return field;\n }\n return (field as FixtextElement)['#text'] ?? '';\n}\n\n/**\n * Extract check-content text from a check element.\n */\nfunction extractCheckContent(\n check: CheckElement | undefined\n): string {\n if (!check) {\n return '';\n }\n const cc = check['check-content'];\n if (!cc) {\n return '';\n }\n if (typeof cc === 'string') {\n return cc;\n }\n // check-content is forced into an array by ARRAY_TAGS — handle both cases\n if (Array.isArray(cc)) {\n const first = (cc as unknown[])[0];\n if (typeof first === 'string') {\n return first;\n }\n if (first && typeof first === 'object' && '#text' in first) {\n return (first as TextElement)['#text'] ?? '';\n }\n return '';\n }\n return (cc as TextElement)['#text'] ?? '';\n}\n\n/**\n * Extract the VulnDiscussion text from an XCCDF description that contains\n * embedded XML like `<VulnDiscussion>...</VulnDiscussion>`. If no\n * VulnDiscussion tag is found, returns the original text.\n */\nfunction extractVulnDiscussion(description: string): string {\n const match = description.match(\n /<VulnDiscussion>([\\s\\S]*?)<\\/VulnDiscussion>/\n );\n if (match) {\n return match[1]!.trim();\n }\n // Also handle HTML-entity-encoded tags from the XML parser\n const entityMatch = description.match(\n /&lt;VulnDiscussion&gt;([\\s\\S]*?)&lt;\\/VulnDiscussion&gt;/\n );\n if (entityMatch) {\n return entityMatch[1]!.trim();\n }\n return description;\n}\n\n/**\n * Extract CCI identifiers from ident elements (system=\"http://cyber.mil/cci\").\n */\nfunction extractCCIs(idents: IdentElement[]): string[] {\n return idents\n .filter((i) => i.system === CCI_SYSTEM)\n .map((i) => i['#text'] ?? '')\n .filter((v) => v.length > 0);\n}\n\n/**\n * Convert a string to kebab-case (e.g., \"MS_Windows_Server_2022_STIG\" -> \"ms-windows-server-2022-stig\").\n */\nfunction kebabCase(s: string): string {\n return s.toLowerCase().replace(/_/g, '-');\n}\n","import { ResultStatus } from '@mitre/hdf-schema';\nimport { CheckStatus } from './model.js';\n\nfunction normalizeKey(s: string): string {\n return s.toLowerCase().trim().split('_').join('').split(' ').join('');\n}\n\nconst STATUS_BY_KEY: Record<string, CheckStatus> = {\n open: CheckStatus.Open,\n notafinding: CheckStatus.NotAFinding,\n notreviewed: CheckStatus.NotReviewed,\n notapplicable: CheckStatus.NotApplicable,\n};\n\n/** Map any CKL/CKLB status spelling to the canonical CheckStatus. */\nexport function parseStatus(s: string | undefined): CheckStatus {\n return STATUS_BY_KEY[normalizeKey(s ?? '')] ?? CheckStatus.NotReviewed;\n}\n\n/** CKL (XML) spelling. */\nexport function statusToCkl(s: CheckStatus): string {\n return s || CheckStatus.NotReviewed;\n}\n\n/** CKLB (JSON) snake_case spelling. */\nexport function statusToCklb(s: CheckStatus): string {\n switch (s) {\n case CheckStatus.Open:\n return 'open';\n case CheckStatus.NotAFinding:\n return 'not_a_finding';\n case CheckStatus.NotApplicable:\n return 'not_applicable';\n default:\n return 'not_reviewed';\n }\n}\n\n/** Canonical status -> HDF Result_Status. */\nexport function statusToHdf(s: CheckStatus): ResultStatus {\n switch (s) {\n case CheckStatus.Open:\n return ResultStatus.Failed;\n case CheckStatus.NotAFinding:\n return ResultStatus.Passed;\n case CheckStatus.NotApplicable:\n return ResultStatus.NotApplicable;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/** HDF Result_Status -> canonical status (error -> Open). */\nexport function statusFromHdf(s: ResultStatus | undefined): CheckStatus {\n switch (s) {\n case ResultStatus.Passed:\n return CheckStatus.NotAFinding;\n case ResultStatus.Failed:\n case ResultStatus.Error:\n return CheckStatus.Open;\n case ResultStatus.NotApplicable:\n return CheckStatus.NotApplicable;\n default:\n return CheckStatus.NotReviewed;\n }\n}\n","import { parseXmlWithArrays, buildXml } from '@mitre/hdf-utilities';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { parseStatus, statusToCkl } from './status.js';\n\nconst ARRAY_TAGS = ['iSTIG', 'VULN', 'STIG_DATA', 'SI_DATA'];\n\n// attributeNamePrefix is set to a token none of our element keys use, so every\n// plain key renders as a child ELEMENT (with the hdf-utilities default of '',\n// fast-xml-parser would emit scalar leaves like STATUS/HOST_NAME as attributes,\n// producing malformed CKL).\nconst BUILD_OPTIONS = {\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n ignoreAttributes: false,\n format: true,\n indentBy: '\\t',\n suppressEmptyNode: false,\n};\n\ninterface CklParsed {\n CHECKLIST?: {\n ASSET?: Record<string, unknown>;\n STIGS?: { iSTIG?: IStigEl[] };\n };\n}\ninterface IStigEl {\n STIG_INFO?: { SI_DATA?: { SID_NAME?: string; SID_DATA?: unknown }[] };\n VULN?: VulnEl[];\n}\ninterface VulnEl {\n STIG_DATA?: { VULN_ATTRIBUTE?: string; ATTRIBUTE_DATA?: unknown }[];\n STATUS?: string;\n FINDING_DETAILS?: unknown;\n COMMENTS?: unknown;\n}\n\nfunction str(v: unknown): string {\n return v === undefined || v === null ? '' : String(v);\n}\n\nconst VULN_ATTR_ORDER = [\n 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver', 'Rule_Title',\n 'Vuln_Discuss', 'IA_Controls', 'Check_Content', 'Fix_Text', 'False_Positives',\n 'False_Negatives', 'Documentable', 'Mitigations', 'Potential_Impact',\n 'Third_Party_Tools', 'Mitigation_Control', 'Responsibility',\n 'Security_Override_Guidance', 'Check_Content_Ref', 'Weight', 'Class', 'STIG_UUID',\n];\nconst CORE_VULN_ATTR = new Set([\n 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver', 'Rule_Title',\n 'Vuln_Discuss', 'Check_Content', 'Fix_Text', 'Weight', 'Class',\n]);\n\n/** Parse CKL XML into the format-neutral Checklist model. */\nexport function parseCkl(input: string): Checklist {\n // processEntities decodes XML entities (&lt; &gt; &amp; …) so CKL text matches\n // Go's encoding/xml (which decodes by default); without it, entity-encoded\n // markup like \"&lt;b&gt;\" survives and stripHTML in checklistToHdf can't act\n // on it — diverging from the Go output.\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS, {\n processEntities: true,\n }) as CklParsed;\n const checklist = parsed.CHECKLIST;\n const istigs = checklist?.STIGS?.iSTIG;\n if (!checklist || !istigs || istigs.length === 0) {\n throw new Error('parse ckl: no <iSTIG> blocks found (not a CKL document?)');\n }\n\n const a = checklist.ASSET ?? {};\n const asset: Asset = {\n role: str(a['ROLE']),\n assetType: str(a['ASSET_TYPE']),\n marking: str(a['MARKING']),\n hostName: str(a['HOST_NAME']),\n hostIP: str(a['HOST_IP']),\n hostMAC: str(a['HOST_MAC']),\n hostFQDN: str(a['HOST_FQDN']),\n targetComment: str(a['TARGET_COMMENT']),\n techArea: str(a['TECH_AREA']),\n targetKey: str(a['TARGET_KEY']),\n webOrDatabase: str(a['WEB_OR_DATABASE']) === 'true',\n webDBSite: str(a['WEB_DB_SITE']),\n webDBInstance: str(a['WEB_DB_INSTANCE']),\n };\n\n const stigs: Stig[] = istigs.map((is, i) => {\n // An iSTIG with no rules would yield requirements: [] downstream, which\n // violates the HDF schema's requirements.minItems=1. Reject as malformed,\n // consistent with the no-<iSTIG> guard above.\n const vulns = is.VULN ?? [];\n if (vulns.length === 0) {\n throw new Error(`parse ckl: <iSTIG> block ${i + 1} contains no <VULN> rules`);\n }\n const si = is.STIG_INFO?.SI_DATA ?? [];\n const siVal = (name: string): string =>\n str(si.find((d) => d.SID_NAME === name)?.SID_DATA);\n return {\n stigID: siVal('stigid'),\n title: siVal('title'),\n version: siVal('version'),\n releaseInfo: siVal('releaseinfo'),\n uuid: siVal('uuid'),\n classification: siVal('classification'),\n vulns: vulns.map(cklVulnToModel),\n };\n });\n\n return { format: 'ckl', asset, stigs };\n}\n\nfunction cklVulnToModel(v: VulnEl): Vuln {\n const data = v.STIG_DATA ?? [];\n const attr = (name: string): string =>\n str(data.find((sd) => sd.VULN_ATTRIBUTE === name)?.ATTRIBUTE_DATA);\n const ccis: string[] = [];\n const extra: Record<string, string> = {};\n const promoted = new Set([\n 'CCI_REF', 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver',\n 'Rule_Title', 'Vuln_Discuss', 'Check_Content', 'Fix_Text', 'Weight', 'Class',\n ]);\n for (const sd of data) {\n const name = sd.VULN_ATTRIBUTE ?? '';\n const val = str(sd.ATTRIBUTE_DATA);\n if (name === 'CCI_REF') {\n if (val) ccis.push(val);\n } else if (!promoted.has(name) && val) {\n extra[name] = val;\n }\n }\n return {\n vulnNum: attr('Vuln_Num'),\n ruleID: attr('Rule_ID'),\n ruleVer: attr('Rule_Ver'),\n groupTitle: attr('Group_Title'),\n severity: attr('Severity'),\n ruleTitle: attr('Rule_Title'),\n vulnDiscuss: attr('Vuln_Discuss'),\n checkContent: attr('Check_Content'),\n fixText: attr('Fix_Text'),\n weight: attr('Weight'),\n classification: attr('Class'),\n ccis,\n status: parseStatus(v.STATUS),\n findingDetails: str(v.FINDING_DETAILS),\n comments: str(v.COMMENTS),\n extra,\n };\n}\n\n/** Serialize the Checklist model to CKL XML (with declaration). */\nexport function serializeCkl(cl: Checklist): string {\n const xmlObj = {\n CHECKLIST: {\n ASSET: {\n ROLE: cl.asset.role || 'None',\n ASSET_TYPE: cl.asset.assetType || 'Computing',\n HOST_NAME: cl.asset.hostName ?? '',\n HOST_IP: cl.asset.hostIP ?? '',\n HOST_MAC: cl.asset.hostMAC ?? '',\n HOST_FQDN: cl.asset.hostFQDN ?? '',\n TARGET_COMMENT: cl.asset.targetComment ?? '',\n TECH_AREA: cl.asset.techArea ?? '',\n TARGET_KEY: cl.asset.targetKey ?? '',\n WEB_OR_DATABASE: cl.asset.webOrDatabase ? 'true' : 'false',\n WEB_DB_SITE: cl.asset.webDBSite ?? '',\n WEB_DB_INSTANCE: cl.asset.webDBInstance ?? '',\n },\n STIGS: {\n iSTIG: cl.stigs.map((s) => ({\n STIG_INFO: { SI_DATA: stigInfoSiData(s) },\n VULN: s.vulns.map(modelVulnToCkl),\n })),\n },\n },\n };\n const body = buildXml(xmlObj, BUILD_OPTIONS);\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${body}`;\n}\n\nfunction stigInfoSiData(s: Stig): { SID_NAME: string; SID_DATA: string }[] {\n return [\n { name: 'version', data: s.version },\n { name: 'classification', data: s.classification },\n { name: 'stigid', data: s.stigID },\n { name: 'releaseinfo', data: s.releaseInfo },\n { name: 'title', data: s.title },\n { name: 'uuid', data: s.uuid },\n ]\n .filter((p) => p.data)\n .map((p) => ({ SID_NAME: p.name, SID_DATA: p.data as string }));\n}\n\nfunction modelVulnToCkl(v: Vuln): {\n STIG_DATA: { VULN_ATTRIBUTE: string; ATTRIBUTE_DATA: string }[];\n STATUS: string;\n FINDING_DETAILS: string;\n COMMENTS: string;\n} {\n const typed: Record<string, string> = {\n Vuln_Num: v.vulnNum,\n Severity: v.severity ?? '',\n Group_Title: v.groupTitle ?? '',\n Rule_ID: v.ruleID ?? '',\n Rule_Ver: v.ruleVer ?? '',\n Rule_Title: v.ruleTitle ?? '',\n Vuln_Discuss: v.vulnDiscuss ?? '',\n Check_Content: v.checkContent ?? '',\n Fix_Text: v.fixText ?? '',\n Weight: v.weight || '10.0',\n Class: v.classification || 'Unclass',\n };\n const stigData: { VULN_ATTRIBUTE: string; ATTRIBUTE_DATA: string }[] = [];\n for (const name of VULN_ATTR_ORDER) {\n const val = typed[name] ?? v.extra?.[name] ?? '';\n if (!val && !CORE_VULN_ATTR.has(name)) continue;\n stigData.push({ VULN_ATTRIBUTE: name, ATTRIBUTE_DATA: val });\n }\n for (const cci of v.ccis) {\n stigData.push({ VULN_ATTRIBUTE: 'CCI_REF', ATTRIBUTE_DATA: cci });\n }\n return {\n STIG_DATA: stigData,\n STATUS: statusToCkl(v.status),\n FINDING_DETAILS: v.findingDetails ?? '',\n COMMENTS: v.comments ?? '',\n };\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { parseStatus, statusToCklb } from './status.js';\n\ninterface CklbDoc {\n title?: string;\n cklb_version?: string;\n target_data?: CklbTarget;\n stigs?: CklbStig[];\n}\ninterface CklbTarget {\n target_type?: string;\n host_name?: string;\n ip_address?: string;\n mac_address?: string;\n fqdn?: string;\n comments?: string;\n role?: string;\n is_web_database?: boolean;\n technology_area?: string;\n web_db_site?: string;\n web_db_instance?: string;\n classification?: string;\n}\ninterface CklbStig {\n stig_name?: string;\n display_name?: string;\n stig_id?: string;\n release_info?: string;\n version?: string;\n uuid?: string;\n reference_identifier?: string;\n rules?: CklbRule[];\n}\ninterface CklbRule {\n group_id?: string;\n group_title?: string;\n rule_id?: string;\n rule_version?: string;\n rule_title?: string;\n severity?: string;\n weight?: string;\n check_content?: string;\n fix_text?: string;\n discussion?: string;\n classification?: string;\n ccis?: string[];\n legacy_ids?: string[];\n srg_id?: string;\n status?: string;\n comments?: string;\n finding_details?: string;\n third_party_tools?: string;\n}\n\n/** Parse CKLB JSON into the format-neutral Checklist model. */\nexport function parseCklb(input: string): Checklist {\n const doc = parseJSON<CklbDoc>(input);\n if (!doc || !Array.isArray(doc.stigs) || doc.stigs.length === 0) {\n throw new Error('parse cklb: no stigs[] found (not a CKLB document?)');\n }\n const t = doc.target_data ?? {};\n const asset: Asset = {\n role: nz(t.role),\n assetType: nz(t.target_type),\n hostName: nz(t.host_name),\n hostIP: nz(t.ip_address),\n hostMAC: nz(t.mac_address),\n hostFQDN: nz(t.fqdn),\n targetComment: nz(t.comments),\n webOrDatabase: t.is_web_database === true,\n webDBSite: nz(t.web_db_site),\n webDBInstance: nz(t.web_db_instance),\n techArea: nz(t.technology_area),\n classification: nz(t.classification),\n };\n\n const stigs: Stig[] = doc.stigs.map((s, i) => {\n // A stig with no rules would yield requirements: [] downstream, which\n // violates the HDF schema's requirements.minItems=1. Reject as malformed,\n // consistent with the empty-stigs[] guard above.\n const rules = s.rules ?? [];\n if (rules.length === 0) {\n throw new Error(`parse cklb: stigs[${i}] contains no rules[]`);\n }\n return {\n stigID: nz(s.stig_id),\n title: nz(s.stig_name) || nz(s.display_name),\n displayName: nz(s.display_name),\n version: nz(s.version),\n releaseInfo: nz(s.release_info),\n uuid: nz(s.uuid),\n referenceIdentifier: nz(s.reference_identifier),\n vulns: rules.map(cklbRuleToModel),\n };\n });\n\n return { format: 'cklb', cklbVersion: nz(doc.cklb_version), asset, stigs };\n}\n\n/** Coerce a possibly-null/non-string JSON value to string | undefined.\n * Real STIG Viewer CKLB output uses null for unset fields (e.g.\n * target_data.classification: null); the model expects string | undefined. */\nfunction nz(v: unknown): string | undefined {\n return typeof v === 'string' ? v : undefined;\n}\n\nfunction cklbRuleToModel(r: CklbRule): Vuln {\n const extra: Record<string, string> = {};\n if (r.third_party_tools) extra['Third_Party_Tools'] = r.third_party_tools;\n if (r.srg_id) extra['SRG_ID'] = r.srg_id;\n return {\n vulnNum: nz(r.group_id) ?? '',\n ruleID: nz(r.rule_id),\n ruleVer: nz(r.rule_version),\n groupID: nz(r.group_id),\n groupTitle: nz(r.group_title),\n severity: nz(r.severity),\n ruleTitle: nz(r.rule_title),\n vulnDiscuss: nz(r.discussion),\n checkContent: nz(r.check_content),\n fixText: nz(r.fix_text),\n weight: nz(r.weight),\n classification: nz(r.classification),\n ccis: Array.isArray(r.ccis) ? r.ccis.filter((c): c is string => typeof c === 'string') : [],\n legacyIDs: r.legacy_ids,\n status: parseStatus(r.status),\n findingDetails: nz(r.finding_details),\n comments: nz(r.comments),\n extra,\n };\n}\n\n/** Serialize the Checklist model to CKLB JSON. */\nexport function serializeCklb(cl: Checklist): string {\n const doc: CklbDoc & { active: boolean; has_path: boolean } = {\n title: cklbTitle(cl),\n cklb_version: cl.cklbVersion || '1.0',\n active: false,\n // has_path is a required top-level key in real STIG Viewer CKLB output;\n // the Go serializer always emits it, so emit it here for parity.\n has_path: false,\n target_data: {\n target_type: cl.asset.assetType || 'Computing',\n host_name: cl.asset.hostName ?? '',\n ip_address: cl.asset.hostIP ?? '',\n mac_address: cl.asset.hostMAC ?? '',\n fqdn: cl.asset.hostFQDN ?? '',\n comments: cl.asset.targetComment ?? '',\n role: cl.asset.role || 'None',\n is_web_database: cl.asset.webOrDatabase ?? false,\n technology_area: cl.asset.techArea ?? '',\n web_db_site: cl.asset.webDBSite ?? '',\n web_db_instance: cl.asset.webDBInstance ?? '',\n ...(cl.asset.classification ? { classification: cl.asset.classification } : {}),\n },\n stigs: cl.stigs.map((s) => ({\n stig_name: s.title ?? '',\n display_name: s.displayName || s.title || '',\n stig_id: s.stigID ?? '',\n release_info: s.releaseInfo ?? '',\n version: s.version ?? '',\n uuid: s.uuid ?? '',\n ...(s.referenceIdentifier ? { reference_identifier: s.referenceIdentifier } : {}),\n rules: s.vulns.map((v) => ({\n group_id: v.groupID || v.vulnNum,\n group_title: v.groupTitle ?? '',\n rule_id: v.ruleID ?? '',\n rule_version: v.ruleVer ?? '',\n rule_title: v.ruleTitle ?? '',\n severity: v.severity ?? '',\n weight: v.weight || '10.0',\n check_content: v.checkContent ?? '',\n fix_text: v.fixText ?? '',\n discussion: v.vulnDiscuss ?? '',\n ccis: v.ccis,\n ...(v.legacyIDs && v.legacyIDs.length ? { legacy_ids: v.legacyIDs } : {}),\n status: statusToCklb(v.status),\n comments: v.comments ?? '',\n finding_details: v.findingDetails ?? '',\n ...(v.extra?.['Third_Party_Tools'] ? { third_party_tools: v.extra['Third_Party_Tools'] } : {}),\n })),\n })),\n };\n return JSON.stringify(doc, null, 2);\n}\n\nfunction cklbTitle(cl: Checklist): string {\n return cl.stigs[0]?.title || 'STIG Checklist';\n}\n","import type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Component,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n Severity,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport { getCCINistMappings } from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, stripHTML } from '../converterutil.js';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { statusToHdf } from './status.js';\n\nconst CONVERTER_VERSION = '1.0.0';\n\n/**\n * Map the format-neutral Checklist model to an HDF Results object.\n * controlType is derived per-Vuln from CCI->NIST; verificationMethod and\n * applicability are omitted (the checklist format cannot substantiate them).\n * Original-format metadata is stashed in extensions/tags for round-trip.\n */\nexport function checklistToHdf(cl: Checklist, resultsChecksum: Checksum, generatorName: string): HDFResults {\n // Checklists carry no per-finding timestamp; use one conversion-time value\n // for every result's startTime and the document timestamp.\n const scanTime = new Date();\n const baselines = cl.stigs.map((s) => stigToBaseline(s, resultsChecksum, scanTime));\n\n const hdf: HDFResults = {\n baselines,\n generator: { name: generatorName, version: CONVERTER_VERSION },\n tool: { name: 'DISA STIG Viewer', format: cl.format === 'cklb' ? 'CKLB' : 'CKL' },\n timestamp: scanTime,\n };\n\n const component = assetToComponent(cl.asset);\n if (component) hdf.components = [component];\n\n const ext = rootExtensions(cl);\n if (Object.keys(ext).length > 0) hdf.extensions = ext;\n return hdf;\n}\n\nfunction stigToBaseline(s: Stig, resultsChecksum: Checksum, scanTime: Date): EvaluatedBaseline {\n const requirements = s.vulns.map((v) => vulnToRequirement(v, scanTime));\n const baseline = createMinimalBaseline('STIG Checklist Scan', requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n if (s.title) baseline.title = s.title;\n if (s.version) baseline.version = s.version;\n const ext = baselineExtensions(s);\n if (Object.keys(ext).length > 0) baseline.extensions = ext;\n return baseline;\n}\n\nfunction vulnToRequirement(v: Vuln, scanTime: Date): EvaluatedRequirement {\n const severity = (v.severity ?? '').toLowerCase();\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n // stripHTML for parity with the Go mapping (CKL text can embed markup).\n const descriptions: Description[] = [\n { label: 'default', data: stripHTML(v.vulnDiscuss ?? '') },\n ];\n if (v.checkContent) descriptions.push({ label: 'check', data: stripHTML(v.checkContent) });\n if (v.fixText) descriptions.push({ label: 'fix', data: stripHTML(v.fixText) });\n\n const message = [v.findingDetails, v.comments]\n .map((s) => (s ?? '').trim())\n .filter(Boolean)\n .join('\\n\\n');\n const result = createResult(statusToHdf(v.status), message, {\n codeDesc: `STIG rule ${v.ruleVer ?? ''}`,\n startTime: scanTime,\n });\n\n const tags: Record<string, unknown> = {};\n let nistTags: string[] = [];\n if (v.ccis.length > 0) {\n tags['cci'] = v.ccis;\n nistTags = [...new Set(v.ccis.flatMap((c) => getCCINistMappings(c) ?? []))].sort();\n tags['nist'] = nistTags;\n } else {\n tags['nist'] = [];\n }\n setIf(tags, 'rid', v.ruleID);\n setIf(tags, 'stig_id', v.ruleVer);\n setIf(tags, 'gtitle', v.groupTitle);\n setIf(tags, 'group_id', v.groupID);\n setIf(tags, 'weight', v.weight);\n setIf(tags, 'severity', severity);\n if (v.legacyIDs && v.legacyIDs.length) tags['legacy_ids'] = v.legacyIDs;\n if (v.extra && Object.keys(v.extra).length > 0) tags['cklMetadata'] = { ...v.extra };\n\n const req = createRequirement(\n v.vulnNum,\n v.ruleTitle ?? v.vulnNum,\n descriptions,\n impact,\n [result],\n { tags }\n ) as EvaluatedRequirement;\n if (severity) req.severity = severity as Severity;\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) req.controlType = controlType;\n return req;\n}\n\nfunction assetToComponent(a: Asset): Component | undefined {\n if (!a.hostName && !a.hostIP && !a.hostFQDN) return undefined;\n // Name falls back to FQDN then IP so the component always has a usable\n // identity (a checklist may carry only HOST_IP / HOST_FQDN).\n const name = a.hostName || a.hostFQDN || a.hostIP || '';\n const c: Component = { name, type: TargetType.Host };\n if (a.hostIP) c.ipAddress = a.hostIP;\n if (a.hostFQDN) c.fqdn = a.hostFQDN;\n if (a.hostMAC) c.macAddress = a.hostMAC;\n return c;\n}\n\nfunction rootExtensions(cl: Checklist): Record<string, unknown> {\n const ext: Record<string, unknown> = { checklistFormat: cl.format || 'ckl' };\n if (cl.cklbVersion) ext['cklbVersion'] = cl.cklbVersion;\n const ax: Record<string, unknown> = {};\n setIf(ax, 'role', cl.asset.role);\n setIf(ax, 'assetType', cl.asset.assetType);\n setIf(ax, 'marking', cl.asset.marking);\n setIf(ax, 'targetKey', cl.asset.targetKey);\n setIf(ax, 'techArea', cl.asset.techArea);\n setIf(ax, 'targetComment', cl.asset.targetComment);\n setIf(ax, 'webDbSite', cl.asset.webDBSite);\n setIf(ax, 'webDbInstance', cl.asset.webDBInstance);\n setIf(ax, 'classification', cl.asset.classification);\n if (cl.asset.webOrDatabase) ax['webOrDatabase'] = true;\n if (Object.keys(ax).length > 0) ext['assetExtras'] = ax;\n return ext;\n}\n\nfunction baselineExtensions(s: Stig): Record<string, unknown> {\n const ext: Record<string, unknown> = {};\n setIf(ext, 'stigid', s.stigID);\n setIf(ext, 'uuid', s.uuid);\n setIf(ext, 'releaseInfo', s.releaseInfo);\n setIf(ext, 'displayName', s.displayName);\n setIf(ext, 'referenceIdentifier', s.referenceIdentifier);\n setIf(ext, 'classification', s.classification);\n return ext;\n}\n\nfunction setIf(m: Record<string, unknown>, key: string, val: string | undefined): void {\n if (val) m[key] = val;\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Description,\n} from '@mitre/hdf-schema';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { statusFromHdf } from './status.js';\n\n/**\n * Map HDF Results back to the format-neutral Checklist model. When the HDF\n * carries checklist passthrough (extensions/tags from checklistToHdf), the\n * original fields are reproduced losslessly; otherwise required checklist\n * fields are synthesized best-effort so any HDF yields a valid checklist.\n */\nexport function hdfToChecklist(input: string): Checklist {\n const hdf = parseJSON<HDFResults>(input);\n if (!hdf || !Array.isArray(hdf.baselines) || hdf.baselines.length === 0) {\n throw new Error('hdf to checklist: HDF has no baselines');\n }\n\n const ext = (hdf.extensions ?? {}) as Record<string, unknown>;\n const format = strVal(ext, 'checklistFormat') || 'ckl';\n const cklbVersion = strVal(ext, 'cklbVersion');\n\n const asset = buildAsset(hdf, ext);\n const stigs = hdf.baselines.map(baselineToStig);\n\n return { format, cklbVersion: cklbVersion || undefined, asset, stigs };\n}\n\nfunction buildAsset(hdf: HDFResults, ext: Record<string, unknown>): Asset {\n const asset: Asset = {};\n const comp = hdf.components?.[0];\n if (comp) {\n asset.hostName = comp.name;\n asset.hostIP = comp.ipAddress;\n asset.hostFQDN = comp.fqdn;\n asset.hostMAC = comp.macAddress;\n }\n const ax = ext['assetExtras'];\n if (ax && typeof ax === 'object') {\n const a = ax as Record<string, unknown>;\n asset.role = strVal(a, 'role');\n asset.assetType = strVal(a, 'assetType');\n asset.marking = strVal(a, 'marking');\n asset.targetKey = strVal(a, 'targetKey');\n asset.techArea = strVal(a, 'techArea');\n asset.targetComment = strVal(a, 'targetComment');\n asset.webDBSite = strVal(a, 'webDbSite');\n asset.webDBInstance = strVal(a, 'webDbInstance');\n asset.classification = strVal(a, 'classification');\n asset.webOrDatabase = a['webOrDatabase'] === true;\n }\n return asset;\n}\n\nfunction baselineToStig(bl: EvaluatedBaseline): Stig {\n const ext = (bl.extensions ?? {}) as Record<string, unknown>;\n const stigID = strVal(ext, 'stigid') || bl.title || '';\n return {\n stigID,\n title: bl.title,\n version: bl.version,\n uuid: strVal(ext, 'uuid'),\n releaseInfo: strVal(ext, 'releaseInfo'),\n displayName: strVal(ext, 'displayName'),\n referenceIdentifier: strVal(ext, 'referenceIdentifier'),\n classification: strVal(ext, 'classification'),\n vulns: bl.requirements.map(requirementToVuln),\n };\n}\n\nfunction requirementToVuln(req: EvaluatedRequirement): Vuln {\n const tags = (req.tags ?? {}) as Record<string, unknown>;\n const descs = req.descriptions ?? [];\n return {\n vulnNum: req.id,\n ruleID: strVal(tags, 'rid'),\n ruleVer: strVal(tags, 'stig_id'),\n groupID: strVal(tags, 'group_id') || req.id,\n groupTitle: strVal(tags, 'gtitle'),\n ruleTitle: req.title,\n weight: strVal(tags, 'weight'),\n severity: resolveSeverity(req, tags),\n vulnDiscuss: descData(descs, 'default'),\n checkContent: descData(descs, 'check'),\n fixText: descData(descs, 'fix'),\n ccis: resolveCcis(tags),\n legacyIDs: strSlice(tags, 'legacy_ids'),\n status: statusFromHdf(req.results?.[0]?.status),\n findingDetails: req.results?.[0]?.message,\n extra: extractCklMetadata(tags),\n };\n}\n\nfunction resolveSeverity(req: EvaluatedRequirement, tags: Record<string, unknown>): string {\n const tagSev = strVal(tags, 'severity');\n if (tagSev) return tagSev;\n if (req.severity) return String(req.severity).toLowerCase();\n const i = req.impact ?? 0;\n if (i >= 0.7) return 'high';\n if (i >= 0.4) return 'medium';\n if (i > 0) return 'low';\n return '';\n}\n\nfunction resolveCcis(tags: Record<string, unknown>): string[] {\n const direct = strSlice(tags, 'cci');\n if (direct.length > 0) return direct;\n const nist = strSlice(tags, 'nist');\n if (nist.length > 0) {\n const ccis = nistToCci(nist);\n if (ccis.length > 0) return ccis;\n }\n return [];\n}\n\nfunction extractCklMetadata(tags: Record<string, unknown>): Record<string, string> | undefined {\n const meta = tags['cklMetadata'];\n if (!meta || typeof meta !== 'object') return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(meta as Record<string, unknown>)) {\n if (typeof v === 'string') out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction descData(descs: Description[], label: string): string {\n return descs.find((d) => d.label === label)?.data ?? '';\n}\n\nfunction strVal(m: Record<string, unknown>, key: string): string {\n const v = m[key];\n return typeof v === 'string' ? v : '';\n}\n\nfunction strSlice(m: Record<string, unknown>, key: string): string[] {\n const v = m[key];\n if (Array.isArray(v)) return v.filter((e): e is string => typeof e === 'string');\n return [];\n}\n","import type { Checksum } from '@mitre/hdf-schema';\nimport { inputChecksum, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport { parseCkl, checklistToHdf } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert a DISA STIG Viewer .ckl document to HDF Results JSON.\n *\n * Parsing and the HDF mapping live in the shared checklist module. v3.2\n * classification: controlType is derived per-VULN from CCI->NIST;\n * verificationMethod and applicability are omitted (the checklist format\n * cannot substantiate them — see the Go package doc and build-converter\n * skill Step 4d).\n */\nexport async function convertCklToHdf(input: string): Promise<string> {\n validateInputSize(input, 'ckl-to-hdf');\n const resultsChecksum: Checksum = await inputChecksum(input);\n const checklist = parseCkl(input);\n return JSON.stringify(checklistToHdf(checklist, resultsChecksum, 'ckl-to-hdf'), null, 2);\n}\n","import type { Checksum } from '@mitre/hdf-schema';\nimport { inputChecksum, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport { parseCklb, checklistToHdf } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert a DISA STIG Viewer 3.x .cklb document to HDF Results JSON.\n *\n * Parsing and the HDF mapping live in the shared checklist module. v3.2\n * classification: controlType is derived per-rule from CCI->NIST;\n * verificationMethod and applicability are omitted (the checklist format\n * cannot substantiate them — see the Go package doc and build-converter\n * skill Step 4d).\n */\nexport async function convertCklbToHdf(input: string): Promise<string> {\n validateInputSize(input, 'cklb-to-hdf');\n const resultsChecksum: Checksum = await inputChecksum(input);\n const checklist = parseCklb(input);\n return JSON.stringify(checklistToHdf(checklist, resultsChecksum, 'cklb-to-hdf'), null, 2);\n}\n","import { hdfToChecklist, serializeCkl } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert HDF Results JSON into a DISA STIG Viewer checklist (.ckl XML).\n *\n * This is a thin wrapper over the shared checklist module, mirroring the\n * hdf-to-csv reverse converter. It produces a STIG Viewer 2.x .ckl from ANY\n * HDF: when the HDF carries checklist passthrough (extensions/tags written by\n * a prior ckl/cklb-to-hdf conversion) the original fields are reproduced\n * losslessly; otherwise the required checklist fields are synthesized\n * best-effort (id->Vuln_Num, nist->CCI reverse, status reverse) with safe\n * defaults. Mirrors heimdall2 PR #4841.\n *\n * @param input HDF Results JSON string\n * @returns CKL XML string (with the `<?xml ...?>` header)\n */\nexport function convertHdfToCkl(input: string): string {\n return serializeCkl(hdfToChecklist(input));\n}\n","import { hdfToChecklist, serializeCklb } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert HDF Results JSON into a DISA STIG Viewer 3.x checklist (.cklb, JSON).\n *\n * The HDF->checklist mapping and CKLB serialization live in the shared\n * checklist module; this converter is a thin wrapper. Any HDF input produces a\n * valid CKLB: when the HDF carries checklist passthrough (it originated from a\n * CKL/CKLB via the reverse converters), the original fields are reproduced\n * losslessly; otherwise the required checklist fields are synthesized\n * best-effort from the HDF requirements, tags, and results.\n *\n * @param input HDF Results JSON string\n * @returns CKLB JSON string\n */\nexport function convertHdfToCklb(input: string): string {\n return serializeCklb(hdfToChecklist(input));\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n Ecosystem,\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Snyk JSON output structures\n * See https://docs.snyk.io/snyk-cli/commands/test for the full schema.\n */\ninterface SnykReport {\n ok: boolean;\n vulnerabilities: SnykVuln[];\n dependencyCount?: number;\n org?: string;\n packageManager?: string;\n summary?: string;\n projectName?: string;\n path?: string;\n}\n\ninterface SnykVuln {\n id: string;\n title: string;\n description: string;\n severity: string;\n cvssScore?: number;\n CVSSv3?: string;\n identifiers: SnykIdentifiers;\n language?: string;\n packageName?: string;\n moduleName?: string;\n version?: string;\n from: string[];\n upgradePath?: unknown[];\n fixedIn?: string[];\n exploit?: string;\n}\n\ninterface SnykIdentifiers {\n CVE?: string[];\n CWE?: string[];\n GHSA?: string[];\n}\n\n/**\n * Formats the \"from\" array as a human-readable dependency path.\n */\nfunction formatDependencyPath(from: string[]): string {\n if (!from || from.length === 0) {\n return 'Unknown dependency path';\n }\n return `From: [ ${from.join(', ')} ]`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of vulnerabilities sharing an ID.\n */\n/**\n * Map Snyk's `packageManager` value to an Affected_Package ecosystem.\n * Snyk reports values that don't always match PURL types one-to-one\n * (pip → pypi, rubygems → gem, yarn → npm). Unknown managers fall back\n * to `generic`.\n */\nfunction ecosystemFromSnykPackageManager(pm: string | undefined): Ecosystem {\n if (!pm) return Ecosystem.Generic;\n const lower = pm.toLowerCase();\n if (lower === 'pip' || lower === 'pip3') return Ecosystem.Pypi;\n if (lower === 'rubygems' || lower === 'bundler') return Ecosystem.Gem;\n if (lower === 'yarn' || lower === 'npm') return Ecosystem.Npm;\n return ecosystemFromPurlType(lower);\n}\n\n/** Synthesize a `pkg:<type>/<name>@<version>` PURL when the ecosystem\n * maps cleanly. Returns undefined for `generic` so we don't emit a\n * fake `pkg:generic/...` PURL that downstream tools can't dereference. */\nfunction synthesizePurl(ecosystem: Ecosystem, name: string, version: string): string | undefined {\n if (ecosystem === Ecosystem.Generic) return undefined;\n return `pkg:${ecosystem}/${name}@${version}`;\n}\n\nfunction buildRequirement(vulnID: string, vulns: SnykVuln[], scanTime: Date, packageManager?: string): EvaluatedRequirement {\n const rep = vulns[0]!;\n const cweIDs = rep.identifiers.CWE ?? [];\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweid'] = cweIDs;\n }\n if (rep.identifiers.CVE && rep.identifiers.CVE.length > 0) {\n tags['cveid'] = rep.identifiers.CVE;\n }\n if (rep.identifiers.GHSA && rep.identifiers.GHSA.length > 0) {\n tags['ghsaid'] = rep.identifiers.GHSA;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.description },\n ];\n\n const results = vulns.map(vuln =>\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatDependencyPath(vuln.from),\n startTime: scanTime,\n })\n );\n\n const req = createRequirement(\n vulnID,\n rep.title,\n descriptions,\n severityToImpact(rep.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const name = rep.packageName ?? rep.moduleName;\n const version = rep.version;\n if (name && version) {\n const ecosystem = ecosystemFromSnykPackageManager(packageManager);\n const pkg = buildAffectedPackage({\n name,\n version,\n ecosystem,\n purl: synthesizePurl(ecosystem, name, version),\n fixedInVersion: rep.fixedIn?.[0],\n });\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n }\n\n return req;\n}\n\n/**\n * Converts a single Snyk project report to an HDF baseline.\n */\nfunction convertSingleProject(\n report: SnykReport,\n resultsChecksum: Checksum,\n scanTime: Date\n): EvaluatedBaseline {\n // Group vulnerabilities by ID, preserving insertion order\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(report.vulnerabilities);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${report.vulnerabilities.length})`);\n }\n const groups = new Map<string, SnykVuln[]>();\n for (const vuln of limitedVulns) {\n const existing = groups.get(vuln.id);\n if (existing) {\n existing.push(vuln);\n } else {\n groups.set(vuln.id, [vuln]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [vulnID, vulns] of groups) {\n requirements.push(buildRequirement(vulnID, vulns, scanTime, report.packageManager));\n }\n\n if (requirements.length === 0) {\n const target = report.projectName ?? report.path ?? 'project';\n requirements.push(\n buildNoFindingsRequirement(\n 'snyk-no-findings',\n `Snyk scanned ${target} and reported zero vulnerable components.`,\n scanTime,\n ),\n );\n }\n\n const title = `Snyk Project: ${report.projectName ?? ''} Snyk Path: ${report.path ?? ''}`;\n\n return createMinimalBaseline(\n 'Snyk Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: report.summary,\n }\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Snyk output to HDF format.\n * Accepts both native Snyk JSON and SARIF format — SARIF input is detected\n * automatically and delegated to the shared SARIF converter.\n * Handles both single-project (object) and multi-project (array) input.\n *\n * @param input - Snyk JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertSnykToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('snyk: empty input');\n }\n validateInputSize(input, 'snyk');\n\n // Detect format: if SARIF, delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Snyk native JSON carries no scan timestamp, so use one conversion-time\n // value for every result's startTime and the document timestamp.\n const scanTime = new Date();\n\n const parsed = parseJSON<SnykReport | SnykReport[]>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('snyk: invalid JSON');\n }\n\n let baselines: EvaluatedBaseline[];\n let targetName: string;\n\n if (Array.isArray(parsed)) {\n // Multi-project output\n const { items: limitedProjects, truncated: truncatedProjects } = limitArray(parsed);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedProjects) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedProjects.length} project items (original: ${parsed.length})`);\n }\n baselines = limitedProjects.map(report => convertSingleProject(report, resultsChecksum, scanTime));\n targetName = limitedProjects[0]?.projectName ?? limitedProjects[0]?.path ?? '';\n } else {\n // Single project\n baselines = [convertSingleProject(parsed, resultsChecksum, scanTime)];\n targetName = parsed.projectName ?? parsed.path ?? '';\n }\n\n return buildHdfResults({\n generatorName: 'snyk-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Snyk',\n toolFormat: 'JSON',\n baselines,\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: scanTime,\n });\n}\n","import {\n type AffectedPackage,\n type Checksum,\n TargetType,\n createMinimalBaseline,\n type Cvss,\n CVSSSeverity,\n Ecosystem,\n type Epss,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type Kev,\n type RequirementResult,\n ResultStatus,\n VerificationMethodEnum,\n Version as CvssVersion,\n} from '@mitre/hdf-schema';\nimport {nistToCci, DEFAULT_STATIC_ANALYSIS_NIST_TAGS} from '@mitre/hdf-mappings';\nimport {cvssScoreToSeverity, parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {inputChecksum, buildNistCciTags, buildNoFindingsRequirement, deriveControlTypeFromTags, limitArray, validateInputSize, buildHdfResults} from '../../../shared/typescript/converterutil.js';\n\n// Input types for Grype JSON\n\ninterface GrypeReport {\n descriptor: GrypeDescriptor;\n source: GrypeSource;\n distro?: GrypeDistro;\n matches: GrypeMatch[];\n ignoredMatches?: GrypeMatch[];\n}\n\ninterface GrypeDescriptor {\n name: string;\n version: string;\n timestamp?: string;\n configuration?: unknown;\n}\n\ninterface GrypeSource {\n target: {\n userInput: string;\n };\n}\n\ninterface GrypeDistro {\n name?: string;\n version?: string;\n idLike?: string[];\n}\n\ninterface GrypeMatch {\n vulnerability: GrypeVulnerability;\n relatedVulnerabilities?: GrypeRelatedVulnerability[];\n matchDetails: GrypeMatchDetail[];\n artifact: GrypeArtifact;\n}\n\ninterface GrypeVulnerability {\n id: string;\n dataSource?: string;\n namespace?: string;\n severity?: string;\n urls?: string[];\n description?: string;\n cvss?: GrypeCVSS[];\n fix?: GrypeFix;\n advisories?: unknown[];\n cwe?: string[];\n epss?: GrypeEpssEntry[];\n kev?: GrypeKev;\n}\n\ninterface GrypeEpssEntry {\n cve?: string;\n epss?: number;\n percentile?: number;\n date?: string;\n}\n\ninterface GrypeKev {\n inKev?: boolean;\n dateAdded?: string;\n dueDate?: string;\n notes?: string;\n}\n\ninterface GrypeRelatedVulnerability {\n id: string;\n dataSource?: string;\n namespace?: string;\n severity?: string;\n urls?: string[];\n description?: string;\n cvss?: GrypeCVSS[];\n}\n\ninterface GrypeCVSS {\n source?: string;\n type?: string;\n version?: string;\n vector?: string;\n metrics?: {\n baseScore?: number;\n exploitabilityScore?: number;\n impactScore?: number;\n };\n vendorMetadata?: unknown;\n}\n\ninterface GrypeFix {\n versions?: string[];\n state?: string; // \"fixed\", \"unknown\", \"wontfix\", \"not-fixed\"\n}\n\ninterface GrypeMatchDetail {\n type?: string; // \"exact-direct-match\", \"exact-indirect-match\", \"cpe-match\"\n matcher?: string;\n searchedBy?: Record<string, unknown>;\n found?: Record<string, unknown>;\n}\n\ninterface GrypeArtifact {\n id?: string;\n name: string;\n version: string;\n type?: string; // \"apk\", \"rpm\", \"deb\", \"npm\", \"python\", etc.\n locations?: GrypeLocation[];\n licenses?: string[];\n language?: string;\n cpes?: string[];\n purl?: string;\n upstreams?: unknown[];\n metadata?: unknown;\n}\n\ninterface GrypeLocation {\n path?: string;\n layerID?: string;\n}\n\n// Severity to impact mapping\nconst IMPACT_MAPPING: Map<string, number> = new Map([\n ['critical', 0.9],\n ['high', 0.7],\n ['medium', 0.5],\n ['low', 0.3],\n ['negligible', 0.0],\n ['unknown', 0.5],\n]);\n\n\nfunction getImpact(severity?: string): number {\n if (!severity) {\n return 0.5; // default for unknown\n }\n return IMPACT_MAPPING.get(severity.toLowerCase()) ?? 0.5;\n}\n\nfunction isNegligibleOrUnknown(severity?: string): boolean {\n if (!severity) {\n return true;\n }\n const lower = severity.toLowerCase();\n return lower === 'negligible' || lower === 'unknown';\n}\n\nfunction getDescription(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string {\n // Use primary vulnerability description if available\n if (vuln.description) {\n return vuln.description;\n }\n\n // Fall back to related vulnerability with matching ID\n if (relatedVulns) {\n for (const related of relatedVulns) {\n if (related.id === vuln.id && related.description) {\n return related.description;\n }\n }\n }\n\n return `Vulnerability ${vuln.id}`;\n}\n\nfunction getFixInfo(fix?: GrypeFix): string {\n if (!fix || !fix.state) {\n return 'vulnerability is not known to be fixed in any versions';\n }\n\n if (fix.state === 'fixed' && fix.versions && fix.versions.length > 0) {\n return `vulnerability is ${fix.state} for versions ${fix.versions.join(', ')}`;\n }\n\n return `vulnerability is ${fix.state}`;\n}\n\nfunction getCVSSInfo(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string {\n const cvssData: Record<string, unknown> = {};\n\n // Collect CVSS from primary vulnerability\n if (vuln.cvss && vuln.cvss.length > 0) {\n cvssData.primary = vuln.cvss;\n }\n\n // Collect CVSS from related vulnerabilities\n if (relatedVulns && relatedVulns.length > 0) {\n cvssData.related = relatedVulns\n .filter(r => r.cvss && r.cvss.length > 0)\n .map(r => ({\n id: r.id,\n dataSource: r.dataSource,\n cvss: r.cvss,\n }));\n }\n\n return JSON.stringify(cvssData);\n}\n\nfunction getReferences(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string[] {\n const refs = new Set<string>();\n\n // Add URLs from primary vulnerability\n if (vuln.urls) {\n for (const url of vuln.urls) {\n refs.add(url);\n }\n }\n\n // Add URLs from related vulnerabilities\n if (relatedVulns) {\n for (const related of relatedVulns) {\n if (related.urls) {\n for (const url of related.urls) {\n refs.add(url);\n }\n }\n }\n }\n\n return Array.from(refs);\n}\n\nfunction buildCodeDesc(match: GrypeMatch): string {\n const parts: string[] = [];\n\n // Package info\n parts.push(`Package: ${match.artifact.name}@${match.artifact.version}`);\n\n // Package type if available\n if (match.artifact.type) {\n parts.push(`Type: ${match.artifact.type}`);\n }\n\n // Location if available\n if (match.artifact.locations && match.artifact.locations.length > 0) {\n const location = match.artifact.locations[0]!;\n if (location.path) {\n parts.push(`Location: ${location.path}`);\n }\n }\n\n // Match type if available\n if (match.matchDetails && match.matchDetails.length > 0) {\n const matchType = match.matchDetails[0]!.type;\n if (matchType) {\n parts.push(`Match Type: ${matchType}`);\n }\n }\n\n return parts.join(' | ');\n}\n\n// cvssVersionToSchema maps Grype's CVSS version string (\"2.0\"/\"3.0\"/\"3.1\"/\"4.0\")\n// to the schema Version enum. Unrecognized values default to \"3.1\".\nfunction cvssVersionToSchema(v?: string): CvssVersion {\n switch (v) {\n case '2.0': return CvssVersion.The20;\n case '3.0': return CvssVersion.The30;\n case '4.0': return CvssVersion.The40;\n default: return CvssVersion.The31;\n }\n}\n\n// cvssBandSeverity converts a CVSS base score to the schema CVSSSeverity enum\n// via hdf-utilities' band thresholds.\nfunction cvssBandSeverity(score: number): CVSSSeverity {\n switch (cvssScoreToSeverity(score)) {\n case 'critical': return CVSSSeverity.Critical;\n case 'high': return CVSSSeverity.High;\n case 'medium': return CVSSSeverity.Medium;\n case 'low': return CVSSSeverity.Low;\n default: return CVSSSeverity.None;\n }\n}\n\n// buildCvssEntries emits one schema Cvss entry per element of\n// vulnerability.cvss[]. Related-vulnerability CVSS arrays are NOT merged in;\n// the schema contract is \"one entry per source-CVE metric set\".\nfunction buildCvssEntries(vuln: GrypeVulnerability): Cvss[] | undefined {\n if (!vuln.cvss || vuln.cvss.length === 0) {\n return undefined;\n }\n const entries: Cvss[] = [];\n for (const c of vuln.cvss) {\n const entry: Cvss = {version: cvssVersionToSchema(c.version)};\n // Only emit base fields that are present: an empty baseVector fails the\n // schema pattern, and a missing baseScore must not be coerced to 0.\n if (c.vector) {\n entry.baseVector = c.vector;\n }\n const score = c.metrics?.baseScore;\n if (typeof score === 'number' && Number.isFinite(score)) {\n entry.baseScore = score;\n entry.baseSeverity = cvssBandSeverity(score);\n }\n if (vuln.id) {\n entry.source = vuln.id;\n }\n // An entry with neither vector nor score cannot satisfy the schema anyOf.\n if (entry.baseVector === undefined && entry.baseScore === undefined) {\n continue;\n }\n entries.push(entry);\n }\n return entries.length > 0 ? entries : undefined;\n}\n\n// mapGrypeTypeToEcosystem translates Grype artifact.type to schema Ecosystem.\n// Anything outside the schema's published enum (apk, binary, future types)\n// falls back to \"generic\".\nexport function mapGrypeTypeToEcosystem(grypeType?: string): Ecosystem {\n switch ((grypeType ?? '').toLowerCase()) {\n case 'rpm': return Ecosystem.RPM;\n case 'deb': return Ecosystem.Deb;\n case 'npm': return Ecosystem.Npm;\n case 'python': return Ecosystem.Pypi;\n case 'gem': return Ecosystem.Gem;\n case 'go-module': return Ecosystem.Go;\n case 'java-archive':\n case 'jenkins-plugin':\n return Ecosystem.Maven;\n case 'dotnet': return Ecosystem.Nuget;\n case 'rust-crate': return Ecosystem.Cargo;\n default: return Ecosystem.Generic;\n }\n}\n\n// buildAffectedPackages produces a single AffectedPackage from match.artifact.\n// First cpes[] element is taken (Grype lists alias-generator variants; the\n// first matches the package's canonical vendor:product identity).\nfunction buildAffectedPackages(match: GrypeMatch): AffectedPackage[] {\n const artifact = match.artifact;\n const pkg: AffectedPackage = {\n name: artifact.name,\n version: artifact.version,\n ecosystem: mapGrypeTypeToEcosystem(artifact.type),\n };\n if (artifact.cpes && artifact.cpes.length > 0 && artifact.cpes[0]) {\n pkg.cpe = artifact.cpes[0];\n }\n if (artifact.purl) {\n pkg.purl = artifact.purl;\n }\n const fix = match.vulnerability.fix;\n if (fix && fix.state === 'fixed' && fix.versions && fix.versions.length > 0 && fix.versions[0]) {\n pkg.fixedInVersion = fix.versions[0];\n }\n return [pkg];\n}\n\n// Valid canonical CWE-N identifier (MITRE catalog convention: no leading zeros).\nconst CWE_ID_PATTERN = /^CWE-[1-9]\\d*$/;\n\n// extractCwe filters Grype's vulnerability.cwe[] to valid CWE-N entries.\n// Malformed entries are dropped silently — the schema layer would reject them.\nfunction extractCwe(raw?: string[]): string[] | undefined {\n if (!raw || raw.length === 0) return undefined;\n const out = raw.filter(c => CWE_ID_PATTERN.test(c));\n return out.length === 0 ? undefined : out;\n}\n\n// buildEpss picks the most-recent entry from vulnerability.epss[]. Grype's\n// array is typically ordered newest-first; we trust that and take index 0.\nfunction buildEpss(entries?: GrypeEpssEntry[]): Epss | undefined {\n if (!entries || entries.length === 0) return undefined;\n const e = entries[0]!;\n if (!e.date) return undefined;\n return {\n score: e.epss ?? 0,\n percentile: e.percentile ?? 0,\n // format: date (YYYY-MM-DD) string; quicktype types it as Date.\n date: e.date as unknown as Date,\n };\n}\n\n// buildKev maps Grype's vulnerability.kev block to the schema Kev primitive.\nfunction buildKev(k?: GrypeKev): Kev | undefined {\n if (!k) return undefined;\n const out: Kev = {inKev: Boolean(k.inKev)};\n // format: date (YYYY-MM-DD) strings; quicktype types them as Date.\n if (k.dateAdded) out.dateAdded = k.dateAdded as unknown as Date;\n if (k.dueDate) out.dueDate = k.dueDate as unknown as Date;\n if (k.notes) out.notes = k.notes;\n return out;\n}\n\nfunction convertMatchToRequirement(match: GrypeMatch, isIgnored: boolean): EvaluatedRequirement {\n const vuln = match.vulnerability;\n const cveId = vuln.id;\n const severity = vuln.severity;\n const impact = getImpact(severity);\n const description = getDescription(vuln, match.relatedVulnerabilities);\n const fixInfo = getFixInfo(vuln.fix);\n const cvssInfo = getCVSSInfo(vuln, match.relatedVulnerabilities);\n const refs = getReferences(vuln, match.relatedVulnerabilities);\n\n // Determine status\n let status: ResultStatus;\n if (isIgnored) {\n status = ResultStatus.NotReviewed; // Ignored by configured rules\n } else if (isNegligibleOrUnknown(severity)) {\n status = ResultStatus.NotApplicable;\n } else {\n status = ResultStatus.Failed;\n }\n\n // Build result message\n const messageParts: string[] = [];\n if (isIgnored) {\n messageParts.push('This vulnerability was ignored by configured rules.');\n }\n if (isNegligibleOrUnknown(severity) && !isIgnored) {\n messageParts.push(\n 'Manual review required because a Grype rating severity is set to `negligible` or `unknown`.'\n );\n }\n messageParts.push(`Severity: ${severity || 'unknown'}`);\n messageParts.push(fixInfo);\n const message = messageParts.join(' ');\n\n // Build execution result\n const result: RequirementResult = {\n status,\n codeDesc: buildCodeDesc(match),\n message,\n startTime: new Date('0001-01-01T00:00:00Z'), // Go zero time format\n };\n\n // Get CCI mappings for NIST controls using curated mapping table\n const cciTags = nistToCci(DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n\n // Build tags object - only include cci if not empty\n const tags = buildNistCciTags(DEFAULT_STATIC_ANALYSIS_NIST_TAGS, cciTags);\n\n // Build requirement\n const requirement: EvaluatedRequirement = {\n id: isIgnored ? `Grype-Ignored-Match/${cveId}` : `Grype/${cveId}`,\n impact,\n results: [result],\n tags,\n descriptions: [\n {label: 'default', data: description},\n {label: 'fix', data: fixInfo},\n {label: 'check', data: cvssInfo},\n ],\n refs: refs.length > 0 ? refs.map(url => ({url})) : undefined,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n if (controlType !== undefined) {\n requirement.controlType = controlType;\n }\n\n // Structured CVE-ecosystem fields (omit when empty/absent so output stays\n // tight; the schema treats all five as optional).\n const cvss = buildCvssEntries(vuln);\n if (cvss) requirement.cvss = cvss;\n requirement.affectedPackages = buildAffectedPackages(match);\n const cwe = extractCwe(vuln.cwe);\n if (cwe) requirement.cwe = cwe;\n const epss = buildEpss(vuln.epss);\n if (epss) requirement.epss = epss;\n const kev = buildKev(vuln.kev);\n if (kev) requirement.kev = kev;\n\n return requirement;\n}\n\nexport async function convertGrypeToHdf(input: string): Promise<string> {\n validateInputSize(input, 'grype');\n // Calculate checksum of input data\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse Grype JSON\n const grypeData = parseJSON<GrypeReport>(input);\n\n // Build requirements from matches\n const requirements: EvaluatedRequirement[] = [];\n\n // Process regular matches\n if (grypeData.matches && grypeData.matches.length > 0) {\n const { items: limitedMatches, truncated: truncatedMatches } = limitArray(grypeData.matches);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedMatches) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedMatches.length} match items (original: ${grypeData.matches.length})`);\n }\n for (const match of limitedMatches) {\n requirements.push(convertMatchToRequirement(match, false));\n }\n }\n\n // Process ignored matches\n if (grypeData.ignoredMatches && grypeData.ignoredMatches.length > 0) {\n const { items: limitedIgnored, truncated: truncatedIgnored } = limitArray(grypeData.ignoredMatches);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIgnored) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIgnored.length} ignoredMatch items (original: ${grypeData.ignoredMatches.length})`);\n }\n for (const match of limitedIgnored) {\n requirements.push(convertMatchToRequirement(match, true));\n }\n }\n\n // Build baseline name from source\n const targetName = grypeData.source?.target?.userInput || 'Grype Scan';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'grype-no-findings',\n `Grype scanned ${targetName} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n // Create baseline\n const baseline: EvaluatedBaseline = createMinimalBaseline(targetName, requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n // Build HDF results\n return buildHdfResults({\n generatorName: grypeData.descriptor?.name || 'grype',\n converterVersion: grypeData.descriptor?.version || 'unknown',\n toolName: 'Grype',\n toolVersion: grypeData.descriptor?.version,\n baselines: [baseline],\n components: [{\n type: TargetType.Artifact,\n name: targetName,\n }],\n timestamp: (grypeData.descriptor?.timestamp ? parseTimestamp(grypeData.descriptor.timestamp) : null) ?? new Date(),\n });\n}\n","import { parseXmlWithArrays, cvssScoreToSeverity, parseTimestamp } from '@mitre/hdf-utilities';\nimport { getNessusNistControl, getCCINistMappings } from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, deriveVerificationMethod, inputChecksum, limitArray, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Component,\n Description,\n Reference,\n Checksum,\n Tool,\n Cvss,\n Epss,\n} from '@mitre/hdf-schema';\nimport { ResultStatus, TargetType, createMinimalBaseline, CVSSSeverity, Version as CvssVersion } from '@mitre/hdf-schema';\n\nconst CVE_SOURCE_RE = /^CVE-\\d{4}-\\d{4,}$/;\nconst CWE_PATTERN = /CWE[- ]?(\\d+)/gi;\n// Per-converter version (matches the pattern used by the other 32 converters).\n// Bumped manually when the nessus converter's output format changes in a way\n// consumers might notice. Distinct from the package's npm version.\nconst converterVersion = '1.0.0';\n\ninterface NessusXml {\n NessusClientData_v2: {\n Policy: {\n policyName: string;\n Preferences?: {\n ServerPreferences?: {\n preference?: Array<{ name: string; value: string }>;\n };\n };\n };\n Report: {\n '@name'?: string;\n ReportHost: ReportHost[];\n };\n };\n}\n\ninterface ReportHost {\n name: string;\n HostProperties?: {\n tag?: HostPropertyTag[];\n };\n ReportItem?: ReportItem[];\n}\n\ninterface HostPropertyTag {\n name: string;\n '#text'?: string;\n}\n\ninterface ReportItem {\n port: string;\n svc_name: string;\n protocol: string;\n severity: string;\n pluginID: string;\n pluginName: string;\n pluginFamily: string;\n description?: string;\n fname?: string;\n plugin_modification_date?: string;\n plugin_name?: string;\n plugin_publication_date?: string;\n plugin_type?: string;\n risk_factor?: string;\n script_version?: string;\n see_also?: string;\n solution?: string;\n synopsis?: string;\n plugin_output?: string;\n cvss_base_score?: string;\n cvss3_base_score?: string;\n cve?: string | string[];\n // Structured CVSS fields (Wave 2: CVE-ecosystem)\n cvss_vector?: string;\n cvss3_vector?: string;\n cvss_temporal_vector?: string;\n cvss3_temporal_vector?: string;\n cvss_temporal_score?: string;\n cvss3_temporal_score?: string;\n cvss_score_source?: string;\n // EPSS (newer Tenable plugins emit these inline)\n epss_score?: string;\n epss_percentile?: string;\n // CWE references — Nessus sometimes emits multiple <cwe> elements\n cwe?: string | string[];\n // Compliance fields\n 'compliance-reference'?: string;\n 'compliance-check-name'?: string;\n 'compliance-info'?: string;\n 'compliance-solution'?: string;\n 'compliance-result'?: string;\n 'compliance-actual-value'?: string;\n}\n\n// Severity to impact mapping from heimdall2\nconst IMPACT_MAPPING: Record<string, number> = {\n '4': 0.9, // Critical\n '3': 0.7, // High\n 'i': 0.7,\n '2': 0.5, // Medium\n 'ii': 0.5,\n '1': 0.3, // Low\n 'iii': 0.3,\n '0': 0.0, // Info\n};\n\n/**\n * Strip HTML tags from a string\n */\nfunction parseHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '').trim();\n}\n\n/**\n * Convert Nessus XML scan results to HDF format\n */\nexport async function convertNessusToHdf(nessusXml: string): Promise<HDFResults> {\n validateInputSize(nessusXml, 'nessus');\n // Calculate checksum of source scan data for integrity verification\n const resultsChecksum: Checksum = await inputChecksum(nessusXml);\n\n const parsed = parseXmlWithArrays(nessusXml, ['preference', 'tag', 'ReportItem', 'ReportHost', 'cwe', 'cve']) as unknown as NessusXml;\n\n const policyName = parsed.NessusClientData_v2.Policy.policyName;\n const version = extractVersion(parsed);\n // parseXmlWithArrays ensures ReportHost is always an array\n const reportHosts = parsed.NessusClientData_v2.Report.ReportHost as ReportHost[];\n\n const { items: limitedHosts, truncated: truncatedHosts } = limitArray(reportHosts);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedHosts) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedHosts.length} ReportHost items (original: ${reportHosts.length})`);\n }\n\n // Calculate start and end times from first and last host\n const { startTime, duration } = calculateTiming(limitedHosts);\n\n const baselines: EvaluatedBaseline[] = [];\n const components: Component[] = [];\n\n // Process each ReportHost\n limitedHosts.forEach(host => {\n const baseline = convertReportHostToBaseline(host, policyName, version, resultsChecksum);\n baselines.push(baseline);\n\n const target = convertReportHostToTarget(host);\n components.push(target);\n });\n\n const tool: Tool = { name: 'Nessus' };\n\n const result: HDFResults = {\n baselines,\n components,\n statistics: {\n duration,\n },\n generator: {\n name: 'nessus-to-hdf',\n version: converterVersion,\n },\n tool,\n timestamp: startTime,\n };\n\n return result;\n}\n\nfunction extractVersion(parsed: NessusXml): string {\n const prefs = parsed.NessusClientData_v2.Policy.Preferences?.ServerPreferences?.preference;\n if (!prefs) return '';\n\n // parseXmlWithArrays ensures preference is always an array\n const scVersion = (prefs as Array<{ name: string; value: string }>).find(p => p.name === 'sc_version');\n return scVersion?.value || '';\n}\n\nfunction calculateTiming(hosts: ReportHost[]): { startTime: Date; endTime: Date; duration: number } {\n if (hosts.length === 0) {\n const now = new Date();\n return { startTime: now, endTime: now, duration: 0 };\n }\n\n const firstHost = hosts[0]!;\n const lastHost = hosts[hosts.length - 1]!;\n\n const startTimeStr = getHostPropertyValue(firstHost, 'HOST_START');\n const endTimeStr = getHostPropertyValue(lastHost, 'HOST_END') || getHostPropertyValue(lastHost, 'HOST_START');\n\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n const endTime = endTimeStr ? (parseTimestamp(endTimeStr) ?? startTime) : startTime;\n\n const duration = (endTime.getTime() - startTime.getTime()) / 1000; // seconds\n\n return { startTime, endTime, duration };\n}\n\nfunction getHostPropertyValue(host: ReportHost, name: string): string | undefined {\n const tags = host.HostProperties?.tag;\n if (!tags) return undefined;\n\n // parseXmlWithArrays ensures tag is always an array\n const tag = (tags as HostPropertyTag[]).find(t => t['name'] === name);\n return tag?.['#text'];\n}\n\nfunction convertReportHostToBaseline(\n host: ReportHost,\n policyName: string,\n version: string,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n const items = host.ReportItem;\n // parseXmlWithArrays ensures ReportItem is always an array\n let requirements: EvaluatedRequirement[];\n if (items) {\n const { items: limitedItems, truncated: truncatedItems } = limitArray(items as ReportItem[]);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedItems) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedItems.length} ReportItem items (original: ${(items as ReportItem[]).length})`);\n }\n requirements = limitedItems.map(item => convertReportItemToRequirement(item, host));\n } else {\n requirements = [];\n }\n\n if (requirements.length === 0) {\n const target = host.name || getHostPropertyValue(host, 'host-ip') || 'host';\n const startTimeStr = getHostPropertyValue(host, 'HOST_START');\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n requirements = [\n buildNoFindingsRequirement(\n 'nessus-no-findings',\n `Nessus scanned ${target} and reported zero findings.`,\n startTime,\n ),\n ];\n }\n\n return createMinimalBaseline(`Nessus ${policyName}`, requirements, {\n title: `Nessus ${policyName}`,\n version,\n resultsChecksum,\n status: 'loaded',\n summary: `Nessus ${policyName}`,\n });\n}\n\nfunction convertReportItemToRequirement(item: ReportItem, host: ReportHost): EvaluatedRequirement {\n const isCompliance = !!item['compliance-reference'];\n const id = isCompliance\n ? parseComplianceRef(item['compliance-reference']!, 'Vuln-ID')[0] || item['pluginID']\n : item['pluginID'];\n\n const title = isCompliance\n ? (item['compliance-check-name'] || item['pluginName'])\n : item['pluginName'];\n\n const descriptions = buildDescriptions(item, isCompliance);\n const impact = calculateImpact(item, isCompliance);\n const tags = buildTags(item, isCompliance);\n const refs = buildRefs(item);\n const results = [buildResult(item, host, isCompliance)];\n const code = JSON.stringify(item, null, 2);\n const nistTags = (tags as Record<string, unknown>)['nist'] as string[] | undefined;\n const controlType = deriveControlTypeFromTags(nistTags ?? []);\n const verificationMethod = deriveVerificationMethod(code);\n\n const req: EvaluatedRequirement = {\n id,\n title,\n descriptions,\n impact,\n tags,\n refs,\n results,\n code,\n };\n if (controlType !== undefined) req.controlType = controlType;\n if (verificationMethod !== undefined) req.verificationMethod = verificationMethod;\n\n // Structured CVE-ecosystem fields. Only populated for non-compliance items\n // whose cvss_score_source is a CVE identifier.\n if (!isCompliance) {\n const cvssEntries = buildCvssEntries(item);\n if (cvssEntries.length > 0) req.cvss = cvssEntries;\n\n const cweIDs = buildCweIDs(item);\n if (cweIDs.length > 0) req.cwe = cweIDs;\n\n const epss = buildEpss(item, host);\n if (epss !== undefined) req.epss = epss;\n }\n\n return req;\n}\n\n/**\n * Build a structured Cvss entry for a CVE finding. Returns an array because\n * the schema models cvss as a multi-entry array (Nessus emits one entry per\n * item; multi-vendor convergence may yield more).\n */\nfunction buildCvssEntries(item: ReportItem): Cvss[] {\n const source = (item.cvss_score_source || '').trim();\n if (!source || !CVE_SOURCE_RE.test(source)) return [];\n\n const hasV3 = !!(item.cvss3_vector || item.cvss3_base_score);\n const hasV2 = !!(item.cvss_vector || item.cvss_base_score);\n if (!hasV3 && !hasV2) return [];\n\n let version: CvssVersion;\n let baseVector: string | undefined;\n let baseScore: number | undefined;\n let threatVector: string | undefined;\n let threatScore: number | undefined;\n\n if (hasV3) {\n version = detectV3Version(item.cvss3_vector ?? '');\n baseVector = item.cvss3_vector || undefined;\n baseScore = parseFloatOrUndef(item.cvss3_base_score);\n threatVector = stripVersionPrefix(item.cvss3_temporal_vector);\n threatScore = item.cvss3_temporal_score ? parseFloatSafe(item.cvss3_temporal_score) : undefined;\n } else {\n version = CvssVersion.The20;\n baseVector = stripV2Prefix(item.cvss_vector ?? '') || undefined;\n baseScore = parseFloatOrUndef(item.cvss_base_score);\n threatVector = stripV2Prefix(item.cvss_temporal_vector ?? '') || undefined;\n threatScore = item.cvss_temporal_score ? parseFloatSafe(item.cvss_temporal_score) : undefined;\n }\n\n // Only emit base fields that are actually present: an empty baseVector would\n // fail the schema pattern, and a missing baseScore must not be coerced to 0.\n const entry: Cvss = {version, source};\n if (baseVector) entry.baseVector = baseVector;\n if (baseScore !== undefined) {\n entry.baseScore = baseScore;\n const baseSeverity = mapCvssSeverity(baseScore);\n if (baseSeverity !== undefined) entry.baseSeverity = baseSeverity;\n }\n if (threatVector !== undefined && threatVector !== '') entry.threatVector = threatVector;\n if (threatScore !== undefined) {\n entry.threatScore = threatScore;\n // Per the spec, the temporal score IS the post-threat-enrichment\n // computed score for both v2 and v3.\n entry.computedScore = threatScore;\n const computedSeverity = mapCvssSeverity(threatScore);\n if (computedSeverity !== undefined) entry.computedSeverity = computedSeverity;\n }\n\n return [entry];\n}\n\nfunction detectV3Version(vector: string): CvssVersion {\n if (vector.startsWith('CVSS:3.1/')) return CvssVersion.The31;\n if (vector.startsWith('CVSS:3.0/')) return CvssVersion.The30;\n // Default to 3.0 (Nessus historically emits CVSS:3.0).\n return CvssVersion.The30;\n}\n\nfunction stripVersionPrefix(vector: string | undefined): string | undefined {\n if (!vector) return undefined;\n for (const prefix of ['CVSS:3.0/', 'CVSS:3.1/', 'CVSS:4.0/']) {\n if (vector.startsWith(prefix)) {\n return vector.slice(prefix.length);\n }\n }\n return vector;\n}\n\nfunction stripV2Prefix(vector: string): string {\n return vector.startsWith('CVSS2#') ? vector.slice('CVSS2#'.length) : vector;\n}\n\nfunction parseFloatSafe(s: string | undefined): number {\n if (!s) return 0;\n const f = Number.parseFloat(s);\n return Number.isFinite(f) ? f : 0;\n}\n\n// parseFloatOrUndef returns the parsed number, or undefined when the source\n// field is absent or unparseable (so callers can omit it rather than emit 0).\nfunction parseFloatOrUndef(s: string | undefined): number | undefined {\n if (s === undefined || s === '') return undefined;\n const f = Number.parseFloat(s);\n return Number.isFinite(f) ? f : undefined;\n}\n\nfunction mapCvssSeverity(score: number): CVSSSeverity | undefined {\n switch (cvssScoreToSeverity(score)) {\n case 'critical': return CVSSSeverity.Critical;\n case 'high': return CVSSSeverity.High;\n case 'medium': return CVSSSeverity.Medium;\n case 'low': return CVSSSeverity.Low;\n case 'none': return CVSSSeverity.None;\n default: return undefined;\n }\n}\n\n/**\n * Extract CWE IDs from a ReportItem's <cwe> elements. Nessus emits bare\n * numeric IDs (e.g. <cwe>200</cwe>); occasionally pipe-separated or prefixed\n * forms appear. Output is \"CWE-N\" form per schema convention.\n */\nfunction buildCweIDs(item: ReportItem): string[] {\n if (!item.cwe) return [];\n const raws = Array.isArray(item.cwe) ? item.cwe : [item.cwe];\n const seen = new Set<string>();\n for (const raw of raws) {\n const text = String(raw);\n // Match \"CWE-N\" / \"CWE N\" / \"cweN\" patterns.\n for (const m of text.matchAll(CWE_PATTERN)) {\n if (m[1]) seen.add(m[1]);\n }\n // Fallback: bare numeric tokens (Nessus' typical form).\n for (const tok of text.split(/[^0-9]+/)) {\n if (tok !== '') seen.add(tok);\n }\n }\n if (seen.size === 0) return [];\n return [...seen].sort().map(id => `CWE-${id}`);\n}\n\n/**\n * Build a structured Epss entry when the ReportItem includes EPSS data.\n * The date is derived from the host's HOST_START in YYYY-MM-DD form.\n */\nfunction buildEpss(item: ReportItem, host: ReportHost): Epss | undefined {\n const hasScore = item.epss_score !== undefined && item.epss_score !== '';\n const hasPct = item.epss_percentile !== undefined && item.epss_percentile !== '';\n if (!hasScore && !hasPct) return undefined;\n // The schema requires a publish date on every Epss entry. If the scan has no\n // reliable date, omit the entry entirely rather than stamping a\n // non-deterministic \"today\".\n const date = epssDate(host);\n if (date === undefined) return undefined;\n const score = hasScore ? parseFloatSafe(item.epss_score) : 0;\n const percentile = hasPct ? parseFloatSafe(item.epss_percentile) : 0;\n return { date: date as unknown as Date, score, percentile };\n}\n\nfunction epssDate(host: ReportHost): string | undefined {\n const hs = getHostPropertyValue(host, 'HOST_START');\n if (hs) {\n const d = parseTimestamp(hs);\n if (d) {\n return d.toISOString().slice(0, 10);\n }\n }\n return undefined;\n}\n\nfunction buildDescriptions(item: ReportItem, isCompliance: boolean): Description[] {\n const descriptions: Description[] = [];\n\n // Default description\n if (isCompliance && item['compliance-info']) {\n descriptions.push({\n label: 'default',\n data: parseHtml(item['compliance-info']),\n });\n } else {\n // Non-compliance: create description from metadata\n const parts = [\n `Plugin Family: ${item['pluginFamily']}`,\n `Port: ${item['port']}`,\n `Protocol: ${item['protocol']}`,\n ];\n descriptions.push({\n label: 'default',\n data: parts.join('; ') + ';',\n });\n }\n\n // Fix/solution description\n const solution = isCompliance ? item['compliance-solution'] : item.solution;\n if (solution && solution !== 'n/a') {\n descriptions.push({\n label: 'fix',\n data: parseHtml(solution),\n });\n } else if (solution === 'n/a') {\n descriptions.push({\n label: 'fix',\n data: 'n/a',\n });\n }\n\n return descriptions;\n}\n\nfunction calculateImpact(item: ReportItem, isCompliance: boolean): number {\n if (isCompliance && item['compliance-reference']) {\n const cat = parseComplianceRef(item['compliance-reference'], 'CAT')[0];\n const catKey = cat?.toLowerCase();\n return catKey ? (IMPACT_MAPPING[catKey] ?? 0.5) : 0.5;\n }\n\n return IMPACT_MAPPING[item['severity']] ?? 0.0;\n}\n\nfunction buildTags(item: ReportItem, isCompliance: boolean): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n rid: isCompliance\n ? parseComplianceRef(item['compliance-reference']!, 'Rule-ID').join(',')\n : item['pluginID'],\n };\n\n // NIST tags\n if (isCompliance && item['compliance-reference']) {\n const cciTags = parseComplianceRef(item['compliance-reference'], 'CCI');\n tags.cci = cciTags;\n // Map CCI IDs to NIST controls using hdf-mappings\n // Pattern: Extract source IDs → Map each ID → Flatten results → Deduplicate\n const mappedControls = cciTags.flatMap(cci => getCCINistMappings(cci) ?? []);\n tags.nist = [...new Set(mappedControls)];\n } else {\n const nistControls = getNessusNistControl(item['pluginFamily'], item['pluginID']);\n tags.nist = nistControls ? nistControls.split('|') : [];\n }\n\n // STIG ID for compliance\n if (isCompliance && item['compliance-reference']) {\n const stigId = parseComplianceRef(item['compliance-reference'], 'STIG-ID').join(',');\n if (stigId) {\n tags.stig_id = stigId;\n }\n }\n\n // Additional Nessus metadata tags\n if (item.risk_factor) tags.risk_factor = item.risk_factor;\n if (item.plugin_type) tags.plugin_type = item.plugin_type;\n if (item.plugin_publication_date) tags.plugin_publication_date = item.plugin_publication_date;\n if (item.fname) tags.fname = item.fname;\n if (item.cvss3_base_score) tags.cvss3_base_score = item.cvss3_base_score;\n if (item.cvss_base_score) tags.cvss_base_score = item.cvss_base_score;\n\n return tags;\n}\n\nfunction buildRefs(item: ReportItem): Reference[] | undefined {\n const refs: Reference[] = [];\n\n if (item.see_also) {\n // Nessus see_also is a whitespace-separated list of URLs (typically\n // newline-delimited). Emit one Reference per URL so each .url is a\n // standalone URI (schema requires format: uri).\n for (const url of item.see_also.split(/\\s+/).filter(Boolean)) {\n refs.push({ url });\n }\n }\n\n return refs.length > 0 ? refs : undefined;\n}\n\nfunction buildResult(item: ReportItem, host: ReportHost, isCompliance: boolean): RequirementResult {\n const status = getStatus(item, isCompliance);\n const codeDesc = getCodeDesc(item);\n const message = item.plugin_output || item['compliance-actual-value'];\n const startTimeStr = getHostPropertyValue(host, 'HOST_START');\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n\n return {\n status,\n codeDesc,\n message: message || undefined,\n startTime,\n };\n}\n\nfunction getStatus(item: ReportItem, isCompliance: boolean): ResultStatus {\n if (isCompliance && item['compliance-result']) {\n const result = item['compliance-result'];\n switch (result) {\n case 'PASSED':\n return ResultStatus.Passed;\n case 'WARNING':\n return ResultStatus.NotApplicable; // Heimdall2 maps WARNING to skipped\n case 'ERROR':\n return ResultStatus.Error;\n default:\n return ResultStatus.Failed;\n }\n }\n\n // Non-compliance items are always failed (informational findings)\n return ResultStatus.Failed;\n}\n\nfunction getCodeDesc(item: ReportItem): string {\n const desc = item.description || item.plugin_output || 'This Nessus Plugin does not provide output message.';\n return parseHtml(desc);\n}\n\nfunction parseComplianceRef(ref: string, key: string): string[] {\n const matches = ref.split(',').filter(element => element.startsWith(key));\n return matches.map(element => element.split('|')[1] || '');\n}\n\nfunction convertReportHostToTarget(host: ReportHost): Component {\n const hostName = host['name'];\n\n // Extract host properties into a lookup map\n const hostProps: Record<string, string> = {};\n const tags = host.HostProperties?.tag;\n if (tags) {\n // parseXmlWithArrays ensures tag is always an array\n (tags as HostPropertyTag[]).forEach(tag => {\n const name = tag['name'];\n const value = tag['#text'];\n if (name && value) {\n hostProps[name] = value;\n }\n });\n }\n\n const target: Component = {\n name: hostName,\n type: TargetType.Host,\n };\n\n // Map host properties to typed Component fields\n if (isFQDN(hostName)) {\n target.fqdn = hostName;\n }\n\n const hostIp = hostProps['host-ip'];\n if (hostIp) {\n target.ipAddress = hostIp;\n } else if (isIPAddress(hostName)) {\n target.ipAddress = hostName;\n }\n\n if (hostProps['operating-system']) {\n target.osName = hostProps['operating-system'];\n }\n\n if (hostProps['os']) {\n target.osVersion = hostProps['os'];\n }\n\n if (hostProps['mac-address']) {\n target.macAddress = hostProps['mac-address'].split('\\n')[0];\n }\n\n if (hostProps['host-fqdn']) {\n target.fqdn = hostProps['host-fqdn'];\n }\n\n target.labels = {};\n\n return target;\n}\n\nfunction isFQDN(s: string): boolean {\n return s.includes('.') && !/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(s);\n}\n\nfunction isIPAddress(s: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(s) || s.includes(':');\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, extractCWEIDs, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * SonarQube /api/issues/search response structure\n */\ninterface SonarQubeIssuesResponse {\n total: number;\n p: number;\n ps: number;\n paging: {\n pageIndex: number;\n pageSize: number;\n total: number;\n };\n issues: SonarQubeIssue[];\n components?: SonarQubeComponent[];\n rules?: SonarQubeRule[];\n}\n\ninterface SonarQubeIssue {\n key: string;\n rule: string;\n severity: 'BLOCKER' | 'CRITICAL' | 'MAJOR' | 'MINOR' | 'INFO';\n component: string;\n project: string;\n line?: number;\n hash?: string;\n textRange?: {\n startLine: number;\n endLine: number;\n startOffset: number;\n endOffset: number;\n };\n flows?: SonarQubeFlow[];\n status: 'OPEN' | 'CONFIRMED' | 'REOPENED' | 'RESOLVED' | 'CLOSED';\n message: string;\n effort?: string;\n debt?: string;\n author?: string;\n tags?: string[];\n creationDate: string;\n updateDate: string;\n type: 'CODE_SMELL' | 'BUG' | 'VULNERABILITY' | 'SECURITY_HOTSPOT';\n}\n\ninterface SonarQubeFlow {\n locations: SonarQubeLocation[];\n}\n\ninterface SonarQubeLocation {\n component: string;\n textRange?: {\n startLine: number;\n endLine: number;\n };\n msg?: string;\n}\n\ninterface SonarQubeComponent {\n key: string;\n enabled?: boolean;\n qualifier?: string;\n name?: string;\n longName?: string;\n path?: string;\n}\n\n/**\n * A section of a SonarQube rule description.\n * SonarQube 26+ returns rule descriptions as structured sections\n * instead of monolithic htmlDesc/mdDesc fields.\n */\ninterface SonarQubeDescriptionSection {\n key: string;\n content: string;\n}\n\ninterface SonarQubeRule {\n key: string;\n name: string;\n status?: string;\n lang?: string;\n langName?: string;\n htmlDesc?: string;\n mdDesc?: string;\n severity?: string;\n type?: string;\n tags?: string[];\n sysTags?: string[];\n scope?: string;\n descriptionSections?: SonarQubeDescriptionSection[];\n}\n\n/**\n * Severity to impact mapping.\n * Canonical reference: heimdall2 sonarqube-mapper.ts IMPACT_MAPPING.\n */\nconst SEVERITY_IMPACT_MAPPING: Record<string, number> = {\n BLOCKER: 1.0,\n CRITICAL: 0.7,\n MAJOR: 0.5,\n MINOR: 0.3,\n INFO: 0.0,\n};\n\n/**\n * Default NIST tag for SonarQube findings without CWE mappings.\n * SA-11 (Developer Security Testing and Evaluation) applies to all issue types —\n * SonarQube is fundamentally a static analysis tool. Matches heimdall2.\n */\nconst DEFAULT_NIST_TAGS = ['SA-11'];\n\n/**\n * Convert SonarQube issues JSON to HDF format\n *\n * @param input - JSON string from SonarQube /api/issues/search endpoint\n * @returns HDF JSON string\n */\nexport async function convertSonarqubeToHdf(input: string): Promise<string> {\n validateInputSize(input, 'sonarqube');\n // Calculate checksum of source scan data\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse SonarQube JSON\n const sonarData = parseJSON<SonarQubeIssuesResponse>(input);\n\n if (!sonarData || typeof sonarData !== 'object') {\n throw new Error('Invalid SonarQube structure: not a valid JSON object');\n }\n\n if (!Array.isArray(sonarData.issues)) {\n throw new Error('Invalid SonarQube structure: missing or invalid issues field');\n }\n\n // Create lookup maps for components and rules\n const componentMap = new Map<string, SonarQubeComponent>();\n if (sonarData.components) {\n for (const component of sonarData.components) {\n componentMap.set(component.key, component);\n }\n }\n\n const ruleMap = new Map<string, SonarQubeRule>();\n if (sonarData.rules) {\n for (const rule of sonarData.rules) {\n ruleMap.set(rule.key, rule);\n }\n }\n\n // Group issues by project (each project becomes a baseline)\n const { items: limitedIssues, truncated: truncatedIssues } = limitArray(sonarData.issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIssues) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${sonarData.issues.length})`);\n }\n const issuesByProject = new Map<string, SonarQubeIssue[]>();\n for (const issue of limitedIssues) {\n const projectKey = issue.project;\n if (!issuesByProject.has(projectKey)) {\n issuesByProject.set(projectKey, []);\n }\n issuesByProject.get(projectKey)!.push(issue);\n }\n\n // Convert each project to a baseline\n const baselines: EvaluatedBaseline[] = [];\n for (const [projectKey, issues] of issuesByProject) {\n const baseline = convertProjectToBaseline(\n projectKey,\n issues,\n componentMap,\n ruleMap,\n resultsChecksum\n );\n baselines.push(baseline);\n }\n\n // Build components from project keys\n let components = Array.from(issuesByProject.keys()).map(projectKey => ({\n type: TargetType.Application,\n name: projectKey,\n }));\n\n if (baselines.length === 0) {\n const targetName = deriveEmptyScanTarget(sonarData.components);\n baselines.push({\n name: targetName,\n title: `SonarQube Analysis for ${targetName}`,\n requirements: [buildNoFindingsRequirement(\n 'sonarqube-no-findings',\n `SonarQube scanned ${targetName} and reported zero findings.`,\n new Date(),\n )],\n resultsChecksum,\n });\n components = [{ type: TargetType.Application, name: targetName }];\n }\n\n // Build HDF\n return buildHdfResults({\n generatorName: 'sonarqube-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'SonarQube',\n baselines,\n components,\n timestamp: new Date(),\n });\n}\n\nfunction deriveEmptyScanTarget(components: SonarQubeComponent[] | undefined): string {\n if (components) {\n const project = components.find(c => c.qualifier === 'TRK');\n if (project) return project.key;\n if (components.length > 0) return components[0]!.key;\n }\n return 'the SonarQube project';\n}\n\nfunction convertProjectToBaseline(\n projectKey: string,\n issues: SonarQubeIssue[],\n componentMap: Map<string, SonarQubeComponent>,\n ruleMap: Map<string, SonarQubeRule>,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n // Group issues by rule (each rule becomes a requirement)\n const issuesByRule = new Map<string, SonarQubeIssue[]>();\n for (const issue of issues) {\n const ruleKey = issue.rule;\n if (!issuesByRule.has(ruleKey)) {\n issuesByRule.set(ruleKey, []);\n }\n issuesByRule.get(ruleKey)!.push(issue);\n }\n\n // Convert each rule to a requirement\n const requirements: EvaluatedRequirement[] = [];\n for (const [ruleKey, ruleIssues] of issuesByRule) {\n const requirement = convertRuleToRequirement(\n ruleKey,\n ruleIssues,\n componentMap,\n ruleMap\n );\n requirements.push(requirement);\n }\n\n return createMinimalBaseline(projectKey, requirements, {\n title: `SonarQube Analysis for ${projectKey}`,\n resultsChecksum,\n });\n}\n\nfunction convertRuleToRequirement(\n ruleKey: string,\n issues: SonarQubeIssue[],\n componentMap: Map<string, SonarQubeComponent>,\n ruleMap: Map<string, SonarQubeRule>\n): EvaluatedRequirement {\n const rule = ruleMap.get(ruleKey);\n\n // Extract rule name and description\n const title = rule?.name || ruleKey;\n const description = extractDescription(rule);\n\n // Get impact from first issue (all issues of same rule have same severity)\n const firstIssue = issues[0]!;\n const impact = SEVERITY_IMPACT_MAPPING[firstIssue.severity] || 0.5;\n\n // Extract tags and mappings\n const { cweIds, owaspTags, allTags } = extractTags(rule, issues);\n const nistControls = mapCWEToNIST(cweIds, DEFAULT_NIST_TAGS);\n const cciControls = nistToCci(nistControls);\n\n // Create results for each issue\n const results: RequirementResult[] = issues.map(issue =>\n createResultFromIssue(issue, componentMap)\n );\n\n // Get source location from first issue with a line number\n const issueWithLocation = issues.find(i => i.line !== undefined);\n const sourceLocation = issueWithLocation\n ? extractSourceLocation(issueWithLocation, componentMap)\n : undefined;\n\n const options: {\n sourceLocation?: { ref: string; line: number };\n tags: Record<string, unknown>;\n } = {\n tags: {\n severity: firstIssue.severity.toLowerCase(),\n type: firstIssue.type.toLowerCase(),\n cwe: cweIds,\n owasp: owaspTags,\n nist: nistControls,\n cci: cciControls,\n ...allTags,\n },\n };\n\n if (sourceLocation) {\n options.sourceLocation = sourceLocation;\n }\n\n const req = createRequirement(\n ruleKey,\n title,\n [createDescription('default', description)],\n impact,\n results,\n options\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nistControls);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\nfunction extractDescription(rule: SonarQubeRule | undefined): string {\n if (!rule) {\n return '';\n }\n\n // Prefer markdown description, fall back to HTML (stripped), then name\n if (rule.mdDesc) {\n return rule.mdDesc;\n }\n\n if (rule.htmlDesc) {\n // Strip HTML tags for plain text description\n return rule.htmlDesc.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n\n // Fall back to descriptionSections (SonarQube 26+ format)\n if (rule.descriptionSections && rule.descriptionSections.length > 0) {\n // Prefer root_cause section (closest to the old monolithic description)\n const rootCause = rule.descriptionSections.find(s => s.key === 'root_cause');\n if (rootCause) {\n return rootCause.content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n // If no root_cause, concatenate all sections\n const parts = rule.descriptionSections\n .map(s => s.content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim())\n .filter(s => s.length > 0);\n if (parts.length > 0) {\n return parts.join('\\n\\n');\n }\n }\n\n return rule.name || '';\n}\n\nfunction extractTags(\n rule: SonarQubeRule | undefined,\n issues: SonarQubeIssue[]\n): {\n cweIds: string[];\n owaspTags: string[];\n allTags: Record<string, string[]>;\n} {\n const cweSet = new Set<string>();\n const owaspSet = new Set<string>();\n const allTagsMap = new Map<string, Set<string>>();\n\n // Extract from rule tags\n if (rule) {\n const ruleTags = [...(rule.tags || []), ...(rule.sysTags || [])];\n\n for (const tag of ruleTags) {\n const lowerTag = tag.toLowerCase();\n\n // Check for CWE tags\n if (lowerTag.startsWith('cwe-') || lowerTag.includes('cwe')) {\n for (const id of extractCWEIDs(tag)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n // Check for OWASP tags\n if (lowerTag.includes('owasp')) {\n owaspSet.add(tag);\n }\n\n // Collect other tags by category\n const parts = tag.split(':');\n if (parts.length === 2) {\n const [category, value] = parts;\n if (!allTagsMap.has(category!)) {\n allTagsMap.set(category!, new Set());\n }\n allTagsMap.get(category!)!.add(value!);\n }\n }\n }\n\n // Extract from issue tags\n for (const issue of issues) {\n if (issue.tags) {\n for (const tag of issue.tags) {\n const lowerTag = tag.toLowerCase();\n\n if (lowerTag.startsWith('cwe-')) {\n for (const id of extractCWEIDs(tag)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n if (lowerTag.includes('owasp')) {\n owaspSet.add(tag);\n }\n }\n }\n }\n\n // Also parse CWE from rule description\n if (rule?.htmlDesc || rule?.mdDesc) {\n const desc = (rule.htmlDesc || '') + (rule.mdDesc || '');\n for (const id of extractCWEIDs(desc)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n // Parse CWE from descriptionSections (SonarQube 26+ format)\n if (rule?.descriptionSections) {\n for (const section of rule.descriptionSections) {\n for (const id of extractCWEIDs(section.content)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n }\n\n const allTags: Record<string, string[]> = {};\n for (const [category, values] of allTagsMap) {\n allTags[category] = Array.from(values);\n }\n\n return {\n cweIds: Array.from(cweSet),\n owaspTags: Array.from(owaspSet),\n allTags,\n };\n}\n\nfunction createResultFromIssue(\n issue: SonarQubeIssue,\n componentMap: Map<string, SonarQubeComponent>\n): RequirementResult {\n const status = issue.status === 'RESOLVED' || issue.status === 'CLOSED'\n ? ResultStatus.Passed\n : ResultStatus.Failed;\n\n const component = componentMap.get(issue.component);\n const componentPath = component?.path || component?.longName || issue.component;\n\n const lineInfo = issue.line ? ` LINE : ${issue.line}` : '';\n const codeDesc = `${componentPath}${lineInfo}`;\n\n return createResult(status, issue.message, {\n codeDesc,\n startTime: parseTimestamp(issue.creationDate) ?? new Date('0001-01-01T00:00:00Z'),\n });\n}\n\nfunction extractSourceLocation(\n issue: SonarQubeIssue,\n componentMap: Map<string, SonarQubeComponent>\n): { ref: string; line: number } | undefined {\n if (!issue.line) {\n return undefined;\n }\n\n const component = componentMap.get(issue.component);\n const ref = component?.path || component?.key || issue.component;\n\n return { ref, line: issue.line };\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n getAwsConfigNistControlByIdentifier,\n getAwsConfigNistControlByName,\n awsConfigMappedRevisions,\n getCurrentNistRevision,\n isNistStrict,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport {\n TargetType,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type Checksum,\n type Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * AWS Config static export structures.\n * Produced by combining `aws configservice describe-config-rules` with\n * `aws configservice get-compliance-details-by-config-rule`.\n */\ninterface ConfigRulesFile {\n ConfigRules: ConfigRule[];\n}\n\ninterface ConfigRule {\n ConfigRuleId: string;\n ConfigRuleName: string;\n ConfigRuleArn: string;\n Description: string;\n Source: ConfigRuleSource;\n InputParameters: string;\n EvaluationResults: EvaluationResult[];\n}\n\ninterface ConfigRuleSource {\n Owner: string;\n SourceIdentifier: string;\n}\n\ninterface EvaluationResult {\n EvaluationResultIdentifier: EvaluationResultIdentifier;\n ComplianceType: string;\n Annotation?: string;\n ConfigRuleInvokedTime: string;\n ResultRecordedTime: string;\n}\n\ninterface EvaluationResultIdentifier {\n EvaluationResultQualifier: EvaluationResultQualifier;\n}\n\ninterface EvaluationResultQualifier {\n ConfigRuleName: string;\n ResourceType: string;\n ResourceId: string;\n}\n\nconst ARN_RE = /arn:aws[^:]*:config:([^:]+):(\\d{12}):config-rule/;\n\nfunction getAccountId(arn: string): string {\n const m = ARN_RE.exec(arn);\n return m ? m[2]! : 'no-account-id';\n}\n\nfunction getRegion(arn: string): string {\n const m = ARN_RE.exec(arn);\n return m ? m[1]! : 'unknown';\n}\n\nfunction mapComplianceStatus(complianceType: string): ResultStatus {\n switch (complianceType) {\n case 'COMPLIANT': return ResultStatus.Passed;\n case 'NON_COMPLIANT': return ResultStatus.Failed;\n case 'NOT_APPLICABLE': return ResultStatus.NotApplicable;\n default: return ResultStatus.NotReviewed; // INSUFFICIENT_DATA etc.\n }\n}\n\nfunction buildNistTags(sourceIdentifier: string, ruleName: string): string[] {\n const byIdentifier = getAwsConfigNistControlByIdentifier(sourceIdentifier);\n if (byIdentifier) return [byIdentifier];\n const byName = getAwsConfigNistControlByName(ruleName);\n if (byName) return [byName];\n return [];\n}\n\n/**\n * Flag rules whose NIST mappings exist at a revision other than the one\n * currently selected — they emit no NIST tags here even though a mapping\n * exists elsewhere, a likely sign of a wrong revision selection. Rules\n * unmapped at every revision are not flagged. Throws in strict mode; otherwise\n * logs a single aggregated warning.\n */\nfunction checkRevisionAlignment(rules: ConfigRule[]): void {\n const rev = getCurrentNistRevision();\n const seen = new Set<string>();\n const lines: string[] = [];\n for (const rule of rules) {\n const covered = awsConfigMappedRevisions(rule.Source.SourceIdentifier, rule.ConfigRuleName);\n if (covered.length === 0 || covered.includes(rev) || seen.has(rule.ConfigRuleName)) continue;\n seen.add(rule.ConfigRuleName);\n lines.push(` - ${rule.ConfigRuleName} (mapped at Rev ${covered.join(', ')})`);\n }\n if (lines.length === 0) return;\n\n const detail =\n `${lines.length} AWS Config rule(s) have NIST 800-53 mappings at a different revision ` +\n `than the requested Rev ${rev}; their NIST tags were omitted:\\n${lines.join('\\n')}`;\n if (isNistStrict()) {\n throw new Error(\n `aws-config: ${detail}\\nre-run with a matching revision, or disable strict mode to convert with the gaps`\n );\n }\n // eslint-disable-next-line no-console\n console.warn(`WARNING: ${detail}`);\n}\n\nfunction buildCheckText(rule: ConfigRule): string {\n const parts: string[] = [\n `ARN: ${rule.ConfigRuleArn || 'N/A'}`,\n `Source Identifier: ${rule.Source.SourceIdentifier || 'N/A'}`,\n ];\n if (rule.InputParameters && rule.InputParameters !== '{}') {\n const params = rule.InputParameters\n .replace(/[{}\"]/g, '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n parts.push(...params);\n }\n return parts.join('<br/>');\n}\n\nfunction buildCodeDesc(q: EvaluationResultQualifier): string {\n return `config_rule_name: ${q.ConfigRuleName}, resource_type: ${q.ResourceType}, resource_id: ${q.ResourceId}`;\n}\n\nfunction buildResultMessage(codeDesc: string, annotation: string | undefined, status: ResultStatus): string | undefined {\n if (status !== ResultStatus.Failed) return undefined;\n const text = annotation || 'Rule does not pass rule compliance';\n return `(${codeDesc}): ${text}`;\n}\n\nfunction buildResult(r: EvaluationResult): RequirementResult {\n const q = r.EvaluationResultIdentifier.EvaluationResultQualifier;\n const status = mapComplianceStatus(r.ComplianceType);\n const codeDesc = buildCodeDesc(q);\n const message = buildResultMessage(codeDesc, r.Annotation, status);\n const startTime = (r.ConfigRuleInvokedTime ? parseTimestamp(r.ConfigRuleInvokedTime) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n return createResult(status, message ?? codeDesc, {\n codeDesc,\n ...(startTime ? { startTime } : {}),\n });\n}\n\n/**\n * Synthesizes a single HDF result for a Config rule whose live evaluation\n * returned zero in-scope resources. The HDF schema requires `results` to have\n * minItems >= 1; this honestly signals to auditors that the rule's check ran\n * but had no scope in this account/region rather than vacuously claiming\n * \"passed\". See issue #80 bug 2.\n */\nfunction buildNotApplicableResult(rule: ConfigRule): RequirementResult {\n const codeDesc = `AWS Config rule ${rule.ConfigRuleName} evaluated zero in-scope resources in this account/region.`;\n return createResult(ResultStatus.NotApplicable, codeDesc, {\n codeDesc,\n startTime: new Date(),\n });\n}\n\nfunction buildRequirement(rule: ConfigRule): EvaluatedRequirement {\n const nist = buildNistTags(rule.Source.SourceIdentifier, rule.ConfigRuleName);\n const tags: Record<string, unknown> = nist.length > 0 ? { nist } : {};\n\n const descriptions: Description[] = [\n { label: 'default', data: rule.Description },\n { label: 'check', data: buildCheckText(rule) },\n ];\n\n const title = `${getAccountId(rule.ConfigRuleArn)} - ${rule.ConfigRuleName}`;\n // Issue #80 bug 2: a Config rule that was deployed and active but evaluated\n // zero in-scope resources (e.g. rds-cluster-multi-az-enabled in an account\n // with no RDS clusters) returns an empty EvaluationResults from\n // GetComplianceDetailsByConfigRule. The HDF schema requires `results` to\n // have minItems >= 1, so synthesize one notApplicable result honestly\n // signaling that the rule had no scope rather than emitting `results: []`.\n const results = rule.EvaluationResults.length > 0\n ? rule.EvaluationResults.map(buildResult)\n : [buildNotApplicableResult(rule)];\n\n const req = createRequirement(\n rule.ConfigRuleId,\n title,\n descriptions,\n 0.5,\n results,\n {\n tags,\n sourceLocation: { ref: rule.ConfigRuleArn, line: 1 },\n }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts an AWS Config static export (ConfigRulesFile JSON) to HDF format.\n *\n * @param input - JSON string produced by combining aws configservice describe-config-rules\n * with get-compliance-details-by-config-rule\n * @returns HDF JSON string\n */\nexport async function convertAwsConfigToHdf(input: string): Promise<string> {\n validateInputSize(input, 'aws-config');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const data = parseJSON<ConfigRulesFile>(input);\n\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid AWS Config export: not a valid JSON object');\n }\n if (!Array.isArray(data.ConfigRules)) {\n throw new Error('Invalid AWS Config export: ConfigRules field is required');\n }\n\n const { items: limitedRules, truncated: truncatedRules } = limitArray(data.ConfigRules);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRules) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRules.length} ConfigRule items (original: ${data.ConfigRules.length})`);\n }\n\n checkRevisionAlignment(limitedRules);\n const requirements = limitedRules.map(buildRequirement);\n\n const baseline: EvaluatedBaseline = {\n ...createMinimalBaseline('AWS Config', requirements, { resultsChecksum }),\n title: 'AWS Config Compliance Results',\n version: '1.0.0',\n maintainer: 'Amazon Web Services',\n } as EvaluatedBaseline;\n\n // Extract account/region from the first rule's ARN for target labels\n const firstArn = limitedRules[0]?.ConfigRuleArn ?? '';\n const accountId = getAccountId(firstArn);\n const region = getRegion(firstArn);\n\n return buildHdfResults({\n generatorName: 'aws-config-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'AWS Config',\n baselines: [baseline],\n components: [{\n type: TargetType.CloudAccount,\n name: `AWS Account ${accountId}`,\n labels: {\n account: accountId,\n region,\n provider: 'aws',\n },\n }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { DEFAULT_STATIC_ANALYSIS_NIST_TAGS } from '@mitre/hdf-mappings';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n severityToImpact,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Checkov JSON output structures.\n */\ninterface CheckovReport {\n check_type: string;\n results: CheckovResults;\n summary: CheckovSummary;\n}\n\ninterface CheckovResults {\n passed_checks: CheckovCheck[];\n failed_checks: CheckovCheck[];\n skipped_checks: CheckovCheck[];\n}\n\ninterface CheckovSummary {\n passed: number;\n failed: number;\n skipped: number;\n parsing_errors: number;\n resource_count: number;\n checkov_version: string;\n}\n\ninterface CheckovCheck {\n check_id: string;\n check_name: string;\n check_result: CheckovCheckResult;\n severity: string | null;\n file_path: string;\n file_line_range: number[];\n resource: string;\n guideline: string | null;\n code_block: unknown;\n check_class: string;\n}\n\ninterface CheckovCheckResult {\n result: string;\n suppress_comment?: string;\n}\n\n/**\n * Maps checkov result string to HDF ResultStatus.\n */\nfunction mapStatus(result: string): ResultStatus {\n switch (result.toUpperCase()) {\n case 'PASSED':\n return ResultStatus.Passed;\n case 'FAILED':\n return ResultStatus.Failed;\n case 'SKIPPED':\n return ResultStatus.NotReviewed;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Maps severity to impact, defaulting to 0.5 for null/unknown.\n */\nfunction getImpact(severity: string | null): number {\n if (!severity) return 0.5;\n return severityToImpact(severity);\n}\n\n/**\n * Converts a single CheckovCheck to an HDF RequirementResult.\n */\nfunction checkToResult(check: CheckovCheck, scanTime: Date): RequirementResult {\n const status = mapStatus(check.check_result.result);\n const codeDesc = `Resource: ${check.resource}\\nFile: ${check.file_path} (lines ${JSON.stringify(check.file_line_range)})`;\n\n let message: string | undefined;\n if (status === ResultStatus.NotReviewed && check.check_result.suppress_comment) {\n message = check.check_result.suppress_comment;\n }\n\n return createResult(status, message ?? '', { codeDesc, startTime: scanTime });\n}\n\n/**\n * Converts a group of checks sharing a check_id into one EvaluatedRequirement.\n */\nfunction buildRequirement(checkId: string, checks: CheckovCheck[], scanTime: Date): EvaluatedRequirement {\n const rep = checks[0]!;\n const impact = getImpact(rep.severity);\n\n const tags: Record<string, unknown> = {\n nist: [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS],\n };\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.check_name },\n ];\n if (rep.guideline) {\n descriptions.push({ label: 'check', data: rep.guideline });\n }\n\n const results = checks.map((check) => checkToResult(check, scanTime));\n\n const req = createRequirement(checkId, rep.check_name, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...DEFAULT_STATIC_ANALYSIS_NIST_TAGS]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Parses checkov input which can be a single object or array.\n */\nfunction parseInput(input: string): CheckovReport[] {\n const parsed = parseJSON<CheckovReport | CheckovReport[]>(input);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid checkov structure: not a valid JSON object');\n }\n if (!parsed.results || typeof parsed.results !== 'object') {\n throw new Error('Invalid checkov structure: missing or invalid results field');\n }\n return [parsed];\n}\n\n/**\n * Converts checkov output to HDF format.\n * Accepts native checkov JSON (single object or array) and SARIF format.\n * SARIF input is detected automatically and delegated to the shared SARIF converter.\n *\n * @param input - checkov JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertCheckovToHdf(input: string): Promise<string> {\n validateInputSize(input, 'checkov');\n\n // Detect SARIF format and delegate\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Checkov native JSON carries no per-finding or scan timestamp; use conversion time\n // for every result's startTime, the no-findings placeholder, and the document timestamp.\n const scanTime = new Date();\n\n const reports = parseInput(input);\n\n // Merge all checks from all frameworks\n const allChecks: CheckovCheck[] = [];\n const checkTypes: string[] = [];\n let version: string | undefined;\n\n for (const report of reports) {\n checkTypes.push(report.check_type);\n if (!version && report.summary.checkov_version) {\n version = report.summary.checkov_version;\n }\n allChecks.push(...report.results.passed_checks);\n allChecks.push(...report.results.failed_checks);\n allChecks.push(...report.results.skipped_checks);\n }\n\n const { items: limitedChecks, truncated } = limitArray(allChecks);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedChecks.length} check items (original: ${allChecks.length})`);\n }\n\n // Group by check_id preserving insertion order\n const groups = new Map<string, CheckovCheck[]>();\n for (const check of limitedChecks) {\n const existing = groups.get(check.check_id);\n if (existing) {\n existing.push(check);\n } else {\n groups.set(check.check_id, [check]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [checkId, checks] of groups) {\n requirements.push(buildRequirement(checkId, checks, scanTime));\n }\n\n const format = checkTypes.join(', ');\n\n if (requirements.length === 0) {\n const target = format || 'input';\n requirements.push(buildNoFindingsRequirement(\n 'checkov-no-findings',\n `Checkov scanned ${target} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Checkov Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'checkov-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Checkov',\n toolVersion: version,\n toolFormat: format,\n baselines: [baseline],\n timestamp: scanTime,\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, inputChecksum, limitArray, validateInputSize, mapCWEToNIST, DEFAULT_REMEDIATION_NIST_TAGS, buildHdfResults, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * gosec JSON output structures\n * See https://github.com/securego/gosec for the full schema.\n */\ninterface GosecReport {\n 'Golang errors': unknown;\n Issues: GosecIssue[];\n Stats: GosecStats;\n GosecVersion: string;\n}\n\ninterface GosecStats {\n files: number;\n lines: number;\n nosec: number;\n found: number;\n}\n\ninterface GosecCWE {\n id: string;\n url: string;\n}\n\ninterface GosecSuppression {\n kind: string;\n justification: string;\n}\n\ninterface GosecIssue {\n severity: string;\n confidence: string;\n cwe: GosecCWE;\n rule_id: string;\n details: string;\n file: string;\n code: string;\n line: string;\n column: string;\n nosec: boolean;\n suppressions: GosecSuppression[] | null;\n}\n\n/**\n * Severity to HDF impact mapping for gosec.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n HIGH: 0.7,\n MEDIUM: 0.5,\n LOW: 0.3,\n};\n\n\n/**\n * Returns true if the issue is suppressed (via nosec flag or suppressions list).\n */\nfunction isSuppressed(issue: GosecIssue): boolean {\n return issue.nosec || issue.suppressions !== null;\n}\n\n/**\n * Builds a skip message from a suppressions list.\n * Returns undefined when suppressions is null (issue not suppressed via list).\n */\nfunction formatSkipMessage(suppressions: GosecSuppression[] | null): string | undefined {\n if (suppressions === null) {\n return undefined;\n }\n if (suppressions.length === 0) {\n return 'No justification provided';\n }\n return suppressions\n .map(s => `${s.justification || 'No justification provided'} (${s.kind})`)\n .join('\\n');\n}\n\n/**\n * Converts a single GosecIssue to an HDF RequirementResult.\n */\nfunction issueToResult(issue: GosecIssue, scanTime: Date): RequirementResult {\n const suppressed = isSuppressed(issue);\n const status = suppressed ? ResultStatus.NotReviewed : ResultStatus.Failed;\n\n let message: string;\n if (suppressed) {\n const skipMsg = formatSkipMessage(issue.suppressions);\n message = skipMsg ?? 'No justification provided';\n } else {\n message = `${issue.confidence} confidence of rule violation at:\\n${issue.code}`;\n }\n\n const codeDesc = `Rule ${issue.rule_id} violation detected at:\\nFile: ${issue.file}\\nLine: ${issue.line}\\nColumn: ${issue.column}`;\n\n return createResult(status, message, { codeDesc, startTime: scanTime });\n}\n\n/**\n * Converts a group of issues sharing a rule_id into one EvaluatedRequirement.\n */\nfunction buildRequirement(ruleId: string, issues: GosecIssue[], scanTime: Date): EvaluatedRequirement {\n const rep = issues[0]!;\n const impact = IMPACT_MAPPING[rep.severity.toUpperCase()] ?? 0.5;\n const nist = mapCWEToNIST([rep.cwe.id], DEFAULT_REMEDIATION_NIST_TAGS);\n\n const tags: Record<string, unknown> = {\n nist,\n cwe: { id: rep.cwe.id, url: rep.cwe.url },\n };\n\n const results = issues.map((issue) => issueToResult(issue, scanTime));\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.details },\n { label: 'check', data: `CWE-${rep.cwe.id}: ${rep.cwe.url}` },\n ];\n\n const req = createRequirement(ruleId, rep.details, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n return req;\n}\n\n/**\n * Converts gosec output to HDF format.\n * Accepts both native gosec JSON and SARIF format — SARIF input is detected\n * automatically and delegated to the shared SARIF converter.\n *\n * @param input - gosec JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertGosecToHdf(input: string): Promise<string> {\n validateInputSize(input, 'gosec');\n // Detect format: if SARIF, delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const report = parseJSON<GosecReport>(input);\n\n if (!report || typeof report !== 'object') {\n throw new Error('Invalid gosec structure: not a valid JSON object');\n }\n\n if (!Array.isArray(report.Issues)) {\n throw new Error('Invalid gosec structure: missing or invalid Issues field');\n }\n\n // Group issues by rule_id, preserving insertion order.\n const { items: limitedIssues, truncated: truncatedIssues } = limitArray(report.Issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIssues) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${report.Issues.length})`);\n }\n const groups = new Map<string, GosecIssue[]>();\n for (const issue of limitedIssues) {\n const existing = groups.get(issue.rule_id);\n if (existing) {\n existing.push(issue);\n } else {\n groups.set(issue.rule_id, [issue]);\n }\n }\n\n // gosec output carries no per-finding timestamp; use one conversion-time\n // value for every result's startTime and the document timestamp.\n const scanTime = new Date();\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [ruleId, issues] of groups) {\n requirements.push(buildRequirement(ruleId, issues, scanTime));\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'gosec-no-findings',\n 'gosec scanned Go codebase and reported zero findings.',\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'gosec Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'gosec-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'gosec',\n toolVersion: report.GosecVersion || undefined,\n baselines: [baseline],\n timestamp: scanTime,\n });\n}\n","import {\n type Checksum,\n TargetType,\n createMinimalBaseline,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n ResultStatus,\n VerificationMethodEnum,\n} from '@mitre/hdf-schema';\nimport {\n getNiktoNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON} from '@mitre/hdf-utilities';\nimport {buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, validateInputSize, buildHdfResults} from '../../../shared/typescript/converterutil.js';\n\n// Nikto JSON input types\n\ninterface NiktoReport {\n banner?: string;\n host?: string;\n ip?: string;\n port?: string;\n vulnerabilities: NiktoVulnerability[];\n}\n\ninterface NiktoVulnerability {\n OSVDB?: string;\n id: string;\n method?: string;\n msg: string;\n url?: string;\n}\n\nfunction buildNistTags(niktoId: string): string[] {\n const control = getNiktoNistControl(niktoId);\n if (control) {\n return [control];\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\nfunction buildCodeDesc(vuln: NiktoVulnerability): string {\n const parts: string[] = [];\n if (vuln.url) {\n parts.push(`URL: ${vuln.url}`);\n }\n if (vuln.method) {\n parts.push(`Method: ${vuln.method}`);\n }\n return parts.join(' ');\n}\n\nfunction convertVulnToRequirement(vuln: NiktoVulnerability): EvaluatedRequirement {\n const nistTags = buildNistTags(vuln.id);\n const cciTags = nistToCci(nistTags);\n\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vuln),\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n\n const extras: Record<string, unknown> = {};\n if (vuln.OSVDB && vuln.OSVDB !== '0') {\n extras.osvdb = vuln.OSVDB;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n const req: EvaluatedRequirement = {\n id: vuln.id,\n title: vuln.msg,\n impact: 0.5,\n results: [result],\n tags,\n descriptions: [\n {label: 'default', data: vuln.msg},\n ],\n };\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\nexport async function convertNiktoToHdf(input: string): Promise<string> {\n validateInputSize(input, 'nikto');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const niktoData = parseJSON<NiktoReport>(input);\n\n // Group vulnerabilities by ID to handle duplicates\n const vulnGroups = new Map<string, NiktoVulnerability[]>();\n if (niktoData.vulnerabilities) {\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(niktoData.vulnerabilities);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${niktoData.vulnerabilities.length})`);\n }\n for (const vuln of limitedVulns) {\n const existing = vulnGroups.get(vuln.id);\n if (existing) {\n existing.push(vuln);\n } else {\n vulnGroups.set(vuln.id, [vuln]);\n }\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [, vulns] of vulnGroups) {\n // Use first vuln for the requirement definition\n const primary = vulns[0]!;\n const req = convertVulnToRequirement(primary);\n\n // Add results from duplicate IDs\n if (vulns.length > 1) {\n for (let i = 1; i < vulns.length; i++) {\n req.results.push({\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vulns[i]!),\n startTime: new Date('0001-01-01T00:00:00Z'),\n });\n }\n }\n\n requirements.push(req);\n }\n\n const targetParts: string[] = [];\n if (niktoData.host) {\n targetParts.push(`Host: ${niktoData.host}`);\n }\n if (niktoData.port) {\n targetParts.push(`Port: ${niktoData.port}`);\n }\n const targetName = targetParts.length > 0 ? targetParts.join(' ') : 'Nikto Scan';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'nikto-no-findings',\n `Nikto scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(targetName, requirements, {\n resultsChecksum,\n title: `Nikto Target: ${targetName}`,\n summary: niktoData.banner || '',\n }) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'nikto-to-hdf',\n converterVersion: 'unknown',\n toolName: 'Nikto',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{\n type: TargetType.Application,\n name: targetName,\n }],\n });\n}\n","import {\n type Checksum,\n createMinimalBaseline,\n TargetType,\n type Tool,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type HDFResults,\n ResultStatus,\n VerificationMethodEnum,\n} from '@mitre/hdf-schema';\nimport {\n getCweNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {detectConverter} from '../../../shared/typescript/fingerprint.js';\nimport {registerAllFingerprints} from '../../../shared/typescript/register-all.js';\nimport {convertSarifToHdf} from '../../sarif-to-hdf/typescript/converter.js';\nimport {buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, stripHTML, validateInputSize, serializeHdf} from '../../../shared/typescript/converterutil.js';\n\n// --- ZAP JSON input types ---\n\ninterface ZapReport {\n '@generated'?: string;\n '@version'?: string;\n site?: ZapSite[];\n}\n\ninterface ZapSite {\n '@host'?: string;\n '@name'?: string;\n '@port'?: string;\n '@ssl'?: string;\n alerts?: ZapAlert[];\n}\n\ninterface ZapAlert {\n pluginid: string;\n name: string;\n alert?: string;\n cweid?: string;\n wascid?: string;\n riskcode?: string;\n riskdesc?: string;\n confidence?: string;\n count?: string;\n desc?: string;\n solution?: string;\n otherinfo?: string;\n reference?: string;\n sourceid?: string;\n instances?: ZapInstance[];\n}\n\ninterface ZapInstance {\n uri?: string;\n method?: string;\n param?: string;\n evidence?: string;\n attack?: string;\n}\n\n// --- Risk code to impact ---\n\nfunction riskCodeToImpact(riskCode: string): number {\n switch (riskCode) {\n case '0':\n case '1':\n return 0.3;\n case '2':\n return 0.5;\n case '3':\n return 0.7;\n default:\n return 0.5;\n }\n}\n\n// --- NIST tag building ---\n\nfunction buildNistTags(cweid: string): string[] {\n if (cweid && cweid !== '0') {\n const cweNum = parseInt(cweid, 10);\n if (!isNaN(cweNum)) {\n const control = getCweNistControl(cweNum);\n if (control) {\n return [control];\n }\n }\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n// --- Instance to code desc ---\n\nfunction buildCodeDesc(instance: ZapInstance): string {\n const parts: string[] = [];\n if (instance.uri) {\n parts.push(`URI: ${instance.uri}`);\n }\n if (instance.method) {\n parts.push(`Method: ${instance.method}`);\n }\n if (instance.param) {\n parts.push(`Param: ${instance.param}`);\n }\n if (instance.evidence) {\n parts.push(`Evidence: ${instance.evidence}`);\n }\n return parts.join(' | ');\n}\n\n// --- Build check description ---\n\nfunction buildCheckDescription(alert: ZapAlert): string {\n const parts: string[] = [];\n if (alert.solution) {\n const stripped = stripHTML(alert.solution);\n if (stripped) {\n parts.push(stripped);\n }\n }\n if (alert.otherinfo) {\n const stripped = stripHTML(alert.otherinfo);\n if (stripped) {\n parts.push(stripped);\n }\n }\n return parts.join('\\n');\n}\n\n// --- Select site with most alerts ---\n\nfunction selectSite(sites: ZapSite[]): ZapSite | undefined {\n if (sites.length === 0) return undefined;\n let best = sites[0]!;\n for (let i = 1; i < sites.length; i++) {\n const site = sites[i]!;\n if ((site.alerts?.length ?? 0) > (best.alerts?.length ?? 0)) {\n best = site;\n }\n }\n return best;\n}\n\n// ZAP emits a zone-less RFC1123-like timestamp (\"Thu, 6 Dec 2018 10:53:11\");\n// parse it as UTC to match the Go peer's parseZapTimestamp and stay host-independent.\nconst ZAP_RFC1123_LIKE = /^[A-Za-z]{3}, \\d{1,2} [A-Za-z]{3} \\d{4} \\d{2}:\\d{2}:\\d{2}$/;\n\nfunction parseZapTimestamp(s: string): Date | undefined {\n const trimmed = s.trim();\n if (ZAP_RFC1123_LIKE.test(trimmed)) {\n // Appending GMT forces UTC interpretation, so this new Date() is\n // host-independent and safe — unlike a bare tool value.\n // eslint-disable-next-line no-restricted-syntax\n const d = new Date(`${trimmed} GMT`);\n if (!isNaN(d.getTime())) {\n return d;\n }\n }\n return parseTimestamp(s) ?? undefined;\n}\n\n// --- Main converter ---\n\nexport async function convertZapToHdf(input: string): Promise<string> {\n validateInputSize(input, 'zap');\n // SARIF routing — delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const zapData = parseJSON<ZapReport>(input);\n\n const sites = Array.isArray(zapData.site) ? zapData.site : [];\n const site = selectSite(sites);\n const alerts = site?.alerts ?? [];\n\n // Deduplicate by pluginid — append .1, .2 for duplicates\n const pluginIdCount = new Map<string, number>();\n const {items: limitedAlerts, truncated} = limitArray(alerts);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAlerts.length} alert items (original: ${alerts.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n for (const alert of limitedAlerts) {\n // Deduplicate pluginid\n const count = pluginIdCount.get(alert.pluginid) ?? 0;\n pluginIdCount.set(alert.pluginid, count + 1);\n const reqId = count === 0 ? alert.pluginid : `${alert.pluginid}.${count}`;\n\n // Build NIST tags\n const nistTags = buildNistTags(alert.cweid ?? '');\n const cciTags = nistToCci(nistTags);\n\n // Build extra tags\n const extras: Record<string, unknown> = {};\n if (alert.cweid) {\n extras.cweid = alert.cweid;\n }\n if (alert.wascid) {\n extras.wascid = alert.wascid;\n }\n if (alert.riskdesc) {\n extras.riskdesc = alert.riskdesc;\n }\n if (alert.confidence) {\n extras.confidence = alert.confidence;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build results from instances\n const results: RequirementResult[] = [];\n if (alert.instances && alert.instances.length > 0) {\n const {items: limitedInstances, truncated: instTruncated} = limitArray(alert.instances);\n if (instTruncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Instances truncated at ${limitedInstances.length} for alert ${alert.pluginid}`);\n }\n for (const instance of limitedInstances) {\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(instance),\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n if (instance.attack) {\n result.message = instance.attack;\n }\n results.push(result);\n }\n }\n\n // Build descriptions\n const descriptions: Array<{label: string; data: string}> = [];\n if (alert.desc) {\n descriptions.push({label: 'default', data: stripHTML(alert.desc)});\n }\n const checkDesc = buildCheckDescription(alert);\n if (checkDesc) {\n descriptions.push({label: 'check', data: checkDesc});\n }\n\n const impact = riskCodeToImpact(alert.riskcode ?? '');\n\n const req: EvaluatedRequirement = {\n id: reqId,\n title: alert.name,\n impact,\n results,\n tags,\n descriptions,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n requirements.push(req);\n }\n\n const targetName = site?.['@host'] ?? 'Unknown Host';\n const siteName = site?.['@name'] ?? '';\n const baselineName = site && (site['@name'] || site['@host'])\n ? `OWASP ZAP Scan of ${site['@name'] ?? targetName}`\n : 'OWASP ZAP Scan';\n\n if (requirements.length === 0) {\n let target = siteName || targetName;\n if (!target || target === 'Unknown Host') {\n target = 'the target site';\n }\n requirements.push(buildNoFindingsRequirement(\n 'zap-no-findings',\n `OWASP ZAP scanned ${target} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline('OWASP ZAP Scan', requirements, {\n resultsChecksum,\n title: baselineName,\n summary: `ZAP Version ${zapData['@version'] ?? 'unknown'}`,\n }) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'OWASP ZAP',\n format: 'JSON',\n };\n if (zapData['@version']) {\n tool.version = zapData['@version'];\n }\n\n // Build components — ZAP is a DAST tool scanning web applications\n const components: Array<{name: string; type: TargetType; url?: string; labels?: Record<string, string>}> = [];\n if (site?.['@name']) {\n components.push({name: targetName, type: TargetType.Application, url: site['@name']});\n } else if (targetName !== 'Unknown Host') {\n components.push({name: targetName, type: TargetType.Application});\n }\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components,\n generator: {\n name: 'zap-to-hdf',\n version: 'unknown',\n },\n tool,\n };\n\n if (zapData['@generated']) {\n const ts = parseZapTimestamp(zapData['@generated']);\n if (ts) {\n hdf.timestamp = ts;\n }\n }\n\n return serializeHdf(hdf);\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * CycloneDX JSON structures (subset relevant to vulnerability mapping)\n */\ninterface CycloneDXBom {\n bomFormat: string;\n specVersion: string;\n metadata?: CycloneDXMetadata;\n components?: CycloneDXComponent[];\n vulnerabilities?: CycloneDXVulnerability[];\n}\n\ninterface CycloneDXMetadata {\n timestamp?: string;\n component?: CycloneDXMetadataComponent;\n}\n\ninterface CycloneDXMetadataComponent {\n type?: string;\n name?: string;\n version?: string;\n 'bom-ref'?: string;\n}\n\ninterface CycloneDXComponent {\n type: string;\n name: string;\n version?: string;\n group?: string;\n 'bom-ref'?: string;\n components?: CycloneDXComponent[];\n}\n\ninterface CycloneDXVulnerability {\n id: string;\n source?: CycloneDXSource;\n ratings?: CycloneDXRating[];\n cwes?: number[];\n description?: string;\n detail?: string;\n recommendation?: string;\n affects?: CycloneDXAffect[];\n analysis?: CycloneDXAnalysis;\n}\n\ninterface CycloneDXSource {\n name?: string;\n url?: string;\n}\n\ninterface CycloneDXRating {\n source?: CycloneDXSource;\n score?: number;\n severity?: string;\n method?: string;\n vector?: string;\n}\n\ninterface CycloneDXAffect {\n ref: string;\n}\n\ninterface CycloneDXAnalysis {\n state?: string;\n justification?: string;\n response?: string[];\n detail?: string;\n}\n\nconst CVSS_METHODS = new Set([\n 'CVSSv2',\n 'CVSSv3',\n 'CVSSv31',\n 'CVSSv4',\n]);\n\n// NOTE: heimdall2 mapped info/unknown severity to NotReviewed status.\n// We intentionally do NOT replicate that — a vulnerability is a finding\n// regardless of severity confidence. Info/unknown severity vulns are Failed\n// with impact from the severity mapping (info→0.1, unknown→0.5).\n\n/**\n * Computes the maximum impact across all ratings for a vulnerability.\n * Prefers CVSS score/10 when available, falls back to severityToImpact().\n */\nfunction maxImpact(ratings: CycloneDXRating[]): number {\n if (ratings.length === 0) {\n return 0.5;\n }\n\n let max = 0;\n for (const rating of ratings) {\n let impact: number;\n if (\n rating.method &&\n CVSS_METHODS.has(rating.method) &&\n rating.score !== undefined &&\n rating.score !== null\n ) {\n impact = rating.score / 10;\n } else {\n impact = severityToImpact(rating.severity ?? 'medium');\n }\n if (impact > max) {\n max = impact;\n }\n }\n return max;\n}\n\n\n/**\n * Formats the ratings as a human-readable tag string.\n */\nfunction formatRatingsTag(ratings: CycloneDXRating[]): string {\n return ratings\n .map((r) => `${r.source?.name ?? 'Unknown'} - ${r.severity ?? 'unrated'}`)\n .join(', ');\n}\n\n/**\n * Formats a component reference as a code_desc string.\n */\nfunction formatCodeDesc(\n componentLookup: Map<string, CycloneDXComponent>,\n ref: string\n): string {\n const comp = componentLookup.get(ref);\n if (!comp) {\n // VEX case: no matching component, use the ref directly\n return `Component ${ref} is vulnerable`;\n }\n\n let name = '';\n if (comp.group) {\n name += comp.group + '/';\n }\n name += comp.name;\n if (comp.version) {\n name += '@' + comp.version;\n }\n return `Component ${name} is vulnerable`;\n}\n\n/**\n * Flattens nested CycloneDX components into a single array.\n */\nfunction flattenComponents(components: CycloneDXComponent[]): CycloneDXComponent[] {\n const result: CycloneDXComponent[] = [];\n for (const comp of components) {\n result.push(comp);\n if (comp.components) {\n result.push(...flattenComponents(comp.components));\n }\n }\n return result;\n}\n\n/**\n * Converts CycloneDX SBOM/VEX JSON to HDF format.\n *\n * @param input - CycloneDX JSON string\n * @returns HDF JSON string\n */\nexport async function convertCyclonedxToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('cyclonedx: empty input');\n }\n validateInputSize(input, 'cyclonedx');\n\n const bom = parseJSON<CycloneDXBom>(input);\n\n if (!bom || typeof bom !== 'object') {\n throw new Error('cyclonedx: invalid JSON');\n }\n\n if (bom.bomFormat !== 'CycloneDX') {\n throw new Error(\n `cyclonedx: missing or invalid bomFormat (expected \"CycloneDX\", got \"${bom.bomFormat ?? 'undefined'}\")`\n );\n }\n\n if (\n (!bom.components || bom.components.length === 0) &&\n (!bom.vulnerabilities || bom.vulnerabilities.length === 0)\n ) {\n throw new Error(\n 'cyclonedx: input has neither components nor vulnerabilities'\n );\n }\n\n if (!bom.vulnerabilities || bom.vulnerabilities.length === 0) {\n throw new Error(\n 'cyclonedx: this file is an SBOM inventory with no vulnerabilities; ' +\n 'to import SBOM data into a system document, use:\\n' +\n ' hdf system create --from <sbom-file> --component-name <name>'\n );\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Prefer the BOM creation time as the scan timestamp; fall back to now.\n const parsedTimestamp = bom.metadata?.timestamp\n ? (parseTimestamp(bom.metadata.timestamp) ?? undefined)\n : undefined;\n const scanTime =\n parsedTimestamp && !isNaN(parsedTimestamp.getTime())\n ? parsedTimestamp\n : new Date();\n\n // Flatten nested components and build lookup by bom-ref\n const allComponents = flattenComponents(bom.components ?? []);\n const componentLookup = new Map<string, CycloneDXComponent>();\n for (const comp of allComponents) {\n if (comp['bom-ref']) {\n componentLookup.set(comp['bom-ref'], comp);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(bom.vulnerabilities ?? []);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${(bom.vulnerabilities ?? []).length})`);\n }\n for (const vuln of limitedVulns) {\n const ratings = vuln.ratings ?? [];\n const impact = maxImpact(ratings);\n const cwes = vuln.cwes ?? [];\n const nist = mapCWEToNIST(cwes.map(c => `${c}`), DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cwes.length > 0) {\n tags['cweid'] = cwes.map((c) => `CWE-${c}`);\n }\n\n if (ratings.length > 0) {\n tags['ratings'] = formatRatingsTag(ratings);\n }\n\n // Build descriptions (must always include a 'default' label per HDF schema)\n const descriptions: Description[] = [];\n\n // Default description: description + detail\n const defaultParts: string[] = [];\n if (vuln.description) {\n defaultParts.push(`Description: ${vuln.description}`);\n }\n if (vuln.detail) {\n defaultParts.push(`Detail: ${vuln.detail}`);\n }\n if (defaultParts.length > 0) {\n descriptions.push({ label: 'default', data: defaultParts.join('\\n\\n') });\n } else {\n descriptions.push({ label: 'default', data: vuln.id });\n }\n\n // Fix description: recommendation + workaround from analysis\n const fixParts: string[] = [];\n if (vuln.recommendation) {\n fixParts.push(vuln.recommendation);\n }\n if (vuln.analysis?.detail) {\n fixParts.push(`Workaround: ${vuln.analysis.detail}`);\n }\n if (fixParts.length > 0) {\n descriptions.push({ label: 'fix', data: fixParts.join('\\n\\n') });\n }\n\n // Build results: one per affected component.\n // All vulnerabilities are Failed — info/unknown severity affects impact\n // score but not status.\n const affects = vuln.affects ?? [];\n const results =\n affects.length > 0\n ? affects.map((affect) =>\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatCodeDesc(componentLookup, affect.ref),\n startTime: scanTime,\n })\n )\n : [\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: `Vulnerability ${vuln.id}`,\n startTime: scanTime,\n }),\n ];\n\n const title = vuln.source?.name\n ? `${vuln.id} (${vuln.source.name})`\n : vuln.id;\n\n // verificationMethod is intentionally NOT set. CycloneDX carries both\n // machine-generated SBOM vulnerability data and human-authored VEX\n // statements (analyst assertions about CVE exploitability). The converter\n // cannot reliably distinguish the two, so stamping \"automated\" would\n // misclassify VEX-derived requirements.\n const req = createRequirement(vuln.id, title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n requirements.push(req);\n }\n\n const baseline = createMinimalBaseline('CycloneDX Scan', requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n const targetName = bom.metadata?.component?.name ?? '';\n\n return buildHdfResults({\n generatorName: 'cyclonedx-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'CycloneDX',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: scanTime,\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { buildCsv } from '@mitre/hdf-utilities';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Component, Description } from '@mitre/hdf-schema';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\n\n/**\n * Row structure for CSV export\n */\ninterface CsvRow {\n 'Baseline ID': string;\n 'Baseline Version': string;\n 'Baseline Title': string;\n 'Target ID': string;\n 'Target Type': string;\n 'Requirement ID': string;\n 'Requirement Title': string;\n 'Description': string;\n 'Severity': string;\n 'Impact': number;\n 'Status': string;\n 'NIST Controls': string;\n 'CCI Controls': string;\n 'Control Type': string;\n 'Verification Method': string;\n 'Applicability': string;\n 'Result Message': string;\n}\n\n/**\n * Convert HDF JSON to CSV format\n * @param input HDF JSON string\n * @returns CSV string with sanitized output\n */\nexport function convertHdfToCsv(input: string): string {\n validateInputSize(input, 'hdf-to-csv');\n const hdf = parseJSON<HDFResults>(input);\n\n if (!hdf || typeof hdf !== 'object' || !('baselines' in hdf)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdf.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n const rows: CsvRow[] = [];\n\n // Get components array (may be empty or undefined)\n const components = hdf.components || [];\n\n // If no components, create a single default target entry\n const targetList: Array<{ name: string; type: string }> = components.length > 0\n ? components.map((t: Component) => ({ name: t.name, type: t.type }))\n : [{ name: '', type: '' }];\n\n // Iterate through each baseline\n for (const baseline of hdf.baselines) {\n // Iterate through each requirement in the baseline\n for (const requirement of baseline.requirements) {\n // Create a row for each target\n for (const target of targetList) {\n rows.push(createRow(baseline, requirement, target));\n }\n }\n }\n\n // Convert to CSV with sanitization enabled\n return buildCsv(rows, { sanitize: true });\n}\n\n/**\n * Create a CSV row from baseline, requirement, and target data\n */\nfunction createRow(\n baseline: EvaluatedBaseline,\n requirement: EvaluatedRequirement,\n target: { name: string; type: string }\n): CsvRow {\n // Get default description (required to be present per schema)\n const defaultDesc = requirement.descriptions.find((d: Description) => d.label === 'default');\n const description = defaultDesc?.data || '';\n\n // Get severity from tags or derive from impact\n const severity = getSeverity(requirement);\n\n // Get status from first result (results is required, minItems: 1 per schema)\n const firstResult = requirement.results[0];\n const status = firstResult?.status || '';\n const message = firstResult?.message || '';\n\n // Extract NIST and CCI controls from tags\n const nistControls = extractArrayFromTags(requirement.tags, 'nist');\n const cciControls = extractArrayFromTags(requirement.tags, 'cci');\n\n return {\n 'Baseline ID': baseline.name,\n 'Baseline Version': baseline.version || '',\n 'Baseline Title': baseline.title || '',\n 'Target ID': target.name,\n 'Target Type': target.type,\n 'Requirement ID': requirement.id,\n 'Requirement Title': requirement.title || '',\n 'Description': description,\n 'Severity': severity,\n 'Impact': requirement.impact,\n 'Status': String(status),\n 'NIST Controls': nistControls,\n 'CCI Controls': cciControls,\n 'Control Type': requirement.controlType ?? '',\n 'Verification Method': requirement.verificationMethod ?? '',\n 'Applicability': requirement.applicability ?? '',\n 'Result Message': message\n };\n}\n\n/**\n * Get severity from requirement tags or derive from impact\n */\nfunction getSeverity(requirement: EvaluatedRequirement): string {\n // Check if severity is explicitly provided in tags\n if (requirement.tags && typeof requirement.tags === 'object') {\n if ('severity' in requirement.tags) {\n const sev = requirement.tags.severity;\n if (typeof sev === 'string') {\n return sev;\n }\n if (Array.isArray(sev) && sev.length > 0) {\n return String(sev[0]);\n }\n }\n }\n\n // Derive from impact if not provided\n const impact = requirement.impact;\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'medium';\n return 'low';\n}\n\n/**\n * Extract array values from tags object and join with semicolons\n */\nfunction extractArrayFromTags(\n tags: Record<string, unknown>,\n key: string\n): string {\n if (!tags || typeof tags !== 'object') {\n return '';\n }\n\n const value = tags[key];\n if (Array.isArray(value)) {\n return value.map(v => String(v)).join('; ');\n }\n\n return '';\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, inputChecksum, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n RequirementGroup,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * Splunk event metadata. Each event emitted by the HDF-to-Splunk pipeline\n * carries a `meta` object that describes the event's role.\n */\ninterface SplunkMeta {\n guid: string;\n subtype: 'header' | 'profile' | 'control';\n hdf_splunk_schema: string;\n filetype: string;\n filename: string;\n profile_sha256?: string;\n status?: string;\n is_baseline?: boolean;\n is_waived?: boolean;\n overlay_depth?: number;\n}\n\ninterface SplunkEvent {\n meta: SplunkMeta;\n [key: string]: unknown;\n}\n\ninterface SplunkHeader extends SplunkEvent {\n profiles: unknown[];\n platform: { name: string; release: string };\n statistics: Record<string, unknown>;\n version: string;\n}\n\ninterface SplunkProfile extends SplunkEvent {\n name: string;\n title: string;\n sha256: string;\n version: string;\n summary?: string;\n copyright?: string;\n maintainer?: string;\n license?: string;\n supports: unknown[];\n groups: Array<{ id: string; controls: string[] }>;\n attributes: unknown[];\n controls: unknown[];\n}\n\ninterface SplunkControl extends SplunkEvent {\n id: string;\n title: string;\n desc: string;\n descriptions: Record<string, string>;\n impact: number;\n code: string;\n tags: Record<string, unknown>;\n results: SplunkResult[];\n refs: unknown[];\n source_location?: { ref: string; line: number };\n}\n\ninterface SplunkResult {\n status: string;\n code_desc: string;\n message?: string;\n start_time: string;\n run_time?: number;\n skip_message?: string;\n exception?: string;\n backtrace?: string[];\n resource?: string;\n}\n\n/**\n * Map a Splunk result status string to the HDF ResultStatus enum.\n */\nfunction mapStatus(status: string): ResultStatus {\n switch (status.toLowerCase()) {\n case 'passed':\n return ResultStatus.Passed;\n case 'failed':\n return ResultStatus.Failed;\n case 'skipped':\n return ResultStatus.NotReviewed;\n case 'error':\n return ResultStatus.Error;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Convert a Splunk descriptions object (`{ key: value }`) to an array of\n * HDF Description objects.\n */\nfunction convertDescriptions(\n descriptions: Record<string, string> | undefined,\n): Description[] {\n if (!descriptions || typeof descriptions !== 'object') {\n return [];\n }\n return Object.entries(descriptions).map(([label, data]) =>\n createDescription(label, data),\n );\n}\n\n/**\n * Convert Splunk profile groups (which use `controls`) to HDF\n * RequirementGroups (which use `requirements`).\n */\nfunction convertGroups(\n groups: Array<{ id: string; controls: string[] }> | undefined,\n): RequirementGroup[] {\n if (!groups || !Array.isArray(groups)) {\n return [];\n }\n return groups.map((g) => ({\n id: g.id,\n requirements: g.controls,\n }));\n}\n\n/**\n * Convert a Splunk JSON event array back into an HDF Results document.\n *\n * Input is a JSON string containing an array of Splunk events previously\n * produced by the HDF-to-Splunk pipeline. Each event carries a `meta.subtype`\n * of \"header\", \"profile\", or \"control\" and a shared `meta.guid` that ties\n * them together.\n *\n * @param input - JSON string of a SplunkEvent array\n * @returns HDF Results JSON string\n */\nexport async function convertSplunkToHdf(input: string): Promise<string> {\n validateInputSize(input, 'splunk');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const events = parseJSON<SplunkEvent[]>(input);\n\n if (!Array.isArray(events) || events.length === 0) {\n throw new Error('No Splunk events found in input');\n }\n\n // Group events by GUID (each GUID represents one original HDF execution)\n const eventsByGuid = new Map<string, SplunkEvent[]>();\n for (const event of events) {\n const guid = event.meta.guid;\n if (!eventsByGuid.has(guid)) {\n eventsByGuid.set(guid, []);\n }\n eventsByGuid.get(guid)!.push(event);\n }\n\n // Process each GUID group into baselines + components\n const allBaselines: EvaluatedBaseline[] = [];\n let targetName = 'unknown';\n let targetRelease = '';\n\n for (const [, guidEvents] of eventsByGuid) {\n const headers: SplunkHeader[] = [];\n const profiles: SplunkProfile[] = [];\n const controls: SplunkControl[] = [];\n\n for (const event of guidEvents) {\n switch (event.meta.subtype) {\n case 'header':\n headers.push(event as SplunkHeader);\n break;\n case 'profile':\n profiles.push(event as SplunkProfile);\n break;\n case 'control':\n controls.push(event as SplunkControl);\n break;\n }\n }\n\n if (headers.length !== 1) {\n throw new Error(\n `Expected 1 header event, got ${headers.length}`,\n );\n }\n\n const header = headers[0]!;\n targetName = header.platform.name;\n targetRelease = header.platform.release;\n\n // Group controls by their profile_sha256\n const controlsByProfile = new Map<string, SplunkControl[]>();\n for (const control of controls) {\n const sha = control.meta.profile_sha256 ?? '';\n if (!controlsByProfile.has(sha)) {\n controlsByProfile.set(sha, []);\n }\n controlsByProfile.get(sha)!.push(control);\n }\n\n // Build a baseline for each profile event\n for (const profile of profiles) {\n const profileControls = controlsByProfile.get(profile.sha256) ?? [];\n\n const requirements: EvaluatedRequirement[] = profileControls.map(\n (control) => {\n const descriptions = convertDescriptions(control.descriptions);\n\n const results: RequirementResult[] = Array.isArray(control.results)\n ? control.results.map((result) =>\n createResult(mapStatus(result.status), result.message, {\n codeDesc: result.code_desc,\n startTime: parseTimestamp(result.start_time) ?? new Date('0001-01-01T00:00:00Z'),\n runTime: result.run_time,\n exception: result.exception,\n backtrace: result.backtrace,\n }),\n )\n : [];\n\n const options: {\n tags: Record<string, unknown>;\n sourceLocation?: { ref: string; line: number };\n } = {\n tags: control.tags ?? {},\n };\n\n if (control.source_location) {\n options.sourceLocation = control.source_location;\n }\n\n const req = createRequirement(\n control.id,\n control.title,\n descriptions,\n control.impact,\n results,\n options,\n ) as EvaluatedRequirement;\n\n const nistTagsRaw = (control.tags as Record<string, unknown> | undefined)?.['nist'];\n const nistTags = Array.isArray(nistTagsRaw)\n ? nistTagsRaw.filter((t): t is string => typeof t === 'string')\n : [];\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n },\n );\n\n const groups = convertGroups(profile.groups);\n\n const baselineOptions: {\n title?: string;\n version?: string;\n summary?: string;\n groups?: RequirementGroup[];\n resultsChecksum: Checksum;\n } = {\n resultsChecksum,\n };\n\n if (profile.title) {\n baselineOptions.title = profile.title;\n }\n if (profile.version) {\n baselineOptions.version = profile.version;\n }\n if (profile.summary) {\n baselineOptions.summary = profile.summary;\n }\n if (groups.length > 0) {\n baselineOptions.groups = groups;\n }\n\n allBaselines.push(\n createMinimalBaseline(profile.name, requirements, baselineOptions),\n );\n }\n }\n\n const hdf: HDFResults = {\n baselines: allBaselines,\n components: [\n {\n name: targetName,\n type: TargetType.Host,\n osName: targetRelease || undefined,\n labels: {},\n },\n ],\n generator: {\n name: 'splunk-to-hdf',\n version: '1.0.0',\n },\n };\n\n return serializeHdf(hdf);\n}\n","import { parseJSON, buildXml } from '@mitre/hdf-utilities';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Component, Description, RequirementResult } from '@mitre/hdf-schema';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\n\n/**\n * Convert HDF JSON to XML format\n * @param input HDF JSON string\n * @returns XML string with proper HDF structure\n */\nexport function convertHdfToXml(input: string): string {\n validateInputSize(input, 'hdf-to-xml');\n const hdf = parseJSON<HDFResults>(input);\n\n if (!hdf || typeof hdf !== 'object' || !('baselines' in hdf)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdf.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n // Transform HDF structure to XML-friendly format\n const xmlObj = {\n HdfResults: transformHdfToXmlObject(hdf)\n };\n\n return buildXml(xmlObj);\n}\n\n/**\n * Wrap primitive values to force them as nested elements instead of attributes\n */\nfunction wrap(value: string | number | boolean): { '#text': string | number | boolean } {\n return { '#text': value };\n}\n\n/**\n * Transform HDF object to XML-compatible structure\n * Converts arrays to repeated singular elements\n */\nfunction transformHdfToXmlObject(hdf: HDFResults): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Transform baselines array\n if (hdf.baselines && hdf.baselines.length > 0) {\n result.baselines = {\n baseline: hdf.baselines.map((baseline: EvaluatedBaseline) => ({\n name: wrap(baseline.name),\n ...(baseline.version && { version: wrap(baseline.version) }),\n ...(baseline.title && { title: wrap(baseline.title) }),\n ...(baseline.integrity && {\n integrity: {\n ...(baseline.integrity.algorithm && { algorithm: wrap(baseline.integrity.algorithm) }),\n ...(baseline.integrity.checksum && { checksum: wrap(baseline.integrity.checksum) })\n }\n }),\n ...(baseline.requirements && baseline.requirements.length > 0 && {\n requirements: {\n requirement: baseline.requirements.map((req: EvaluatedRequirement) => transformRequirement(req))\n }\n }),\n ...(baseline.requirements && baseline.requirements.length === 0 && {\n requirements: {}\n })\n }))\n };\n } else {\n result.baselines = {};\n }\n\n // Transform components array\n if (hdf.components && hdf.components.length > 0) {\n result.components = {\n target: hdf.components.map((target: Component) => ({\n name: wrap(target.name),\n type: wrap(target.type),\n ...(target.fqdn && { fqdn: wrap(target.fqdn) }),\n ...(target.ipAddress && { ipAddress: wrap(target.ipAddress) }),\n ...(target.hostname && { hostname: wrap(target.hostname) })\n }))\n };\n }\n\n // Transform statistics\n if (hdf.statistics) {\n result.statistics = {};\n if (hdf.statistics.duration !== undefined) {\n (result.statistics as Record<string, unknown>).duration = wrap(hdf.statistics.duration);\n }\n if (hdf.statistics.requirements) {\n (result.statistics as Record<string, unknown>).requirements = hdf.statistics.requirements;\n }\n }\n\n // Add other optional fields\n if (hdf.timestamp) {\n result.timestamp = wrap(typeof hdf.timestamp === 'string' ? hdf.timestamp : hdf.timestamp.toISOString());\n }\n if (hdf.generator) {\n result.generator = hdf.generator;\n }\n\n return result;\n}\n\n/**\n * Transform a requirement object for XML output\n */\nfunction transformRequirement(req: EvaluatedRequirement): Record<string, unknown> {\n const result: Record<string, unknown> = {\n id: wrap(req.id),\n ...(req.title && { title: wrap(req.title) }),\n ...(req.descriptions && req.descriptions.length > 0 && {\n descriptions: {\n description: req.descriptions.map((d: Description) => ({\n label: wrap(d.label),\n data: wrap(d.data)\n }))\n }\n }),\n impact: wrap(req.impact)\n };\n\n // Transform tags (handle arrays within tags object)\n if (req.tags && Object.keys(req.tags).length > 0) {\n const transformedTags: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(req.tags)) {\n if (Array.isArray(value) && value.length > 0) {\n // Repeat the tag name for each array element (wrapped)\n transformedTags[key] = value.map((v: string | number | boolean) => wrap(v));\n } else if (!Array.isArray(value)) {\n transformedTags[key] = wrap(value);\n }\n }\n if (Object.keys(transformedTags).length > 0) {\n result.tags = transformedTags;\n }\n }\n\n // Transform results array\n if (req.results && req.results.length > 0) {\n result.results = {\n result: req.results.map((r: RequirementResult) => ({\n status: wrap(r.status),\n codeDesc: wrap(r.codeDesc),\n startTime: wrap(typeof r.startTime === 'string' ? r.startTime : r.startTime.toISOString()),\n ...(r.message && { message: wrap(r.message) }),\n ...(r.runTime !== undefined && { runTime: wrap(r.runTime) })\n }))\n };\n }\n\n return result;\n}\n","import {\n type Checksum,\n createMinimalBaseline,\n TargetType,\n type Tool,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type HDFResults,\n type Component,\n ResultStatus,\n VerificationMethodEnum,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport {\n getCweNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {buildNoFindingsRequirement, inputChecksum, buildNistCciTags, deriveControlTypeFromTags, limitArray, validateInputSize, serializeHdf} from '../../../shared/typescript/converterutil.js';\n\n// --- GitLab Security Report input types ---\n\ninterface GitLabReport {\n version?: string;\n scan?: GitLabScan;\n vulnerabilities?: GitLabVulnerability[];\n remediations?: GitLabRemediation[];\n}\n\ninterface GitLabScan {\n analyzer?: GitLabTool;\n scanner?: GitLabTool;\n start_time?: string;\n end_time?: string;\n status?: string;\n type?: string;\n}\n\ninterface GitLabTool {\n id?: string;\n name?: string;\n version?: string;\n}\n\ninterface GitLabVulnerability {\n id: string;\n name?: string;\n description?: string;\n severity?: string;\n solution?: string;\n identifiers?: GitLabIdentifier[];\n location?: GitLabLocation;\n links?: Array<{url?: string}>;\n}\n\ninterface GitLabIdentifier {\n type?: string;\n name?: string;\n value?: string;\n url?: string;\n}\n\ninterface GitLabLocation {\n file?: string;\n start_line?: number;\n end_line?: number;\n class?: string;\n method?: string;\n hostname?: string;\n path?: string;\n param?: string;\n image?: string;\n operating_system?: string;\n dependency?: {\n package?: {name?: string};\n version?: string;\n };\n}\n\ninterface GitLabRemediation {\n fixes?: Array<{id?: string}>;\n summary?: string;\n diff?: string;\n}\n\n// --- Severity to impact ---\n\nfunction gitlabSeverityToImpact(severity: string): number {\n return severityToImpact(severity.toLowerCase());\n}\n\n// --- Scan type to target type ---\n\nfunction scanTypeToTargetType(scanType: string): TargetType {\n switch (scanType) {\n case 'dast':\n return TargetType.Application;\n case 'container_scanning':\n return TargetType.ContainerImage;\n default:\n return TargetType.Repository;\n }\n}\n\n// --- Scan type label ---\n\nfunction scanTypeLabel(scanType: string): string {\n const labels: Record<string, string> = {\n sast: 'SAST',\n dast: 'DAST',\n dependency_scanning: 'Dependency Scanning',\n container_scanning: 'Container Scanning',\n secret_detection: 'Secret Detection',\n api_fuzzing: 'API Fuzzing',\n };\n return labels[scanType] ?? scanType.toUpperCase();\n}\n\n// --- NIST tag building ---\n\nfunction buildNistTags(identifiers: GitLabIdentifier[]): string[] {\n const seen = new Set<string>();\n const controls: string[] = [];\n for (const id of identifiers) {\n if (id.type === 'cwe' && id.value) {\n const cweNum = parseInt(id.value, 10);\n if (!isNaN(cweNum)) {\n const control = getCweNistControl(cweNum);\n if (control && !seen.has(control)) {\n seen.add(control);\n controls.push(control);\n }\n }\n }\n }\n if (controls.length > 0) {\n return controls;\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n// --- Collect identifier tags ---\n\nfunction collectIdentifierTags(identifiers: GitLabIdentifier[]): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const id of identifiers) {\n if (id.type && id.value) {\n const key = id.type.toLowerCase();\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(id.value);\n }\n }\n return result;\n}\n\n// --- Build code description by scan type ---\n\nfunction buildCodeDesc(scanType: string, location?: GitLabLocation): string {\n if (!location) return '';\n\n switch (scanType) {\n case 'sast':\n case 'secret_detection': {\n const parts: string[] = [];\n if (location.file) {\n parts.push(`File: ${location.file}`);\n }\n if (location.start_line != null) {\n const line = location.end_line != null && location.end_line !== location.start_line\n ? `${location.start_line}-${location.end_line}`\n : `${location.start_line}`;\n parts.push(`Line: ${line}`);\n }\n if (location.class) {\n parts.push(`Class: ${location.class}`);\n }\n if (location.method) {\n parts.push(`Method: ${location.method}`);\n }\n return parts.join(' | ');\n }\n case 'dast': {\n const parts: string[] = [];\n if (location.hostname) {\n const url = location.path ? `${location.hostname}${location.path}` : location.hostname;\n parts.push(`URL: ${url}`);\n }\n if (location.method) {\n parts.push(`Method: ${location.method}`);\n }\n if (location.param) {\n parts.push(`Param: ${location.param}`);\n }\n return parts.join(' | ');\n }\n case 'dependency_scanning': {\n const parts: string[] = [];\n if (location.file) {\n parts.push(`File: ${location.file}`);\n }\n if (location.dependency?.package?.name) {\n const pkg = location.dependency.version\n ? `${location.dependency.package.name}@${location.dependency.version}`\n : location.dependency.package.name;\n parts.push(`Package: ${pkg}`);\n }\n return parts.join(' | ');\n }\n case 'container_scanning': {\n const parts: string[] = [];\n if (location.image) {\n parts.push(`Image: ${location.image}`);\n }\n if (location.dependency?.package?.name) {\n const pkg = location.dependency.version\n ? `${location.dependency.package.name}@${location.dependency.version}`\n : location.dependency.package.name;\n parts.push(`Package: ${pkg}`);\n }\n return parts.join(' | ');\n }\n default:\n return `Location: ${JSON.stringify(location)}`;\n }\n}\n\n// --- Main converter ---\n\nexport async function convertGitlabToHdf(input: string): Promise<string> {\n validateInputSize(input, 'gitlab');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const report = parseJSON<GitLabReport>(input);\n\n const scanType = report.scan?.type ?? 'sast';\n const scannerName = report.scan?.scanner?.name ?? 'GitLab Security Scanner';\n const scannerVersion = report.scan?.scanner?.version;\n const startTime = report.scan?.start_time;\n\n const vulns = report.vulnerabilities ?? [];\n const {items: limitedVulns, truncated} = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerabilities (original: ${vulns.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n for (const vuln of limitedVulns) {\n const identifiers = vuln.identifiers ?? [];\n\n // Build NIST tags\n const nistTags = buildNistTags(identifiers);\n const cciTags = nistToCci(nistTags);\n\n // Build extra tags from identifiers\n const idTags = collectIdentifierTags(identifiers);\n const extras: Record<string, unknown> = {};\n for (const [key, values] of Object.entries(idTags)) {\n extras[key] = values;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build descriptions\n const descriptions: Array<{label: string; data: string}> = [];\n if (vuln.description) {\n descriptions.push({label: 'default', data: vuln.description});\n }\n if (vuln.solution) {\n descriptions.push({label: 'check', data: vuln.solution});\n }\n\n // Build result\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(scanType, vuln.location),\n startTime: startTime ? (parseTimestamp(startTime) ?? new Date('0001-01-01T00:00:00Z')) : new Date('0001-01-01T00:00:00Z'),\n };\n\n const impact = gitlabSeverityToImpact(vuln.severity ?? 'Unknown');\n\n const req: EvaluatedRequirement = {\n id: vuln.id,\n title: vuln.name ?? vuln.id,\n impact,\n results: [result],\n tags,\n descriptions,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n requirements.push(req);\n }\n\n const label = scanTypeLabel(scanType);\n\n if (requirements.length === 0) {\n const ts = startTime ? (parseTimestamp(startTime) ?? new Date()) : new Date();\n requirements.push(buildNoFindingsRequirement(\n 'gitlab-no-findings',\n `GitLab ${label} scan via ${scannerName} reported zero findings.`,\n ts,\n ));\n }\n\n const baselineTitle = `GitLab ${label} Security Scan`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline('GitLab Security Scan', requirements, {\n resultsChecksum,\n title: baselineTitle,\n summary: `Scanner: ${scannerName}${scannerVersion ? ` v${scannerVersion}` : ''}`,\n }) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: scannerName,\n format: 'JSON',\n };\n if (scannerVersion) {\n tool.version = scannerVersion;\n }\n\n // Build components based on scan type\n const components: Component[] = [];\n const targetType = scanTypeToTargetType(scanType);\n components.push({name: scannerName, type: targetType});\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components,\n generator: {\n name: 'gitlab-to-hdf',\n version: 'unknown',\n },\n tool,\n };\n\n if (report.scan?.end_time) {\n const endTime = parseTimestamp(report.scan.end_time);\n if (endTime) {\n hdf.timestamp = endTime;\n }\n }\n\n return serializeHdf(hdf);\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArrayWithWarning, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * TruffleHog finding structure.\n */\ninterface TrufflehogFinding {\n SourceMetadata?: SourceMetadata;\n SourceID?: number;\n SourceType?: number;\n SourceName?: string;\n DetectorType: number;\n DetectorName: string;\n DetectorDescription?: string;\n DecoderName: string;\n Verified: boolean;\n VerificationError?: string;\n Raw: string;\n RawV2?: string;\n Redacted: string;\n ExtraData?: Record<string, unknown> | null;\n StructuredData?: unknown;\n}\n\ninterface SourceMetadata {\n Data: SourceData;\n}\n\ninterface SourceData {\n Git?: GitSource;\n Filesystem?: FilesystemSource;\n Docker?: DockerSource;\n}\n\ninterface GitSource {\n commit: string;\n file: string;\n email: string;\n repository: string;\n timestamp: string;\n line: number;\n}\n\ninterface FilesystemSource {\n file: string;\n line: number;\n}\n\ninterface DockerSource {\n image: string;\n file: string;\n line: number;\n}\n\n/** Hardcoded NIST/CCI constants for credential exposure findings. */\nconst TRUFFLEHOG_NIST = ['IA-5 (7)'];\nconst TRUFFLEHOG_CCI = ['CCI-000202', 'CCI-000203', 'CCI-002367'];\n\n/**\n * Parse TruffleHog input as JSON array, single object, or NDJSON.\n */\nfunction parseFindings(input: string): TrufflehogFinding[] {\n const trimmed = input.trim();\n\n // Try JSON array first\n try {\n const parsed = parseJSON<unknown>(trimmed);\n if (Array.isArray(parsed)) {\n return parsed as TrufflehogFinding[];\n }\n // Single JSON object\n if (typeof parsed === 'object' && parsed !== null && 'DetectorName' in parsed) {\n return [parsed as TrufflehogFinding];\n }\n } catch {\n // Not valid JSON — try NDJSON\n }\n\n // Try NDJSON: split on newlines, parse each line\n const lines = trimmed.split('\\n').filter(line => line.trim().length > 0);\n const findings: TrufflehogFinding[] = [];\n for (const line of lines) {\n try {\n findings.push(parseJSON<TrufflehogFinding>(line.trim()));\n } catch {\n throw new Error(`trufflehog: failed to parse NDJSON line: ${line.substring(0, 80)}`);\n }\n }\n if (findings.length > 0) {\n return findings;\n }\n\n throw new Error('trufflehog: unable to parse input as JSON array, single object, or NDJSON');\n}\n\n/**\n * Group findings by DetectorName + DecoderName, preserving insertion order.\n */\nfunction groupFindings(findings: TrufflehogFinding[]): Map<string, TrufflehogFinding[]> {\n const groups = new Map<string, TrufflehogFinding[]>();\n for (const f of findings) {\n const key = `${f.DetectorName} ${f.DecoderName}`;\n const existing = groups.get(key);\n if (existing) {\n existing.push(f);\n } else {\n groups.set(key, [f]);\n }\n }\n return groups;\n}\n\n/**\n * Build the Result.Message JSON from selected finding fields.\n */\nfunction buildMessage(f: TrufflehogFinding): string {\n const msg: Record<string, unknown> = {\n Verified: f.Verified,\n Redacted: f.Redacted,\n };\n if (f.VerificationError) {\n msg.VerificationError = f.VerificationError;\n }\n if (f.ExtraData && Object.keys(f.ExtraData).length > 0) {\n msg.ExtraData = f.ExtraData;\n }\n return JSON.stringify(msg);\n}\n\n/**\n * Build the Result.CodeDesc as JSON of SourceMetadata.\n */\nfunction buildCodeDesc(f: TrufflehogFinding): string {\n return JSON.stringify(f.SourceMetadata ?? {});\n}\n\n/**\n * Extract a timestamp from a finding's Git source metadata.\n */\nfunction getTimestamp(f: TrufflehogFinding): Date {\n if (f.SourceMetadata?.Data?.Git?.timestamp) {\n const ts = parseTimestamp(f.SourceMetadata.Data.Git.timestamp);\n if (ts) {\n return ts;\n }\n }\n return new Date();\n}\n\n/**\n * Get the source file path from any source type.\n */\nfunction getSourceFile(f: TrufflehogFinding): string | undefined {\n return f.SourceMetadata?.Data?.Git?.file\n ?? f.SourceMetadata?.Data?.Filesystem?.file\n ?? f.SourceMetadata?.Data?.Docker?.file;\n}\n\n/**\n * Get the source line number from any source type.\n */\nfunction getSourceLine(f: TrufflehogFinding): number | undefined {\n return f.SourceMetadata?.Data?.Git?.line\n ?? f.SourceMetadata?.Data?.Filesystem?.line\n ?? f.SourceMetadata?.Data?.Docker?.line;\n}\n\n/**\n * Find the first Git repository URL from findings.\n */\nfunction findGitRepoURL(findings: TrufflehogFinding[]): string | undefined {\n for (const f of findings) {\n if (f.SourceMetadata?.Data?.Git?.repository) {\n return f.SourceMetadata.Data.Git.repository;\n }\n }\n return undefined;\n}\n\n/**\n * Build an EvaluatedRequirement from a group of findings sharing a detector.\n */\nfunction buildRequirement(reqID: string, findings: TrufflehogFinding[]): EvaluatedRequirement {\n const rep = findings[0]!;\n const tags = buildNistCciTags(TRUFFLEHOG_NIST, TRUFFLEHOG_CCI);\n\n const title = `Found ${rep.DetectorName} secret using ${rep.DecoderName} decoder`;\n\n const descData = rep.DetectorDescription\n ?? `${rep.DetectorName} secret detected by ${rep.DecoderName} decoder`;\n const descriptions: Description[] = [\n { label: 'default', data: descData },\n ];\n\n const results = findings.map(f =>\n createResult(ResultStatus.Failed, buildMessage(f), {\n codeDesc: buildCodeDesc(f),\n startTime: getTimestamp(f),\n })\n );\n\n const sourceFile = getSourceFile(rep);\n const sourceLine = getSourceLine(rep);\n\n const req = createRequirement(\n reqID,\n title,\n descriptions,\n 0.5,\n results,\n {\n tags,\n sourceLocation: sourceFile ? { ref: sourceFile, line: sourceLine } : undefined,\n }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(TRUFFLEHOG_NIST);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts TruffleHog output to HDF format.\n * Accepts JSON array, single JSON object, or NDJSON input.\n *\n * @param input - TruffleHog JSON/NDJSON string\n * @returns HDF JSON string\n */\nexport async function convertTrufflehogToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('trufflehog: empty input');\n }\n validateInputSize(input, 'trufflehog');\n\n const findings = parseFindings(input);\n\n const resultsChecksum = await inputChecksum(input);\n const limitedFindings = limitArrayWithWarning(findings, 'finding');\n\n const groups = groupFindings(limitedFindings);\n const requirements: EvaluatedRequirement[] = [];\n for (const [reqID, group] of groups) {\n requirements.push(buildRequirement(reqID, group));\n }\n\n if (requirements.length === 0) {\n const target = findGitRepoURL(limitedFindings)\n ?? limitedFindings[0]?.SourceName\n ?? 'the target source';\n requirements.push(buildNoFindingsRequirement(\n 'trufflehog-no-findings',\n `TruffleHog scanned ${target} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const sourceName = limitedFindings[0]?.SourceName ?? 'trufflehog';\n const baselineTitle = `TruffleHog Scan (${sourceName})`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'TruffleHog Scan',\n requirements,\n {\n resultsChecksum,\n title: baselineTitle,\n }\n ) as EvaluatedBaseline;\n\n const tool: Tool = { name: 'TruffleHog', format: 'JSON' };\n\n const hdf: HDFResults = {\n baselines: [baseline],\n generator: {\n name: 'trufflehog-to-hdf',\n version: '1.0.0',\n },\n tool,\n timestamp: new Date(),\n };\n\n // Add target only if a Git repository URL is available\n const repoURL = findGitRepoURL(limitedFindings);\n if (repoURL) {\n hdf.components = [{ name: repoURL, type: TargetType.Repository }];\n }\n\n return serializeHdf(hdf);\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {\n buildNoFindingsRequirement,\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n mapCWEToNIST,\n extractCWEIDs,\n validateInputSize,\n serializeHdf,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// --- BurpSuite XML input types ---\n\ninterface BurpIssuesXml {\n issues: {\n burpVersion?: string;\n exportTime?: string;\n issue?: BurpIssueXml[];\n };\n}\n\ninterface BurpIssueXml {\n serialNumber?: string;\n type?: string;\n name?: string;\n host?: BurpHostXml;\n path?: string;\n location?: string;\n severity?: string;\n confidence?: string;\n issueBackground?: string;\n remediationBackground?: string;\n references?: string;\n vulnerabilityClassifications?: string;\n issueDetail?: string;\n}\n\ninterface BurpHostXml {\n ip?: string;\n '#text'?: string;\n}\n\n// --- Impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n 'high': 0.7,\n 'medium': 0.5,\n 'low': 0.3,\n 'information': 0.3,\n};\n\nfunction getImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.3;\n}\n\n// --- CWE parsing ---\n\n/**\n * Extract CWE identifiers from HTML text.\n * Returns CWE-prefixed IDs (e.g., [\"CWE-79\"]) for use in tags and mapCWEToNIST.\n */\nfunction parseCWEIDs(html: string): string[] {\n if (!html) return [];\n return extractCWEIDs(html).map(id => `CWE-${id}`);\n}\n\n// --- Format code desc ---\n\nfunction formatCodeDesc(\n hostIP: string,\n hostURL: string,\n location: string,\n issueDetail: string,\n confidence: string,\n): string {\n const parts: string[] = [];\n parts.push(`Host: ip: ${hostIP}, url: ${hostURL}`);\n parts.push(`Location: ${stripHTML(location)}`);\n if (issueDetail) {\n parts.push(`issueDetail: ${stripHTML(issueDetail)}`);\n }\n parts.push(`confidence: ${confidence}`);\n return parts.join('\\n') + '\\n';\n}\n\n// --- Main converter ---\n\n/**\n * Converts BurpSuite Pro XML export to HDF format.\n *\n * Issues are grouped by `<type>` — each unique type becomes one requirement,\n * with one result per individual issue instance.\n *\n * @param input - BurpSuite XML string\n * @returns HDF JSON string\n */\nexport async function convertBurpsuiteToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('burpsuite: empty input');\n }\n validateInputSize(input, 'burpsuite');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse XML — ensure issue is always treated as array\n const parsed = parseXmlWithArrays(input, ['issue']) as unknown as BurpIssuesXml;\n\n if (!parsed.issues) {\n throw new Error('burpsuite: invalid XML — missing <issues> root element');\n }\n\n const issues = parsed.issues.issue ?? [];\n const burpVersion = parsed.issues.burpVersion ?? '';\n const exportTime = parsed.issues.exportTime ?? '';\n\n const { items: limitedIssues, truncated } = limitArray(issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${issues.length})`);\n }\n\n // Group issues by type (preserving insertion order)\n const groups = new Map<string, BurpIssueXml[]>();\n for (const issue of limitedIssues) {\n const issueType = issue.type ?? 'unknown';\n const existing = groups.get(issueType);\n if (existing) {\n existing.push(issue);\n } else {\n groups.set(issueType, [issue]);\n }\n }\n\n // Build requirements from grouped issues\n const requirements: EvaluatedRequirement[] = [];\n for (const [issueType, groupIssues] of groups) {\n requirements.push(buildRequirement(issueType, groupIssues));\n }\n\n // Determine target from the first issue's host\n const targetName = limitedIssues.length > 0\n ? (limitedIssues[0]!.host?.['#text'] ?? 'Unknown').trim()\n : 'Unknown';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'burpsuite-no-findings',\n `Burp Suite scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const title = `BurpSuite Scan: ${targetName}`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'BurpSuite Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'BurpSuite',\n format: 'XML',\n };\n if (burpVersion) {\n tool.version = burpVersion;\n }\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Application,\n },\n ],\n generator: {\n name: 'burpsuite-to-hdf',\n version: '1.0.0',\n },\n tool,\n };\n\n if (exportTime) {\n hdf.timestamp = parseTimestamp(exportTime) ?? undefined;\n }\n\n return serializeHdf(hdf);\n}\n\n// --- Build requirement ---\n\nfunction buildRequirement(\n issueType: string,\n issues: BurpIssueXml[],\n): EvaluatedRequirement {\n const rep = issues[0]!;\n\n // Parse CWE IDs from vulnerabilityClassifications HTML\n const cweIDs = parseCWEIDs(rep.vulnerabilityClassifications ?? '');\n\n // Map CWE to NIST\n const nist = mapCWEToNIST(cweIDs, [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS]);\n const cciTags = nistToCci(nist);\n\n // Build extra tags\n const extras: Record<string, unknown> = {};\n if (cweIDs.length > 0) {\n extras.cweid = cweIDs.join(', ');\n }\n if (rep.confidence) {\n extras.confidence = rep.confidence;\n }\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build descriptions\n const descriptions: Description[] = [];\n\n // Default description (required minimum 1 with \"default\" label)\n const defaultData = rep.issueBackground\n ? stripHTML(rep.issueBackground)\n : (rep.name ?? issueType);\n descriptions.push({ label: 'default', data: defaultData });\n\n // Check description from issueBackground\n if (rep.issueBackground) {\n descriptions.push({ label: 'check', data: stripHTML(rep.issueBackground) });\n }\n\n // Fix description from remediationBackground\n if (rep.remediationBackground) {\n descriptions.push({ label: 'fix', data: stripHTML(rep.remediationBackground) });\n }\n\n // Build results — one per issue in the group\n const results: RequirementResult[] = issues.map(issue => {\n const codeDesc = formatCodeDesc(\n issue.host?.ip ?? '',\n (issue.host?.['#text'] ?? '').trim(),\n issue.location ?? '',\n issue.issueDetail ?? '',\n issue.confidence ?? '',\n );\n return {\n status: ResultStatus.Failed,\n codeDesc,\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n });\n\n const impact = getImpact(rep.severity ?? 'information');\n\n const req: EvaluatedRequirement = {\n id: issueType,\n title: rep.name ?? undefined,\n impact,\n tags,\n descriptions,\n results,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/** Impact mapping from heimdall2 DBProtect mapper */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n informational: 0.0,\n};\n\n/** Parsed DBProtect XML dataset structure */\ninterface DatasetXml {\n dataset: {\n metadata: {\n item: MetadataItem[];\n };\n data: {\n row: DataRow[];\n };\n };\n}\n\ninterface MetadataItem {\n name: string;\n type: string;\n}\n\ninterface DataRow {\n value: Array<string | { nil: string } | null>;\n}\n\n/** A single compiled finding, mapping column names to string values */\ntype Finding = Record<string, string>;\n\n/**\n * Maps metadata column names to row values by position index.\n * Mirrors the heimdall2 compileFindings function.\n */\nfunction compileFindings(parsed: DatasetXml): Finding[] {\n const items = parsed.dataset.metadata.item;\n const rows = parsed.dataset.data.row;\n\n const colNames = items.map((item: MetadataItem) => item['name']);\n\n return rows.map((row: DataRow) => {\n const finding: Finding = {};\n const values = row.value;\n colNames.forEach((name: string, i: number) => {\n const val = values[i];\n if (val === null || val === undefined || typeof val === 'object') {\n finding[name] = '';\n } else {\n finding[name] = String(val);\n }\n });\n return finding;\n });\n}\n\n/** Check if the dataset has a \"Result Status\" column */\nfunction hasResultStatusColumn(parsed: DatasetXml): boolean {\n return parsed.dataset.metadata.item.some(\n (item: MetadataItem) => item['name'] === 'Result Status',\n );\n}\n\n/** Maps DBProtect result status strings to HDF ResultStatus */\nfunction getStatus(status: string): ResultStatus {\n switch (status) {\n case 'Fact':\n return ResultStatus.NotReviewed;\n case 'Failed':\n return ResultStatus.Failed;\n case 'Finding':\n return ResultStatus.Failed;\n case 'Not A Finding':\n return ResultStatus.Passed;\n default:\n // Includes \"Skipped\" and any unknown status\n return ResultStatus.NotReviewed;\n }\n}\n\n/** Maps DBProtect risk level to HDF impact value */\nfunction getImpact(riskDV: string): number {\n const impact = IMPACT_MAPPING[riskDV.toLowerCase()];\n return impact !== undefined ? impact : 0.5;\n}\n\n/** Creates a description string from a finding's task and check category */\nfunction formatDesc(f: Finding): string {\n return `Task : ${f['Task'] ?? ''}; Check Category : ${f['Check Category'] ?? ''}`;\n}\n\n/** Creates a summary string from a finding's metadata */\nfunction formatSummary(f: Finding): string {\n return [\n `Organization : ${f['Organization'] ?? ''}`,\n `Asset : ${f['Asset'] ?? ''}`,\n `Asset Type : ${f['Asset Type'] ?? ''}`,\n `IP Address, Port, Instance : ${f['IP Address, Port, Instance'] ?? ''}`,\n ].join('\\n');\n}\n\nconst MONTH_ABBR: Record<string, string> = {\n Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06',\n Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12',\n};\n\n/**\n * Parses DBProtect date formats (\"Feb 18 2021 15:57\" or \"2021-02-18 15:55\").\n * Month-name values are normalized to ISO so parseTimestamp interprets them as\n * UTC, matching the Go peer and keeping output host-timezone-independent.\n */\nfunction parseDate(dateStr: string): Date {\n const trimmed = dateStr.trim();\n // Go's parseDate returns the zero time.Time (serializes as 0001-01-01T00:00:00Z)\n // for an empty or unparseable Date column; mirror that for byte-parity instead\n // of a non-deterministic conversion-time fallback.\n const ZERO = new Date('0001-01-01T00:00:00Z');\n if (!trimmed) {\n return ZERO;\n }\n const month = /^([A-Z][a-z]{2}) (\\d{1,2}) (\\d{4}) (\\d{2}:\\d{2})$/.exec(trimmed);\n const normalized = month\n ? `${month[3]}-${MONTH_ABBR[month[1]!] ?? '00'}-${month[2]!.padStart(2, '0')} ${month[4]}`\n : trimmed;\n return parseTimestamp(normalized) ?? ZERO;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of findings sharing a Check ID.\n */\nfunction buildRequirement(\n checkID: string,\n findings: Finding[],\n hasStatus: boolean,\n): EvaluatedRequirement {\n const rep = findings[0]!;\n\n const nist = DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n const descriptions: Description[] = [\n { label: 'default', data: formatDesc(rep) },\n ];\n\n const results = findings.map((f) => {\n const status = hasStatus\n ? getStatus(f['Result Status'] ?? '')\n : ResultStatus.Failed;\n\n return createResult(status, undefined, {\n codeDesc: f['Details'] ?? '',\n startTime: parseDate(f['Date'] ?? ''),\n });\n });\n\n const req = createRequirement(\n checkID,\n rep['Check'] ?? '',\n descriptions,\n getImpact(rep['Risk DV'] ?? ''),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...nist]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Converts DBProtect Cognos XML output to HDF format.\n * Supports both \"Check Results Details\" (has Result Status) and \"Findings Detail\"\n * (no Result Status; all rows are findings) report formats.\n *\n * @param input - DBProtect XML string\n * @returns HDF JSON string\n */\nexport async function convertDbprotectToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('dbprotect: empty input');\n }\n validateInputSize(input, 'dbprotect');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseXmlWithArrays(input, ['item', 'row', 'value']) as unknown as DatasetXml;\n\n if (!parsed?.dataset?.data?.row || parsed.dataset.data.row.length === 0) {\n throw new Error('dbprotect: no data rows found');\n }\n\n const findings = compileFindings(parsed);\n const { items: limitedFindings, truncated } = limitArray(findings);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Input truncated at ${limitedFindings.length} finding items (original: ${findings.length})`,\n );\n }\n\n const hasStatus = hasResultStatusColumn(parsed);\n\n // Group findings by Check ID, preserving insertion order\n const groups = new Map<string, Finding[]>();\n for (const f of limitedFindings) {\n const checkID = (f['Check ID'] ?? '').trim();\n const existing = groups.get(checkID);\n if (existing) {\n existing.push(f);\n } else {\n groups.set(checkID, [f]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [checkID, findingGroup] of groups) {\n requirements.push(buildRequirement(checkID, findingGroup, hasStatus));\n }\n\n // Use first finding for metadata\n const firstFinding = limitedFindings[0]!;\n const title = firstFinding['Job Name'] ?? '';\n const summary = formatSummary(firstFinding);\n const targetName = firstFinding['Asset'] ?? '';\n\n const baseline = createMinimalBaseline('DBProtect Scan', requirements, {\n resultsChecksum,\n title,\n summary,\n }) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'dbprotect-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'DBProtect',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Host }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, cvssScoreToSeverity, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_REMEDIATION_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Cvss,\n AffectedPackage,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n CVSSSeverity,\n Ecosystem,\n Version as CvssVersion,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Twistlock/Prisma Cloud scan output structures.\n *\n * Container image scans produce a top-level \"results\" array.\n * Code repository scans omit the wrapper and return a single result object.\n */\ninterface TwistlockReport {\n results?: TwistlockResult[];\n consoleURL?: string;\n}\n\ninterface TwistlockResult {\n id?: string;\n name?: string;\n repository?: string;\n distro?: string;\n distroRelease?: string;\n collections?: string[];\n packages?: TwistlockPackage[];\n vulnerabilities?: TwistlockVuln[] | null;\n vulnerabilityDistribution?: TwistlockDistribution;\n complianceDistribution?: TwistlockDistribution;\n}\n\ninterface TwistlockPackage {\n type?: string;\n name?: string;\n version?: string;\n}\n\ninterface TwistlockVuln {\n id: string;\n cve?: string;\n status?: string;\n cvss?: number;\n vector?: string;\n description: string;\n severity: string;\n packageName?: string;\n packageVersion?: string;\n packageType?: string;\n cwe?: string;\n link?: string;\n fixedBy?: string;\n riskFactors?: string[];\n impactedVersions?: string[];\n publishedDate?: string;\n discoveredDate?: string;\n fixDate?: string;\n layerTime?: string;\n}\n\ninterface TwistlockDistribution {\n critical: number;\n high: number;\n medium: number;\n low: number;\n total: number;\n}\n\n/**\n * Maps Twistlock severity strings to HDF impact values.\n * Includes \"important\" (alias for critical) and \"moderate\" (alias for medium)\n * which appear in some Twistlock outputs.\n */\nfunction twistlockSeverityToImpact(severity: string): number {\n switch (severity.toLowerCase()) {\n case 'critical':\n case 'important':\n return 0.9;\n case 'high':\n return 0.7;\n case 'medium':\n case 'moderate':\n return 0.5;\n case 'low':\n return 0.3;\n default:\n return 0.5;\n }\n}\n\n/**\n * Builds the baseline title from scan result data.\n */\nfunction buildTitle(result: TwistlockResult): string {\n let projectName: string;\n if (result.repository) {\n projectName = result.repository;\n } else if (result.collections && result.collections.length > 0) {\n projectName = result.collections.join(' / ');\n } else {\n projectName = 'N/A';\n }\n return `Twistlock Project: ${projectName}`;\n}\n\n/**\n * Builds the baseline summary from distribution data.\n */\nfunction buildSummary(result: TwistlockResult): string {\n const vulnTotal = result.vulnerabilityDistribution\n ? String(result.vulnerabilityDistribution.total)\n : 'N/A';\n const complianceTotal = result.complianceDistribution\n ? String(result.complianceDistribution.total)\n : 'N/A';\n return `Package Vulnerability Summary: ${vulnTotal} Application Compliance Issue Total: ${complianceTotal}`;\n}\n\n/**\n * Detects CVSS schema version enum from the vector prefix. Defaults to 3.1\n * since modern Twistlock exclusively emits 3.x output.\n */\nexport function cvssVersionFromVector(vector: string | undefined): CvssVersion {\n if (!vector) return CvssVersion.The31;\n if (vector.startsWith('CVSS:2.0/')) return CvssVersion.The20;\n if (vector.startsWith('CVSS:3.0/')) return CvssVersion.The30;\n if (vector.startsWith('CVSS:4.0/')) return CvssVersion.The40;\n return CvssVersion.The31;\n}\n\n/**\n * Maps cvssScoreToSeverity('low'|'medium'|...) into the CVSSSeverity enum.\n */\nexport function cvssSeverityFromScore(score: number): CVSSSeverity | undefined {\n const band = cvssScoreToSeverity(score);\n switch (band) {\n case 'none': return CVSSSeverity.None;\n case 'low': return CVSSSeverity.Low;\n case 'medium': return CVSSSeverity.Medium;\n case 'high': return CVSSSeverity.High;\n case 'critical': return CVSSSeverity.Critical;\n default: return undefined;\n }\n}\n\n/**\n * Builds a Cvss entry from a Twistlock vulnerability. Returns undefined only\n * when neither a score nor a vector is available. When the vendor emits a\n * score but no vector (common in Twistlock/Prisma Cloud output), the Cvss\n * entry is still emitted — the schema makes baseVector optional precisely\n * so vendor-final-score data isn't dropped.\n */\nexport function buildCvss(vuln: TwistlockVuln): Cvss | undefined {\n // 0.0 is a valid CVSS score (\"none\"); only treat a non-numeric/non-finite\n // value as \"no score\". A missing score is omitted, never coerced to 0.\n const hasScore = typeof vuln.cvss === 'number' && Number.isFinite(vuln.cvss);\n const hasVector = !!vuln.vector;\n if (!hasScore && !hasVector) return undefined;\n\n const cv: Cvss = {version: cvssVersionFromVector(vuln.vector)};\n if (hasScore) {\n cv.baseScore = vuln.cvss as number;\n const sev = cvssSeverityFromScore(vuln.cvss as number);\n if (sev !== undefined) cv.baseSeverity = sev;\n }\n if (hasVector) {\n cv.baseVector = vuln.vector as string;\n }\n const source = vuln.cve ?? vuln.id;\n if (source) cv.source = source;\n return cv;\n}\n\nconst CWE_REGEX = /cwe[-_]?(\\d+)/gi;\n\n/**\n * Extracts canonical CWE-N identifiers from a free-form string.\n */\nexport function parseCwes(raw: string | undefined): string[] {\n if (!raw) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const m of raw.matchAll(CWE_REGEX)) {\n const id = `CWE-${m[1]}`;\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\nfunction rhelDistro(distro: string): boolean {\n const low = distro.toLowerCase();\n return ['red hat', 'rhel', 'centos', 'fedora', 'amazon linux', 'oracle linux', 'rocky', 'alma']\n .some(m => low.includes(m));\n}\n\nfunction debDistro(distro: string): boolean {\n const low = distro.toLowerCase();\n return ['debian', 'ubuntu'].some(m => low.includes(m));\n}\n\n/**\n * Maps a Twistlock package type plus the result's distro string to a schema\n * Ecosystem value. Defaults to 'generic' for unknown types.\n */\nexport function resolveEcosystem(packageType: string | undefined, distro: string | undefined): Ecosystem {\n const t = (packageType ?? '').toLowerCase();\n const d = distro ?? '';\n switch (t) {\n case 'os':\n if (rhelDistro(d)) return Ecosystem.RPM;\n if (debDistro(d)) return Ecosystem.Deb;\n return Ecosystem.Generic;\n case 'rpm': return Ecosystem.RPM;\n case 'deb': return Ecosystem.Deb;\n case 'jar':\n case 'maven': return Ecosystem.Maven;\n case 'python':\n case 'pypi': return Ecosystem.Pypi;\n case 'nodejs':\n case 'npm': return Ecosystem.Npm;\n case 'gem': return Ecosystem.Gem;\n case 'nuget': return Ecosystem.Nuget;\n case 'go': return Ecosystem.Go;\n case 'cargo': return Ecosystem.Cargo;\n default: return Ecosystem.Generic;\n }\n}\n\nconst FIX_VERSION_REGEX = /\\d+(?:\\.\\d+)+[A-Za-z0-9._+\\-]*/;\n\n/**\n * Extracts the first version-looking token from fixedBy or a \"fixed in X\"\n * status string. Returns empty string when no fix info is present.\n */\nexport function extractFixedInVersion(vuln: TwistlockVuln): string {\n if (vuln.fixedBy) return vuln.fixedBy;\n const status = (vuln.status ?? '').toLowerCase();\n if (!status.includes('fixed')) return '';\n const m = (vuln.status ?? '').match(FIX_VERSION_REGEX);\n return m ? m[0] : '';\n}\n\n/**\n * Builds an AffectedPackage entry from per-vulnerability fields. Returns\n * undefined when packageName or packageVersion are missing (both required).\n */\nexport function buildAffectedPackage(\n vuln: TwistlockVuln,\n packageTypes: Map<string, string>,\n distro: string | undefined,\n): AffectedPackage | undefined {\n if (!vuln.packageName || !vuln.packageVersion) return undefined;\n const pkgType = vuln.packageType ?? packageTypes.get(vuln.packageName);\n const pkg: AffectedPackage = {\n name: vuln.packageName,\n version: vuln.packageVersion,\n ecosystem: resolveEcosystem(pkgType, distro),\n };\n const fixed = extractFixedInVersion(vuln);\n if (fixed) pkg.fixedInVersion = fixed;\n return pkg;\n}\n\n/**\n * Indexes packageName → packageType from the result-level packages array.\n */\nfunction buildPackageTypeIndex(pkgs: TwistlockPackage[] | undefined): Map<string, string> {\n const idx = new Map<string, string>();\n if (!pkgs) return idx;\n for (const p of pkgs) {\n if (p.name && p.type) idx.set(p.name, p.type);\n }\n return idx;\n}\n\n/**\n * Builds the code_desc string for a vulnerability result.\n */\nfunction formatCodeDesc(vuln: TwistlockVuln): string {\n const packageName = vuln.packageName ?? 'N/A';\n const impactedVersions = vuln.impactedVersions && vuln.impactedVersions.length > 0\n ? JSON.stringify(vuln.impactedVersions)\n : 'N/A';\n return `Package ${JSON.stringify(packageName)} should be updated to latest version above impacted versions ${impactedVersions}`;\n}\n\n/**\n * Converts a single vulnerability into an EvaluatedRequirement.\n *\n * @param vuln - The Twistlock vulnerability object\n * @param packageTypes - name→type lookup built from the enclosing result's packages array\n * @param distro - the enclosing result's distro string, used to disambiguate \"os\" packages\n */\nfunction buildRequirement(\n vuln: TwistlockVuln,\n packageTypes: Map<string, string>,\n distro: string | undefined,\n): EvaluatedRequirement {\n const nist = DEFAULT_REMEDIATION_NIST_TAGS;\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = { cveid: [vuln.id] };\n // Legacy: retain the cvss_base_score tag for one release so existing\n // downstream queries keep working. Marked for removal in v3.4.0 (see\n // CHANGELOG note in epic hdf-libs-8zn0).\n if (typeof vuln.cvss === 'number' && vuln.cvss > 0) {\n extras['cvss_base_score'] = vuln.cvss;\n }\n\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n const descriptions: Description[] = [\n { label: 'default', data: vuln.description },\n ];\n\n const startTime = (vuln.discoveredDate ? parseTimestamp(vuln.discoveredDate) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n const results = [\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatCodeDesc(vuln),\n startTime,\n }),\n ];\n\n const req = createRequirement(\n vuln.id,\n vuln.id,\n descriptions,\n twistlockSeverityToImpact(vuln.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const cv = buildCvss(vuln);\n if (cv) req.cvss = [cv];\n const cwes = parseCwes(vuln.cwe);\n if (cwes.length > 0) req.cwe = cwes;\n const pkg = buildAffectedPackage(vuln, packageTypes, distro);\n if (pkg) req.affectedPackages = [pkg];\n\n return req;\n}\n\n/**\n * Converts a single TwistlockResult to an EvaluatedBaseline.\n */\nfunction convertSingleResult(\n result: TwistlockResult,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n const vulns = result.vulnerabilities ?? [];\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const packageTypes = buildPackageTypeIndex(result.packages);\n const requirements: EvaluatedRequirement[] = limitedVulns.map(vuln =>\n buildRequirement(vuln, packageTypes, result.distro)\n );\n\n if (requirements.length === 0) {\n const target = result.name ?? result.repository ?? result.id ?? 'scan target';\n requirements.push(buildNoFindingsRequirement(\n 'twistlock-no-findings',\n `Twistlock scanned ${target} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n const title = buildTitle(result);\n const summary = buildSummary(result);\n\n return createMinimalBaseline(\n 'Twistlock Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary,\n }\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Twistlock/Prisma Cloud scan output to HDF format.\n *\n * Handles both container image scans (with \"results\" wrapper) and code\n * repository scans (single result object without wrapper).\n *\n * @param input - Twistlock JSON string\n * @returns HDF JSON string\n */\nexport async function convertTwistlockToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('twistlock: empty input');\n }\n validateInputSize(input, 'twistlock');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<TwistlockReport & TwistlockResult>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('twistlock: invalid JSON');\n }\n\n let results: TwistlockResult[];\n\n if (Array.isArray((parsed as TwistlockReport).results)) {\n // Container scan with \"results\" wrapper\n results = (parsed as TwistlockReport).results!;\n } else {\n // Code repo scan — single result object, wrap it\n results = [parsed as TwistlockResult];\n }\n\n if (results.length === 0) {\n throw new Error('twistlock: no scan results found');\n }\n\n const baselines = results.map(result =>\n convertSingleResult(result, resultsChecksum)\n );\n\n // Use the first result's name or repository as target name\n const targetName = results[0]!.name ?? results[0]!.repository ?? '';\n\n return buildHdfResults({\n generatorName: 'twistlock-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Twistlock',\n toolFormat: 'JSON',\n baselines,\n components: [{\n name: targetName,\n type: TargetType.ContainerImage,\n labels: { image: results[0]?.id ?? targetName },\n }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, parsePurl, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, inputChecksum, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Dependency-Track Finding Packaging Format (FPF) structures.\n */\ninterface DeptrackReport {\n version?: string;\n meta: DeptrackMeta;\n project: DeptrackProject;\n findings: DeptrackFinding[];\n}\n\ninterface DeptrackMeta {\n application?: string;\n version?: string;\n timestamp?: string;\n baseUrl?: string;\n}\n\ninterface DeptrackProject {\n uuid: string;\n name: string;\n version?: string;\n description?: string;\n}\n\ninterface DeptrackFinding {\n component: DeptrackComponent;\n vulnerability: DeptrackVulnerability;\n analysis?: DeptrackAnalysis;\n attribution?: DeptrackAttribution;\n matrix: string;\n}\n\ninterface DeptrackComponent {\n uuid?: string;\n name: string;\n version?: string;\n purl?: string;\n latestVersion?: string;\n group?: string;\n project?: string;\n cpe?: string;\n}\n\ninterface DeptrackVulnerability {\n uuid?: string;\n source?: string;\n vulnId?: string;\n title?: string;\n subtitle?: string;\n severity: string;\n severityRank?: number;\n cweId?: number;\n cweName?: string;\n cwes?: DeptrackCwe[];\n description?: string;\n recommendation?: string;\n aliases?: unknown[];\n cvssV2BaseScore?: number;\n cvssV3BaseScore?: number;\n epssScore?: number;\n epssPercentile?: number;\n}\n\ninterface DeptrackCwe {\n cweId: number;\n name: string;\n}\n\ninterface DeptrackAnalysis {\n state?: string;\n isSuppressed?: boolean;\n}\n\ninterface DeptrackAttribution {\n analyzerIdentity?: string;\n attributedOn?: string;\n alternateIdentifier?: string;\n referenceUrl?: string;\n}\n\n/**\n * Maps Dependency-Track severity strings to HDF impact values.\n * Uses the same mapping as the heimdall2 dependency-track-mapper:\n * critical=0.9, high=0.7, medium=0.5, low=0.3, info=0, unassigned=0.5\n */\nfunction getImpact(severity: string): number {\n switch (severity.toLowerCase()) {\n case 'critical':\n return 0.9;\n case 'high':\n return 0.7;\n case 'medium':\n return 0.5;\n case 'low':\n return 0.3;\n case 'info':\n return 0.0;\n default:\n return 0.5;\n }\n}\n\n/**\n * Builds the requirement title from component purl and vulnerability title.\n * Matches the heimdall2 pattern: \"{purl} - {title}\" or just \"{purl}\".\n */\nfunction getTitle(finding: DeptrackFinding): string {\n const purl = finding.component.purl ?? finding.component.name;\n const title = finding.vulnerability.title;\n if (title) {\n return `${purl} - ${title}`;\n }\n return purl;\n}\n\n/**\n * Extracts CWE IDs as \"CWE-NNN\" strings from the cwes array.\n */\nfunction getCweIDs(cwes: DeptrackCwe[] | undefined): string[] {\n if (!cwes || cwes.length === 0) {\n return [];\n }\n return cwes.map(cwe => `CWE-${cwe.cweId}`);\n}\n\n/**\n * Builds a single EvaluatedRequirement from a Dependency-Track finding.\n */\nfunction buildRequirement(finding: DeptrackFinding, timestamp: string | undefined): EvaluatedRequirement {\n const cweIDs = getCweIDs(finding.vulnerability.cwes);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweIds'] = cweIDs;\n }\n\n // Build descriptions: default, check, fix\n const descriptions: Description[] = [\n { label: 'default', data: finding.vulnerability.description ?? '' },\n ];\n\n if (finding.vulnerability.description) {\n descriptions.push({ label: 'check', data: finding.vulnerability.description });\n }\n if (finding.vulnerability.recommendation) {\n descriptions.push({ label: 'fix', data: finding.vulnerability.recommendation });\n }\n\n // Build result: all findings are Failed\n const codeDesc = finding.vulnerability.recommendation ?? 'No recommendation available';\n\n const results = [\n createResult(ResultStatus.Failed, undefined, {\n codeDesc,\n startTime: (timestamp ? parseTimestamp(timestamp) : null) ?? new Date('0001-01-01T00:00:00Z'),\n }),\n ];\n\n const req = createRequirement(\n finding.matrix,\n getTitle(finding),\n descriptions,\n getImpact(finding.vulnerability.severity),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n const pkg = buildAffectedPackageFromComponent(finding.component);\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n\n return req;\n}\n\n/**\n * Builds an Affected_Package from a Dependency-Track component. Prefers\n * the rich identifiers Dependency-Track already exposes (purl, cpe) and\n * augments with name/version/ecosystem when available. Returns undefined\n * when the component carries no schema-acceptable identifier.\n */\nfunction buildAffectedPackageFromComponent(c: DeptrackComponent): ReturnType<typeof buildAffectedPackage> {\n // Derive ecosystem from the purl scheme when possible; falls back to\n // generic so the name+version+ecosystem branch stays valid for\n // components Dependency-Track left without a purl.\n let ecosystem;\n if (c.purl) {\n const parsed = parsePurl(c.purl);\n ecosystem = ecosystemFromPurlType(parsed?.type);\n } else if (c.name && c.version) {\n ecosystem = ecosystemFromPurlType(undefined);\n }\n return buildAffectedPackage({\n name: c.name,\n version: c.version,\n ecosystem,\n purl: c.purl,\n cpe: c.cpe,\n fixedInVersion: c.latestVersion,\n });\n}\n\n/**\n * Converts Dependency-Track FPF JSON output to HDF format.\n *\n * @param input - Dependency-Track FPF JSON string\n * @returns HDF JSON string\n */\nexport async function convertDeptrackToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('deptrack: empty input');\n }\n validateInputSize(input, 'deptrack');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<DeptrackReport>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('deptrack: invalid JSON');\n }\n\n // Validate it looks like a Dependency-Track report\n if (!parsed.findings && !parsed.project && !parsed.meta) {\n throw new Error('deptrack: input does not appear to be a Dependency-Track report');\n }\n\n const findings = parsed.findings ?? [];\n const requirements: EvaluatedRequirement[] = findings.map(\n finding => buildRequirement(finding, parsed.meta?.timestamp),\n );\n\n if (requirements.length === 0) {\n const projectName = parsed.project?.name ?? parsed.project?.uuid ?? '';\n requirements.push(buildNoFindingsRequirement(\n 'deptrack-no-findings',\n `Dependency-Track analyzed ${projectName} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n const title = `Dependency-Track: ${parsed.project?.name ?? ''} ${parsed.project?.version ?? ''}`;\n\n const baseline = createMinimalBaseline(\n 'Dependency-Track Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: parsed.project?.description,\n },\n ) as EvaluatedBaseline;\n\n const targetName = parsed.project?.name ?? parsed.project?.uuid ?? '';\n\n return buildHdfResults({\n generatorName: 'deptrack-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Dependency-Track',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, sha256 } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, ecosystemFromPurlType, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * JFrog Xray JSON output structures.\n */\ninterface XrayReport {\n total_count: number;\n data: XrayEntry[];\n}\n\ninterface XrayEntry {\n id: string;\n severity: string;\n summary: string;\n issue_type?: string;\n provider?: string;\n component?: string;\n source_id?: string;\n source_comp_id?: string;\n component_versions?: ComponentVersions;\n edited?: string;\n}\n\ninterface ComponentVersions {\n id?: string;\n vulnerable_versions?: string[];\n fixed_versions?: string[];\n more_details?: MoreDetails;\n}\n\ninterface MoreDetails {\n cves?: CVEEntry[];\n description?: string;\n provider?: string;\n}\n\ninterface CVEEntry {\n cve?: string;\n cwe?: string[];\n cvss_v2?: string;\n cvss_v3?: string;\n}\n\n/**\n * Generate a truncated SHA-256 hash of a string for use as an ID.\n * Truncated to 32 hex chars for compatibility with original hash length.\n */\nasync function hashID(summary: string): Promise<string> {\n const full = await sha256(summary);\n return full.substring(0, 32);\n}\n\n/**\n * Extract CWE identifiers from the first CVE entry.\n */\nfunction extractCWEs(entry: XrayEntry): string[] {\n const cves = entry.component_versions?.more_details?.cves;\n if (!cves || cves.length === 0) {\n return [];\n }\n return cves[0]?.cwe ?? [];\n}\n\n/**\n * Build description from more_details, including CVE data.\n * Matches heimdall2 formatDesc behavior.\n */\nfunction formatDescription(entry: XrayEntry): string {\n const parts: string[] = [];\n const desc = entry.component_versions?.more_details?.description;\n if (desc) {\n parts.push(desc);\n }\n const cves = entry.component_versions?.more_details?.cves;\n if (cves && cves.length > 0) {\n let cveStr = JSON.stringify(cves);\n cveStr = cveStr.replace(/\":/g, '\"=>');\n cveStr = cveStr.replace(/,/g, ', ');\n parts.push(`cves: ${cveStr}`);\n }\n if (parts.length === 0) {\n return entry.summary;\n }\n return parts.join('\\n');\n}\n\n/**\n * Build code_desc from component version metadata.\n * Matches heimdall2 formatCodeDesc behavior.\n */\nfunction formatCodeDesc(entry: XrayEntry): string {\n const parts: string[] = [];\n\n parts.push(`source_comp_id : ${entry.source_comp_id ?? ''}`);\n\n const vulnVersions = entry.component_versions?.vulnerable_versions;\n if (vulnVersions && vulnVersions.length > 0) {\n parts.push(`vulnerable_versions : ${JSON.stringify(vulnVersions)}`);\n } else {\n parts.push('vulnerable_versions : ');\n }\n\n const fixedVersions = entry.component_versions?.fixed_versions;\n if (fixedVersions && fixedVersions.length > 0) {\n parts.push(`fixed_versions : ${JSON.stringify(fixedVersions)}`);\n } else {\n parts.push('fixed_versions : ');\n }\n\n parts.push(`issue_type : ${entry.issue_type ?? ''}`);\n parts.push(`provider : ${entry.provider ?? ''}`);\n\n return parts.join('\\n').replace(/,/g, ', ');\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of entries sharing an ID.\n */\nfunction buildRequirement(entryID: string, entries: XrayEntry[], scanTime: Date): EvaluatedRequirement {\n const rep = entries[0]!;\n const cweIDs = extractCWEs(rep);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweid'] = cweIDs;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: formatDescription(rep) },\n ];\n\n const results = entries.map(entry =>\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatCodeDesc(entry),\n startTime: scanTime,\n })\n );\n\n const req = createRequirement(\n entryID,\n rep.summary,\n descriptions,\n severityToImpact(rep.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const pkg = buildAffectedPackageFromEntry(rep);\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n return req;\n}\n\n// Xray source-id scheme to AffectedPackage ecosystem.\n// `gav://` is Maven (group:artifact); other schemes match purl types\n// directly (npm, pypi, etc.).\nfunction ecosystemFromXraySource(scheme: string): Ecosystem {\n if (scheme === 'gav') return Ecosystem.Maven;\n return ecosystemFromPurlType(scheme);\n}\n\n// Parse `<scheme>://<name>:<version>` (source_comp_id) or\n// `<scheme>://<name>` (source_id). Returns undefined when no scheme is\n// present.\nfunction parseSourceCompID(s: string | undefined):\n | { scheme: string; name: string; version?: string }\n | undefined {\n if (!s) return undefined;\n const m = /^([a-zA-Z0-9]+):\\/\\/(.+)$/.exec(s);\n if (!m) return undefined;\n const scheme = m[1]!.toLowerCase();\n const rest = m[2]!;\n const colonIdx = rest.lastIndexOf(':');\n if (colonIdx > 0) {\n return { scheme, name: rest.slice(0, colonIdx), version: rest.slice(colonIdx + 1) };\n }\n return { scheme, name: rest };\n}\n\nfunction buildAffectedPackageFromEntry(entry: XrayEntry): ReturnType<typeof buildAffectedPackage> {\n const parsed = parseSourceCompID(entry.source_comp_id ?? entry.source_id);\n let name = entry.component ?? '';\n let version: string | undefined;\n let ecosystem: Ecosystem | undefined;\n if (parsed) {\n if (parsed.name) name = parsed.name;\n version = parsed.version;\n ecosystem = ecosystemFromXraySource(parsed.scheme);\n }\n // Fall back to component_versions.fixed_versions[0] for the fixed-in\n // marker; vulnerable_versions are range expressions and don't fit\n // AffectedPackage.fixedInVersion (which mirrors `version` syntax).\n const fixed = entry.component_versions?.fixed_versions?.[0];\n // Without a concrete version we still emit the package — the schema\n // accepts name+version+ecosystem OR purl-only; here we ensure at\n // least name+ecosystem are populated, version optional.\n return buildAffectedPackage({\n name,\n version,\n ecosystem: ecosystem ?? (name ? Ecosystem.Generic : undefined),\n fixedInVersion: fixed,\n });\n}\n\n/**\n * Converts JFrog Xray JSON output to HDF format.\n *\n * @param input - JFrog Xray JSON string\n * @returns HDF JSON string\n */\nexport async function convertJfrogXrayToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('jfrog-xray: empty input');\n }\n validateInputSize(input, 'jfrog-xray');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<XrayReport>(input);\n\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.data)) {\n throw new Error('jfrog-xray: invalid JSON structure');\n }\n\n // JFrog Xray output carries no scan-level timestamp (only per-entry `edited`\n // dates, which mark when each vuln-DB record was last edited, not when the\n // scan ran). Use a single conversion timestamp for all results, the doc\n // timestamp, and the no-findings placeholder.\n const scanTime = new Date();\n\n const { items: limitedEntries, truncated } = limitArray(parsed.data);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedEntries.length} entries (original: ${parsed.data.length})`);\n }\n\n // Pre-compute entry IDs (hashID is async due to Web Crypto sha256)\n const entryIDs = await Promise.all(\n limitedEntries.map(async (entry) => {\n if (entry.id && entry.id.length > 0) return entry.id;\n return hashID(entry.summary);\n })\n );\n\n // Group entries by effective ID, preserving insertion order\n const groups = new Map<string, XrayEntry[]>();\n for (let i = 0; i < limitedEntries.length; i++) {\n const id = entryIDs[i]!;\n const entry = limitedEntries[i]!;\n const existing = groups.get(id);\n if (existing) {\n existing.push(entry);\n } else {\n groups.set(id, [entry]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [entryID, entries] of groups) {\n requirements.push(buildRequirement(entryID, entries, scanTime));\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'jfrog-xray-no-findings',\n 'JFrog Xray scanned the target artifact and reported zero vulnerable components.',\n scanTime,\n ));\n }\n\n const baseline = createMinimalBaseline(\n 'JFrog Xray Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'jfrog-xray-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'JFrog Xray',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ name: 'JFrog Xray Scan', type: TargetType.Application }],\n timestamp: scanTime,\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_REMEDIATION_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, extractCWEIDs, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * NeuVector scan JSON output structures.\n *\n * Top-level object has \"error_message\" and \"report\" fields.\n * The report contains image metadata and a vulnerabilities array.\n */\ninterface NeuVectorScan {\n error_message: string;\n report: NeuVectorScanReport;\n}\n\ninterface NeuVectorScanReport {\n image_id: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n size: number;\n author: string;\n base_os: string;\n created_at: string;\n cvedb_version: string;\n cvedb_create_time: string;\n layers: unknown[];\n vulnerabilities: NeuVectorVuln[];\n modules?: NeuVectorScanModule[];\n}\n\ninterface NeuVectorVuln {\n name: string;\n score: number;\n severity: string;\n vectors: string;\n description: string;\n file_name: string;\n package_name: string;\n package_version: string;\n fixed_version: string;\n link: string;\n score_v3: number;\n vectors_v3: string;\n published_timestamp: number;\n last_modified_timestamp: number;\n cpes?: string[];\n cves?: string[];\n feed_rating: string;\n in_base_image?: boolean;\n tags?: string[];\n}\n\ninterface NeuVectorScanModule {\n name: string;\n file: string;\n version: string;\n source: string;\n}\n\n/**\n * Extracts CWE identifiers from a vulnerability description string.\n * Returns CWE-prefixed IDs (e.g., [\"CWE-444\"]) for use in tags and mapCWEToNIST.\n */\nfunction extractCWEs(description: string): string[] {\n return extractCWEIDs(description).map(id => `CWE-${id}`);\n}\n\n/**\n * Computes the HDF impact from NeuVector CVSS scores.\n * Prefers CVSS v3 score; falls back to CVSS v2 if v3 is 0.\n * Impact is normalized to 0.0-1.0 by dividing by 10.\n */\nfunction getImpact(vuln: NeuVectorVuln): number {\n if (vuln.score_v3 > 0) {\n return vuln.score_v3 / 10;\n }\n if (vuln.score > 0) {\n return vuln.score / 10;\n }\n return 0.5; // default when no score available\n}\n\n/**\n * Constructs the unique ID for a NeuVector vulnerability.\n */\nfunction vulnID(vuln: NeuVectorVuln): string {\n return `${vuln.name}/${vuln.package_name}/${vuln.package_version}`;\n}\n\n/**\n * Generates a human-readable title for the vulnerability.\n */\nfunction vulnTitle(vuln: NeuVectorVuln): string {\n return `NeuVector found a vulnerability to ${vuln.name} in ${vuln.package_name}/${vuln.package_version}.`;\n}\n\n/**\n * Generates the result message describing the fix action.\n */\nfunction vulnMessage(vuln: NeuVectorVuln): string {\n if (!vuln.fixed_version) {\n return `Vulnerable package ${vuln.package_name} is at version ${vuln.package_version}. No fixed version available.`;\n }\n return `Vulnerable package ${vuln.package_name} is at version ${vuln.package_version}. Update to fixed version ${vuln.fixed_version}.`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a NeuVector vulnerability.\n */\nfunction buildRequirement(vuln: NeuVectorVuln, scanTime: Date): EvaluatedRequirement {\n const cweIDs = extractCWEs(vuln.description);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_REMEDIATION_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cwe'] = cweIDs;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: vuln.description },\n ];\n\n const results = [\n createResult(ResultStatus.Failed, vulnMessage(vuln), {\n codeDesc: '',\n startTime: scanTime,\n }),\n ];\n\n const req = createRequirement(\n vulnID(vuln),\n vulnTitle(vuln),\n descriptions,\n getImpact(vuln),\n results,\n { tags }\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n // NeuVector scans container images; the package ecosystem isn't\n // disambiguated by the source format (could be rpm/deb/python/etc.\n // depending on the base image), so we record `generic`. NeuVector\n // emits CPE 2.2 URIs (`cpe:/...`); the schema requires CPE 2.3, so\n // only the first 2.3-shaped entry is carried through.\n const cpe23 = (vuln.cpes ?? []).find((c) => /^cpe:2\\.3:[aho]:/.test(c));\n const pkg = buildAffectedPackage({\n name: vuln.package_name,\n version: vuln.package_version,\n ecosystem: vuln.package_name && vuln.package_version ? Ecosystem.Generic : undefined,\n cpe: cpe23,\n fixedInVersion: vuln.fixed_version,\n });\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n return req;\n}\n\n/**\n * Constructs the baseline title from the image metadata.\n */\nfunction imageTitle(report: NeuVectorScanReport): string {\n return `${report.registry}/${report.repository}:${report.tag} - Digest: ${report.digest} - Image ID: ${report.image_id}`;\n}\n\n/**\n * Constructs the target name from the image metadata.\n */\nfunction targetNameFromReport(report: NeuVectorScanReport): string {\n return `${report.registry}/${report.repository}:${report.tag}`;\n}\n\n/**\n * Converts NeuVector container vulnerability scan JSON output to HDF format.\n *\n * Each vulnerability becomes a separate requirement with a unique\n * ID of name/package_name/package_version. Impact is derived from the\n * CVSS v3 score (preferred) or CVSS v2 score as fallback, normalized to 0-1.\n *\n * CWE identifiers are extracted from vulnerability descriptions via regex\n * and mapped to NIST 800-53 controls. When no CWE is found, default\n * remediation NIST tags (SI-2, RA-5) are used.\n *\n * @param input - NeuVector scan JSON string\n * @returns HDF JSON string\n */\nexport async function convertNeuvectorToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('neuvector: empty input');\n }\n validateInputSize(input, 'neuvector');\n\n const scan = parseJSON<NeuVectorScan>(input);\n\n if (!scan || typeof scan !== 'object' || !('report' in scan)) {\n throw new Error('neuvector: invalid JSON structure');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const { items: limitedVulns, truncated } = limitArray(\n scan.report.vulnerabilities ?? []\n );\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${scan.report.vulnerabilities.length})`\n );\n }\n\n // NeuVector reports carry image build time (created_at) and CVE-DB version\n // time (cvedb_create_time), but neither is the scan time, so use conversion\n // time as the single timestamp shared by every result.\n const scanTime = new Date();\n\n // Deduplicate by composite ID (name/package_name/package_version)\n const seen = new Set<string>();\n const requirements: EvaluatedRequirement[] = [];\n for (const vuln of limitedVulns) {\n const id = vulnID(vuln);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n requirements.push(buildRequirement(vuln, scanTime));\n }\n\n const target = targetNameFromReport(scan.report);\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'neuvector-no-findings',\n `NeuVector scanned ${target} and reported zero vulnerable components.`,\n scanTime,\n ));\n }\n\n const title = imageTitle(scan.report);\n\n const baseline = createMinimalBaseline(\n 'NeuVector Scan',\n requirements,\n {\n resultsChecksum,\n title,\n }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'neuvector-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'NeuVector',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [\n {\n name: targetNameFromReport(scan.report),\n type: TargetType.ContainerImage,\n labels: {\n image: `${scan.report.registry}/${scan.report.repository}:${scan.report.tag}`,\n registry: scan.report.registry,\n },\n },\n ],\n timestamp: scanTime,\n });\n}\n","import { parseXml, parseTimestamp } from '@mitre/hdf-utilities';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport {\n buildNoFindingsRequirement,\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n ensureArray,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n validateInputSize,\n serializeHdf,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// NIST 800-53 reference name used by Fortify in Description.References\nconst NIST_REFERENCE_NAME =\n 'Standards Mapping - NIST Special Publication 800-53 Revision 4';\n\n\n// Regex to match NIST control identifiers like SI-10, AC-2\nconst NIST_PATTERN = /[a-zA-Z]{2}-\\d+/g;\n\n// --- FVDL XML types ---\n\ninterface FVDLParsed {\n FVDL: {\n CreatedTS?: { date?: string; time?: string };\n UUID?: string;\n Build?: {\n BuildID?: string;\n NumberFiles?: string;\n SourceBasePath?: string;\n };\n Vulnerabilities?: {\n Vulnerability?: FVDLVulnerability | FVDLVulnerability[];\n };\n Description?: FVDLDescription | FVDLDescription[];\n Snippets?: {\n Snippet?: FVDLSnippet | FVDLSnippet[];\n };\n EngineData?: {\n EngineVersion?: string;\n };\n };\n}\n\ninterface FVDLVulnerability {\n ClassInfo?: {\n ClassID?: string;\n Kingdom?: string;\n Type?: string;\n Subtype?: string;\n AnalyzerName?: string;\n DefaultSeverity?: string;\n };\n InstanceInfo?: {\n InstanceID?: string;\n InstanceSeverity?: string;\n Confidence?: string;\n };\n AnalysisInfo?: {\n Unified?: {\n Trace?: {\n Primary?: {\n Entry?: FVDLEntry | FVDLEntry[];\n };\n };\n };\n };\n}\n\ninterface FVDLEntry {\n NodeRef?: { id?: string };\n Node?: {\n isDefault?: string;\n SourceLocation?: {\n path?: string;\n line?: string;\n lineEnd?: string;\n colStart?: string;\n colEnd?: string;\n contextId?: string;\n snippet?: string;\n };\n };\n}\n\ninterface FVDLDescription {\n classID?: string;\n contentType?: string;\n Abstract?: string;\n Explanation?: string;\n Recommendations?: string;\n References?: {\n Reference?: FVDLReference | FVDLReference[];\n };\n}\n\ninterface FVDLReference {\n Title?: string;\n Author?: string;\n Publisher?: string;\n Source?: string;\n}\n\ninterface FVDLSnippet {\n id?: string;\n File?: string;\n StartLine?: string;\n EndLine?: string;\n Text?: string;\n}\n\n// --- Helpers ---\n\nfunction buildSnippetMap(snippets: FVDLSnippet[]): Map<string, FVDLSnippet> {\n const map = new Map<string, FVDLSnippet>();\n for (const s of snippets) {\n if (s.id) {\n map.set(s.id, s);\n }\n }\n return map;\n}\n\nfunction groupVulnsByClassID(vulns: FVDLVulnerability[]): Map<string, FVDLVulnerability[]> {\n const groups = new Map<string, FVDLVulnerability[]>();\n for (const vuln of vulns) {\n const classID = vuln.ClassInfo?.ClassID ?? 'unknown';\n const existing = groups.get(classID);\n if (existing) {\n existing.push(vuln);\n } else {\n groups.set(classID, [vuln]);\n }\n }\n return groups;\n}\n\nfunction extractNISTFromReferences(refs: FVDLReference[]): string[] {\n for (const ref of refs) {\n if (ref.Author === NIST_REFERENCE_NAME) {\n const matches = ref.Title?.match(NIST_PATTERN);\n if (matches && matches.length > 0) {\n return matches;\n }\n }\n }\n return [];\n}\n\nfunction formatSnippet(snippet: FVDLSnippet): string {\n const text = (snippet.Text ?? '').trim();\n return `Path: ${snippet.File ?? ''}\\nStartLine: ${snippet.StartLine ?? ''}, EndLine: ${snippet.EndLine ?? ''}\\nCode:\\n${text}`;\n}\n\nfunction buildCodeDesc(\n vuln: FVDLVulnerability,\n snippetMap: Map<string, FVDLSnippet>,\n): string {\n const parts: string[] = [];\n const entries = ensureArray(vuln.AnalysisInfo?.Unified?.Trace?.Primary?.Entry);\n\n for (const entry of entries) {\n if (!entry.Node) continue;\n\n const snippetID = entry.Node.SourceLocation?.snippet;\n if (!snippetID) {\n const path = entry.Node.SourceLocation?.path;\n const line = entry.Node.SourceLocation?.line;\n if (path) {\n parts.push(`Path: ${path}\\nLine: ${line ?? ''}`);\n }\n continue;\n }\n\n const snippet = snippetMap.get(snippetID);\n if (snippet) {\n parts.push(formatSnippet(snippet));\n }\n }\n\n if (parts.length === 0) {\n return `ClassID: ${vuln.ClassInfo?.ClassID ?? ''}, InstanceID: ${vuln.InstanceInfo?.InstanceID ?? ''}`;\n }\n\n return parts.join('\\n');\n}\n\nfunction buildRequirement(\n desc: FVDLDescription,\n vulns: FVDLVulnerability[],\n snippetMap: Map<string, FVDLSnippet>,\n startTimeStr: string,\n): EvaluatedRequirement {\n // Extract NIST tags from Description References\n const refs = ensureArray(desc.References?.Reference);\n let nistTags = extractNISTFromReferences(refs);\n if (nistTags.length === 0) {\n nistTags = [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n }\n const cciTags = nistToCci(nistTags);\n const tags = buildNistCciTags(nistTags, cciTags);\n\n // Title from Abstract (HTML stripped)\n const title = stripHTML(desc.Abstract ?? '');\n\n // Default description from Explanation (HTML stripped)\n let explanationText = stripHTML(desc.Explanation ?? '');\n if (!explanationText) {\n explanationText = title;\n }\n const descriptions: Description[] = [\n { label: 'default', data: explanationText },\n ];\n\n // Fix description from Recommendations\n if (desc.Recommendations) {\n descriptions.push({\n label: 'fix',\n data: stripHTML(desc.Recommendations),\n });\n }\n\n // Impact from the first vulnerability's DefaultSeverity / 5\n let impact = 0;\n if (vulns.length > 0) {\n const severity = parseFloat(vulns[0]!.ClassInfo?.DefaultSeverity ?? '0');\n impact = severity / 5.0;\n }\n\n // Build results — one per vulnerability instance\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const results: RequirementResult[] = limitedVulns.map(vuln => ({\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vuln, snippetMap),\n startTime: parseTimestamp(startTimeStr) ?? new Date(),\n }));\n\n const req: EvaluatedRequirement = {\n id: desc.classID ?? 'unknown',\n title,\n impact,\n tags,\n descriptions,\n results,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n// --- Main converter ---\n\n/**\n * Converts Fortify FVDL XML to HDF format.\n *\n * Descriptions are used as requirements (one per unique classID).\n * Vulnerabilities are mapped to results under their corresponding Description.\n * Snippets provide code context for result code descriptions.\n *\n * @param input - Fortify FVDL XML string\n * @returns HDF JSON string\n */\nexport async function convertFortifyToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('fortify: empty input');\n }\n validateInputSize(input, 'fortify');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse FVDL XML — use stopNodes to preserve embedded HTML in Abstract/Explanation\n const parsed = parseXml(input, {\n stopNodes: ['FVDL.Description.Abstract', 'FVDL.Description.Explanation'],\n }) as unknown as FVDLParsed;\n\n if (!parsed.FVDL) {\n throw new Error('fortify: invalid FVDL — missing <FVDL> root element');\n }\n\n const fvdl = parsed.FVDL;\n\n // Build snippet map\n const snippets = ensureArray(fvdl.Snippets?.Snippet);\n const snippetMap = buildSnippetMap(snippets);\n\n // Get vulnerabilities grouped by ClassID\n const vulns = ensureArray(fvdl.Vulnerabilities?.Vulnerability);\n const vulnGroups = groupVulnsByClassID(vulns);\n\n // Get descriptions\n const descriptions = ensureArray(fvdl.Description);\n const { items: limitedDescs, truncated: truncatedDescs } = limitArray(descriptions);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedDescs) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedDescs.length} Description items (original: ${descriptions.length})`);\n }\n\n // Build timestamp string from CreatedTS\n const createdDate = fvdl.CreatedTS?.date ?? '';\n const createdTime = fvdl.CreatedTS?.time ?? '';\n const startTimeStr = `${createdDate}T${createdTime}`;\n\n // Build requirements — one per Description classID\n const requirements: EvaluatedRequirement[] = limitedDescs.map(desc => {\n const classVulns = vulnGroups.get(desc.classID ?? '') ?? [];\n return buildRequirement(desc, classVulns, snippetMap, startTimeStr);\n });\n\n const targetName = fvdl.Build?.SourceBasePath ?? fvdl.Build?.BuildID ?? 'Unknown';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'fortify-no-findings',\n `Fortify scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n // Build baseline\n const title = 'Fortify Static Analyzer Scan';\n const summary = `Fortify Static Analyzer Scan of UUID: ${fvdl.UUID ?? ''}`;\n const version = fvdl.EngineData?.EngineVersion ?? '';\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Fortify Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary,\n version,\n status: 'loaded',\n },\n ) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'Fortify',\n format: 'FVDL',\n };\n\n const hdfResult: HDFResults = {\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Repository,\n },\n ],\n generator: {\n name: 'fortify-to-hdf',\n version: '1.0.0',\n },\n tool,\n };\n\n // Set timestamp from CreatedTS\n if (createdDate) {\n hdfResult.timestamp = parseTimestamp(startTimeStr) ?? new Date();\n }\n\n return serializeHdf(hdfResult);\n}\n","/**\n * Prisma Cloud CSV to HDF converter.\n *\n * Prisma Cloud exports compliance scan results as CSV with one row per finding.\n * Findings are grouped by Hostname, producing one baseline per host.\n * Each finding maps to a single requirement with a single failed result.\n */\n\nimport { parseCsv } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArrayWithWarning, DEFAULT_REMEDIATION_NIST_TAGS, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n\n/** Required CSV columns that must be present */\nconst REQUIRED_COLUMNS = ['Hostname', 'Compliance ID', 'Severity', 'Type', 'Description'];\n\n/**\n * A single row from the Prisma Cloud CSV export.\n */\ninterface PrismaRecord {\n Hostname: string;\n Distro: string;\n 'CVE ID': string;\n 'Compliance ID': string;\n Type: string;\n Severity: string;\n Packages: string;\n /** Some Prisma exports include a separate Source Package column;\n * optional because older exports collapse it into `Packages`. */\n 'Source Package'?: string;\n /** Concrete vulnerable version of the affected package. */\n 'Package Version'?: string;\n Description: string;\n Cause: string;\n 'Fix Status': string;\n Published: string;\n 'Vulnerability Link': string;\n}\n\n/**\n * Prisma uses non-standard severity names: \"important\" and \"moderate\"\n * in addition to the standard critical/high/medium/low.\n */\nfunction getImpact(severity: string): number {\n switch (severity.toLowerCase()) {\n case 'critical':\n return 1.0;\n case 'important':\n return 0.9;\n case 'high':\n return 0.7;\n case 'moderate':\n case 'medium':\n return 0.5;\n case 'low':\n return 0.3;\n default:\n return 0.5;\n }\n}\n\n/**\n * Returns NIST tags based on whether the finding has a CVE.\n * CVE findings get remediation tags; non-CVE compliance findings get static analysis tags.\n */\nfunction getNistTags(cveID: string): string[] {\n if (cveID) {\n return DEFAULT_REMEDIATION_NIST_TAGS;\n }\n return DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n}\n\n/**\n * Constructs the requirement ID following the heimdall2 pattern:\n * - CVE findings: \"{ComplianceID}-{CVEID}\"\n * - Non-CVE compliance: \"{ComplianceID}-{Distro}-{Severity}\"\n */\nfunction makeRequirementID(rec: PrismaRecord): string {\n if (rec['CVE ID']) {\n return `${rec['Compliance ID']}-${rec['CVE ID']}`;\n }\n return `${rec['Compliance ID']}-${rec.Distro}-${rec.Severity}`;\n}\n\n/**\n * Builds the code description following the heimdall2 pattern.\n */\nfunction makeCodeDesc(rec: PrismaRecord): string {\n let result = '';\n if (rec.Type === 'image') {\n if (rec.Packages !== '') {\n result += `Version check of package: ${rec.Packages}`;\n }\n } else if (rec.Type === 'linux') {\n if (rec.Distro !== '') {\n result += `Configuration check for ${rec.Distro}`;\n }\n } else {\n result += `${rec.Type} check for ${rec.Hostname}`;\n }\n if (rec.Description) {\n result += `\\n\\n${rec.Description}`;\n }\n return result;\n}\n\n/**\n * Builds the result message from Fix Status and Cause fields.\n */\nfunction makeMessage(rec: PrismaRecord): string {\n const hasFixStatus = rec['Fix Status'] !== '';\n const hasCause = rec.Cause !== '';\n\n if (hasFixStatus && hasCause) {\n return `Fix Status: ${rec['Fix Status']}\\n\\n${rec.Cause}`;\n } else if (hasFixStatus) {\n return `Fix Status: ${rec['Fix Status']}`;\n } else if (hasCause) {\n return `Cause: ${rec.Cause}`;\n }\n return 'Unknown';\n}\n\n/**\n * Builds the requirement title following the heimdall2 pattern.\n */\nfunction makeTitle(rec: PrismaRecord): string {\n return `${rec.Hostname}-${rec.Distro}-${rec.Type}`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a Prisma record.\n */\nfunction buildRequirement(rec: PrismaRecord, scanTime: Date): EvaluatedRequirement {\n const id = makeRequirementID(rec);\n const title = makeTitle(rec);\n const codeDesc = makeCodeDesc(rec);\n const message = makeMessage(rec);\n\n const nist = getNistTags(rec['CVE ID']);\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {};\n if (rec['CVE ID']) {\n extras['cve'] = [rec['CVE ID']];\n }\n\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n const descriptions: Description[] = [\n { label: 'default', data: rec.Description },\n ];\n\n const results = [\n createResult(ResultStatus.Failed, message, {\n codeDesc,\n startTime: scanTime,\n }),\n ];\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n getImpact(rec.Severity),\n results,\n { tags },\n );\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n if (rec['CVE ID']) {\n const pkg = buildAffectedPackageFromRecord(rec);\n if (pkg) {\n (req as EvaluatedRequirement).affectedPackages = [pkg];\n }\n }\n return req as EvaluatedRequirement;\n}\n\n/**\n * Distro slugs in Prisma look like `redhat-RHEL7`, `debian-buster`,\n * `alpine-3.14`, `ubuntu-20.04`. Only the leading vendor segment is\n * mapped — unknown vendors fall back to `generic` rather than guessing.\n */\nfunction ecosystemFromDistro(distro: string | undefined): Ecosystem {\n if (!distro) return Ecosystem.Generic;\n const head = distro.split('-')[0]?.toLowerCase();\n switch (head) {\n case 'redhat':\n case 'rhel':\n case 'centos':\n case 'rocky':\n case 'alma':\n case 'fedora':\n case 'amazon':\n case 'amazonlinux':\n case 'suse':\n case 'sles':\n case 'opensuse':\n return Ecosystem.RPM;\n case 'debian':\n case 'ubuntu':\n return Ecosystem.Deb;\n default:\n return Ecosystem.Generic;\n }\n}\n\nconst FIX_VERSION_PATTERN = /fixed in\\s+([^\\s,;]+)/i;\n\nfunction buildAffectedPackageFromRecord(rec: PrismaRecord): ReturnType<typeof buildAffectedPackage> {\n const name = rec['Source Package'] || rec.Packages;\n const version = rec['Package Version'];\n if (!name || !version) return undefined;\n const fixMatch = rec['Fix Status'] ? FIX_VERSION_PATTERN.exec(rec['Fix Status']) : null;\n return buildAffectedPackage({\n name,\n version,\n ecosystem: ecosystemFromDistro(rec.Distro),\n fixedInVersion: fixMatch ? fixMatch[1] : undefined,\n });\n}\n\n/**\n * Groups records by hostname, preserving insertion order.\n */\nfunction groupByHostname(records: PrismaRecord[]): Map<string, PrismaRecord[]> {\n const groups = new Map<string, PrismaRecord[]>();\n for (const rec of records) {\n const existing = groups.get(rec.Hostname);\n if (existing) {\n existing.push(rec);\n } else {\n groups.set(rec.Hostname, [rec]);\n }\n }\n return groups;\n}\n\n/**\n * Builds an HDF baseline from all records for a single host.\n */\nfunction buildBaseline(\n hostname: string,\n records: PrismaRecord[],\n resultsChecksum: Checksum,\n scanTime: Date,\n): EvaluatedBaseline {\n const limitedRecords = limitArrayWithWarning(records, 'finding');\n\n const requirements = limitedRecords.map(rec => buildRequirement(rec, scanTime));\n\n const title = `Prisma Cloud Scan (${hostname})`;\n\n return createMinimalBaseline(\n 'Prisma Cloud Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Prisma Cloud CSV compliance scan output to HDF format.\n * Records are grouped by hostname, producing one baseline per host.\n *\n * @param input - Prisma Cloud CSV string\n * @returns HDF JSON string\n */\nexport async function convertPrismaToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('prisma: empty input');\n }\n validateInputSize(input, 'prisma');\n\n // Validate required columns are present in the CSV header before any\n // data-row parsing so a headers-only Prisma export is still accepted.\n const headerLine = input.split(/\\r?\\n/, 1)[0] ?? '';\n const headers = headerLine.split(',').map(h => h.trim());\n for (const col of REQUIRED_COLUMNS) {\n if (!headers.includes(col)) {\n throw new Error(`prisma: missing required CSV column \"${col}\"`);\n }\n }\n\n const records = parseCsv<PrismaRecord>(input);\n const resultsChecksum = await inputChecksum(input);\n // Prisma Cloud CSV exports carry no scan-level timestamp (the `Published`\n // column is a per-finding CVE publish date), so use conversion time for\n // every result, the doc timestamp, and any no-findings placeholder.\n const scanTime = new Date();\n const baselines: EvaluatedBaseline[] = [];\n const components: HDFResults['components'] = [];\n\n if (records.length === 0) {\n baselines.push(createMinimalBaseline(\n 'Prisma Cloud Scan',\n [buildNoFindingsRequirement(\n 'prisma-no-findings',\n 'Prisma Cloud scanned the workload and reported zero vulnerable components.',\n scanTime,\n )],\n {\n resultsChecksum,\n title: 'Prisma Cloud Scan',\n },\n ) as EvaluatedBaseline);\n } else {\n const hostGroups = groupByHostname(records);\n for (const [hostname, hostRecords] of hostGroups) {\n baselines.push(buildBaseline(hostname, hostRecords, resultsChecksum, scanTime));\n components.push({ name: hostname, type: TargetType.Host });\n }\n }\n\n return buildHdfResults({\n generatorName: 'prisma-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Prisma Cloud',\n toolFormat: 'CSV',\n baselines,\n components,\n timestamp: scanTime,\n });\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n getOwaspNistControl,\n getCweNistControl,\n} from '@mitre/hdf-mappings';\nimport {\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n validateInputSize,\n buildHdfResults,\n buildNoFindingsRequirement,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// --- Netsparker/Invicti XML input types ---\n\ninterface NetsparkerXml {\n 'netsparker-enterprise'?: NetsparkerEnterprise;\n 'invicti-enterprise'?: NetsparkerEnterprise;\n}\n\ninterface NetsparkerEnterprise {\n generated?: string;\n target?: NetsparkerTarget;\n vulnerabilities?: {\n vulnerability?: NetsparkerVuln[];\n };\n}\n\ninterface NetsparkerTarget {\n 'scan-id'?: string;\n url?: string;\n initiated?: string;\n duration?: string;\n}\n\ninterface NetsparkerVuln {\n LookupId?: string;\n url?: string;\n type?: string;\n name?: string;\n severity?: string;\n certainty?: string;\n confirmed?: string;\n state?: string;\n FirstSeenDate?: string;\n LastSeenDate?: string;\n classification?: NetsparkerClassification;\n 'http-request'?: NetsparkerHttpRequest;\n 'http-response'?: NetsparkerHttpResponse;\n description?: string;\n impact?: string;\n 'remedial-actions'?: string;\n 'exploitation-skills'?: string;\n 'remedial-procedure'?: string;\n 'remedy-references'?: string;\n 'external-references'?: string;\n 'proof-of-concept'?: string;\n}\n\ninterface NetsparkerClassification {\n owasp?: string;\n wasc?: string;\n cwe?: string;\n capec?: string;\n iso27001?: string;\n}\n\ninterface NetsparkerHttpRequest {\n method?: string;\n content?: string;\n}\n\ninterface NetsparkerHttpResponse {\n 'status-code'?: string;\n duration?: string;\n content?: string;\n}\n\n// --- Severity to impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n 'critical': 1.0,\n 'high': 0.7,\n 'medium': 0.5,\n 'low': 0.3,\n 'best_practice': 0.0,\n 'information': 0.0,\n};\n\nfunction getImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.5;\n}\n\n// Netsparker <initiated> uses the US format \"MM/DD/YYYY hh:mm AM/PM\"\n// (e.g. \"05/05/2023 04:57 PM\"), which the shared parseTimestamp does not\n// recognize — so it would fall to host-local `new Date()`. Parse it explicitly\n// as UTC (mirroring the Go converter's parseNetsparkerTimestamp + UTC\n// normalization); fall back to the shared parser for any other shape.\nconst NETSPARKER_US_DATETIME = /^\\d{2}\\/\\d{2}\\/\\d{4} \\d{1,2}:\\d{2} (AM|PM)$/;\n\nfunction parseNetsparkerTimestamp(s: string): Date | null {\n const trimmed = s.trim();\n if (NETSPARKER_US_DATETIME.test(trimmed)) {\n // Appending GMT forces UTC interpretation (the whole point of this parser),\n // so this new Date() is host-independent and safe — unlike a bare value.\n // eslint-disable-next-line no-restricted-syntax\n const d = new Date(`${trimmed} GMT`);\n if (!isNaN(d.getTime())) return d;\n }\n return parseTimestamp(s);\n}\n\n// --- Format helpers ---\n\nfunction formatCodeDesc(request: NetsparkerHttpRequest | undefined): string {\n const parts: string[] = [];\n parts.push(`http-request : ${request?.content ?? ''}`);\n parts.push(`method : ${request?.method ?? ''}`);\n return parts.join('\\n');\n}\n\nfunction formatMessage(response: NetsparkerHttpResponse | undefined): string {\n const parts: string[] = [];\n parts.push(`http-response : ${response?.content ?? ''}`);\n parts.push(`duration : ${response?.duration ?? ''}`);\n parts.push(`status-code : ${response?.['status-code'] ?? ''}`);\n return parts.join('\\n');\n}\n\nfunction formatControlDesc(vuln: NetsparkerVuln): string {\n const parts: string[] = [];\n if (vuln.description) {\n parts.push(stripHTML(vuln.description));\n }\n if (vuln['exploitation-skills']) {\n parts.push(`Exploitation-skills: ${vuln['exploitation-skills']}`);\n }\n const cweVal = vuln.classification?.cwe ?? '';\n const owaspVal = vuln.classification?.owasp ?? '';\n if (cweVal || owaspVal) {\n parts.push(`Classification: cwe=>${cweVal}, owasp=>${owaspVal}`);\n }\n if (vuln.impact) {\n parts.push(`Impact: ${stripHTML(vuln.impact)}`);\n }\n if (vuln.FirstSeenDate) {\n parts.push(`FirstSeenDate: ${vuln.FirstSeenDate}`);\n }\n if (vuln.LastSeenDate) {\n parts.push(`LastSeenDate: ${vuln.LastSeenDate}`);\n }\n if (vuln.certainty) {\n parts.push(`Certainty: ${vuln.certainty}`);\n }\n if (vuln.type) {\n parts.push(`Type: ${vuln.type}`);\n }\n if (vuln.confirmed) {\n parts.push(`Confirmed: ${vuln.confirmed}`);\n }\n return parts.join('\\n');\n}\n\n/**\n * Performs dual NIST mapping from both CWE and OWASP IDs.\n * Returns a deduplicated sorted list of NIST controls, falling back to\n * DEFAULT_STATIC_ANALYSIS_NIST_TAGS if no mappings are found.\n */\nfunction mapNISTFromCWEAndOWASP(cweID: string, owaspID: string): string[] {\n const controls = new Set<string>();\n\n // CWE -> NIST\n if (cweID) {\n const numericId = parseInt(cweID, 10);\n if (!isNaN(numericId)) {\n const nistControl = getCweNistControl(numericId);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n }\n\n // OWASP -> NIST\n if (owaspID) {\n const nistControl = getOwaspNistControl(owaspID);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n\n return controls.size > 0\n ? [...controls].sort()\n : [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n/**\n * Builds a single EvaluatedRequirement from a vulnerability.\n */\nfunction buildRequirement(\n vuln: NetsparkerVuln,\n initiated: string,\n): EvaluatedRequirement {\n const cweID = vuln.classification?.cwe ?? '';\n const owaspID = vuln.classification?.owasp ?? '';\n\n const nist = mapNISTFromCWEAndOWASP(cweID, owaspID);\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {};\n if (cweID) {\n extras.cweid = cweID;\n }\n if (owaspID) {\n extras.owasp = owaspID;\n }\n\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Default description\n const defaultDesc = formatControlDesc(vuln);\n const descriptions: Description[] = [\n { label: 'default', data: defaultDesc || vuln.name || '' },\n ];\n\n // Check description\n const checkParts: string[] = [];\n if (vuln['exploitation-skills']) {\n checkParts.push(`Exploitation-skills: ${vuln['exploitation-skills']}`);\n }\n if (vuln['proof-of-concept']) {\n checkParts.push(`Proof-of-concept: ${stripHTML(vuln['proof-of-concept'])}`);\n }\n if (checkParts.length > 0) {\n descriptions.push({ label: 'check', data: stripHTML(checkParts.join('\\n')) });\n }\n\n // Fix description\n const fixParts: string[] = [];\n if (vuln['remedial-actions']) {\n fixParts.push(`Remedial-actions: ${stripHTML(vuln['remedial-actions'])}`);\n }\n if (vuln['remedial-procedure']) {\n fixParts.push(`Remedial-procedure: ${stripHTML(vuln['remedial-procedure'])}`);\n }\n if (vuln['remedy-references']) {\n fixParts.push(`Remedy-references: ${stripHTML(vuln['remedy-references'])}`);\n }\n if (fixParts.length > 0) {\n descriptions.push({ label: 'fix', data: fixParts.join('\\n') });\n }\n\n // Result\n const codeDesc = formatCodeDesc(vuln['http-request']);\n const message = formatMessage(vuln['http-response']);\n\n const startTime = (initiated ? parseNetsparkerTimestamp(initiated) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n const results: RequirementResult[] = [{\n status: ResultStatus.Failed,\n codeDesc,\n message,\n startTime,\n }];\n\n const impact = getImpact(vuln.severity ?? '');\n\n const req: EvaluatedRequirement = {\n id: vuln.LookupId ?? '',\n title: vuln.name ?? undefined,\n impact,\n tags,\n descriptions,\n results,\n };\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Netsparker/Invicti XML scan results to HDF format.\n * Handles both <netsparker-enterprise> and <invicti-enterprise> root elements.\n *\n * @param input - Netsparker/Invicti XML string\n * @returns HDF JSON string\n */\nexport async function convertNetsparkerToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('netsparker: empty input');\n }\n validateInputSize(input, 'netsparker');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse XML — ensure vulnerability is always treated as array\n const parsed = parseXmlWithArrays(input, ['vulnerability']) as unknown as NetsparkerXml;\n\n // Detect root element\n const isInvicti = !!parsed['invicti-enterprise'];\n const data: NetsparkerEnterprise = parsed['invicti-enterprise'] ?? parsed['netsparker-enterprise'] ?? {};\n\n if (!data.vulnerabilities && !data.target) {\n throw new Error('netsparker: invalid XML — missing expected root element');\n }\n\n const toolName = isInvicti ? 'Invicti' : 'Netsparker';\n const vulns = data.vulnerabilities?.vulnerability ?? [];\n const target = data.target ?? {};\n const initiated = target.initiated ?? '';\n\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const targetName = target.url ?? 'Unknown';\n\n // Build one requirement per vulnerability\n const requirements: EvaluatedRequirement[] = limitedVulns.map(\n vuln => buildRequirement(vuln, initiated),\n );\n\n if (requirements.length === 0) {\n const startTime = (initiated ? parseNetsparkerTimestamp(initiated) : null) ?? new Date();\n requirements.push(buildNoFindingsRequirement(\n 'netsparker-no-findings',\n `${toolName} scanned ${targetName} and reported zero findings.`,\n startTime,\n ));\n }\n\n const title = `${toolName} Enterprise Scan ID: ${target['scan-id'] ?? ''} URL: ${target.url ?? ''}`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Netsparker Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'netsparker-to-hdf',\n converterVersion: '1.0.0',\n toolName,\n toolFormat: 'XML',\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Application,\n },\n ],\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n getScoutsuiteNistControl,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { inputChecksum, buildNistCciTags, deriveControlTypeFromTags, limitArrayWithWarning, validateInputSize, buildHdfResults, buildNoFindingsRequirement } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * ScoutSuite JSON output structures\n */\ninterface ScoutSuiteReport {\n account_id: string;\n environment?: string;\n last_run: LastRun;\n partition?: string;\n provider_code?: string;\n provider_name: string;\n services: Record<string, ServiceData>;\n}\n\ninterface LastRun {\n ruleset_about?: string;\n ruleset_name: string;\n time: string;\n version: string;\n}\n\ninterface ServiceData {\n findings?: Record<string, ScoutSuiteFinding>;\n [key: string]: unknown;\n}\n\ninterface ScoutSuiteFinding {\n checked_items: number;\n compliance?: ComplianceItem[] | null;\n description: string;\n flagged_items: number;\n id_suffix?: string;\n items: string[];\n level: string;\n path?: string;\n rationale: string;\n references?: string[] | null;\n remediation?: string | null;\n service?: string;\n}\n\ninterface ComplianceItem {\n name: string;\n reference: string;\n version: string;\n}\n\n/**\n * Maps ScoutSuite level strings to HDF impact values.\n */\nfunction getImpact(level: string): number {\n switch (level.toLowerCase()) {\n case 'danger':\n return 0.7;\n case 'warning':\n return 0.5;\n default:\n return 0.3;\n }\n}\n\n/**\n * Determines the HDF result status based on checked and flagged item counts.\n */\nfunction getStatus(checkedItems: number, flaggedItems: number): ResultStatus {\n if (checkedItems === 0) {\n return ResultStatus.NotReviewed;\n }\n if (flaggedItems === 0) {\n return ResultStatus.Passed;\n }\n return ResultStatus.Failed;\n}\n\n/**\n * Builds the result message based on checked/flagged item counts.\n */\nfunction getMessage(checkedItems: number, flaggedItems: number, items: string[]): string {\n if (checkedItems === 0) {\n return 'Skipped because no items were checked';\n }\n if (flaggedItems === 0) {\n return `0 flagged items out of ${checkedItems} checked items`;\n }\n let msg = `${flaggedItems} flagged items out of ${checkedItems} checked items`;\n if (items.length > 0) {\n msg += ':\\n' + items.join('\\n');\n }\n return msg;\n}\n\n/** Known ScoutSuite JS variable assignment prefixes. */\nconst SCOUTSUITE_JS_PREFIX = /^\\s*(scoutsuite_results)\\s*=\\s*$/i;\n\n/**\n * Strips the \"scoutsuite_results = \" JS variable prefix from input.\n * ScoutSuite outputs results as a JS file with this prefix on the first line.\n * Only strips prefixes matching known ScoutSuite patterns; unrecognized prefixes\n * are left intact so JSON parsing produces a descriptive error.\n */\nfunction stripJSPrefix(input: string): string {\n const idx = input.indexOf('{');\n if (idx < 0) {\n return input;\n }\n if (idx === 0) {\n return input; // Already valid JSON\n }\n const prefix = input.substring(0, idx).trim();\n if (SCOUTSUITE_JS_PREFIX.test(prefix)) {\n return input.substring(idx);\n }\n // Unknown prefix — don't strip, let JSON parser report the error\n return input;\n}\n\n/**\n * Gets NIST controls for a ScoutSuite rule, splitting pipe-delimited values.\n */\nfunction getNistControls(ruleID: string): string[] {\n const ctrl = getScoutsuiteNistControl(ruleID);\n if (!ctrl) {\n return ['SA-11', 'RA-5']; // fallback\n }\n return ctrl.split('|');\n}\n\n/**\n * Collapses all service findings into a flat list of (ruleID, finding) pairs.\n */\nfunction collapseFindings(report: ScoutSuiteReport): Array<[string, ScoutSuiteFinding]> {\n const result: Array<[string, ScoutSuiteFinding]> = [];\n\n const serviceNames = Object.keys(report.services).sort();\n for (const serviceName of serviceNames) {\n const svcRaw = report.services[serviceName];\n if (!svcRaw) continue;\n\n // The service object may have properties beyond \"findings\" (filters, regions, etc.)\n // We only care about findings\n const svc = svcRaw as ServiceData;\n if (!svc.findings) continue;\n\n const ruleNames = Object.keys(svc.findings).sort();\n for (const ruleName of ruleNames) {\n const finding = svc.findings[ruleName];\n if (finding) {\n result.push([ruleName, finding]);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a ScoutSuite finding.\n */\nfunction buildRequirement(\n ruleID: string,\n finding: ScoutSuiteFinding,\n startTime: string,\n): EvaluatedRequirement {\n const nist = getNistControls(ruleID);\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n const descriptions: Description[] = [\n { label: 'default', data: finding.rationale },\n ];\n if (finding.remediation) {\n descriptions.push({ label: 'fix', data: finding.remediation });\n }\n\n const status = getStatus(finding.checked_items, finding.flagged_items);\n const message = getMessage(finding.checked_items, finding.flagged_items, finding.items);\n\n const resultObj = createResult(status, message, {\n codeDesc: finding.description,\n startTime: (startTime ? parseTimestamp(startTime) : null) ?? new Date('0001-01-01T00:00:00Z'),\n });\n\n const req = createRequirement(\n ruleID,\n finding.description,\n descriptions,\n getImpact(finding.level),\n [resultObj],\n { tags },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts ScoutSuite output to HDF format.\n * Input may be a JS file with \"scoutsuite_results = \" prefix or pure JSON.\n *\n * @param input - ScoutSuite JS/JSON string\n * @returns HDF JSON string\n */\nexport async function convertScoutsuiteToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('scoutsuite: empty input');\n }\n validateInputSize(input, 'scoutsuite');\n\n // Strip JS variable prefix if present\n const jsonStr = stripJSPrefix(input);\n\n const resultsChecksum: Checksum = await inputChecksum(jsonStr);\n\n const report = parseJSON<ScoutSuiteReport>(jsonStr);\n\n if (!report || typeof report !== 'object') {\n throw new Error('scoutsuite: invalid JSON');\n }\n\n // Collapse all service findings\n const findingPairs = collapseFindings(report);\n const limitedPairs = limitArrayWithWarning(findingPairs, 'finding');\n\n const requirements: EvaluatedRequirement[] = limitedPairs.map(\n ([ruleID, finding]) => buildRequirement(ruleID, finding, report.last_run.time),\n );\n\n const targetName = `${report.last_run.ruleset_name} ruleset:${report.provider_name}:${report.account_id}`;\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'scoutsuite-no-findings',\n `ScoutSuite scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const title = `Scout Suite Report using ${report.last_run.ruleset_name} ruleset on ${report.provider_name} with account ${report.account_id}`;\n\n const baseline = createMinimalBaseline(\n 'ScoutSuite Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: report.last_run.ruleset_about,\n },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'scoutsuite-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'ScoutSuite',\n toolFormat: 'JSON',\n toolVersion: report.last_run.version,\n baselines: [baseline],\n components: [{\n name: targetName,\n type: TargetType.CloudAccount,\n labels: {\n account: report.account_id,\n provider: report.provider_code ?? report.provider_name,\n },\n }],\n timestamp: report.last_run.time ? (parseTimestamp(report.last_run.time) ?? new Date()) : new Date(),\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/** Maximum Conveyor score (used for normalization). */\nconst CONVEYOR_MAX_SCORE = 1000;\n\n/** Top-level Conveyor JSON output structure. */\ninterface ConveyorData {\n api_error_message?: string;\n api_response?: ConveyorAPIResp;\n api_server_version?: string;\n}\n\ninterface ConveyorAPIResp {\n file_tree?: Record<string, FileTreeNode>;\n results?: Record<string, ConveyorResult>;\n params?: Record<string, unknown>;\n max_score?: number;\n}\n\ninterface FileTreeNode {\n name?: string[];\n sha256?: string;\n children?: Record<string, FileTreeNode>;\n score?: number;\n size?: number;\n type?: string;\n}\n\ninterface ConveyorResult {\n sha256: string;\n classification?: string;\n created?: string;\n response: ConveyorResp;\n result: ConveyorScore;\n size?: number | null;\n type?: string | null;\n}\n\ninterface ConveyorResp {\n service_name: string;\n service_version?: string;\n service_context?: unknown;\n service_debug_info?: unknown;\n service_tool_version?: unknown;\n supplementary?: unknown;\n milestones?: ConveyorMilestone;\n}\n\ninterface ConveyorMilestone {\n service_started?: string;\n service_completed?: string;\n}\n\ninterface ConveyorScore {\n score: number;\n sections: ConveyorSection[];\n}\n\ninterface ConveyorSection {\n title_text?: string;\n body?: unknown;\n body_format?: string;\n classification?: string;\n depth?: number;\n heuristic?: Heuristic | null;\n}\n\ninterface Heuristic {\n heur_id?: string;\n name?: string;\n score?: number;\n}\n\n/**\n * Recursively walks the file tree, collecting sha256 -> filename mappings.\n */\nfunction collateSHAAndFilenames(tree: Record<string, FileTreeNode>): Map<string, string> {\n const result = new Map<string, string>();\n for (const [sha, node] of Object.entries(tree)) {\n if (node.name && node.name.length > 0) {\n result.set(sha, node.name[0]!);\n }\n if (node.children && Object.keys(node.children).length > 0) {\n for (const [childSha, childName] of collateSHAAndFilenames(node.children)) {\n result.set(childSha, childName);\n }\n }\n }\n return result;\n}\n\n/**\n * Maps a Conveyor score to an HDF result status.\n * Score 0 = Passed, non-zero = Failed.\n */\nfunction determineStatus(score: number): ResultStatus {\n return score === 0 ? ResultStatus.Passed : ResultStatus.Failed;\n}\n\n/**\n * Normalizes a Conveyor score (0-1000) to HDF impact (0.0-1.0).\n */\nfunction scoreToImpact(score: number): number {\n if (score <= 0) return 0.0;\n if (score >= CONVEYOR_MAX_SCORE) return 1.0;\n return score / CONVEYOR_MAX_SCORE;\n}\n\n/**\n * Extracts a string from a body field that may be null or a string.\n */\nfunction bodyToString(body: unknown): string {\n if (body === null || body === undefined) return '';\n if (typeof body === 'string') return body;\n return String(body);\n}\n\n/**\n * Creates the code_desc field content from a Conveyor section.\n */\nfunction buildCodeDesc(section: ConveyorSection, scannerName: string): string {\n const parts: string[] = [];\n\n if (scannerName === 'Moldy' || scannerName === 'Stigma' || scannerName === 'Clamav') {\n parts.push(`title_text:${section.title_text ?? ''}`);\n parts.push(`body:${bodyToString(section.body)}`);\n parts.push(`body_format:${section.body_format ?? ''}`);\n parts.push(`classification:${section.classification ?? ''}`);\n parts.push(`depth:${section.depth ?? 0}`);\n if (section.heuristic) {\n parts.push(`heuristic_heur_id:${section.heuristic.heur_id ?? ''}`);\n parts.push(`heuristic_score:${section.heuristic.score ?? 0}`);\n parts.push(`heuristic_name:${section.heuristic.name ?? ''}`);\n }\n } else if (scannerName === 'CodeQuality') {\n parts.push(`body:${bodyToString(section.body)}`);\n parts.push(`body_format:${section.body_format ?? ''}`);\n parts.push(`classification:${section.classification ?? ''}`);\n parts.push(`depth:${section.depth ?? 0}`);\n parts.push(`title_text:${section.title_text ?? ''}`);\n } else {\n return JSON.stringify(section);\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Groups Conveyor results by their service (scanner) name.\n */\nfunction groupResultsByScanner(\n results: Record<string, ConveyorResult>,\n): { scanners: string[]; groups: Map<string, ConveyorResult[]> } {\n const groups = new Map<string, ConveyorResult[]>();\n for (const result of Object.values(results)) {\n const name = result.response.service_name;\n const existing = groups.get(name);\n if (existing) {\n existing.push(result);\n } else {\n groups.set(name, [result]);\n }\n }\n const scanners = [...groups.keys()].sort();\n return { scanners, groups };\n}\n\n/**\n * Builds an HDF requirement from a single Conveyor result.\n */\nfunction buildRequirementFromResult(\n result: ConveyorResult,\n filename: string,\n): EvaluatedRequirement {\n const nist = DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n // Build description from sections\n let descText = '';\n if (result.result.sections.length > 0) {\n descText = result.result.sections\n .map(s => s.title_text ?? '')\n .filter(t => t.length > 0)\n .join('; ');\n }\n if (!descText) {\n descText = `Conveyor scan result for ${result.sha256}`;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: descText },\n ];\n\n const scannerName = result.response.service_name;\n const startTimeStr = result.response.milestones?.service_started ?? '';\n const startTime = (startTimeStr ? parseTimestamp(startTimeStr) : null) ?? new Date('0001-01-01T00:00:00Z');\n const score = result.result.score;\n const status = determineStatus(score);\n\n let results;\n if (result.result.sections.length > 0) {\n results = result.result.sections.map(section => {\n const codeDesc = buildCodeDesc(section, scannerName);\n return createResult(status, undefined, {\n codeDesc,\n startTime,\n });\n });\n } else {\n results = [\n createResult(status, undefined, {\n codeDesc: `No sections reported by ${scannerName}`,\n startTime,\n }),\n ];\n }\n\n const req = createRequirement(\n result.sha256,\n filename,\n descriptions,\n scoreToImpact(score),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...nist]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Builds an HDF baseline for a single scanner's results.\n */\nfunction buildScannerBaseline(\n scannerName: string,\n results: ConveyorResult[],\n shaMap: Map<string, string>,\n resultsChecksum: Checksum,\n): EvaluatedBaseline {\n const requirements: EvaluatedRequirement[] = results.map(result => {\n const filename = shaMap.get(result.sha256) ?? '';\n return buildRequirementFromResult(result, filename);\n });\n\n const title = `Conveyor Scan (${scannerName})`;\n\n return createMinimalBaseline(\n 'Conveyor Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Conveyor scan results to HDF format.\n * Results are grouped by scanner name, producing one baseline per scanner.\n *\n * @param input - Conveyor JSON string\n * @returns HDF JSON string\n */\nexport async function convertConveyorToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('conveyor: empty input');\n }\n validateInputSize(input, 'conveyor');\n\n const data = parseJSON<ConveyorData>(input);\n\n if (!data || typeof data !== 'object') {\n throw new Error('conveyor: invalid JSON');\n }\n\n if (!data.api_response) {\n throw new Error('conveyor: missing api_response field');\n }\n\n if (!data.api_response.results) {\n throw new Error('conveyor: missing api_response.results field');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Build SHA -> filename mapping from file tree\n const shaMap = data.api_response.file_tree\n ? collateSHAAndFilenames(data.api_response.file_tree)\n : new Map<string, string>();\n\n // Group results by scanner\n const { scanners, groups } = groupResultsByScanner(data.api_response.results);\n\n const baselines: EvaluatedBaseline[] = scanners.map(scannerName =>\n buildScannerBaseline(\n scannerName,\n groups.get(scannerName)!,\n shaMap,\n resultsChecksum,\n ),\n );\n\n // Build target name from params.description\n let targetName = 'Conveyor Scan';\n if (data.api_response.params) {\n const desc = data.api_response.params['description'];\n if (typeof desc === 'string' && desc.length > 0) {\n targetName = desc;\n }\n }\n\n if (baselines.length === 0) {\n baselines.push(createMinimalBaseline(\n 'Conveyor Scan',\n [\n buildNoFindingsRequirement(\n 'conveyor-no-findings',\n `Conveyor scanned ${targetName} and reported zero findings.`,\n new Date(),\n ),\n ],\n {\n resultsChecksum,\n title: 'Conveyor Scan (no findings)',\n },\n ) as EvaluatedBaseline);\n }\n\n return buildHdfResults({\n generatorName: 'conveyor-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Conveyor',\n toolFormat: 'JSON',\n baselines,\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: new Date(),\n });\n}\n","/**\n * Veracode DetailedReport XML to HDF converter.\n *\n * Converts Veracode static analysis and SCA findings into HDF format.\n * Produces two types of controls:\n * - CWE-based: From severity categories (static analysis findings)\n * - CVE-based: From SCA vulnerable components\n *\n * Uses attributeNamePrefix '@_' to disambiguate XML attributes from child\n * elements (critical for the `vulnerabilities` attr/element collision on\n * `<component>`).\n */\n\nimport { parseXml, parseTimestamp } from '@mitre/hdf-utilities';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, mapCWEToNIST, buildNistCciTags, ensureArray, DEFAULT_REMEDIATION_NIST_TAGS, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/** Attribute prefix used by fast-xml-parser — all XML attributes are accessed via `@_name`. */\nconst A = '@_';\n\n\n/** Veracode severity level (0-5) to HDF impact mapping. */\nconst IMPACT_MAPPING: Map<string, number> = new Map([\n ['5', 0.9],\n ['4', 0.7],\n ['3', 0.5],\n ['2', 0.3],\n ['1', 0.1],\n ['0', 0.0],\n]);\n\nfunction veracodeSeverityToImpact(severity: string): number {\n return IMPACT_MAPPING.get(severity) ?? 0.1;\n}\n\n// ---- Utility functions ----\n\n/** Get an attribute from a parsed XML node. */\nfunction attr(node: Record<string, unknown>, name: string): string {\n return (node[`${A}${name}`] as string) ?? '';\n}\n\n/** Decode common XML/HTML character references (&#xHH; and &#NNN;). */\nfunction decodeXmlEntities(s: string): string {\n return s\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex) => String.fromCharCode(parseInt(hex as string, 16)))\n .replace(/&#(\\d+);/g, (_, dec) => String.fromCharCode(parseInt(dec as string, 10)));\n}\n\n/** Parse Veracode timestamp format (\"2021-12-29 22:16:36 UTC\") to Date. */\nfunction parseVeracodeTimestamp(ts: string): Date | undefined {\n if (!ts) return undefined;\n // Decode XML entities in timestamps (e.g., &#x3a; -> :)\n const decoded = decodeXmlEntities(ts);\n const normalized = decoded.replace(' UTC', 'Z').replace(' ', 'T');\n return parseTimestamp(normalized) ?? undefined;\n}\n\n/** Format description paragraphs into text. */\nfunction formatDesc(desc: Record<string, unknown> | undefined): string {\n if (!desc) return '';\n const paras = ensureArray(desc.para as Record<string, unknown> | Record<string, unknown>[]);\n return paras.map(p => attr(p, 'text')).filter(Boolean).join('\\n');\n}\n\n/** Format recommendations into text. */\nfunction formatRecommendations(rec: Record<string, unknown> | undefined): string {\n if (!rec) return '';\n const paras = ensureArray(rec.para as Record<string, unknown> | Record<string, unknown>[]);\n const parts: string[] = [];\n for (const p of paras) {\n const text = attr(p, 'text');\n if (text) parts.push(text);\n const bullets = ensureArray(p.bulletitem as Record<string, unknown> | Record<string, unknown>[]);\n for (const b of bullets) {\n const btext = attr(b, 'text');\n if (btext) parts.push(btext);\n }\n }\n return parts.join('\\n');\n}\n\n/** Format CWE data for the cweid tag. */\nfunction formatCWEData(cwes: Record<string, unknown>[]): string {\n return cwes.map(c => {\n let entry = `CWE-${attr(c, 'cweid')}: ${attr(c, 'cwename')}`;\n const categories: [string, string][] = [\n ['pcrirelated', attr(c, 'pcirelated')],\n ['owasp', attr(c, 'owasp')],\n ['sans', attr(c, 'sans')],\n ['certc', attr(c, 'certc')],\n ['certcpp', attr(c, 'certcpp')],\n ['certjava', attr(c, 'certjava')],\n ['owaspmobile', attr(c, 'owaspmobile')],\n ];\n for (const [name, val] of categories) {\n if (val) entry += `${name}: ${val}\\n`;\n }\n return entry;\n }).join('\\n');\n}\n\n/** Format CWE descriptions for the cweDescription tag. */\nfunction formatCWEDesc(cwes: Record<string, unknown>[]): string {\n return cwes.map(c => {\n const desc = c.description as Record<string, unknown> | undefined;\n const text = desc?.text as Record<string, unknown> | undefined;\n const descText = text ? attr(text, 'text') : '';\n return `CWE-${attr(c, 'cweid')}: ${attr(c, 'cwename')} Description: ${descText}; `;\n }).join('\\n');\n}\n\n/** Format a static flaw as a code description. */\nfunction formatFlawCodeDesc(flaw: Record<string, unknown>): string {\n const sourcefilepath = attr(flaw, 'sourcefilepath');\n if (!sourcefilepath) {\n return `Issue ID: ${attr(flaw, 'issueid')}`;\n }\n\n const parts: string[] = [`Sourcefile Path: ${sourcefilepath}`];\n const fields: [string, string][] = [\n ['Line Number', attr(flaw, 'line')],\n ['Affect Policy Compliance', attr(flaw, 'affects_policy_compliance')],\n ['Remediation Effort', attr(flaw, 'remediationeffort')],\n ['Exploit level', attr(flaw, 'exploitLevel')],\n ['Issue ID', attr(flaw, 'issueid')],\n ['Module', attr(flaw, 'module')],\n ['Type', attr(flaw, 'type')],\n ['CWE ID', attr(flaw, 'cweid')],\n ['Date First Occurence', attr(flaw, 'date_first_occurrence')],\n ['CIA Impact', attr(flaw, 'cia_impact')],\n ['Description', attr(flaw, 'description')],\n ['Source File', attr(flaw, 'sourcefile')],\n ['Scope', attr(flaw, 'scope')],\n ['PCI Related', attr(flaw, 'pcirelated')],\n ['Function Prototype', attr(flaw, 'functionprototype')],\n ['Function Relative Location', attr(flaw, 'functionrelativelocation')],\n ];\n\n for (const [title, value] of fields) {\n if (value) parts.push(`${title}: ${value}`);\n }\n\n return parts.join('\\n');\n}\n\n/** Format an SCA component as a code description. */\nfunction formatSCACodeDesc(comp: Record<string, unknown>): string {\n const parts: string[] = [`component_id: ${attr(comp, 'component_id')}`];\n const fields: [string, string][] = [\n ['sha1', attr(comp, 'sha1')],\n ['file_name', attr(comp, 'file_name')],\n ['max_cvss_score', attr(comp, 'max_cvss_score')],\n ['version', attr(comp, 'version')],\n ['library', attr(comp, 'library')],\n ['library_id', attr(comp, 'library_id')],\n ['vendor', attr(comp, 'vendor')],\n ['description', attr(comp, 'description')],\n ['added_date', attr(comp, 'added_date')],\n ['component_affects_policy_compliance', attr(comp, 'component_affects_policy_compliance')],\n ];\n\n for (const [title, value] of fields) {\n if (value) parts.push(`${title}: ${value}`);\n }\n\n // File paths\n const filePaths = comp.file_paths as Record<string, unknown> | undefined;\n if (filePaths) {\n const fps = ensureArray(filePaths.file_path as Record<string, unknown> | Record<string, unknown>[]);\n for (const fp of fps) {\n const val = attr(fp, 'value');\n if (val) parts.push(`file_path: ${val}`);\n }\n }\n\n return parts.join('\\n');\n}\n\n// ---- Requirement builders ----\n\n/** Build CWE-based requirements from severity categories. */\nfunction buildCWERequirements(severities: Record<string, unknown>[], firstBuildDate: string): EvaluatedRequirement[] {\n const requirements: EvaluatedRequirement[] = [];\n\n for (const sev of severities) {\n const impact = veracodeSeverityToImpact(attr(sev, 'level'));\n const categories = ensureArray(sev.category as Record<string, unknown> | Record<string, unknown>[]);\n\n for (const cat of categories) {\n requirements.push(buildCWERequirement(cat, impact, firstBuildDate));\n }\n }\n\n return requirements;\n}\n\n/** Build a single CWE-based requirement from a category. */\nfunction buildCWERequirement(cat: Record<string, unknown>, impact: number, firstBuildDate: string): EvaluatedRequirement {\n const cwes = ensureArray(cat.cwe as Record<string, unknown> | Record<string, unknown>[]);\n\n // Collect CWE IDs for NIST mapping\n const cweIDs = cwes.map(c => attr(c, 'cweid')).filter(Boolean);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_REMEDIATION_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n // Build tags\n const extras: Record<string, unknown> = {};\n const cweData = formatCWEData(cwes);\n if (cweData) extras.cweid = cweData;\n const cweDescStr = formatCWEDesc(cwes);\n if (cweDescStr) extras.cweDescription = cweDescStr;\n\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n // Build descriptions\n const descriptions: Description[] = [\n { label: 'default', data: formatDesc(cat.desc as Record<string, unknown> | undefined) },\n ];\n const recText = formatRecommendations(cat.recommendations as Record<string, unknown> | undefined);\n if (recText) {\n descriptions.push({ label: 'fix', data: recText });\n }\n\n // Collect all flaws from all CWEs in this category\n const startTime = parseVeracodeTimestamp(firstBuildDate) ?? new Date();\n const results = cwes.flatMap(c => {\n const staticflaws = c.staticflaws as Record<string, unknown> | undefined;\n const flaws = ensureArray(staticflaws?.flaw as Record<string, unknown> | Record<string, unknown>[]);\n return flaws.map(flaw => createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatFlawCodeDesc(flaw),\n startTime,\n }));\n });\n\n const req = createRequirement(\n attr(cat, 'categoryid'),\n attr(cat, 'categoryname'),\n descriptions,\n impact,\n results,\n { tags },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/** Build CVE-based requirements from SCA components. */\nfunction buildCVERequirements(\n sca: Record<string, unknown> | undefined,\n firstBuildDate: string,\n): EvaluatedRequirement[] {\n if (!sca) return [];\n const vulnComps = sca.vulnerable_components as Record<string, unknown> | undefined;\n if (!vulnComps?.component) return [];\n\n const components = ensureArray(vulnComps.component as Record<string, unknown> | Record<string, unknown>[]);\n\n // Group vulnerabilities by CVE ID across all components\n interface CVEEntry {\n vuln: Record<string, unknown>;\n components: Record<string, unknown>[];\n }\n\n const cveOrder: string[] = [];\n const cveMap = new Map<string, CVEEntry>();\n\n for (const comp of components) {\n const vulnCountAttr = attr(comp, 'vulnerabilities');\n if (vulnCountAttr === '0') continue;\n\n // With @_ prefix, child element <vulnerabilities> is at key 'vulnerabilities',\n // and the attribute is at '@_vulnerabilities'\n const vulnsElem = comp.vulnerabilities as Record<string, unknown> | undefined;\n if (!vulnsElem?.vulnerability) continue;\n const vulns = ensureArray(vulnsElem.vulnerability as Record<string, unknown> | Record<string, unknown>[]);\n\n for (const vuln of vulns) {\n const cveID = attr(vuln, 'cve_id');\n if (!cveID) continue;\n\n const existing = cveMap.get(cveID);\n if (existing) {\n existing.components.push(comp);\n } else {\n cveOrder.push(cveID);\n cveMap.set(cveID, { vuln, components: [comp] });\n }\n }\n }\n\n return cveOrder.map(cveID => {\n const entry = cveMap.get(cveID)!;\n return buildCVERequirement(entry.vuln, entry.components, firstBuildDate);\n });\n}\n\n/** Build a single CVE-based requirement. */\nfunction buildCVERequirement(\n vuln: Record<string, unknown>,\n components: Record<string, unknown>[],\n firstBuildDate: string,\n): EvaluatedRequirement {\n const impact = veracodeSeverityToImpact(attr(vuln, 'severity'));\n\n // Map CWE to NIST\n const cweID = attr(vuln, 'cwe_id');\n let nist: string[];\n if (cweID) {\n nist = mapCWEToNIST([cweID.replace(/^CWE-/, '')], DEFAULT_REMEDIATION_NIST_TAGS);\n } else {\n nist = DEFAULT_REMEDIATION_NIST_TAGS;\n }\n const cciTags = nistToCci(nist);\n const extras: Record<string, unknown> = {};\n if (cweID) extras.cwe = cweID;\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n // One result per affected component\n const startTime = parseVeracodeTimestamp(firstBuildDate) ?? new Date();\n\n const results = components.map(comp => createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatSCACodeDesc(comp),\n startTime,\n }));\n\n const cveSummary = attr(vuln, 'cve_summary');\n const cveId = attr(vuln, 'cve_id');\n const descriptions: Description[] = [\n { label: 'default', data: cveSummary || '' },\n ];\n\n const req = createRequirement(\n cveId,\n cveId,\n descriptions,\n impact,\n results,\n { tags },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n// ---- Main converter ----\n\n/**\n * Convert Veracode DetailedReport XML to HDF JSON string.\n *\n * @param input - Veracode DetailedReport XML string\n * @returns HDF JSON string\n */\nexport async function convertVeracodeToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('veracode: empty input');\n }\n validateInputSize(input, 'veracode');\n\n // Parse XML with @_ attribute prefix to disambiguate attributes from child elements.\n // This is critical for the <component> element where both `vulnerabilities` attribute\n // (count) and child `<vulnerabilities>` element (list) exist.\n const parsed = parseXml(input, { attributeNamePrefix: '@_' }) as Record<string, unknown>;\n\n // Check for summary report\n if ('summaryreport' in parsed) {\n throw new Error('veracode: summary reports are not supported; use a detailed report');\n }\n\n const report = parsed.detailedreport as Record<string, unknown> | undefined;\n if (!report) {\n throw new Error('veracode: invalid XML - no <detailedreport> root element');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const firstBuildDate = attr(report, 'first_build_submitted_date');\n\n // Ensure severities is an array\n const severities = ensureArray(report.severity as Record<string, unknown> | Record<string, unknown>[]);\n\n // Build CWE-based requirements\n const cweRequirements = buildCWERequirements(severities, firstBuildDate);\n\n // Build CVE-based requirements from SCA\n const cveRequirements = buildCVERequirements(\n report.software_composition_analysis as Record<string, unknown> | undefined,\n firstBuildDate,\n );\n\n // Merge\n const allRequirements = [...cweRequirements, ...cveRequirements];\n\n const targetName = attr(report, 'app_name') || 'Veracode Application';\n\n if (allRequirements.length === 0) {\n allRequirements.push(buildNoFindingsRequirement(\n 'veracode-no-findings',\n `Veracode scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n // Get module name for title\n let title: string | undefined;\n const staticAnalysis = report['static-analysis'] as Record<string, unknown> | undefined;\n if (staticAnalysis) {\n const modules = staticAnalysis.modules as Record<string, unknown> | undefined;\n if (modules?.module) {\n const moduleList = ensureArray(modules.module as Record<string, unknown> | Record<string, unknown>[]);\n if (moduleList.length > 0) {\n title = attr(moduleList[0]!, 'name');\n }\n }\n }\n\n const baseline = createMinimalBaseline('Veracode Scan', allRequirements, {\n resultsChecksum,\n title,\n version: attr(report, 'policy_version'),\n summary: attr(report, 'policy_name'),\n }) as EvaluatedBaseline;\n\n const timestamp = parseVeracodeTimestamp(firstBuildDate);\n\n return buildHdfResults({\n generatorName: 'veracode-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Veracode',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp,\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, stripHTML, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Graph Secure Score structures.\n * Defined locally to avoid external dependency on @microsoft/microsoft-graph-types.\n */\ninterface CombinedResponse {\n secureScore: SecureScoreResponse;\n profiles: ProfileResponse;\n}\n\ninterface SecureScoreResponse {\n '@odata.context'?: string;\n value: SecureScore[];\n}\n\ninterface SecureScore {\n id: string;\n azureTenantId: string;\n activeUserCount?: number;\n createdDateTime: string;\n currentScore?: number;\n enabledServices?: string[];\n licensedUserCount?: number;\n maxScore?: number;\n controlScores: ControlScore[];\n averageComparativeScores?: unknown[];\n}\n\ninterface ControlScore {\n controlCategory: string;\n controlName: string;\n description: string;\n score: number;\n lastSynced?: string;\n implementationStatus: string;\n on?: string;\n scoreInPercentage: number;\n}\n\ninterface ProfileResponse {\n '@odata.context'?: string;\n '@odata.nextLink'?: string;\n value: SecureScoreControlProfile[];\n}\n\ninterface SecureScoreControlProfile {\n id: string;\n azureTenantId?: string;\n controlCategory?: string;\n title?: string;\n maxScore?: number;\n rank?: unknown;\n remediation?: string;\n remediationImpact?: string;\n service?: string;\n threats?: unknown;\n tier?: string;\n userImpact?: string;\n}\n\n/**\n * Returns all profiles matching a given control name.\n */\nfunction getMatchingProfiles(\n profiles: SecureScoreControlProfile[],\n controlName: string,\n): SecureScoreControlProfile[] {\n return profiles.filter(p => p.id === controlName);\n}\n\n/**\n * Gets the title from matching profiles, or falls back to category:name.\n */\nfunction getTitle(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): string {\n const matched = getMatchingProfiles(profiles, cs.controlName);\n const titles = matched\n .map(p => p.title)\n .filter((t): t is string => t !== undefined && t !== '');\n\n if (titles.length > 0) {\n return titles[0]!;\n }\n\n // Fallback\n return [cs.controlCategory, cs.controlName].filter(Boolean).join(':');\n}\n\n/**\n * Computes impact from profile maxScore (maxScore / 10.0).\n * Falls back to 0.5 when no matching profile exists.\n * Capped at 1.0.\n */\nfunction getImpact(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): number {\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length === 0) {\n return 0.5;\n }\n\n const maxScore = Math.max(...matched.map(p => p.maxScore ?? 0));\n const impact = maxScore / 10.0;\n return Math.min(Math.round(impact * 100) / 100, 1.0);\n}\n\n/**\n * Determines the result status based on scoreInPercentage and profile maxScore.\n */\nfunction getStatus(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): ResultStatus {\n if (cs.scoreInPercentage === 100) {\n return ResultStatus.Passed;\n }\n\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length === 0) {\n return ResultStatus.Failed;\n }\n\n const maxScore = Math.max(...matched.map(p => p.maxScore ?? 0));\n if (cs.score === maxScore) {\n return ResultStatus.Passed;\n }\n\n return ResultStatus.Failed;\n}\n\n/**\n * Builds an EvaluatedRequirement from a ControlScore.\n */\nfunction buildRequirement(\n cs: ControlScore,\n profiles: SecureScoreControlProfile[],\n createdDateTime: string,\n): EvaluatedRequirement {\n const id = `${cs.controlCategory}:${cs.controlName}`;\n const title = getTitle(profiles, cs);\n const impact = getImpact(profiles, cs);\n const status = getStatus(profiles, cs);\n\n // NIST tags: use default static analysis tags\n const nist = [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n const tags = buildNistCciTags(nist, []);\n\n // Descriptions\n const descriptions: Description[] = [\n { label: 'default', data: stripHTML(cs.description) },\n ];\n\n // Add fix description from profile remediation\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length > 0) {\n const remediations = matched\n .map(p => p.remediation)\n .filter((r): r is string => r !== undefined && r !== '');\n if (remediations.length > 0) {\n descriptions.push({ label: 'fix', data: stripHTML(remediations[0]!) });\n }\n\n const impacts = matched\n .map(p => p.remediationImpact)\n .filter((r): r is string => r !== undefined && r !== '');\n if (impacts.length > 0) {\n descriptions.push({ label: 'rationale', data: stripHTML(impacts[0]!) });\n }\n }\n\n // CodeDesc from implementationStatus\n const codeDesc = cs.implementationStatus || 'No implementation status provided';\n\n // StartTime from createdDateTime\n const startTime = (createdDateTime ? parseTimestamp(createdDateTime) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n const results = [\n createResult(status, undefined, {\n codeDesc,\n ...(startTime ? { startTime } : {}),\n }),\n ];\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n impact,\n results,\n { tags },\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Microsoft Secure Score combined JSON to HDF format.\n *\n * Input is the combined JSON containing both secureScore and profiles data\n * from the Microsoft Graph API.\n *\n * @param input - Combined JSON string with secureScore and profiles\n * @returns HDF JSON string\n */\nexport async function convertMsftSecureScoreToHdf(input: string): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('msft-secure-score: empty input');\n }\n validateInputSize(input, 'msft-secure-score');\n\n const combined = parseJSON<CombinedResponse>(input);\n\n if (!combined || typeof combined !== 'object') {\n throw new Error('msft-secure-score: invalid JSON');\n }\n\n if (!combined.secureScore?.value) {\n throw new Error('msft-secure-score: missing secureScore.value');\n }\n if (!combined.profiles?.value) {\n throw new Error('msft-secure-score: missing profiles.value');\n }\n if (combined.secureScore.value.length === 0) {\n throw new Error('msft-secure-score: secureScore.value is empty');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const profiles = combined.profiles.value;\n let tenantId = '';\n\n const baselines: EvaluatedBaseline[] = combined.secureScore.value.map(ss => {\n if (!tenantId) {\n tenantId = ss.azureTenantId;\n }\n\n const { items: limitedControlScores, truncated } = limitArray(ss.controlScores);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedControlScores.length} controlScore items (original: ${ss.controlScores.length})`);\n }\n\n const requirements = limitedControlScores.map(cs =>\n buildRequirement(cs, profiles, ss.createdDateTime),\n );\n\n const title = `Azure Secure Score report - Tenant ID: ${ss.azureTenantId} - Run ID: ${ss.id}`;\n\n return createMinimalBaseline(\n 'Microsoft Secure Score',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n });\n\n return buildHdfResults({\n generatorName: 'msft-secure-score-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Microsoft Secure Score',\n toolFormat: 'JSON',\n baselines,\n components: [{\n name: `Azure Tenant: ${tenantId}`,\n type: TargetType.CloudAccount,\n labels: { account: tenantId, provider: 'azure' },\n }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFResults, Component } from '@mitre/hdf-schema';\nimport { TargetType } from '@mitre/hdf-schema';\n\n// --- MSDO-specific SARIF type definitions ---\n// These capture fields that the generic SARIF converter ignores.\n\ninterface MsdoSarif {\n runs: MsdoRun[];\n}\n\ninterface MsdoRun {\n tool: {\n driver: MsdoDriver;\n };\n versionControlProvenance?: VersionControlProvenance[];\n policies?: MsdoPolicy[];\n results?: MsdoResult[];\n}\n\ninterface MsdoDriver {\n name?: string;\n organization?: string;\n product?: string;\n fullName?: string;\n properties?: Record<string, unknown>;\n}\n\ninterface VersionControlProvenance {\n repositoryUri: string;\n revisionId?: string;\n branch?: string;\n}\n\ninterface MsdoPolicy {\n name: string;\n version: string;\n}\n\ninterface MsdoResult {\n ruleId: string;\n properties?: Record<string, unknown>;\n}\n\ninterface RunEnrichment {\n toolTags: Record<string, unknown>;\n policyTag: string;\n resultProps: Map<string, Record<string, unknown>[]>;\n}\n\n/**\n * Converts Microsoft Defender for DevOps SARIF output to HDF format.\n * Delegates base conversion to the generic SARIF converter and enriches\n * the output with MSDO-specific metadata.\n */\nexport async function convertMsftDefenderDevopsToHdf(input: string): Promise<string> {\n validateInputSize(input, 'msft-defender-devops');\n\n // 1. Parse raw SARIF to extract MSDO-specific fields\n const raw = parseJSON<MsdoSarif>(input);\n if (!raw || !Array.isArray(raw.runs)) {\n throw new Error('Invalid MSDO SARIF structure: missing or invalid runs field');\n }\n const { components, runEnrichments } = extractEnrichments(raw);\n\n // 2. Delegate to the generic SARIF converter for base HDF\n const hdfJson = await convertSarifToHdf(input);\n const result = JSON.parse(hdfJson) as HDFResults;\n\n // Run before applyEnrichments so synthesized reqs get the same run-level tags.\n synthesizeNoFindingsPlaceholders(result);\n applyEnrichments(result, components, runEnrichments);\n\n // 4. Override generator name and data source\n if (result.generator) {\n result.generator.name = 'msft-defender-devops-to-hdf';\n }\n if (result.tool) {\n result.tool.name = 'Microsoft Defender for DevOps';\n }\n\n return JSON.stringify(result, null, 2);\n}\n\nfunction extractEnrichments(raw: MsdoSarif): {\n components: Component[];\n runEnrichments: RunEnrichment[];\n} {\n const components: Component[] = [];\n const seenRepos = new Set<string>();\n const runEnrichments: RunEnrichment[] = [];\n\n for (const run of raw.runs) {\n // Extract repository components from versionControlProvenance\n for (const vcp of run.versionControlProvenance ?? []) {\n if (vcp.repositoryUri && !seenRepos.has(vcp.repositoryUri)) {\n seenRepos.add(vcp.repositoryUri);\n const target: Component = {\n name: repoNameFromURI(vcp.repositoryUri),\n type: TargetType.Repository,\n url: vcp.repositoryUri,\n labels: {},\n };\n if (vcp.branch) {\n target.branch = vcp.branch;\n }\n if (vcp.revisionId) {\n target.commit = vcp.revisionId;\n }\n components.push(target);\n }\n }\n\n // Extract tool metadata tags\n const toolTags: Record<string, unknown> = {};\n const driver = run.tool.driver;\n if (driver.organization) {\n toolTags.msdo_organization = driver.organization;\n }\n if (driver.product) {\n toolTags.msdo_product = driver.product;\n }\n if (driver.fullName) {\n toolTags.msdo_fullName = driver.fullName;\n }\n if (driver.properties?.RawName) {\n toolTags.msdo_rawName = driver.properties.RawName;\n }\n if (driver.properties?.IsPreview !== undefined) {\n toolTags.msdo_isPreview = driver.properties.IsPreview;\n }\n\n // Extract policy tags\n let policyTag = '';\n if (run.policies && run.policies.length > 0) {\n policyTag = run.policies.map(p => `${p.name} ${p.version}`).join(', ');\n }\n\n // Extract result-level properties keyed by ruleId\n const resultProps = new Map<string, Record<string, unknown>[]>();\n for (const res of run.results ?? []) {\n if (res.properties && Object.keys(res.properties).length > 0) {\n const existing = resultProps.get(res.ruleId) ?? [];\n existing.push(res.properties);\n resultProps.set(res.ruleId, existing);\n }\n }\n\n runEnrichments.push({ toolTags, policyTag, resultProps });\n }\n\n return { components, runEnrichments };\n}\n\nfunction applyEnrichments(\n result: HDFResults,\n components: Component[],\n runEnrichments: RunEnrichment[],\n): void {\n // Add components\n if (components.length > 0) {\n result.components = components;\n }\n\n // Apply per-baseline (per-run) enrichments\n const baselines = result.baselines ?? [];\n for (let i = 0; i < baselines.length && i < runEnrichments.length; i++) {\n const re = runEnrichments[i]!;\n const requirements = baselines[i]!.requirements ?? [];\n\n for (const req of requirements) {\n const tags = (req.tags ?? {}) as Record<string, unknown>;\n\n // Add tool metadata tags\n for (const [k, v] of Object.entries(re.toolTags)) {\n tags[k] = v;\n }\n\n // Add policy tag\n if (re.policyTag) {\n tags.msdo_policy = re.policyTag;\n }\n\n // Add result-level properties for this requirement's ruleId\n const props = re.resultProps.get(req.id);\n if (props && props.length > 0) {\n tags.msdo_properties = props[0];\n }\n\n req.tags = tags;\n }\n }\n}\n\n// HDF requires requirements.minItems=1; SARIF's empty results[] means the\n// scan ran clean (§3.7.2), so synthesize one passed placeholder per baseline.\nfunction synthesizeNoFindingsPlaceholders(result: HDFResults): void {\n const startTime = result.timestamp ?? new Date();\n for (const baseline of result.baselines ?? []) {\n if (baseline.requirements && baseline.requirements.length > 0) continue;\n const tool = baseline.name;\n baseline.requirements = [\n buildNoFindingsRequirement(\n `${tool}-no-findings`,\n `Microsoft Defender for DevOps scanner \"${tool}\" ran and reported zero findings.`,\n startTime,\n ),\n ];\n }\n}\n\nfunction repoNameFromURI(uri: string): string {\n const parts = uri.split('/');\n const name = parts[parts.length - 1];\n return name || uri;\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { inputChecksum, limitArray, validateInputSize, buildHdfResults, buildNoFindingsRequirement } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Defender for Cloud assessment structures.\n * Derived from Azure REST API: /providers/Microsoft.Security/assessments\n * See: https://learn.microsoft.com/en-us/rest/api/defenderforcloud/assessments/list\n */\ninterface DefenderCloudInput {\n value: Assessment[];\n}\n\ninterface Assessment {\n id: string;\n name: string;\n type: string;\n properties: AssessmentProperties;\n}\n\ninterface AssessmentProperties {\n displayName: string;\n resourceDetails: ResourceDetails;\n status: StatusBlock;\n metadata: Metadata;\n}\n\ninterface ResourceDetails {\n source: string;\n id: string;\n}\n\ninterface StatusBlock {\n code: string;\n cause: string;\n description: string;\n}\n\ninterface Metadata {\n displayName: string;\n assessmentType: string;\n policyDefinitionId: string;\n description: string;\n remediationDescription: string;\n categories: string[];\n severity: string;\n userImpact: string;\n implementationEffort: string;\n threats: string[];\n tactics: string[];\n techniques: string[];\n}\n\n/**\n * Severity to HDF impact mapping.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n};\n\n/**\n * Maps Azure status code to HDF ResultStatus.\n */\nfunction mapStatus(code: string): ResultStatus {\n switch (code.toLowerCase()) {\n case 'healthy':\n return ResultStatus.Passed;\n case 'unhealthy':\n return ResultStatus.Failed;\n case 'notapplicable':\n return ResultStatus.NotApplicable;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Extracts subscription ID from an Azure resource path.\n */\nfunction extractSubscriptionID(resourcePath: string): string {\n const lower = resourcePath.toLowerCase();\n const idx = lower.indexOf('/subscriptions/');\n if (idx === -1) {\n return '';\n }\n const rest = resourcePath.substring(idx + '/subscriptions/'.length);\n const slashIdx = rest.indexOf('/');\n if (slashIdx !== -1) {\n return rest.substring(0, slashIdx);\n }\n return rest;\n}\n\n/**\n * Converts a group of assessments sharing an assessment ID into one EvaluatedRequirement.\n */\nfunction buildRequirement(assessmentID: string, assessments: Assessment[], scanTime: Date): EvaluatedRequirement {\n const rep = assessments[0]!;\n const meta = rep.properties.metadata;\n\n const impact = IMPACT_MAPPING[meta.severity.toLowerCase()] ?? 0.5;\n\n const tags: Record<string, unknown> = {};\n\n if (meta.categories.length > 0) {\n tags['categories'] = meta.categories;\n }\n if (meta.tactics.length > 0) {\n tags['tactics'] = meta.tactics;\n }\n if (meta.techniques.length > 0) {\n tags['techniques'] = meta.techniques;\n }\n if (meta.threats.length > 0) {\n tags['threats'] = meta.threats;\n }\n\n tags['severity'] = meta.severity;\n if (meta.userImpact) {\n tags['userImpact'] = meta.userImpact;\n }\n if (meta.implementationEffort) {\n tags['implementationEffort'] = meta.implementationEffort;\n }\n if (meta.assessmentType) {\n tags['assessmentType'] = meta.assessmentType;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: meta.description },\n ];\n if (meta.remediationDescription) {\n descriptions.push({ label: 'fix', data: meta.remediationDescription });\n }\n\n const results = assessments.map((a) => buildResultFromAssessment(a, scanTime));\n\n const req = createRequirement(assessmentID, rep.properties.displayName, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts a single assessment into an HDF RequirementResult.\n */\nfunction buildResultFromAssessment(a: Assessment, scanTime: Date): RequirementResult {\n const status = mapStatus(a.properties.status.code);\n const codeDesc = `Resource: ${a.properties.resourceDetails.id}`;\n const message = a.properties.status.description || a.properties.status.cause || undefined;\n\n return createResult(status, message, { codeDesc, startTime: scanTime });\n}\n\n/**\n * Converts Microsoft Defender for Cloud assessment output to HDF format.\n *\n * @param input - JSON string containing Azure Security Assessments API response\n * @returns HDF JSON string\n */\nexport async function convertMsftDefenderCloudToHdf(input: string): Promise<string> {\n validateInputSize(input, 'msft-defender-cloud');\n\n const scanTime = new Date();\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const raw = parseJSON<DefenderCloudInput>(input);\n\n if (!raw || typeof raw !== 'object') {\n throw new Error('Invalid Defender for Cloud structure: not a valid JSON object');\n }\n\n if (!Array.isArray(raw.value)) {\n throw new Error('Invalid Defender for Cloud structure: missing or invalid value array');\n }\n\n const { items: limitedAssessments, truncated } = limitArray(raw.value);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAssessments.length} assessment items (original: ${raw.value.length})`);\n }\n\n // Group assessments by name (GUID), preserving insertion order.\n const groups = new Map<string, Assessment[]>();\n for (const a of limitedAssessments) {\n const existing = groups.get(a.name);\n if (existing) {\n existing.push(a);\n } else {\n groups.set(a.name, [a]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [assessmentID, assessments] of groups) {\n requirements.push(buildRequirement(assessmentID, assessments, scanTime));\n }\n\n const subscriptionID = limitedAssessments.length > 0\n ? extractSubscriptionID(limitedAssessments[0]!.id)\n : '';\n\n if (requirements.length === 0) {\n const targetName = subscriptionID || 'Unknown';\n requirements.push(buildNoFindingsRequirement(\n 'msft-defender-cloud-no-findings',\n `Microsoft Defender for Cloud scanned ${targetName} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Microsoft Defender for Cloud Assessments',\n requirements,\n { resultsChecksum },\n ) as EvaluatedBaseline;\n\n const components: Component[] = [];\n if (subscriptionID) {\n components.push({\n name: `Azure Subscription ${subscriptionID}`,\n type: TargetType.CloudAccount,\n accountId: subscriptionID,\n provider: 'azure' as Component['provider'],\n labels: { account: subscriptionID, provider: 'azure' },\n });\n }\n\n return buildHdfResults({\n generatorName: 'msft-defender-cloud-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Microsoft Defender for Cloud',\n toolFormat: 'JSON',\n baselines: [baseline],\n components,\n timestamp: scanTime,\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Graph Security API v2 alert response structure.\n * Derived from official Microsoft documentation:\n * https://learn.microsoft.com/en-us/graph/api/resources/security-alert\n */\ninterface MdeAlertResponse {\n '@odata.context'?: string;\n value: MdeAlert[];\n}\n\ninterface MdeAlert {\n id: string;\n incidentId?: string;\n status: string;\n severity: string;\n classification?: string | null;\n determination?: string | null;\n serviceSource?: string;\n detectionSource?: string;\n category: string;\n title: string;\n description: string;\n alertWebUrl?: string;\n createdDateTime?: string;\n firstActivityDateTime?: string;\n lastActivityDateTime?: string;\n lastUpdateDateTime?: string;\n resolvedDateTime?: string | null;\n assignedTo?: string | null;\n tenantId?: string;\n actorDisplayName?: string | null;\n threatDisplayName?: string | null;\n threatFamilyName?: string | null;\n mitreTechniques?: string[];\n recommendedActions?: string;\n comments?: unknown[];\n evidence?: MdeEvidence[];\n}\n\ninterface MdeEvidence {\n '@odata.type'?: string;\n deviceDnsName?: string;\n osPlatform?: string;\n mdeDeviceId?: string;\n healthStatus?: string;\n onboardingStatus?: string;\n rbacGroupName?: string;\n processId?: number;\n processCommandLine?: string;\n imageFile?: MdeImageFile;\n detectionStatus?: string;\n parentProcess?: MdeParentProcess;\n fileName?: string;\n filePath?: string;\n sha256?: string;\n}\n\ninterface MdeImageFile {\n fileName?: string;\n filePath?: string;\n sha256?: string;\n}\n\ninterface MdeParentProcess {\n processId?: number;\n imageFile?: MdeImageFile;\n}\n\n/**\n * Severity to HDF impact mapping.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n informational: 0.0,\n};\n\n/**\n * Maps MDE severity to HDF impact value.\n */\nfunction severityToImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.5;\n}\n\n/**\n * Maps MDE alert status + classification to HDF result status.\n * new/inProgress → Failed, resolved with falsePositive → Passed, otherwise → Failed.\n */\nfunction statusToResultStatus(status: string, classification?: string | null): ResultStatus {\n if (status.toLowerCase() === 'resolved') {\n if (classification && classification.toLowerCase() === 'falsepositive') {\n return ResultStatus.Passed;\n }\n return ResultStatus.Failed;\n }\n return ResultStatus.Failed;\n}\n\n/**\n * Formats evidence items into a human-readable code_desc string.\n */\nfunction formatEvidence(evidence: MdeEvidence[]): string {\n if (!evidence || evidence.length === 0) {\n return 'No evidence available';\n }\n\n const parts: string[] = [];\n for (const ev of evidence) {\n const odataType = ev['@odata.type'] ?? '';\n if (odataType.includes('deviceEvidence')) {\n parts.push(`Device: ${ev.deviceDnsName ?? 'unknown'} (OS: ${ev.osPlatform ?? 'unknown'})`);\n } else if (odataType.includes('processEvidence')) {\n if (ev.imageFile) {\n parts.push(`Process: ${ev.imageFile.filePath ?? ''}\\\\${ev.imageFile.fileName ?? ''} (Command: ${ev.processCommandLine ?? ''})`);\n } else {\n parts.push(`Process: (Command: ${ev.processCommandLine ?? ''})`);\n }\n } else if (odataType.includes('fileEvidence')) {\n parts.push(`File: ${ev.filePath ?? ''}\\\\${ev.fileName ?? ''}`);\n } else {\n parts.push(`Evidence type: ${odataType}`);\n }\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Formats the message string for a result.\n */\nfunction formatMessage(alert: MdeAlert): string {\n const parts: string[] = [];\n parts.push(`Alert: ${alert.title}`);\n parts.push(`Status: ${alert.status}`);\n parts.push(`Severity: ${alert.severity}`);\n if (alert.threatDisplayName) {\n parts.push(`Threat: ${alert.threatDisplayName}`);\n }\n if (alert.alertWebUrl) {\n parts.push(`URL: ${alert.alertWebUrl}`);\n }\n return parts.join('\\n');\n}\n\n/**\n * Extracts a Host target from device evidence, or falls back to tenant as cloud account.\n */\nfunction extractDeviceTarget(alert: MdeAlert): Component {\n if (alert.evidence) {\n for (const ev of alert.evidence) {\n const odataType = ev['@odata.type'] ?? '';\n if (odataType.includes('deviceEvidence') && ev.deviceDnsName) {\n const target: Component = {\n name: ev.deviceDnsName,\n type: TargetType.Host,\n labels: { provider: 'azure' },\n };\n if (ev.deviceDnsName) {\n target.fqdn = ev.deviceDnsName;\n }\n if (ev.osPlatform) {\n target.osName = ev.osPlatform;\n }\n return target;\n }\n }\n }\n // No device evidence — use tenant as cloud account\n return {\n name: alert.tenantId ?? 'unknown',\n type: TargetType.CloudAccount,\n accountId: alert.tenantId,\n labels: { account: alert.tenantId ?? '', provider: 'azure' },\n };\n}\n\n/**\n * Builds tags map for a requirement.\n */\nfunction buildTags(alert: MdeAlert): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n nist: ['SA-11', 'RA-5'],\n };\n\n if (alert.category) {\n tags['category'] = alert.category;\n }\n\n if (alert.mitreTechniques && alert.mitreTechniques.length > 0) {\n tags['mitre'] = alert.mitreTechniques;\n }\n\n if (alert.classification) {\n tags['classification'] = alert.classification;\n }\n if (alert.determination) {\n tags['determination'] = alert.determination;\n }\n\n return tags;\n}\n\n/**\n * Resolves a clean per-finding source timestamp, falling back to the conversion time.\n */\nfunction resolveStartTime(alert: MdeAlert, scanTime: Date): Date {\n // Resolve each candidate independently (matching the Go converter): a\n // present-but-unparseable firstActivityDateTime must still fall through to\n // createdDateTime, not skip straight to the conversion time.\n const first = alert.firstActivityDateTime ? parseTimestamp(alert.firstActivityDateTime) : null;\n if (first) {\n return first;\n }\n const created = alert.createdDateTime ? parseTimestamp(alert.createdDateTime) : null;\n if (created) {\n return created;\n }\n return scanTime;\n}\n\n/**\n * Converts a single MDE alert to an HDF EvaluatedRequirement.\n */\nfunction alertToRequirement(alert: MdeAlert, scanTime: Date): EvaluatedRequirement {\n const impact = severityToImpact(alert.severity);\n const status = statusToResultStatus(alert.status, alert.classification);\n\n const codeDesc = formatEvidence(alert.evidence ?? []);\n const message = formatMessage(alert);\n const startTime = resolveStartTime(alert, scanTime);\n\n const results: RequirementResult[] = [\n createResult(status, message, { codeDesc, startTime }),\n ];\n\n const descriptions: Description[] = [\n { label: 'default', data: alert.description },\n ];\n if (alert.recommendedActions) {\n descriptions.push({ label: 'fix', data: alert.recommendedActions });\n }\n\n const tags = buildTags(alert);\n\n const req = createRequirement(alert.id, alert.title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const nistTags = tags.nist as string[];\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Microsoft Defender for Endpoint alerts (Microsoft Graph Security API v2 format) to HDF.\n * Each alert becomes one requirement with one result.\n *\n * @param input - JSON string of MDE alert response\n * @returns HDF JSON string\n */\nexport async function convertMsftDefenderEndpointToHdf(input: string): Promise<string> {\n validateInputSize(input, 'msft-defender-endpoint');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const response = parseJSON<MdeAlertResponse>(input);\n\n if (!response || typeof response !== 'object') {\n throw new Error('Invalid Microsoft Defender for Endpoint structure: not a valid JSON object');\n }\n\n if (!Array.isArray(response.value)) {\n throw new Error('Invalid Microsoft Defender for Endpoint structure: missing or invalid value array');\n }\n\n const scanTime = new Date();\n\n const { items: limitedAlerts, truncated } = limitArray(response.value);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAlerts.length} alert items (original: ${response.value.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = limitedAlerts.map((alert) => alertToRequirement(alert, scanTime));\n\n const seenTargets = new Set<string>();\n const components: Component[] = [];\n for (const alert of limitedAlerts) {\n const target = extractDeviceTarget(alert);\n if (!seenTargets.has(target.name)) {\n seenTargets.add(target.name);\n components.push(target);\n }\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'msft-defender-endpoint-no-findings',\n 'Microsoft Defender for Endpoint scanned the tenant and reported zero findings.',\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Microsoft Defender for Endpoint Scan',\n requirements,\n { resultsChecksum },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'msft-defender-endpoint-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Microsoft Defender for Endpoint',\n baselines: [baseline],\n components,\n timestamp: scanTime,\n });\n}\n","import { parseJSON, buildXml } from '@mitre/hdf-utilities';\nimport type {\n HDFResults,\n EvaluatedRequirement,\n Description,\n} from '@mitre/hdf-schema';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\n\n/** Attribute prefix used by fast-xml-parser to distinguish attrs from elements. */\nconst ATTR = '@_';\n\n/** XML build options that enable attribute rendering via @_ prefix. */\nconst BUILD_OPTIONS = {\n attributeNamePrefix: ATTR,\n textNodeName: '#text',\n ignoreAttributes: false,\n format: true,\n indentBy: ' ',\n suppressEmptyNode: false,\n};\n\n/**\n * Convert HDF Results JSON to XCCDF 1.2 Benchmark XML.\n *\n * @param input - HDF Results JSON string\n * @returns XCCDF 1.2 XML string\n */\nexport function convertHdfToXccdf(input: string): string {\n validateInputSize(input, 'hdf-to-xccdf');\n\n const hdfData = parseJSON<HDFResults>(input);\n\n if (!hdfData || typeof hdfData !== 'object' || !('baselines' in hdfData)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdfData.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n const xmlObj = { Benchmark: buildBenchmarkObj(hdfData) };\n\n const xmlBody = buildXml(xmlObj, BUILD_OPTIONS);\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${xmlBody}`;\n}\n\n/** Wrap a primitive value to force it as a text node in XML output. */\nfunction wrap(\n value: string | number | boolean,\n): { '#text': string | number | boolean } {\n return { '#text': value };\n}\n\n/** Map HDF impact (0.0-1.0) to XCCDF severity string. */\nfunction impactToSeverity(impact: number): string {\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'medium';\n if (impact >= 0.1) return 'low';\n return 'info';\n}\n\n/** Map HDF result status to XCCDF result value. */\nfunction hdfStatusToXccdf(status: string): string {\n const statusMap: Record<string, string> = {\n passed: 'pass',\n failed: 'fail',\n error: 'error',\n notReviewed: 'notchecked',\n notApplicable: 'notapplicable',\n };\n return statusMap[status] ?? 'unknown';\n}\n\n/** Find a description by label. */\nfunction findDescription(\n descriptions: Description[] | undefined,\n label: string,\n): string | undefined {\n return descriptions?.find((d) => d.label === label)?.data;\n}\n\n/** Replace characters not valid in XCCDF IDs with underscores. */\nfunction sanitizeXccdfId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_.\\-]/g, '_');\n}\n\n/** Build the Benchmark XML object from HDF data. */\nfunction buildBenchmarkObj(hdfData: HDFResults): Record<string, unknown> {\n const benchmark: Record<string, unknown> = {\n [`${ATTR}xmlns`]: 'http://checklists.nist.gov/xccdf/1.2',\n [`${ATTR}resolved`]: '1',\n status: wrap('incomplete'),\n };\n\n if (!hdfData.baselines || hdfData.baselines.length === 0) {\n benchmark[`${ATTR}id`] = 'xccdf_hdf_benchmark_exported';\n benchmark.title = wrap('HDF Export');\n benchmark.version = wrap('1.0');\n return benchmark;\n }\n\n const baseline = hdfData.baselines[0]!;\n\n benchmark[`${ATTR}id`] = sanitizeXccdfId(\n 'xccdf_hdf_benchmark_' + baseline.name,\n );\n benchmark.title = wrap(baseline.title ?? baseline.name);\n benchmark.version = wrap(baseline.version ?? '1.0');\n\n // Profile\n benchmark.Profile = {\n [`${ATTR}id`]: sanitizeXccdfId('xccdf_hdf_profile_' + baseline.name),\n title: wrap(baseline.title ?? baseline.name),\n };\n\n // Rules\n if (baseline.requirements && baseline.requirements.length > 0) {\n benchmark.Rule = baseline.requirements.map((req: EvaluatedRequirement) => buildRuleObj(req));\n }\n\n // TestResult\n benchmark.TestResult = buildTestResultObj(hdfData, baseline);\n\n return benchmark;\n}\n\n/** Build an XCCDF Rule object from an HDF EvaluatedRequirement. */\nfunction buildRuleObj(req: EvaluatedRequirement): Record<string, unknown> {\n const ruleId = sanitizeXccdfId('xccdf_hdf_rule_' + req.id + '_rule');\n\n const rule: Record<string, unknown> = {\n [`${ATTR}id`]: ruleId,\n [`${ATTR}severity`]: impactToSeverity(req.impact),\n [`${ATTR}selected`]: 'true',\n title: wrap(req.title ?? req.id),\n };\n\n const description = findDescription(req.descriptions, 'default');\n if (description) {\n rule.description = wrap(description);\n }\n\n const fixtext = findDescription(req.descriptions, 'fix');\n if (fixtext) {\n rule.fixtext = wrap(fixtext);\n }\n\n // CCI idents\n if (req.tags && Array.isArray(req.tags['cci'])) {\n const ccis = req.tags['cci'] as string[];\n if (ccis.length > 0) {\n rule.ident = ccis.map((cci) => ({\n [`${ATTR}system`]: 'http://cyber.mil/cci',\n '#text': cci,\n }));\n }\n }\n\n // Check content\n const checkContent = findDescription(req.descriptions, 'check');\n if (checkContent) {\n rule.check = {\n [`${ATTR}system`]: 'http://oval.mitre.org/XMLSchema/oval-definitions-5',\n 'check-content': wrap(checkContent),\n };\n }\n\n return rule;\n}\n\n/** Build the XCCDF TestResult object. */\nfunction buildTestResultObj(\n hdfData: HDFResults,\n baseline: HDFResults['baselines'][0],\n): Record<string, unknown> {\n const testResult: Record<string, unknown> = {\n [`${ATTR}id`]: 'xccdf_hdf_testresult_1',\n title: wrap('HDF Assessment Results'),\n };\n\n // Timestamps\n if (hdfData.timestamp) {\n const ts =\n typeof hdfData.timestamp === 'string'\n ? hdfData.timestamp\n : (hdfData.timestamp as Date).toISOString();\n testResult[`${ATTR}start-time`] = ts;\n testResult[`${ATTR}end-time`] = ts;\n }\n\n // Component\n if (hdfData.components && hdfData.components.length > 0) {\n const target = hdfData.components[0]!;\n testResult.target = wrap(target.name);\n if (target.ipAddress) {\n testResult['target-address'] = wrap(target.ipAddress);\n }\n } else {\n testResult.target = wrap('unknown');\n }\n\n // Rule results\n const ruleResults: Record<string, unknown>[] = [];\n for (const req of baseline.requirements) {\n const ruleIdRef = sanitizeXccdfId('xccdf_hdf_rule_' + req.id + '_rule');\n\n for (const result of req.results) {\n const rr: Record<string, unknown> = {\n [`${ATTR}idref`]: ruleIdRef,\n result: wrap(hdfStatusToXccdf(result.status)),\n };\n\n const startTime =\n typeof result.startTime === 'string'\n ? result.startTime\n : (result.startTime as Date).toISOString();\n rr[`${ATTR}time`] = startTime;\n\n if (result.message) {\n rr.message = wrap(result.message);\n }\n\n if (result.codeDesc) {\n rr.check = {\n [`${ATTR}system`]:\n 'http://oval.mitre.org/XMLSchema/oval-definitions-5',\n 'check-content': wrap(result.codeDesc),\n };\n }\n\n ruleResults.push(rr);\n }\n }\n\n testResult['rule-result'] = ruleResults;\n\n return testResult;\n}\n","/**\n * Shared helper functions for OSCAL-to-HDF converters.\n *\n * Mirrors the Go helpers in converters/oscal-to-hdf/go/shared.go.\n */\n\nimport type { Property, Part, Characterization, DocumentMetadata, Oscal } from './types.js';\n\nconst controlEnhancementRe = /^([a-z]{2}-\\d+)\\.(\\d+)$/;\nconst objectiveIDRe = /^([a-z]{2}-\\d+(?:\\.\\d+)?)/;\n\n/**\n * Converts an OSCAL control ID to NIST 800-53 notation.\n * \"ac-1\" -> \"AC-1\", \"ac-2.3\" -> \"AC-2 (3)\"\n */\nexport function controlIdToNistTag(id: string): string {\n const m = controlEnhancementRe.exec(id);\n if (m) {\n return `${m[1]!.toUpperCase()} (${m[2]!})`;\n }\n return id.toUpperCase();\n}\n\n/**\n * Converts a list of OSCAL control IDs to NIST tags, deduplicating.\n */\nexport function controlIdsToNistTags(ids: string[]): string[] {\n const tags: string[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n const tag = controlIdToNistTag(id);\n if (!seen.has(tag)) {\n seen.add(tag);\n tags.push(tag);\n }\n }\n return tags;\n}\n\n/**\n * Extracts the base control ID from a SAR objective ID.\n * \"ac-1.a.1_obj.1\" -> \"ac-1\"\n */\nexport function extractControlIdFromObjectiveId(objectiveId: string): string {\n const m = objectiveIDRe.exec(objectiveId);\n if (m) {\n return m[1]!;\n }\n return objectiveId;\n}\n\n/**\n * Maps OSCAL finding/risk status strings to HDF-compatible status strings.\n * \"satisfied\"/\"closed\" -> \"passed\", \"not-satisfied\"/\"open\" -> \"failed\"\n */\nexport function oscalStatusToHdf(state: string): string | undefined {\n switch (state.toLowerCase().trim()) {\n case 'satisfied':\n case 'closed':\n return 'passed';\n case 'not-satisfied':\n case 'open':\n return 'failed';\n default:\n return undefined;\n }\n}\n\n/**\n * Finds the first property with the given name and returns its value.\n * If ns is non-empty, the property must also match that namespace.\n */\nexport function extractPropValue(\n props: Property[] | undefined,\n name: string,\n ns?: string,\n): string | undefined {\n if (!props) return undefined;\n for (const p of props) {\n if (p.name === name && (!ns || p.ns === ns)) {\n return p.value;\n }\n }\n return undefined;\n}\n\n/**\n * Returns all property values matching the given name.\n */\nexport function extractAllPropValues(\n props: Property[] | undefined,\n name: string,\n ns?: string,\n): string[] {\n if (!props) return [];\n const values: string[] = [];\n for (const p of props) {\n if (p.name === name && (!ns || p.ns === ns)) {\n values.push(p.value);\n }\n }\n return values;\n}\n\n/**\n * Recursively concatenates prose from a Part tree, joining with newlines.\n */\nexport function flattenParts(parts: Part[] | undefined): string {\n if (!parts) return '';\n const pieces: string[] = [];\n flattenPartsRecursive(parts, pieces);\n return pieces.join('\\n').trim();\n}\n\nfunction flattenPartsRecursive(parts: Part[], pieces: string[]): void {\n for (const p of parts) {\n if (p.prose) {\n pieces.push(p.prose);\n }\n if (p.parts && p.parts.length > 0) {\n flattenPartsRecursive(p.parts, pieces);\n }\n }\n}\n\n/**\n * Like flattenParts but only includes top-level parts matching the given name.\n * Nested parts are included regardless of their name.\n */\nexport function flattenPartsByName(\n parts: Part[] | undefined,\n name: string,\n): string {\n if (!parts) return '';\n const pieces: string[] = [];\n for (const p of parts) {\n if (p.name === name) {\n if (p.prose) {\n pieces.push(p.prose);\n }\n if (p.parts && p.parts.length > 0) {\n flattenPartsRecursive(p.parts, pieces);\n }\n }\n }\n return pieces.join('\\n').trim();\n}\n\n/**\n * Extracts impact/severity from risk characterization facets.\n * Returns a normalized 0.0-1.0 impact value. Falls back to defaultImpact.\n */\nexport function extractRiskSeverity(\n characterizations: Characterization[] | undefined,\n defaultImpact: number,\n): number {\n if (!characterizations) return defaultImpact;\n for (const c of characterizations) {\n if (!c.facets) continue;\n for (const f of c.facets) {\n if (f.name === 'impact' || f.name === 'risk' || f.name === 'likelihood') {\n switch (f.value.toLowerCase()) {\n case 'critical':\n return 0.9;\n case 'high':\n return 0.7;\n case 'moderate':\n case 'medium':\n return 0.5;\n case 'low':\n return 0.3;\n case 'info':\n case 'informational':\n case 'none':\n return 0.0;\n }\n }\n }\n }\n return defaultImpact;\n}\n\n/** Holds extracted metadata common to all OSCAL documents. */\nexport interface MetadataInfo {\n title: string;\n version: string;\n oscalVersion: string;\n lastModified: string;\n}\n\n/** Pulls common fields from OSCAL metadata. */\nexport function extractMetadata(m: DocumentMetadata): MetadataInfo {\n return {\n title: m.title,\n version: m.version,\n oscalVersion: m['oscal-version'],\n lastModified: String(m['last-modified']),\n };\n}\n\n/** Matches NIST 800-53 tags with enhancements like \"AC-2 (3)\". */\nconst nistEnhancementReverseRe = /^([A-Z]{2}-\\d+)\\s*\\((\\d+)\\)$/;\n\n/**\n * Converts NIST 800-53 notation back to OSCAL control ID.\n * \"AC-1\" -> \"ac-1\", \"AC-2 (3)\" -> \"ac-2.3\", \"SI-7 (1)\" -> \"si-7.1\"\n */\nexport function nistTagToControlId(tag: string): string {\n tag = tag.trim();\n const m = nistEnhancementReverseRe.exec(tag);\n if (m) {\n return `${m[1]!.toLowerCase()}.${m[2]!}`;\n }\n return tag.toLowerCase();\n}\n\n/**\n * Converts a 0.0-1.0 impact value to an OSCAL severity string.\n * This is the reverse of extractRiskSeverity.\n */\nexport function impactToSeverity(impact: number): string {\n if (impact >= 0.9) return 'critical';\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'moderate';\n if (impact >= 0.1) return 'low';\n return 'info';\n}\n\n/**\n * Maps an HDF status string to an OSCAL risk status string.\n * \"passed\"/\"notApplicable\" -> \"closed\", everything else -> \"open\".\n */\nexport function hdfStatusToOscalRiskStatus(status: string): string {\n if (status === 'passed' || status === 'notApplicable') {\n return 'closed';\n }\n return 'open';\n}\n\n/** OSCAL specification version used in reverse converter output documents. */\nexport const OSCAL_VERSION = '1.1.2';\n\n/**\n * Parses an OSCAL document from JSON input, validates the document type.\n * Throws if input is empty, invalid JSON, or not the expected type.\n */\nexport function parseOscalDocument<T extends keyof Oscal>(\n input: string,\n expectedKey: T,\n converterName: string,\n): NonNullable<Oscal[T]> {\n if (!input || input.trim().length === 0) {\n throw new Error(`${converterName}: empty input`);\n }\n\n let doc: Oscal;\n try {\n doc = JSON.parse(input) as Oscal;\n } catch {\n throw new Error(`${converterName}: failed to parse JSON`);\n }\n\n const value = doc[expectedKey];\n if (!value) {\n throw new Error(`${converterName}: expected ${String(expectedKey)} document`);\n }\n\n return value as NonNullable<Oscal[T]>;\n}\n\n/**\n * Converts a title to kebab-case, truncated to 80 characters.\n * Shared utility used by multiple converters for deriving names.\n */\nexport function toKebabCase(title: string, fallback: string): string {\n if (!title) return fallback;\n let name = title.toLowerCase();\n name = name.replace(/[^a-z0-9]/g, '-');\n // Collapse consecutive dashes\n while (name.includes('--')) {\n name = name.replace(/--/g, '-');\n }\n name = name.replace(/^-+|-+$/g, '');\n if (name.length > 80) {\n name = name.slice(0, 80);\n }\n return name;\n}\n","/**\n * Converts HDF Results to OSCAL Assessment Results (SAR) format.\n *\n * This is the reverse direction of the oscal-to-hdf SAR converter. It takes HDF\n * Results JSON and produces an OSCAL 1.1.2 assessment-results JSON document.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Description, RequirementResult } from '@mitre/hdf-schema';\nimport type {\n SecurityAssessmentResultsSAR,\n DocumentMetadata,\n ImportAssessmentPlan,\n AssessmentResult,\n Finding,\n TargetClass,\n StatusClass,\n Observation,\n IdentifiedRisk,\n Property,\n} from '../../oscal-to-hdf/typescript/types.js';\nimport {\n nistTagToControlId,\n impactToSeverity,\n OSCAL_VERSION,\n} from '../../oscal-to-hdf/typescript/shared.js';\n\n/** Root wrapper for the output JSON. */\ninterface OscalSARDocument {\n 'assessment-results': SecurityAssessmentResultsSAR;\n}\n\n/**\n * Convert HDF Results JSON to OSCAL Assessment Results (SAR) JSON.\n *\n * @param input - HDF Results JSON string\n * @returns OSCAL SAR JSON string\n */\nexport async function convertHdfToOscalSar(input: string): Promise<string> {\n validateInputSize(input, 'hdf-to-oscal-sar');\n\n if (!input || input.trim().length === 0) {\n throw new Error('hdf-to-oscal-sar: empty input');\n }\n\n let hdfResults: HDFResults;\n try {\n hdfResults = parseJSON<HDFResults>(input);\n } catch {\n throw new Error('hdf-to-oscal-sar: failed to parse HDF JSON');\n }\n\n if (!hdfResults || typeof hdfResults !== 'object' || !('baselines' in hdfResults)) {\n throw new Error('hdf-to-oscal-sar: invalid HDF structure: missing baselines field');\n }\n\n const doc = buildOSCALDocument(hdfResults);\n return JSON.stringify(doc, null, 2);\n}\n\n/**\n * Constructs the full OSCAL assessment-results document from HDF results.\n */\nfunction buildOSCALDocument(hdfResults: HDFResults): OscalSARDocument {\n let timestamp = new Date().toISOString();\n if (hdfResults.timestamp) {\n timestamp = typeof hdfResults.timestamp === 'string'\n ? hdfResults.timestamp\n : hdfResults.timestamp.toISOString();\n }\n\n const metadata = {\n title: 'HDF Assessment Results Export',\n 'last-modified': timestamp,\n version: '1.0.0',\n 'oscal-version': OSCAL_VERSION,\n } as unknown as DocumentMetadata;\n\n let importAP: ImportAssessmentPlan;\n if (hdfResults.planRef && hdfResults.planRef !== '') {\n importAP = { href: hdfResults.planRef };\n } else {\n importAP = { href: '#' };\n }\n\n const results: AssessmentResult[] = [];\n for (const baseline of hdfResults.baselines) {\n results.push(baselineToResult(baseline, timestamp));\n }\n\n return {\n 'assessment-results': {\n uuid: crypto.randomUUID(),\n metadata,\n 'import-ap': importAP,\n results,\n },\n };\n}\n\n/**\n * Converts a single EvaluatedBaseline to an OSCAL Result.\n */\nfunction baselineToResult(baseline: EvaluatedBaseline, timestamp: string): AssessmentResult {\n let title = baseline.name;\n if (baseline.title && baseline.title !== '') {\n title = baseline.title;\n }\n\n let description: string | undefined = 'Converted from HDF results';\n if (baseline.description && baseline.description !== '') {\n description = baseline.description;\n }\n\n const findings: Finding[] = [];\n const observations: Observation[] = [];\n const risks: IdentifiedRisk[] = [];\n\n for (const req of baseline.requirements) {\n const { finding, observation, risk } = requirementToFindingSet(req, timestamp);\n findings.push(finding);\n if (observation) {\n observations.push(observation);\n }\n if (risk) {\n risks.push(risk);\n }\n }\n\n const result = {\n uuid: crypto.randomUUID(),\n title,\n description,\n start: timestamp,\n findings,\n observations,\n risks,\n } as unknown as AssessmentResult;\n\n return result;\n}\n\n/**\n * Converts an EvaluatedRequirement into a Finding, optional Observation, and optional Risk.\n */\nfunction requirementToFindingSet(\n req: EvaluatedRequirement,\n timestamp: string,\n): { finding: Finding; observation: Observation | undefined; risk: IdentifiedRisk | undefined } {\n const controlID = nistTagToControlId(req.id);\n const { state, reason } = aggregateStatus(req.results);\n const findingDesc = extractDefaultDescription(req.descriptions);\n\n // Build props from NIST tags\n const props: Property[] = [];\n if (req.tags) {\n const nistRaw = req.tags['nist'];\n if (Array.isArray(nistRaw)) {\n for (const v of nistRaw) {\n if (typeof v === 'string') {\n props.push({ name: 'nist', value: v });\n }\n }\n }\n }\n\n let title = req.id;\n if (req.title && req.title !== '') {\n title = req.title;\n }\n\n const targetStatus: StatusClass = { state } as unknown as StatusClass;\n if (reason) {\n targetStatus.reason = reason;\n }\n\n const target = {\n type: 'objective-id',\n 'target-id': controlID,\n status: targetStatus,\n } as unknown as TargetClass;\n\n const finding = {\n uuid: crypto.randomUUID(),\n title,\n description: findingDesc || '',\n props: props.length > 0 ? props : undefined,\n target,\n } as Finding;\n\n // Build observation from requirement results\n let observation: Observation | undefined;\n if (req.results.length > 0) {\n const obsUUID = crypto.randomUUID();\n const obsDesc = buildObservationDescription(req.results);\n observation = {\n uuid: obsUUID,\n description: obsDesc,\n methods: ['TEST'],\n collected: timestamp,\n } as unknown as Observation;\n finding['related-observations'] = [{ 'observation-uuid': obsUUID }];\n }\n\n // Build risk from impact\n let risk: IdentifiedRisk | undefined;\n if (req.impact > 0) {\n const riskUUID = crypto.randomUUID();\n const severity = impactToSeverity(req.impact);\n risk = {\n uuid: riskUUID,\n title: `Risk for ${req.id}`,\n description: `Impact: ${req.impact.toFixed(1)} (${severity})`,\n statement: `Impact: ${req.impact.toFixed(1)} (${severity})`,\n status: riskStatusFromState(state),\n characterizations: [\n {\n facets: [\n {\n name: 'impact',\n system: 'https://fedramp.gov',\n value: severity,\n },\n ],\n },\n ],\n } as unknown as IdentifiedRisk;\n finding['related-risks'] = [{ 'risk-uuid': riskUUID }];\n }\n\n return { finding, observation, risk };\n}\n\n\n/**\n * Determines the overall finding status from requirement results.\n */\nexport function aggregateStatus(results: RequirementResult[]): { state: string; reason: string } {\n if (results.length === 0) {\n return { state: 'not-satisfied', reason: 'other' };\n }\n\n let hasFailed = false;\n let hasError = false;\n let hasNotReviewed = false;\n let hasNotApplicable = false;\n let allPassed = true;\n\n for (const r of results) {\n switch (r.status) {\n case 'passed':\n break;\n case 'failed':\n hasFailed = true;\n allPassed = false;\n break;\n case 'error':\n hasError = true;\n allPassed = false;\n break;\n case 'notReviewed':\n hasNotReviewed = true;\n allPassed = false;\n break;\n case 'notApplicable':\n hasNotApplicable = true;\n allPassed = false;\n break;\n default:\n allPassed = false;\n break;\n }\n }\n\n if (allPassed) {\n return { state: 'satisfied', reason: '' };\n }\n if (hasFailed || hasError) {\n return { state: 'not-satisfied', reason: '' };\n }\n if (hasNotReviewed) {\n return { state: 'not-satisfied', reason: 'other' };\n }\n if (hasNotApplicable) {\n return { state: 'not-satisfied', reason: 'not-applicable' };\n }\n return { state: 'not-satisfied', reason: '' };\n}\n\n/**\n * Finds the \"default\" labeled description.\n */\nfunction extractDefaultDescription(descriptions: Description[]): string {\n for (const d of descriptions) {\n if (d.label === 'default') {\n return d.data;\n }\n }\n if (descriptions.length > 0) {\n return descriptions[0]!.data;\n }\n return '';\n}\n\n/**\n * Concatenates result code descriptions and messages.\n */\nfunction buildObservationDescription(results: RequirementResult[]): string {\n const parts: string[] = [];\n for (const r of results) {\n let desc = `[${r.status}] ${r.codeDesc}`;\n if (r.message && r.message !== '') {\n desc += ': ' + r.message;\n }\n parts.push(desc);\n }\n if (parts.length === 0) {\n return 'No observations recorded';\n }\n return parts.join('\\n');\n}\n\n\n/**\n * Maps OSCAL finding state to risk status.\n */\nfunction riskStatusFromState(state: string): string {\n if (state === 'satisfied') {\n return 'closed';\n }\n return 'open';\n}\n","/**\n * Converts HDF Amendments to OSCAL Plan of Action and Milestones (POA&M) format.\n *\n * This is the reverse direction of the oscal-poam to HDF converter.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFAmendments, StandaloneOverride } from '@mitre/hdf-schema';\nimport type {\n Oscal,\n DocumentMetadata,\n ImportSystemSecurityPlan,\n PlanOfActionAndMilestonesPOAM,\n POAMItem,\n IdentifiedRisk,\n Property,\n RiskResponse,\n RiskLog,\n} from '../../oscal-to-hdf/typescript/types.js';\nimport {\n nistTagToControlId,\n hdfStatusToOscalRiskStatus,\n OSCAL_VERSION,\n} from '../../oscal-to-hdf/typescript/shared.js';\n\n/**\n * Convert HDF Amendments JSON to OSCAL POA&M JSON.\n *\n * @param input - HDF Amendments JSON string\n * @returns OSCAL POA&M JSON string\n */\nexport async function convertHdfToOscalPoam(input: string): Promise<string> {\n validateInputSize(input, 'hdf-to-oscal-poam');\n\n if (!input || input.trim().length === 0) {\n throw new Error('hdf-to-oscal-poam: empty input');\n }\n\n let amendments: HDFAmendments;\n try {\n amendments = parseJSON<HDFAmendments>(input);\n } catch {\n throw new Error('hdf-to-oscal-poam: failed to parse JSON');\n }\n\n const poam = amendmentsToPOAM(amendments);\n\n const doc: Oscal = {\n 'plan-of-action-and-milestones': poam,\n };\n\n return JSON.stringify(doc, null, 2);\n}\n\n/**\n * Converts parsed HDFAmendments to an OSCAL PlanOfActionAndMilestones.\n */\nfunction amendmentsToPOAM(amendments: HDFAmendments): PlanOfActionAndMilestonesPOAM {\n const now = new Date().toISOString();\n\n const metadata = {\n title: amendments.name,\n 'last-modified': now,\n version: '1.0.0',\n 'oscal-version': OSCAL_VERSION,\n } as unknown as DocumentMetadata;\n\n // Add responsible parties from appliedBy\n if (amendments.appliedBy) {\n const partyUUID = crypto.randomUUID();\n metadata.parties = [\n {\n uuid: partyUUID,\n type: 'person' as unknown,\n name: amendments.appliedBy.identifier,\n },\n ] as unknown as DocumentMetadata['parties'];\n metadata['responsible-parties'] = [\n {\n 'role-id': 'prepared-by',\n 'party-uuids': [partyUUID],\n },\n ];\n metadata.roles = [\n {\n id: 'prepared-by',\n title: 'Prepared By',\n },\n ];\n }\n\n // Build import-ssp\n let importSSP: ImportSystemSecurityPlan;\n if (amendments.systemRef && amendments.systemRef !== '') {\n importSSP = { href: amendments.systemRef } as ImportSystemSecurityPlan;\n } else {\n importSSP = { href: '#' } as ImportSystemSecurityPlan;\n }\n\n // Convert overrides to poam-items and collect risks\n const poamItems: POAMItem[] = [];\n const risks: IdentifiedRisk[] = [];\n\n for (const override of amendments.overrides) {\n const { item, itemRisks } = overrideToPOAMItem(override);\n poamItems.push(item);\n risks.push(...itemRisks);\n }\n\n return {\n uuid: crypto.randomUUID(),\n metadata,\n 'import-ssp': importSSP,\n risks,\n 'poam-items': poamItems,\n };\n}\n\n/**\n * Converts a single StandaloneOverride to a POAMItem and its associated Risk(s).\n */\nfunction overrideToPOAMItem(override: StandaloneOverride): { item: POAMItem; itemRisks: IdentifiedRisk[] } {\n const riskUUID = crypto.randomUUID();\n\n // Map HDF status to OSCAL risk status\n const riskStatus = hdfStatusToOscalRiskStatus(String(override.status));\n\n // Convert requirement ID from NIST notation to OSCAL control ID\n const controlID = nistTagToControlId(override.requirementId);\n\n // Build risk props with impacted-control-id\n const riskProps: Property[] = [\n {\n name: 'impacted-control-id',\n value: controlID,\n },\n ];\n\n // Build remediations from milestones\n const remediations: RiskResponse[] = [];\n if (override.milestones) {\n for (const ms of override.milestones) {\n remediations.push({\n uuid: crypto.randomUUID(),\n lifecycle: 'planned',\n title: ms.description,\n description: ms.description,\n });\n }\n }\n\n // Build risk log entry for expiration tracking\n let riskLog: RiskLog | undefined;\n const expiresAt = override.expiresAt;\n if (expiresAt) {\n const expiresDate = typeof expiresAt === 'string' ? new Date(expiresAt) : expiresAt;\n if (!isNaN(expiresDate.getTime()) && expiresDate.getTime() > 0) {\n riskLog = {\n entries: [\n {\n uuid: crypto.randomUUID(),\n title: 'Scheduled review',\n description: 'Amendment expiration date',\n start: expiresDate.toISOString(),\n 'status-change': riskStatus,\n },\n ],\n } as unknown as RiskLog;\n }\n }\n\n const risk = {\n uuid: riskUUID,\n title: override.requirementId,\n description: override.reason,\n statement: override.reason,\n status: riskStatus,\n props: riskProps,\n remediations: remediations.length > 0 ? remediations : undefined,\n 'risk-log': riskLog,\n } as unknown as IdentifiedRisk;\n\n const item: POAMItem = {\n uuid: crypto.randomUUID(),\n title: override.requirementId,\n description: override.reason,\n 'related-risks': [{ 'risk-uuid': riskUUID }],\n };\n\n return { item, itemRisks: [risk] };\n}\n\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n createResult,\n} from '@mitre/hdf-schema';\nimport {\n nistToCci,\n DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {\n inputChecksum,\n buildNistCciTags,\n deriveControlTypeFromTags,\n validateInputSize,\n buildHdfResults,\n} from '../../../shared/typescript/converterutil.js';\n\n// ---- Input types ----\n\ninterface IonChannelAnalysis {\n id: string;\n analysis_id: string;\n team_id: string;\n project_id: string;\n name: string;\n text: string;\n type: string;\n source: string;\n branch: string;\n description: string;\n risk: string;\n summary: string;\n passed: boolean;\n ruleset_id: string;\n ruleset_name: string;\n status: string;\n created_at: string;\n updated_at: string;\n duration: number;\n trigger_hash: string;\n trigger_text: string;\n trigger_author: string;\n trigger: string;\n public: boolean;\n scan_summaries: ScanSummary[];\n}\n\ninterface ScanSummary {\n id: string;\n team_id: string;\n project_id: string;\n analysis_id: string;\n summary: string;\n results: ScanResults;\n created_at: string;\n updated_at: string;\n duration: number;\n name: string;\n description: string;\n}\n\ninterface ScanResults {\n type: string;\n data: ScanData;\n}\n\ninterface ScanData {\n dependencies?: Dependency[];\n}\n\ninterface Dependency {\n latest_version: string;\n org: string;\n name: string;\n type: string;\n package: string;\n version: string;\n scope: string;\n requirement: string;\n file: string;\n outdated_version: OutdatedVersion;\n dependencies: Dependency[];\n}\n\ninterface OutdatedVersion {\n major_behind: number;\n minor_behind: number;\n patch_behind: number;\n}\n\ninterface ContextualizedDependency extends Dependency {\n parentDependencies: string[];\n}\n\n// ---- Helpers ----\n\nfunction extractAllDependencies(dep: Dependency): ContextualizedDependency[] {\n const result: ContextualizedDependency[] = [\n { ...dep, parentDependencies: [] },\n ];\n if (Array.isArray(dep.dependencies)) {\n for (const sub of dep.dependencies) {\n result.push(...extractAllDependencies(sub));\n }\n }\n return result;\n}\n\nfunction buildDependencyGraph(deps: Dependency[]): ContextualizedDependency[] {\n const graph = new Map<string, ContextualizedDependency>();\n\n // Flatten all dependencies\n for (const topLevel of deps) {\n for (const flat of extractAllDependencies(topLevel)) {\n const key = `${flat.org}/${flat.name}`;\n if (!graph.has(key)) {\n graph.set(key, flat);\n }\n }\n }\n\n // Associate parent relationships\n for (const dep of graph.values()) {\n if (Array.isArray(dep.dependencies)) {\n for (const sub of dep.dependencies) {\n const subKey = `${sub.org}/${sub.name}`;\n const child = graph.get(subKey);\n if (child) {\n const parentKey = `${dep.org}/${dep.name}`;\n child.parentDependencies.push(parentKey);\n }\n }\n }\n }\n\n return Array.from(graph.values());\n}\n\nfunction buildTitle(dep: Dependency): string {\n // Python editable install special case\n if (dep.type === 'pypi' && dep.package === 'egg' && dep.name === '-e') {\n return `Python requirements file ${dep.file}`;\n }\n\n let title = `Dependency ${dep.name} `;\n if (dep.org && dep.org.toLowerCase() !== 'n/a') {\n title += `from ${dep.org} `;\n }\n if (dep.version && dep.version.toLowerCase() !== 'n/a') {\n title += `@ ${dep.version} `;\n }\n if (dep.requirement && dep.requirement.toLowerCase() !== 'n/a') {\n title += `(Required ${dep.requirement}) `;\n }\n return title.trim();\n}\n\nfunction buildTags(\n dep: ContextualizedDependency,\n): Record<string, unknown> {\n const nist = DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS;\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {\n org: dep.org,\n name: dep.name,\n type: dep.type,\n version: dep.version,\n latest_version: dep.latest_version,\n scope: dep.scope,\n requirement: dep.requirement,\n file: dep.file,\n };\n\n if (Array.isArray(dep.dependencies) && dep.dependencies.length > 0) {\n extras.dependencies = dep.dependencies.map((sub) => sub.name);\n }\n\n if (dep.parentDependencies.length > 0) {\n extras.parentDependencies = dep.parentDependencies;\n }\n\n return buildNistCciTags(nist, cciTags, extras);\n}\n\n// ---- Main converter ----\n\nexport async function convertIonchannelToHdf(input: string): Promise<string> {\n if (!input?.trim()) {\n throw new Error('Empty input');\n }\n\n validateInputSize(input, 'ionchannel');\n\n const analysis = parseJSON<IonChannelAnalysis>(input);\n\n if (!Array.isArray(analysis.scan_summaries)) {\n throw new Error(\n `Ion Channel scan_summaries invalid summary data (expecting array, got ${typeof analysis.scan_summaries})`,\n );\n }\n\n // Extract dependencies from dependency scan\n let allDeps: Dependency[] = [];\n for (const scan of analysis.scan_summaries) {\n if (scan.name === 'dependency') {\n allDeps = scan.results?.data?.dependencies ?? [];\n break;\n }\n }\n\n // Flatten and contextualize\n const contextDeps = buildDependencyGraph(allDeps);\n\n // Build requirements\n const requirements: EvaluatedRequirement[] = contextDeps.map((dep) => {\n const depId = `dependency-${dep.org}/${dep.name}`;\n const title = buildTitle(dep);\n const tags = buildTags(dep);\n const code = JSON.stringify(\n {\n latest_version: dep.latest_version,\n org: dep.org,\n name: dep.name,\n type: dep.type,\n package: dep.package,\n version: dep.version,\n scope: dep.scope,\n requirement: dep.requirement,\n file: dep.file,\n outdated_version: dep.outdated_version,\n dependencies: dep.dependencies,\n } as Dependency,\n null,\n 2,\n );\n\n const descriptions = [\n createDescription('default', `Dependency ${dep.org}/${dep.name}`),\n ];\n const results = [\n createResult(ResultStatus.NotReviewed, 'Dependency inventory item', {\n codeDesc: 'Dependency inventory item',\n startTime: new Date('0001-01-01T00:00:00Z'),\n }),\n ];\n\n const req = createRequirement(depId, title, descriptions, 0.0, results, {\n tags,\n }) as EvaluatedRequirement;\n req.code = code;\n const controlType = deriveControlTypeFromTags(DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n });\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const baseline = createMinimalBaseline(\n 'Ion Channel SBOM Analysis',\n requirements,\n {\n title: `Ion Channel Analysis of ${analysis.source}`,\n summary: analysis.summary,\n integrity: { algorithm: resultsChecksum.algorithm, checksum: resultsChecksum.value },\n status: 'loaded',\n },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'ionchannel-to-hdf',\n converterVersion: '1.0.0',\n toolName: 'Ion Channel',\n toolFormat: 'JSON',\n baselines: [baseline],\n timestamp: new Date(),\n });\n}\n","/**\n * Shared mapping between VEX (OpenVEX, CSAF VEX, CycloneDX VEX) and HDF\n * Amendments. Importers normalize ecosystem-specific statuses + justifications\n * to the canonical forms here; exporters render HDF override state back to\n * the canonical VEX shape.\n *\n * Synthesis happens only where the consumer has explicitly acted. The\n * helper never invents amendments from raw findings, and never claims a\n * real system is patched without a closure amendment chained on top of an\n * open POA&M (real-system vs abstract-vuln distinction).\n */\n\nimport type { AffectedPackage, Evidence, StandaloneOverride } from '@mitre/hdf-schema';\nimport {\n Ecosystem,\n EvidenceType,\n Justification,\n OverrideType,\n ResultStatus,\n} from '@mitre/hdf-schema';\nimport { parsePurl } from '@mitre/hdf-utilities';\n\n/** Canonical VEX status across OpenVEX / CSAF / CycloneDX. */\nexport const VexStatus = {\n NotAffected: 'not_affected',\n Affected: 'affected',\n Fixed: 'fixed',\n UnderInvestigation: 'under_investigation',\n} as const;\n\nexport type VexStatus = (typeof VexStatus)[keyof typeof VexStatus];\n\n/**\n * Map an ecosystem-specific status string to the canonical VexStatus.\n * Returns undefined for values without a clean mapping — caller should warn\n * and skip, not guess.\n */\nexport function normalizeStatus(raw: string): VexStatus | undefined {\n switch (raw.trim().toLowerCase()) {\n case 'not_affected':\n case 'known_not_affected':\n case 'false_positive':\n return VexStatus.NotAffected;\n case 'affected':\n case 'known_affected':\n case 'exploitable':\n return VexStatus.Affected;\n case 'fixed':\n case 'first_fixed':\n case 'resolved':\n case 'resolved_with_pedigree':\n return VexStatus.Fixed;\n case 'under_investigation':\n case 'in_triage':\n return VexStatus.UnderInvestigation;\n default:\n return undefined;\n }\n}\n\n/**\n * Map an ecosystem-specific justification string to the canonical HDF\n * Justification enum. Returns undefined for unknown values; callers SHOULD\n * log unknown values rather than silently dropping (the schema spec wants\n * pass-through, but practically we expect the enum to be extended when a\n * new vocabulary is integrated rather than carrying raw labels\n * indefinitely).\n *\n * The HDF Justification enum (v3.2.x) covers:\n * - the original OpenVEX / CSAF VEX five values\n * - CycloneDX-specific reachability values (requires_*, protected_*)\n * that describe why a vulnerable code path is unreachable in the\n * deployed configuration.\n */\nexport function normalizeJustification(raw: string): Justification | undefined {\n switch (raw.trim().toLowerCase()) {\n case 'component_not_present':\n case 'code_not_present':\n return Justification.ComponentNotPresent;\n case 'vulnerable_code_not_present':\n return Justification.VulnerableCodeNotPresent;\n case 'vulnerable_code_not_in_execute_path':\n case 'code_not_reachable':\n return Justification.VulnerableCodeNotInExecutePath;\n case 'vulnerable_code_cannot_be_controlled_by_adversary':\n return Justification.VulnerableCodeCannotBeControlledByAdversary;\n case 'inline_mitigations_already_exist':\n case 'protected_by_mitigating_control':\n return Justification.InlineMitigationsAlreadyExist;\n case 'requires_configuration':\n return Justification.RequiresConfiguration;\n case 'requires_dependency':\n return Justification.RequiresDependency;\n case 'requires_environment':\n return Justification.RequiresEnvironment;\n case 'protected_by_compiler':\n return Justification.ProtectedByCompiler;\n case 'protected_at_runtime':\n return Justification.ProtectedAtRuntime;\n case 'protected_at_perimeter':\n return Justification.ProtectedAtPerimeter;\n default:\n return undefined;\n }\n}\n\n/**\n * Render an HDF Justification value as the CycloneDX-native vocabulary.\n * CycloneDX uses short-form names (code_not_present, code_not_reachable,\n * protected_by_mitigating_control) for the three justifications shared\n * with OpenVEX/CSAF, and shares the six CycloneDX-specific reachability\n * values verbatim.\n *\n * Returns undefined when the HDF value has no equivalent in CycloneDX's\n * enum (vulnerable_code_not_present and\n * vulnerable_code_cannot_be_controlled_by_adversary). Callers should\n * omit the justification field in that case.\n */\nexport function justificationForCycloneDX(j: Justification): string | undefined {\n switch (j) {\n case Justification.ComponentNotPresent:\n return 'code_not_present';\n case Justification.VulnerableCodeNotInExecutePath:\n return 'code_not_reachable';\n case Justification.InlineMitigationsAlreadyExist:\n return 'protected_by_mitigating_control';\n case Justification.RequiresConfiguration:\n case Justification.RequiresDependency:\n case Justification.RequiresEnvironment:\n case Justification.ProtectedByCompiler:\n case Justification.ProtectedAtRuntime:\n case Justification.ProtectedAtPerimeter:\n return String(j);\n default:\n return undefined;\n }\n}\n\nexport interface ImportTarget {\n overrideType: OverrideType;\n status?: ResultStatus;\n /** True when the canonical VEX status implies the importer should\n * populate justification on the synthesized override (not_affected). */\n setJustification: boolean;\n /** POAM action_statement template for the \"fixed\" path. Empty otherwise. */\n poamActionTemplate: string;\n}\n\n/**\n * Return the amendment shape an importer should produce for a canonical VEX\n * status. Returns undefined for \"affected\" and \"under_investigation\" — those\n * are informational; the consumer creates an amendment later if they act.\n */\nexport function importTargetFor(status: VexStatus): ImportTarget | undefined {\n switch (status) {\n case VexStatus.NotAffected:\n return {\n overrideType: OverrideType.FalsePositive,\n status: ResultStatus.Passed,\n setJustification: true,\n poamActionTemplate: '',\n };\n case VexStatus.Fixed:\n return {\n overrideType: OverrideType.Poam,\n // Status stays 'failed' on the open POA&M: VEX 'fixed' is an\n // abstract supplier claim about a product version, not evidence\n // the assessed system has the patch. Re-scan is required to change\n // the effective status.\n status: ResultStatus.Failed,\n setJustification: false,\n poamActionTemplate:\n 'vendor reports fix; apply and re-scan to verify',\n };\n case VexStatus.Affected:\n case VexStatus.UnderInvestigation:\n return undefined;\n /* c8 ignore next 2 — every VexStatus has a case above */\n default:\n return undefined;\n }\n}\n\n/**\n * Return the canonical VEX status an exporter should emit for an HDF\n * override. Returns undefined when no VEX statement should be emitted —\n * the consumer has not acted, and VEX requires a deliberate statement.\n *\n * `allMilestonesCompleted` and `closureChained` are consulted only for\n * POA&M overrides. Closure is signalled by BOTH flags being true; either\n * alone is insufficient.\n */\nexport function exportStatusFor(\n override: StandaloneOverride | undefined,\n allMilestonesCompleted: boolean,\n closureChained: boolean,\n): VexStatus | undefined {\n if (!override) {\n return undefined;\n }\n if (override.justification) {\n return VexStatus.NotAffected;\n }\n switch (override.type) {\n case OverrideType.FalsePositive:\n case OverrideType.Attestation:\n case OverrideType.Inherited:\n return VexStatus.NotAffected;\n case OverrideType.Waiver:\n case OverrideType.RiskAdjustment:\n case OverrideType.OperationalRequirement:\n return VexStatus.Affected;\n case OverrideType.Poam:\n return allMilestonesCompleted && closureChained\n ? VexStatus.Fixed\n : VexStatus.Affected;\n /* c8 ignore next 2 — every OverrideType has a case above */\n default:\n return undefined;\n }\n}\n\n// Maps PURL `type` segment → AffectedPackage.ecosystem. Unknown types fall\n// back to `generic`, which the schema enum permits as a catch-all.\nconst ECOSYSTEM_FROM_PURL_TYPE: Record<string, Ecosystem> = {\n npm: Ecosystem.Npm,\n pypi: Ecosystem.Pypi,\n rpm: Ecosystem.RPM,\n deb: Ecosystem.Deb,\n maven: Ecosystem.Maven,\n gem: Ecosystem.Gem,\n nuget: Ecosystem.Nuget,\n golang: Ecosystem.Go,\n go: Ecosystem.Go,\n cargo: Ecosystem.Cargo,\n};\n\n/**\n * Build an AffectedPackage from a single product identifier string emitted\n * by a VEX format. Recognizes PURLs and CPE 2.3 strings; returns undefined\n * for opaque identifiers (importer should drop the entry — schema additions\n * forbid fabricating name+version).\n */\nexport function affectedPackageFromIdentifier(\n identifier: string,\n): AffectedPackage | undefined {\n if (!identifier) return undefined;\n if (identifier.startsWith('pkg:')) {\n const parsed = parsePurl(identifier);\n if (parsed) {\n const pkg: AffectedPackage = { purl: identifier };\n /* c8 ignore next 2 — parsePurl populates name/version when the\n identifier was a well-formed purl; the absent branches require a\n malformed-but-prefixed input that loses these fields without\n triggering the outer null return. Defensive. */\n if (parsed.name) pkg.name = parsed.name;\n if (parsed.version) pkg.version = parsed.version;\n pkg.ecosystem = ECOSYSTEM_FROM_PURL_TYPE[parsed.type] ?? Ecosystem.Generic;\n return pkg;\n }\n // Malformed purl with the prefix — preserve as purl-only.\n return { purl: identifier };\n }\n if (identifier.startsWith('cpe:2.3:')) {\n return { cpe: identifier };\n }\n return undefined;\n}\n\n/**\n * Build a unique list of AffectedPackage entries from a sequence of product\n * identifier strings. Empty / unresolvable identifiers are dropped; duplicate\n * purls/cpes/names are collapsed.\n */\nexport function affectedPackagesFromIdentifiers(\n identifiers: readonly string[],\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seen = new Set<string>();\n for (const id of identifiers) {\n const pkg = affectedPackageFromIdentifier(id);\n if (!pkg) continue;\n /* c8 ignore next — affectedPackageFromIdentifier always emits either\n purl or cpe, so the name fallback branch isn't reachable through\n this caller. Kept for safety if a hand-built AffectedPackage flows\n through a future caller. */\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(pkg);\n }\n return out;\n}\n\n/**\n * Render an AffectedPackage as a single identifier string suitable for\n * round-tripping into a VEX format. Prefers purl > cpe > name@version.\n * Returns undefined when nothing identifying is set.\n */\nexport function affectedPackageToIdentifier(\n pkg: AffectedPackage,\n): string | undefined {\n if (pkg.purl) return pkg.purl;\n if (pkg.cpe) return pkg.cpe;\n if (pkg.name && pkg.version) return `${pkg.name}@${pkg.version}`;\n if (pkg.name) return pkg.name;\n return undefined;\n}\n\n/**\n * Build an HDF Evidence entry pointing at the upstream VEX document. Used by\n * importers to preserve provenance even though we lose the structured\n * statement_id. Returns undefined when sourceURI is empty — don't fabricate.\n */\nexport function supplierEvidence(\n sourceURI: string,\n description?: string,\n): Evidence | undefined {\n if (!sourceURI.trim()) {\n return undefined;\n }\n return {\n type: EvidenceType.URL,\n data: sourceURI,\n description: description?.trim() ? description : 'Upstream VEX statement',\n };\n}\n","/**\n * OpenVEX to HDF Amendments converter.\n *\n * VEX statements are consumer-attached context for CVE findings. The act of\n * attaching IS the amendment, so this converter emits HDF Amendments rather\n * than HDF Results.\n *\n * VEX 'fixed' is an abstract supplier claim; the assessed system has not\n * been verified to carry the fix. Imports therefore become open POA&M\n * overrides (status pinned to failed pending re-scan), not status flips.\n *\n * Spec: https://github.com/openvex/spec\n */\n\nimport {\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackagesFromIdentifiers,\n importTargetFor,\n normalizeJustification,\n normalizeStatus,\n supplierEvidence,\n} from '../../../shared/typescript/vex/mapping.js';\n\n/** One year in milliseconds. VEX statements are re-evaluated as new info\n * arrives; one year is a defensive default consistent with the\n * no-permanent-amendment rule on Standalone_Override. */\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface OpenVexVulnerability {\n '@id'?: string;\n name?: string;\n description?: string;\n aliases?: string[];\n}\n\ninterface OpenVexProduct {\n '@id'?: string;\n identifiers?: Record<string, string>;\n hashes?: Record<string, string>;\n}\n\ninterface OpenVexStatement {\n vulnerability?: OpenVexVulnerability;\n products?: OpenVexProduct[];\n status?: string;\n justification?: string;\n impact_statement?: string;\n action_statement?: string;\n timestamp?: string;\n author?: string;\n}\n\ninterface OpenVexDocument {\n '@context'?: string;\n '@id'?: string;\n author?: string;\n role?: string;\n timestamp?: string;\n version?: number;\n statements?: OpenVexStatement[];\n}\n\nexport async function convertOpenVexToHdf(\n input: string,\n converterVersion: string,\n): Promise<HDFAmendments> {\n validateInputSize(input, 'openvex-to-hdf');\n const doc = parseJSON<OpenVexDocument>(input);\n const docTime = (doc.timestamp ? parseTimestamp(doc.timestamp) : null) ?? new Date();\n\n const overrides: StandaloneOverride[] = [];\n for (const stmt of doc.statements ?? []) {\n const override = statementToOverride(stmt, doc, docTime);\n if (override) {\n overrides.push(override);\n }\n }\n\n // HDF Amendments requires overrides.minItems=1. A VEX document with only\n // 'affected' or 'under_investigation' statements has no consumer-action\n // payload, so we refuse to write an empty amendments document.\n if (overrides.length === 0) {\n throw new Error(\n \"openvex-to-hdf: VEX document contains no actionable statements (all 'affected' or 'under_investigation'); no amendment to write\",\n );\n }\n\n const name = doc.author\n ? `OpenVEX statements from ${doc.author}`\n : 'OpenVEX statements';\n\n return {\n name,\n description: `Imported VEX statements from ${truncateId(doc['@id'] ?? '')}`,\n overrides,\n appliedBy: identityFor(doc.author, doc.role),\n generator: {\n name: 'openvex-to-hdf',\n version: converterVersion,\n },\n integrity: await inputIntegrity(input),\n } as HDFAmendments;\n}\n\nfunction statementToOverride(\n stmt: OpenVexStatement,\n doc: OpenVexDocument,\n docTime: Date,\n): StandaloneOverride | undefined {\n const canonical = normalizeStatus(stmt.status ?? '');\n if (!canonical) return undefined;\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const requirementId = stmt.vulnerability?.name ?? stmt.vulnerability?.['@id'] ?? '';\n if (!requirementId) return undefined;\n\n const stmtTime = (stmt.timestamp ? parseTimestamp(stmt.timestamp) : null) ?? docTime;\n const author = stmt.author ?? doc.author ?? '';\n\n const expiresAt = new Date(stmtTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId,\n appliedAt: stmtTime,\n expiresAt,\n appliedBy: identityFor(author, doc.role),\n reason: buildReason(stmt, target.poamActionTemplate),\n } as StandaloneOverride;\n\n const productIds = (stmt.products ?? [])\n .map((p) => p['@id'])\n .filter((id): id is string => Boolean(id));\n const affectedPackages = affectedPackagesFromIdentifiers(productIds);\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) {\n override.status = target.status;\n }\n\n if (target.setJustification && stmt.justification) {\n const j = normalizeJustification(stmt.justification);\n if (j) {\n override.justification = j;\n }\n }\n\n const ev = supplierEvidence(doc['@id'] ?? '', 'OpenVEX document');\n if (ev) {\n override.evidence = [ev as Evidence];\n }\n\n if (target.overrideType === OverrideType.Poam) {\n const milestone: Milestone = {\n description: target.poamActionTemplate,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction buildReason(stmt: OpenVexStatement, poamTemplate: string): string {\n const parts: string[] = [];\n if (stmt.impact_statement) parts.push(stmt.impact_statement);\n if (stmt.action_statement) parts.push(stmt.action_statement);\n // Justification and product list are fully structured fields now\n // (Justification enum + Standalone_Override.affectedPackages); neither\n // is mirrored into reason.\n if (parts.length === 0) {\n return poamTemplate || `Imported from OpenVEX status \"${stmt.status ?? ''}\"`;\n }\n return parts.join('\\n');\n}\n\nfunction identityFor(author: string | undefined, role: string | undefined): Identity {\n if (!author) {\n return {\n type: IdentityType.System,\n identifier: 'openvex-import',\n } as Identity;\n }\n const id: Identity = {\n type: author.includes('@') ? IdentityType.Email : IdentityType.Simple,\n identifier: author,\n } as Identity;\n if (role) {\n id.description = role;\n }\n return id;\n}\n\nfunction truncateId(id: string): string {\n const MAX = 80;\n return id.length <= MAX ? id : `${id.slice(0, MAX)}...`;\n}\n\n","/**\n * CSAF VEX to HDF Amendments converter.\n *\n * CSAF (OASIS Common Security Advisory Framework) VEX profile is the\n * vendor-advisory format. Per the amendment-output pattern (Step 4f),\n * 'fixed' becomes an open POA&M, not a status flip — supplier claim is\n * not assessed-system evidence.\n *\n * Spec: https://docs.oasis-open.org/csaf/csaf/v2.0/csaf-v2.0.html\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n Ecosystem,\n IdentityType,\n Justification,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageFromIdentifier,\n importTargetFor,\n normalizeJustification,\n supplierEvidence,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface CsafPublisher {\n category?: string;\n name?: string;\n namespace?: string;\n}\n\ninterface CsafTracking {\n id?: string;\n status?: string;\n version?: string;\n current_release_date?: string;\n initial_release_date?: string;\n}\n\ninterface CsafReference {\n category?: string;\n summary?: string;\n url?: string;\n}\n\ninterface CsafNote {\n category?: string;\n text?: string;\n title?: string;\n}\n\ninterface CsafDocumentMeta {\n category?: string;\n csaf_version?: string;\n title?: string;\n publisher?: CsafPublisher;\n tracking?: CsafTracking;\n notes?: CsafNote[];\n references?: CsafReference[];\n}\n\ninterface CsafProductStatus {\n first_affected?: string[];\n first_fixed?: string[];\n fixed?: string[];\n known_affected?: string[];\n known_not_affected?: string[];\n last_affected?: string[];\n recommended?: string[];\n under_investigation?: string[];\n}\n\ninterface CsafThreat {\n category?: string;\n details?: string;\n product_ids?: string[];\n}\n\ninterface CsafRemediation {\n category?: string;\n details?: string;\n product_ids?: string[];\n url?: string;\n}\n\ninterface CsafFlag {\n date?: string;\n label?: string;\n product_ids?: string[];\n}\n\ninterface CsafVulnerability {\n cve?: string;\n notes?: CsafNote[];\n product_status?: CsafProductStatus;\n threats?: CsafThreat[];\n remediations?: CsafRemediation[];\n flags?: CsafFlag[];\n references?: CsafReference[];\n}\n\ninterface CsafProductIdentificationHelper {\n purl?: string;\n cpe?: string;\n}\n\ninterface CsafFullProductName {\n name?: string;\n product_id?: string;\n product_identification_helper?: CsafProductIdentificationHelper;\n}\n\ninterface CsafBranch {\n category?: string;\n name?: string;\n product?: CsafFullProductName;\n branches?: CsafBranch[];\n}\n\ninterface CsafProductTree {\n branches?: CsafBranch[];\n full_product_names?: CsafFullProductName[];\n}\n\ninterface CsafDocument {\n document?: CsafDocumentMeta;\n product_tree?: CsafProductTree;\n vulnerabilities?: CsafVulnerability[];\n}\n\nexport async function convertCsafVexToHdf(\n input: string,\n converterVersion: string,\n): Promise<HDFAmendments> {\n validateInputSize(input, 'csaf-vex-to-hdf');\n const doc = parseJSON<CsafDocument>(input);\n // CSAF schema requires document + document.category + document.tracking +\n // document.publisher. After this check passes we treat them as present\n // — defensive optional-chaining everywhere bloats the branch surface\n // without buying real safety against a malformed input we've already\n // rejected.\n if (doc.document?.category !== 'csaf_vex') {\n throw new Error(\n `csaf-vex-to-hdf: document.category is ${JSON.stringify(doc.document?.category)}; only 'csaf_vex' is supported`,\n );\n }\n const dm = doc.document;\n const tracking = dm.tracking ?? {};\n const publisher = dm.publisher ?? {};\n\n const docTime =\n (tracking.current_release_date ? parseTimestamp(tracking.current_release_date) : null) ??\n new Date();\n\n const productLookup = buildProductLookup(doc.product_tree);\n\n const overrides: StandaloneOverride[] = [];\n for (const v of doc.vulnerabilities ?? []) {\n overrides.push(...vulnerabilityToOverrides(v, publisher, tracking, docTime, productLookup));\n }\n\n if (overrides.length === 0) {\n throw new Error(\n 'csaf-vex-to-hdf: CSAF VEX document contains no actionable statements (only affected/under_investigation/recommended); no amendment to write',\n );\n }\n\n const publisherName = publisher.name ?? '';\n return {\n name: publisherName ? `CSAF VEX statements from ${publisherName}` : 'CSAF VEX statements',\n description: `Imported VEX advisory ${tracking.id ?? ''}`,\n overrides,\n appliedBy: identityFor(publisher),\n generator: { name: 'csaf-vex-to-hdf', version: converterVersion },\n integrity: await inputIntegrity(input),\n version: tracking.version,\n } as HDFAmendments;\n}\n\nfunction vulnerabilityToOverrides(\n vuln: CsafVulnerability,\n publisher: CsafPublisher,\n tracking: CsafTracking,\n docTime: Date,\n productLookup: Map<string, AffectedPackage>,\n): StandaloneOverride[] {\n if (!vuln.cve) return [];\n const ps = vuln.product_status;\n if (!ps) return [];\n\n const out: StandaloneOverride[] = [];\n if (ps.known_not_affected?.length) {\n const o = buildOverride(vuln, publisher, tracking, docTime, VexStatus.NotAffected, ps.known_not_affected, productLookup);\n if (o) out.push(o);\n }\n const fixedProducts = [...(ps.fixed ?? []), ...(ps.first_fixed ?? [])];\n if (fixedProducts.length > 0) {\n const o = buildOverride(vuln, publisher, tracking, docTime, VexStatus.Fixed, fixedProducts, productLookup);\n if (o) out.push(o);\n }\n // known_affected / first_affected / last_affected / under_investigation /\n // recommended produce no override (informational only).\n return out;\n}\n\nfunction buildOverride(\n vuln: CsafVulnerability,\n publisher: CsafPublisher,\n tracking: CsafTracking,\n docTime: Date,\n canonical: VexStatus,\n products: string[],\n productLookup: Map<string, AffectedPackage>,\n): StandaloneOverride | undefined {\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const expiresAt = new Date(docTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId: vuln.cve!,\n appliedAt: docTime,\n expiresAt,\n appliedBy: identityFor(publisher),\n reason: buildReason(vuln, products),\n } as StandaloneOverride;\n\n const affectedPackages = resolveAffectedPackages(products, productLookup);\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) override.status = target.status;\n\n if (target.setJustification) {\n const j = pickJustification(vuln, products);\n if (j) override.justification = j;\n }\n\n const evidence: Evidence[] = [];\n const advisoryEv = supplierEvidence(advisoryURI(publisher, tracking), 'CSAF VEX advisory');\n if (advisoryEv) evidence.push(advisoryEv as Evidence);\n for (const r of vuln.references ?? []) {\n if (!r.url) continue;\n const ev = supplierEvidence(r.url, r.summary ?? r.category ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n if (evidence.length > 0) override.evidence = evidence;\n\n if (target.overrideType === OverrideType.Poam) {\n const action = firstActionRemediation(vuln, products) || target.poamActionTemplate;\n const milestone: Milestone = {\n description: action,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction pickJustification(\n vuln: CsafVulnerability,\n products: string[],\n): Justification | undefined {\n const scope = new Set(products);\n for (const f of vuln.flags ?? []) {\n const ids = f.product_ids ?? [];\n if (!overlap(ids, scope)) continue;\n if (!f.label) continue;\n const j = normalizeJustification(f.label);\n if (j) return j;\n }\n return undefined;\n}\n\nfunction firstActionRemediation(vuln: CsafVulnerability, products: string[]): string {\n const scope = new Set(products);\n for (const r of vuln.remediations ?? []) {\n const ids = r.product_ids;\n if (ids && ids.length > 0 && !overlap(ids, scope)) continue;\n if (\n (r.category === 'vendor_fix' || r.category === 'mitigation' || r.category === 'workaround') &&\n r.details\n ) {\n return r.details;\n }\n }\n return '';\n}\n\n// buildReason composes the override reason from CSAF prose (description\n// note + product-scoped threat details). Justification and product list\n// are fully structured fields now (Justification enum +\n// Standalone_Override.affectedPackages); neither is mirrored into reason.\n// Falls back to a status synopsis when CSAF carries no prose, so the\n// schema's required `reason` string is never empty.\nfunction buildReason(vuln: CsafVulnerability, products: string[]): string {\n const parts: string[] = [];\n const scope = new Set(products);\n for (const n of vuln.notes ?? []) {\n if (n.category === 'description' && n.text) parts.push(n.text);\n }\n for (const t of vuln.threats ?? []) {\n if (!t.details) continue;\n const ids = t.product_ids;\n if (ids && ids.length > 0 && !overlap(ids, scope)) continue;\n parts.push(t.details);\n }\n if (parts.length === 0) {\n return `Imported from CSAF VEX (${vuln.cve ?? 'unknown CVE'})`;\n }\n return parts.join('\\n');\n}\n\n/**\n * Walk a CSAF product_tree and build a lookup from product_id to a\n * structured AffectedPackage. Prefers product_identification_helper.purl,\n * then .cpe, then the full_product_name's `name` (used for matching only\n * — name+version is hard to derive from CSAF reliably, so we drop entries\n * with no purl and no cpe).\n */\nexport function buildProductLookup(\n tree: CsafProductTree | undefined,\n): Map<string, AffectedPackage> {\n const lookup = new Map<string, AffectedPackage>();\n if (!tree) return lookup;\n if (tree.full_product_names) {\n for (const fp of tree.full_product_names) {\n registerProduct(fp, lookup);\n }\n }\n if (tree.branches) {\n walkBranches(tree.branches, lookup);\n }\n return lookup;\n}\n\ninterface BranchContext {\n productName?: string;\n version?: string;\n}\n\nfunction walkBranches(\n branches: CsafBranch[],\n lookup: Map<string, AffectedPackage>,\n ctx: BranchContext = {},\n): void {\n for (const b of branches) {\n // Track product_name and product_version branches so leaf products can\n // recover name+version even when no product_identification_helper is set.\n const next: BranchContext = { ...ctx };\n /* c8 ignore next 2 — falsy branches require a malformed CSAF branch\n node (category set but name empty) which we don't fixture. */\n if (b.category === 'product_name' && b.name) next.productName = b.name;\n if (b.category === 'product_version' && b.name) next.version = b.name;\n if (b.product) registerProduct(b.product, lookup, next);\n if (b.branches) walkBranches(b.branches, lookup, next);\n }\n}\n\nfunction registerProduct(\n fp: CsafFullProductName,\n lookup: Map<string, AffectedPackage>,\n ctx: BranchContext = {},\n): void {\n /* c8 ignore next — defensive against a malformed CSAF full_product_name\n missing its required product_id field; not fixtured. */\n if (!fp.product_id) return;\n const helper = fp.product_identification_helper;\n if (helper?.purl) {\n const pkg = affectedPackageFromIdentifier(helper.purl);\n /* c8 ignore next 4 — affectedPackageFromIdentifier always returns a\n non-null value for an input that starts with 'pkg:' (preserves\n malformed input as purl-only). The null branch is unreachable from\n this callsite. */\n if (pkg) {\n lookup.set(fp.product_id, pkg);\n return;\n }\n }\n if (helper?.cpe) {\n const pkg = affectedPackageFromIdentifier(helper.cpe);\n /* c8 ignore next 4 — same as above; identifiers starting with\n 'cpe:2.3:' always produce a cpe-only AffectedPackage. */\n if (pkg) {\n lookup.set(fp.product_id, pkg);\n return;\n }\n }\n // No portable identifier — fall back to ancestor product_name +\n // product_version branches if both are present. Ecosystem stays generic\n // since CSAF doesn't disambiguate package managers; the structured triple\n // is still useful for downstream matching.\n if (ctx.productName && ctx.version) {\n lookup.set(fp.product_id, {\n name: ctx.productName,\n version: ctx.version,\n ecosystem: Ecosystem.Generic,\n });\n }\n // Otherwise drop the entry — schema requires name+version+ecosystem OR\n // purl OR cpe; fabricating identity is the anti-pattern Step 1b forbids.\n}\n\nfunction resolveAffectedPackages(\n productIds: string[],\n lookup: Map<string, AffectedPackage>,\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seenKeys = new Set<string>();\n for (const id of productIds) {\n const pkg = lookup.get(id);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n out.push(pkg);\n }\n return out;\n}\n\nfunction identityFor(p: CsafPublisher): Identity {\n if (!p.name) {\n return { type: IdentityType.System, identifier: 'csaf-vex-import' } as Identity;\n }\n const id: Identity = { type: IdentityType.Simple, identifier: p.name } as Identity;\n if (p.category) id.description = p.category;\n return id;\n}\n\nfunction advisoryURI(publisher: CsafPublisher, tracking: CsafTracking): string {\n // tracking.id is required by the CSAF schema; we've already validated\n // document.category so the read is safe. `?? ''` is a paranoid guard\n // against a malformed file that already failed the category check above.\n /* c8 ignore next */\n const id = tracking.id ?? '';\n const ns = publisher.namespace;\n if (ns && id) return `${ns.replace(/\\/+$/, '')}/${id}`;\n return id;\n}\n\n// overlap is only called with non-empty product scopes (we construct the\n// scope from a status bucket that we already checked is non-empty), so\n// the empty-set guard is not needed.\nfunction overlap(ids: string[], scope: Set<string>): boolean {\n return ids.some((id) => scope.has(id));\n}\n","/**\n * CycloneDX VEX to HDF Amendments converter.\n *\n * CycloneDX VEX is not a separate format — it's a CycloneDX BOM whose\n * vulnerabilities[] carry an `analysis` object. CycloneDX-specific\n * justifications without an HDF equivalent (requires_configuration,\n * protected_by_compiler, etc.) are preserved verbatim in the reason\n * field via the shared helper's unknown-value passthrough.\n *\n * Spec: https://cyclonedx.org/use-cases/#vulnerability-exploitability\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n Ecosystem,\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageFromIdentifier,\n importTargetFor,\n normalizeJustification,\n normalizeStatus,\n supplierEvidence,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface Source {\n name?: string;\n url?: string;\n}\n\ninterface Author {\n name?: string;\n email?: string;\n}\n\ninterface Tool {\n vendor?: string;\n name?: string;\n version?: string;\n}\n\ninterface Component {\n name?: string;\n version?: string;\n type?: string;\n 'bom-ref'?: string;\n purl?: string;\n}\n\ninterface Reference {\n id?: string;\n source?: Source;\n}\n\ninterface Analysis {\n state?: string;\n justification?: string;\n response?: string[];\n detail?: string;\n}\n\ninterface AffectedRef {\n ref?: string;\n}\n\ninterface Vulnerability {\n id?: string;\n source?: Source;\n references?: Reference[];\n description?: string;\n detail?: string;\n analysis?: Analysis;\n affects?: AffectedRef[];\n}\n\ninterface Metadata {\n timestamp?: string;\n component?: Component;\n authors?: Author[];\n tools?: Tool[];\n}\n\ninterface BOM {\n bomFormat?: string;\n specVersion?: string;\n serialNumber?: string;\n metadata?: Metadata;\n vulnerabilities?: Vulnerability[];\n components?: Component[];\n}\n\nexport async function convertCyclonedxVexToHdf(\n input: string,\n converterVersion: string,\n): Promise<HDFAmendments> {\n validateInputSize(input, 'cyclonedx-vex-to-hdf');\n const bom = parseJSON<BOM>(input);\n if (bom.bomFormat !== 'CycloneDX') {\n throw new Error(\n `cyclonedx-vex-to-hdf: bomFormat is ${JSON.stringify(bom.bomFormat)}; only 'CycloneDX' is supported`,\n );\n }\n\n const docTime =\n (bom.metadata?.timestamp ? parseTimestamp(bom.metadata.timestamp) : null) ?? new Date();\n const productLookup = buildProductLookup(bom);\n const publisher = publisherIdentityOrDefault(bom);\n\n const overrides: StandaloneOverride[] = [];\n for (const v of bom.vulnerabilities ?? []) {\n const o = vulnerabilityToOverride(v, productLookup, docTime, publisher);\n if (o) overrides.push(o);\n }\n\n if (overrides.length === 0) {\n throw new Error(\n 'cyclonedx-vex-to-hdf: BOM contains no actionable VEX statements (only exploitable/in_triage or no analysis); no amendment to write',\n );\n }\n\n const publisherName = publisher.identifier;\n const name =\n publisherName && publisherName !== 'cyclonedx-vex-import'\n ? `CycloneDX VEX statements from ${publisherName}`\n : 'CycloneDX VEX statements';\n const description = bom.serialNumber\n ? `Imported CycloneDX VEX ${bom.serialNumber}`\n : 'Imported CycloneDX VEX';\n\n return {\n name,\n description,\n overrides,\n appliedBy: publisher,\n generator: { name: 'cyclonedx-vex-to-hdf', version: converterVersion },\n integrity: await inputIntegrity(input),\n } as HDFAmendments;\n}\n\nfunction vulnerabilityToOverride(\n v: Vulnerability,\n productLookup: Map<string, Component>,\n docTime: Date,\n publisher: Identity,\n): StandaloneOverride | undefined {\n if (!v.id || !v.analysis?.state) return undefined;\n const canonical = normalizeStatus(v.analysis.state);\n if (!canonical) return undefined;\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const affectedPackages = affectedPackagesForVuln(v, productLookup);\n const expiresAt = new Date(docTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n\n // componentRef is UUID-constrained on the HDF schema (it identifies an\n // HDF component by id, not a foreign-format identifier). Multi-product\n // VEX scoping lands in affectedPackages[] (structured) rather than in\n // the reason free-text field.\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId: v.id,\n appliedAt: docTime,\n expiresAt,\n appliedBy: publisher,\n reason: buildReason(v),\n } as StandaloneOverride;\n\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) override.status = target.status;\n\n if (target.setJustification && v.analysis.justification) {\n const j = normalizeJustification(v.analysis.justification);\n if (j) override.justification = j;\n }\n\n const evidence: Evidence[] = [];\n if (v.source?.url) {\n const ev = supplierEvidence(v.source.url, v.source.name ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n for (const r of v.references ?? []) {\n if (!r.source?.url) continue;\n const ev = supplierEvidence(r.source.url, r.source.name ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n if (evidence.length > 0) override.evidence = evidence;\n\n if (target.overrideType === OverrideType.Poam) {\n const action = firstActionFromResponse(v.analysis.response ?? []) || target.poamActionTemplate;\n const milestone: Milestone = {\n description: action,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction buildReason(v: Vulnerability): string {\n const parts: string[] = [];\n if (v.description) parts.push(v.description);\n if (v.analysis?.detail) parts.push(v.analysis.detail);\n // Justification and product list are fully structured fields now\n // (Justification enum + Standalone_Override.affectedPackages); neither\n // is mirrored into reason. Response[] hints are not echoed either —\n // POA&M overrides carry remediation context via milestones.\n return parts.join('\\n');\n}\n\n/**\n * Resolve CycloneDX affects[].ref entries to structured AffectedPackage\n * entries. Looks up the bom-ref in the component table to recover purl,\n * name/version. Opaque bom-refs with no component-table match are dropped\n * (the schema forbids fabricating name+version, and bom-refs aren't\n * portable identifiers outside their source BOM).\n */\nexport function affectedPackagesForVuln(\n v: Vulnerability,\n lookup: Map<string, Component>,\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seenKeys = new Set<string>();\n for (const a of v.affects ?? []) {\n if (!a.ref) continue;\n const comp = lookup.get(a.ref);\n const pkg = comp ? affectedPackageFromComponent(comp) : affectedPackageFromIdentifier(a.ref);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n out.push(pkg);\n }\n return out;\n}\n\n/**\n * Build an AffectedPackage from a CycloneDX Component. Prefers structured\n * purl decomposition via the shared helper (so name/version/ecosystem are\n * also populated when the purl is parseable); falls back to the component's\n * name+version when no purl is set. Returns undefined when the component\n * carries neither a purl nor a name+version pair (schema requires at least\n * name+version+ecosystem, purl, or cpe).\n */\nexport function affectedPackageFromComponent(c: Component): AffectedPackage | undefined {\n if (c.purl) return affectedPackageFromIdentifier(c.purl);\n if (c.name && c.version) {\n return {\n name: c.name,\n version: c.version,\n ecosystem: Ecosystem.Generic,\n };\n }\n return undefined;\n}\n\nfunction buildProductLookup(bom: BOM): Map<string, Component> {\n const lookup = new Map<string, Component>();\n const root = bom.metadata?.component;\n if (root?.['bom-ref']) lookup.set(root['bom-ref'], root);\n for (const c of bom.components ?? []) {\n if (c['bom-ref']) lookup.set(c['bom-ref'], c);\n }\n return lookup;\n}\n\nexport function firstActionFromResponse(resp: string[]): string {\n for (const r of resp) {\n switch (r.trim().toLowerCase()) {\n case 'update':\n return 'Apply vendor update and re-scan to verify.';\n case 'rollback':\n return 'Roll back to the unaffected version and re-scan to verify.';\n case 'workaround_available':\n return 'Apply the documented workaround.';\n }\n }\n return '';\n}\n\nfunction publisherIdentityOrDefault(bom: BOM): Identity {\n for (const a of bom.metadata?.authors ?? []) {\n if (a.email) return { type: IdentityType.Email, identifier: a.email } as Identity;\n if (a.name) return { type: IdentityType.Simple, identifier: a.name } as Identity;\n }\n for (const t of bom.metadata?.tools ?? []) {\n const ident = [t.vendor, t.name].filter(Boolean).join(' ').trim();\n if (ident) return { type: IdentityType.System, identifier: ident } as Identity;\n }\n return { type: IdentityType.System, identifier: 'cyclonedx-vex-import' } as Identity;\n}\n","/**\n * HDF Amendments to CSAF VEX (csaf_vex profile) converter.\n *\n * Reverse direction of csaf-vex-to-hdf. Intentionally partial-fidelity:\n * fields the shared VEX mapping considers consumer-action-bearing survive\n * round-trip; the rest collapse into the available CSAF fields.\n */\n\nimport {\n Justification,\n MilestoneStatus,\n OverrideType,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { parseJSON, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n exportStatusFor,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface CSAFVexDocument {\n document: {\n category: 'csaf_vex';\n csaf_version: '2.0';\n title?: string;\n notes?: { category: string; text: string; title?: string }[];\n publisher: { category: string; name: string; namespace?: string };\n tracking: {\n id: string;\n status: 'final';\n version: string;\n current_release_date: string;\n initial_release_date: string;\n revision_history: { date: string; number: string; summary: string }[];\n generator?: { engine: { name: string; version: string }; date: string };\n };\n };\n product_tree: { full_product_names: { name: string; product_id: string }[] };\n vulnerabilities: Vulnerability[];\n}\n\ninterface Vulnerability {\n cve: string;\n notes?: { category: string; text: string }[];\n product_status?: {\n fixed?: string[];\n known_affected?: string[];\n known_not_affected?: string[];\n };\n flags?: { label: string; date?: string; product_ids: string[] }[];\n threats?: { category: string; details: string; product_ids?: string[] }[];\n remediations?: { category: string; details: string; product_ids?: string[] }[];\n references?: { category?: string; summary?: string; url: string }[];\n}\n\nexport function convertHdfToCsafVex(input: string, converterVersion: string): string {\n validateInputSize(input, 'hdf-to-csaf-vex');\n const amendments = parseJSON<HDFAmendments>(input);\n const groups = groupByCVE(amendments.overrides ?? []);\n const productSet = new Map<string, true>();\n const vulnerabilities: Vulnerability[] = [];\n\n for (const group of groups) {\n const v = buildVulnerability(group);\n if (!v) continue;\n vulnerabilities.push(v);\n for (const p of productIDsForGroup(group)) productSet.set(p, true);\n }\n\n if (vulnerabilities.length === 0) {\n throw new Error(\n 'hdf-to-csaf-vex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n const products = [...productSet.keys()].sort();\n const doc = buildDocument(amendments, converterVersion);\n doc.vulnerabilities = vulnerabilities;\n doc.product_tree.full_product_names =\n products.length > 0\n ? products.map((p) => ({ name: p, product_id: p }))\n : [{ name: DEFAULT_PRODUCT_ID, product_id: DEFAULT_PRODUCT_ID }];\n\n return JSON.stringify(doc, null, 2);\n}\n\ninterface CveGroup {\n cve: string;\n overrides: StandaloneOverride[];\n}\n\nfunction groupByCVE(overrides: StandaloneOverride[]): CveGroup[] {\n const groups = new Map<string, CveGroup>();\n for (const o of overrides) {\n if (!CVE_ID_PATTERN.test(o.requirementId)) continue;\n let g = groups.get(o.requirementId);\n if (!g) {\n g = { cve: o.requirementId, overrides: [] };\n groups.set(o.requirementId, g);\n }\n g.overrides.push(o);\n }\n return [...groups.values()].sort((a, b) => a.cve.localeCompare(b.cve));\n}\n\nfunction productIDsForGroup(group: CveGroup): string[] {\n const seen = new Set<string>();\n for (const o of group.overrides) {\n for (const p of productIDsFor(o)) seen.add(p);\n }\n return [...seen].sort();\n}\n\nexport function productIDsFor(o: StandaloneOverride): string[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids;\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs.\n if (o.componentRef) return [o.componentRef];\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n const parts = m[1]\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length > 0) return parts;\n }\n return [DEFAULT_PRODUCT_ID];\n}\n\nexport function stripProductsLine(reason: string): string {\n return reason.replace(PRODUCTS_LINE, '').replace(/\\n+$/, '');\n}\n\nfunction allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nfunction buildVulnerability(group: CveGroup): Vulnerability | undefined {\n const v: Vulnerability = { cve: group.cve };\n const status: NonNullable<Vulnerability['product_status']> = {};\n let emitted = false;\n\n for (const o of group.overrides) {\n const pids = productIDsFor(o);\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) continue;\n\n // exportStatusFor returns Fixed only when closureChained is true,\n // which a one-shot export doesn't know. Promote poam-with-all-complete\n // to Fixed here so the obvious case round-trips.\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n if (canonical === VexStatus.NotAffected) {\n status.known_not_affected = (status.known_not_affected ?? []).concat(pids);\n if (o.justification) {\n v.flags = v.flags ?? [];\n v.flags.push({\n label: String(o.justification as Justification),\n product_ids: pids,\n date: formatTimestampSeconds(new Date(o.appliedAt)),\n });\n }\n emitted = true;\n } else if (canonical === VexStatus.Fixed) {\n status.fixed = (status.fixed ?? []).concat(pids);\n for (const m of o.milestones ?? []) {\n if (!m.description) continue;\n v.remediations = v.remediations ?? [];\n v.remediations.push({ category: 'vendor_fix', details: m.description, product_ids: pids });\n }\n emitted = true;\n } else if (canonical === VexStatus.Affected) {\n status.known_affected = (status.known_affected ?? []).concat(pids);\n if (o.reason) {\n v.threats = v.threats ?? [];\n v.threats.push({\n category: 'impact',\n details: stripProductsLine(o.reason),\n product_ids: pids,\n });\n }\n if (o.type === OverrideType.Poam) {\n for (const m of o.milestones ?? []) {\n if (!m.description) continue;\n v.remediations = v.remediations ?? [];\n v.remediations.push({\n category: 'workaround',\n details: m.description,\n product_ids: pids,\n });\n }\n }\n emitted = true;\n }\n\n for (const e of o.evidence ?? []) {\n if (e.type !== 'url' || !e.data) continue;\n v.references = v.references ?? [];\n v.references.push({ category: 'external', summary: e.description ?? '', url: e.data });\n }\n }\n\n // emitted is false only if every override in the group returned an\n // unmappable canonical status — defensive guard, not reachable from the\n // current shared mapping (which handles every override type).\n /* c8 ignore next */\n if (!emitted) return undefined;\n\n if (status.fixed) status.fixed = [...new Set(status.fixed)];\n if (status.known_affected) status.known_affected = [...new Set(status.known_affected)];\n if (status.known_not_affected) status.known_not_affected = [...new Set(status.known_not_affected)];\n v.product_status = status;\n\n if (v.references) {\n const seen = new Set<string>();\n v.references = v.references.filter((r) => {\n if (seen.has(r.url)) return false;\n seen.add(r.url);\n return true;\n });\n }\n\n return v;\n}\n\nfunction buildDocument(\n amendments: HDFAmendments,\n converterVersion: string,\n): CSAFVexDocument {\n const now = formatTimestampSeconds(new Date());\n const publisherName = amendments.appliedBy?.identifier || 'HDF Amendments Export';\n const trackingId = amendments.amendmentId || 'HDF-VEX-EXPORT';\n const docVersion = amendments.version || '1';\n const title = amendments.name || 'HDF Amendments exported as CSAF VEX';\n const notes: { category: string; text: string; title?: string }[] = [];\n if (amendments.description) {\n notes.push({ category: 'summary', text: amendments.description, title: 'Description' });\n }\n return {\n document: {\n category: 'csaf_vex',\n csaf_version: '2.0',\n title,\n notes,\n publisher: { category: 'other', name: publisherName },\n tracking: {\n id: trackingId,\n status: 'final',\n version: docVersion,\n current_release_date: now,\n initial_release_date: now,\n revision_history: [\n { date: now, number: docVersion, summary: 'Generated by hdf-to-csaf-vex from HDF Amendments.' },\n ],\n generator: { engine: { name: 'hdf-to-csaf-vex', version: converterVersion }, date: now },\n },\n },\n product_tree: { full_product_names: [] },\n vulnerabilities: [],\n };\n}\n","/**\n * HDF Amendments to OpenVEX converter.\n *\n * Reverse direction of openvex-to-hdf. Step 4f amendment-output pattern,\n * partial-fidelity by design — consumer-action-bearing fields (CVE id,\n * status, justification) survive round-trip; the rest collapse.\n */\n\nimport { parseJSON, sha256, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport {\n MilestoneStatus,\n OverrideType,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n exportStatusFor,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst OPENVEX_CONTEXT = 'https://openvex.dev/ns/v0.2.0';\nconst OPENVEX_NAMESPACE = 'https://openvex.dev/docs/public/';\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface Document {\n '@context': string;\n '@id': string;\n author: string;\n role?: string;\n timestamp: string;\n version: number;\n statements: Statement[];\n}\n\ninterface Statement {\n vulnerability: { '@id'?: string; name: string };\n products?: { '@id': string }[];\n status: string;\n justification?: string;\n impact_statement?: string;\n action_statement?: string;\n timestamp?: string;\n}\n\nexport async function convertHdfToOpenVex(\n input: string,\n converterVersion: string,\n): Promise<string> {\n validateInputSize(input, 'hdf-to-openvex');\n const amendments = parseJSON<HDFAmendments>(input);\n\n const statements: Statement[] = [];\n let earliest: Date | undefined;\n for (const o of amendments.overrides ?? []) {\n const s = overrideToStatement(o);\n if (!s) continue;\n statements.push(s);\n const t = new Date(o.appliedAt);\n if (!earliest || t < earliest) earliest = t;\n }\n\n if (statements.length === 0) {\n throw new Error(\n 'hdf-to-openvex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n statements.sort((a, b) => a.vulnerability.name.localeCompare(b.vulnerability.name));\n\n const author = amendments.appliedBy?.identifier || 'HDF Amendments Export';\n const role = amendments.appliedBy?.description;\n\n const doc: Document = {\n '@context': OPENVEX_CONTEXT,\n '@id': await buildDocumentID(input, amendments),\n author,\n role,\n timestamp: formatTimestampSeconds(earliest ?? new Date()),\n version: 1,\n statements,\n };\n\n void converterVersion; // OpenVEX has no generator field; version is unused here\n return JSON.stringify(doc, null, 2);\n}\n\nfunction overrideToStatement(o: StandaloneOverride): Statement | undefined {\n if (!CVE_ID_PATTERN.test(o.requirementId)) return undefined;\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) return undefined;\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n const stmt: Statement = {\n vulnerability: {\n name: o.requirementId,\n '@id': `https://nvd.nist.gov/vuln/detail/${o.requirementId}`,\n },\n status: String(canonical),\n timestamp: formatTimestampSeconds(new Date(o.appliedAt)),\n products: productsFor(o),\n };\n\n if (canonical === VexStatus.NotAffected) {\n if (o.justification) stmt.justification = String(o.justification);\n const impact = stripProductsLine(o.reason ?? '');\n if (impact) stmt.impact_statement = impact;\n } else if (canonical === VexStatus.Fixed) {\n stmt.action_statement =\n firstMilestoneAction(o) || 'Fix applied; consumer re-scan confirmed clean.';\n } else if (canonical === VexStatus.Affected) {\n stmt.action_statement = firstMilestoneAction(o) || stripProductsLine(o.reason ?? '');\n }\n\n return stmt;\n}\n\nexport function productsFor(o: StandaloneOverride): { '@id': string }[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids.map((id) => ({ '@id': id }));\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs:\n // 1. componentRef (HDF-internal UUID — emit verbatim)\n // 2. legacy 'Products:' reason-line annotation\n let ids: string[] = [];\n if (o.componentRef) {\n ids = [o.componentRef];\n } else {\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n ids = m[1].split(',').map((s) => s.trim()).filter(Boolean);\n }\n }\n if (ids.length === 0) ids = [DEFAULT_PRODUCT_ID];\n return ids.map((id) => ({ '@id': id }));\n}\n\nfunction firstMilestoneAction(o: StandaloneOverride): string {\n for (const m of o.milestones ?? []) {\n if (m.description) return m.description;\n }\n return '';\n}\n\nfunction allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nexport function stripProductsLine(reason: string): string {\n return reason.replace(PRODUCTS_LINE, '').replace(/\\n+$/, '');\n}\n\nasync function buildDocumentID(input: string, a: HDFAmendments): Promise<string> {\n if (a.amendmentId) return `${OPENVEX_NAMESPACE}vex-${a.amendmentId}`;\n const digest = await sha256(input);\n return `${OPENVEX_NAMESPACE}vex-${digest}`;\n}\n","/**\n * HDF Amendments to CycloneDX VEX converter (export side).\n *\n * Reverse direction of cyclonedx-vex-to-hdf. Step 4f amendment-output\n * pattern, partial-fidelity by design — consumer-action-bearing fields\n * (CVE id, status, justification) survive round-trip; the rest collapse\n * into the available CycloneDX VEX fields.\n */\n\nimport {\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { parseJSON, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n exportStatusFor,\n justificationForCycloneDX,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst RAW_JUST_LINE = /^VEX justification:\\s*(.+)$/m;\nconst RESPONSE_LINE = /^Response:.*$/gm;\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface Component {\n type: string;\n name: string;\n 'bom-ref': string;\n version?: string;\n purl?: string;\n cpe?: string;\n}\n\ninterface BOM {\n bomFormat: 'CycloneDX';\n specVersion: '1.4';\n serialNumber: string;\n version: number;\n metadata: {\n timestamp: string;\n tools?: { vendor?: string; name?: string; version?: string }[];\n authors?: { name?: string; email?: string }[];\n };\n components?: Component[];\n vulnerabilities: Vulnerability[];\n}\n\ninterface Vulnerability {\n id: string;\n source?: { name?: string; url: string };\n references?: { id: string; source: { name?: string; url: string } }[];\n analysis: {\n state: string;\n justification?: string;\n response?: string[];\n detail?: string;\n };\n affects: { ref: string }[];\n}\n\nexport function convertHdfToCyclonedxVex(input: string, converterVersion: string): string {\n validateInputSize(input, 'hdf-to-cyclonedx-vex');\n const amendments = parseJSON<HDFAmendments>(input);\n\n const componentRegistry = new Map<string, Component>();\n const vulnerabilities: Vulnerability[] = [];\n let earliest: Date | undefined;\n\n for (const o of amendments.overrides ?? []) {\n if (!CVE_ID_PATTERN.test(o.requirementId)) continue;\n const v = overrideToVulnerability(o, componentRegistry);\n if (!v) continue;\n vulnerabilities.push(v);\n const t = new Date(o.appliedAt);\n if (!earliest || t < earliest) earliest = t;\n }\n\n if (vulnerabilities.length === 0) {\n throw new Error(\n 'hdf-to-cyclonedx-vex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n vulnerabilities.sort((a, b) => a.id.localeCompare(b.id));\n const components = [...componentRegistry.values()].sort((a, b) =>\n a['bom-ref'].localeCompare(b['bom-ref']),\n );\n\n const bom: BOM = {\n bomFormat: 'CycloneDX',\n specVersion: '1.4',\n serialNumber: buildSerialNumberSync(input, amendments),\n version: 1,\n metadata: buildMetadata(amendments, earliest ?? new Date(), converterVersion),\n components,\n vulnerabilities,\n };\n\n return JSON.stringify(bom, null, 2);\n}\n\nfunction overrideToVulnerability(\n o: StandaloneOverride,\n componentRegistry: Map<string, Component>,\n): Vulnerability | undefined {\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) return undefined;\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n // Pair each emitted product id back to the AffectedPackage it came from\n // so we can preserve name/version/purl/cpe in the CycloneDX component.\n // Falls back to a pid-only component for legacy paths (componentRef or\n // 'Products:' reason annotation) where no structured entry exists.\n const pids = productIDsFor(o);\n const pkgById = new Map<string, AffectedPackage>();\n for (const p of o.affectedPackages ?? []) {\n const id = affectedPackageToIdentifier(p);\n if (id) pkgById.set(id, p);\n }\n for (const pid of pids) {\n componentRegistry.set(pid, componentFor(pid, pkgById.get(pid)));\n }\n\n const analysis: Vulnerability['analysis'] = { state: canonicalToCycloneDXState(canonical) };\n // HDF Justification uses long-form names from OpenVEX/CSAF; CycloneDX\n // uses short-form names for the same concepts. Translate via the\n // shared helper.\n if (o.justification) {\n const cdxJust = justificationForCycloneDX(o.justification);\n if (cdxJust) analysis.justification = cdxJust;\n }\n const detail = stripReasonAnnotations(o.reason ?? '');\n if (detail) analysis.detail = detail;\n if (canonical === VexStatus.Fixed) {\n analysis.response = ['update'];\n } else if (canonical === VexStatus.Affected && o.type === OverrideType.Poam) {\n analysis.response = ['workaround_available'];\n }\n\n const v: Vulnerability = {\n id: o.requirementId,\n source: { name: 'NVD', url: `https://nvd.nist.gov/vuln/detail/${o.requirementId}` },\n analysis,\n affects: pids.map((p) => ({ ref: p })),\n };\n\n for (const e of o.evidence ?? []) {\n if (e.type !== 'url' || !e.data) continue;\n v.references = v.references ?? [];\n v.references.push({\n id: o.requirementId,\n source: { name: e.description ?? '', url: e.data },\n });\n }\n\n return v;\n}\n\nfunction canonicalToCycloneDXState(canonical: VexStatus): string {\n switch (canonical) {\n case VexStatus.NotAffected:\n return 'not_affected';\n case VexStatus.Fixed:\n return 'resolved';\n case VexStatus.Affected:\n return 'exploitable';\n /* c8 ignore next 2 — defensive: every VexStatus has a case above */\n default:\n return canonical;\n }\n}\n\nfunction componentFor(pid: string, pkg?: AffectedPackage): Component {\n const c: Component = {\n type: 'application',\n name: pkg?.name ?? pid,\n 'bom-ref': pid,\n };\n if (pkg?.version) c.version = pkg.version;\n if (pkg?.purl ?? (pid.startsWith('pkg:') ? pid : undefined)) {\n c.purl = pkg?.purl ?? pid;\n }\n if (pkg?.cpe ?? (pid.startsWith('cpe:2.3:') ? pid : undefined)) {\n c.cpe = pkg?.cpe ?? pid;\n }\n return c;\n}\n\nexport function productIDsFor(o: StandaloneOverride): string[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids;\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs.\n if (o.componentRef) return [o.componentRef];\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n const parts = m[1].split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length > 0) return parts;\n }\n return [DEFAULT_PRODUCT_ID];\n}\n\n// stripReasonAnnotations removes the 'Products: …' tail line that\n// import-side converters append, so analysis.detail carries only the\n// prose. (The 'VEX justification:' and 'Response:' annotations were\n// removed when the Justification enum was extended to cover the full\n// CycloneDX vocabulary; this stripper also handles any legacy reason\n// strings that still carry them.)\nexport function stripReasonAnnotations(reason: string): string {\n return reason\n .replace(PRODUCTS_LINE, '')\n .replace(RAW_JUST_LINE, '')\n .replace(RESPONSE_LINE, '')\n .trim();\n}\n\nexport function allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nfunction buildMetadata(\n a: HDFAmendments,\n docTime: Date,\n converterVersion: string,\n): BOM['metadata'] {\n const metadata: BOM['metadata'] = {\n timestamp: formatTimestampSeconds(docTime),\n tools: [{ vendor: 'mitre', name: 'hdf-to-cyclonedx-vex', version: converterVersion }],\n };\n if (a.appliedBy?.identifier) {\n const author: { name?: string; email?: string } = {};\n if (a.appliedBy.type === IdentityType.Email) {\n author.email = a.appliedBy.identifier;\n } else {\n author.name = a.appliedBy.identifier;\n }\n metadata.authors = [author];\n }\n return metadata;\n}\n\n// sha256() is async but we want JSON.stringify to be synchronous; pre-hash\n// the input bytes once at the top of convertHdfToCyclonedxVex via a tiny\n// non-cryptographic FNV digest. The CycloneDX serialNumber is opaque to\n// consumers — it only needs to be stable per input.\nfunction buildSerialNumberSync(input: string, a: HDFAmendments): string {\n if (a.amendmentId) return `urn:uuid:${a.amendmentId}`;\n return `urn:uuid:${fnv1a(input)}`;\n}\n\nfunction fnv1a(s: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < s.length; i++) {\n h ^= s.charCodeAt(i);\n h = Math.imul(h, 0x01000193) >>> 0;\n }\n // Pad to a 32-hex-char string (UUID-ish length) by repeating the\n // 8-hex-char digest. Not cryptographically meaningful — see note above.\n const d = h.toString(16).padStart(8, '0');\n return (d + d + d + d).slice(0, 32);\n}\n\n","/**\n * OSCAL document type detection.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/detect.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport type { Oscal } from './types.js';\n\n/** The 7 valid OSCAL document type strings. */\nexport type OscalDocumentType =\n | 'catalog'\n | 'profile'\n | 'component-definition'\n | 'system-security-plan'\n | 'assessment-plan'\n | 'assessment-results'\n | 'plan-of-action-and-milestones';\n\n/**\n * Parses the input JSON just enough to determine which OSCAL document type\n * it contains. Returns one of the 7 OSCAL root key strings.\n *\n * @throws Error if the input is not valid OSCAL\n */\nexport function detectOscalDocumentType(input: string): OscalDocumentType {\n const doc = parseJSON<Oscal>(input);\n\n if (doc.catalog) return 'catalog';\n if (doc.profile) return 'profile';\n if (doc['component-definition']) return 'component-definition';\n if (doc['system-security-plan']) return 'system-security-plan';\n if (doc['assessment-plan']) return 'assessment-plan';\n if (doc['assessment-results']) return 'assessment-results';\n if (doc['plan-of-action-and-milestones']) return 'plan-of-action-and-milestones';\n\n throw new Error(\n 'unrecognized OSCAL document: expected one of catalog, profile, ' +\n 'component-definition, system-security-plan, assessment-plan, ' +\n 'assessment-results, plan-of-action-and-milestones as root key',\n );\n}\n","/**\n * OSCAL Catalog to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_catalog.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFBaseline, BaselineRequirement } from '@mitre/hdf-schema';\nimport type { Description, RequirementGroup } from '@mitre/hdf-schema';\nimport { Applicability } from '@mitre/hdf-schema';\nimport type { Oscal, Catalog, Control } from './types.js';\nimport {\n controlIdToNistTag,\n extractPropValue,\n flattenPartsByName,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Catalog document to HDF Baseline JSON.\n *\n * @param input - Raw JSON string containing an OSCAL catalog\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalCatalogToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-catalog');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc.catalog) {\n throw new Error(\n \"oscal-catalog: input is not a catalog document (root key is not 'catalog')\",\n );\n }\n\n const baseline = await catalogToBaseline(doc.catalog, input);\n return JSON.stringify(baseline, null, 2);\n}\n\n/**\n * Shared logic: converts a parsed Catalog to HDFBaseline.\n * Also used by the profile converter after resolving.\n */\nexport async function catalogToBaseline(\n catalog: Catalog,\n rawInput: string,\n): Promise<HDFBaseline> {\n const integrity = await inputIntegrity(rawInput);\n const meta = extractMetadata(catalog.metadata);\n\n const requirements: BaselineRequirement[] = [];\n const groups: RequirementGroup[] = [];\n\n for (const group of catalog.groups ?? []) {\n const reqIDs: string[] = [];\n\n for (const ctrl of group.controls ?? []) {\n const req = controlToBaselineRequirement(ctrl);\n requirements.push(req);\n reqIDs.push(req.id);\n\n // Include control enhancements\n for (const enh of ctrl.controls ?? []) {\n const enhReq = controlToBaselineRequirement(enh);\n requirements.push(enhReq);\n reqIDs.push(enhReq.id);\n }\n }\n\n if (reqIDs.length > 0) {\n groups.push({\n id: group.id ?? '',\n title: group.title,\n requirements: reqIDs,\n });\n }\n }\n\n // Top-level controls (outside groups)\n for (const ctrl of catalog.controls ?? []) {\n const req = controlToBaselineRequirement(ctrl);\n requirements.push(req);\n\n for (const enh of ctrl.controls ?? []) {\n const enhReq = controlToBaselineRequirement(enh);\n requirements.push(enhReq);\n }\n }\n\n const baseline: HDFBaseline = {\n name: catalogBaselineName(catalog),\n title: meta.title,\n version: meta.version,\n status: 'loaded',\n integrity,\n requirements,\n groups,\n generator: {\n name: 'oscal-catalog-to-hdf',\n version: '1.0.0',\n },\n };\n\n return baseline;\n}\n\n/** Converts a single OSCAL Control to an HDF BaselineRequirement. */\nfunction controlToBaselineRequirement(ctrl: Control): BaselineRequirement {\n const nistTag = controlIdToNistTag(ctrl.id);\n const descriptions = buildCatalogDescriptions(ctrl);\n const tags = buildCatalogTags(ctrl);\n\n const req: BaselineRequirement = {\n id: nistTag,\n title: ctrl.title,\n impact: 0.5, // default for catalog controls\n descriptions,\n tags,\n };\n\n const controlType = deriveControlTypeFromTags([nistTag]);\n if (controlType !== undefined) req.controlType = controlType;\n\n // FedRAMP rev5 marks mandatory controls in a baseline with prop[name=CORE,value=true].\n // Catalogs typically don't carry CORE props, but resolved profiles (distributed\n // by FedRAMP as catalogs) do. When present, map CORE=true to applicability=required.\n // Absence is intentionally left undefined; consumers may interpret omitted as required\n // by convention. We do NOT map non-CORE to \"optional\" because catalog-only inputs\n // omit the prop entirely on all controls, which would be misleading.\n const coreProp = extractPropValue(ctrl.props, 'CORE');\n if (coreProp === 'true') {\n req.applicability = Applicability.Required;\n }\n\n return req;\n}\n\n/** Creates HDF Description entries from control parts. */\nfunction buildCatalogDescriptions(ctrl: Control): Description[] {\n const descriptions: Description[] = [];\n\n // Statement -> default description\n const statement = flattenPartsByName(ctrl.parts, 'statement');\n descriptions.push({\n label: 'default',\n data: statement || '',\n });\n\n // Guidance -> rationale\n const guidance = flattenPartsByName(ctrl.parts, 'guidance');\n if (guidance) {\n descriptions.push({ label: 'rationale', data: guidance });\n }\n\n // Assessment objective -> check\n const check = flattenPartsByName(ctrl.parts, 'assessment-objective');\n if (check) {\n descriptions.push({ label: 'check', data: check });\n }\n\n return descriptions;\n}\n\n/** Builds the tags map for an OSCAL catalog control. */\nfunction buildCatalogTags(ctrl: Control): Record<string, unknown> {\n const tags: Record<string, unknown> = {};\n\n const nistTag = controlIdToNistTag(ctrl.id);\n tags['nist'] = [nistTag];\n\n const label = extractPropValue(ctrl.props, 'label');\n if (label !== undefined) {\n tags['label'] = label;\n }\n\n const sortId = extractPropValue(ctrl.props, 'sort-id');\n if (sortId !== undefined) {\n tags['sort-id'] = sortId;\n }\n\n return tags;\n}\n\n/** Derives a baseline name from catalog metadata. */\nfunction catalogBaselineName(catalog: Catalog): string {\n return toKebabCase(catalog.metadata.title, 'oscal-catalog');\n}\n","/**\n * OSCAL Profile to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_profile.go.\n *\n * This implements the \"simple resolver\" -- it handles:\n * - A single catalog import\n * - include-controls with with-ids filtering\n * - set-parameters from modify section\n * - merge as-is (preserve catalog structure)\n *\n * It does NOT handle:\n * - Multiple imports\n * - Nested profile imports\n * - alter directives\n * - Complex merge strategies\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n Oscal,\n Catalog,\n Control,\n CatalogControlGroup,\n ImportResource,\n Part,\n ParameterSetting,\n} from './types.js';\nimport { catalogToBaseline } from './converter-catalog.js';\n\n/**\n * Converts an OSCAL Profile against a provided catalog to HDF Baseline JSON.\n *\n * @param profileInput - Raw JSON string containing an OSCAL profile\n * @param catalogInput - Raw JSON string containing an OSCAL catalog\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalProfileToHdf(\n profileInput: string,\n catalogInput: string,\n): Promise<string> {\n validateInputSize(profileInput, 'oscal-profile');\n\n if (!profileInput || profileInput.trim().length === 0) {\n throw new Error('empty profile input');\n }\n if (!catalogInput || catalogInput.trim().length === 0) {\n throw new Error('empty catalog input');\n }\n\n // Parse profile\n const profileDoc = parseJSON<Oscal>(profileInput);\n if (!profileDoc.profile) {\n throw new Error(\n \"oscal-profile: input is not a profile document (root key is not 'profile')\",\n );\n }\n const profile = profileDoc.profile;\n\n // Parse catalog\n const catalogDoc = parseJSON<Oscal>(catalogInput);\n if (!catalogDoc.catalog) {\n throw new Error(\n \"oscal-profile: catalog input is not a catalog document (root key is not 'catalog')\",\n );\n }\n const catalog = catalogDoc.catalog;\n\n // Validate: single import only\n if (!profile.imports || profile.imports.length === 0) {\n throw new Error('oscal-profile: profile has no imports');\n }\n if (profile.imports.length > 1) {\n throw new Error(\n `oscal-profile: profile has ${profile.imports.length} imports -- this converter only supports single-catalog imports. Use NIST's oscal-cli to resolve complex profiles, or use a pre-resolved catalog`,\n );\n }\n\n // Validate: no alter directives\n if (profile.modify?.alters && profile.modify.alters.length > 0) {\n throw new Error(\n `oscal-profile: profile contains ${profile.modify.alters.length} alter directives -- this converter only supports parameter overrides. Use NIST's oscal-cli to resolve profiles with alter directives, or use a pre-resolved catalog`,\n );\n }\n\n // Collect included/excluded control IDs\n const imp = profile.imports[0]!;\n const includedIDs = collectIncludedIDs(imp);\n const excludedIDs = collectExcludedIDs(imp);\n\n // Filter catalog\n const resolvedCatalog = filterCatalog(catalog, includedIDs, excludedIDs);\n\n // Apply parameter overrides\n if (profile.modify?.['set-parameters']) {\n applyParameterOverrides(resolvedCatalog, profile.modify['set-parameters']);\n }\n\n // Override metadata from profile\n resolvedCatalog.metadata = profile.metadata;\n resolvedCatalog.uuid = profile.uuid;\n\n const baseline = await catalogToBaseline(resolvedCatalog, profileInput);\n\n // Override the integrity to be based on the profile input\n baseline.integrity = await inputIntegrity(profileInput);\n\n return JSON.stringify(baseline, null, 2);\n}\n\n/** Extracts all control IDs from an import's include-controls. Returns null if include all. */\nfunction collectIncludedIDs(imp: ImportResource): Set<string> | null {\n const includeControls = imp['include-controls'];\n if (!includeControls || includeControls.length === 0) {\n return null; // include all\n }\n\n const ids = new Set<string>();\n for (const ic of includeControls) {\n for (const id of ic['with-ids'] ?? []) {\n ids.add(id);\n }\n }\n return ids;\n}\n\n/** Extracts all control IDs from an import's exclude-controls. */\nfunction collectExcludedIDs(imp: ImportResource): Set<string> | null {\n const excludeControls = imp['exclude-controls'];\n if (!excludeControls || excludeControls.length === 0) {\n return null;\n }\n\n const ids = new Set<string>();\n for (const ec of excludeControls) {\n for (const id of ec['with-ids'] ?? []) {\n ids.add(id);\n }\n }\n return ids;\n}\n\n/** Creates a new catalog containing only the controls matching filters. */\nfunction filterCatalog(\n catalog: Catalog,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n): Catalog {\n const includeAll = includedIDs === null;\n\n const result: Catalog = {\n uuid: catalog.uuid,\n metadata: catalog.metadata,\n 'back-matter': catalog['back-matter'],\n groups: [],\n controls: [],\n };\n\n for (const group of catalog.groups ?? []) {\n const filtered = filterGroupControls(group, includedIDs, excludedIDs, includeAll);\n if (filtered.controls && filtered.controls.length > 0) {\n result.groups!.push(filtered);\n }\n }\n\n for (const ctrl of catalog.controls ?? []) {\n if (shouldIncludeControl(ctrl.id, includedIDs, excludedIDs, includeAll)) {\n const filteredCtrl = filterControlEnhancements(ctrl, includedIDs, excludedIDs, includeAll);\n result.controls!.push(filteredCtrl);\n }\n }\n\n return result;\n}\n\nfunction filterGroupControls(\n group: CatalogControlGroup,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): CatalogControlGroup {\n const filtered: CatalogControlGroup = {\n id: group.id,\n class: group.class,\n title: group.title,\n props: group.props,\n parts: group.parts,\n controls: [],\n };\n\n for (const ctrl of group.controls ?? []) {\n if (shouldIncludeControl(ctrl.id, includedIDs, excludedIDs, includeAll)) {\n const filteredCtrl = filterControlEnhancements(ctrl, includedIDs, excludedIDs, includeAll);\n filtered.controls!.push(filteredCtrl);\n }\n }\n\n return filtered;\n}\n\nfunction filterControlEnhancements(\n ctrl: Control,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): Control {\n const result: Control = {\n id: ctrl.id,\n class: ctrl.class,\n title: ctrl.title,\n params: ctrl.params,\n props: ctrl.props,\n links: ctrl.links,\n parts: ctrl.parts,\n controls: [],\n };\n\n for (const enh of ctrl.controls ?? []) {\n if (shouldIncludeControl(enh.id, includedIDs, excludedIDs, includeAll)) {\n result.controls!.push(enh);\n }\n }\n\n return result;\n}\n\nfunction shouldIncludeControl(\n id: string,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): boolean {\n if (excludedIDs !== null && excludedIDs.has(id)) {\n return false;\n }\n if (includeAll) {\n return true;\n }\n return includedIDs !== null && includedIDs.has(id);\n}\n\n/** Applies set-parameters from the profile's modify section to the resolved catalog. */\nfunction applyParameterOverrides(\n catalog: Catalog,\n setParams: ParameterSetting[],\n): void {\n if (setParams.length === 0) return;\n\n // Build param-id -> values lookup\n const overrides = new Map<string, string[]>();\n for (const sp of setParams) {\n if (sp['param-id']) {\n overrides.set(sp['param-id'], sp.values ?? []);\n }\n }\n\n // Apply to all controls in groups\n for (const group of catalog.groups ?? []) {\n for (const ctrl of group.controls ?? []) {\n applyParamOverridesToControl(ctrl, overrides);\n for (const enh of ctrl.controls ?? []) {\n applyParamOverridesToControl(enh, overrides);\n }\n }\n }\n\n // Apply to top-level controls\n for (const ctrl of catalog.controls ?? []) {\n applyParamOverridesToControl(ctrl, overrides);\n for (const enh of ctrl.controls ?? []) {\n applyParamOverridesToControl(enh, overrides);\n }\n }\n}\n\nfunction applyParamOverridesToControl(\n ctrl: Control,\n overrides: Map<string, string[]>,\n): void {\n if (ctrl.params) {\n for (const param of ctrl.params) {\n if (!param.id) continue;\n const values = overrides.get(param.id);\n if (values) {\n param.label = values.join(', ');\n }\n }\n }\n\n // Replace parameter insertions in prose\n if (ctrl.parts) {\n for (const part of ctrl.parts) {\n replaceParamInsertions(part, overrides);\n }\n }\n}\n\nfunction replaceParamInsertions(part: Part, overrides: Map<string, string[]>): void {\n if (part.prose) {\n part.prose = substituteParams(part.prose, overrides);\n }\n if (part.parts) {\n for (const child of part.parts) {\n replaceParamInsertions(child, overrides);\n }\n }\n}\n\n/** Replaces OSCAL parameter insertion patterns: {{ insert: param, <param-id> }} */\nfunction substituteParams(text: string, overrides: Map<string, string[]>): string {\n let result = text;\n for (const [paramId, values] of overrides) {\n const placeholder = `{{ insert: param, ${paramId} }}`;\n const replacement = values.join(', ');\n result = result.split(placeholder).join(replacement);\n }\n return result;\n}\n","/**\n * OSCAL Component Definition to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_component.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFBaseline, BaselineRequirement } from '@mitre/hdf-schema';\nimport type { Description } from '@mitre/hdf-schema';\nimport type { Oscal, ImplementedRequirementElement, ComponentDefinitionComponent, ComponentDefinition } from './types.js';\nimport { controlIdToNistTag, extractMetadata, toKebabCase } from './shared.js';\n\n/**\n * Converts an OSCAL Component Definition document to HDF Baseline JSON.\n *\n * @param input - Raw JSON string containing an OSCAL component-definition\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalComponentToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-component-definition');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['component-definition']) {\n throw new Error(\n \"oscal-component-definition: input is not a component-definition document (root key is not 'component-definition')\",\n );\n }\n\n const compDef = doc['component-definition'];\n\n if (!compDef.components || compDef.components.length === 0) {\n throw new Error('oscal-component-definition: document contains no components');\n }\n\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(compDef.metadata);\n\n // Use the first component to build the baseline\n const comp = compDef.components[0]!;\n\n const requirements: BaselineRequirement[] = [];\n for (const ci of comp['control-implementations'] ?? []) {\n for (const ir of ci['implemented-requirements'] ?? []) {\n requirements.push(implementedRequirementToBaselineRequirement(ir));\n }\n }\n\n const baseline: HDFBaseline = {\n name: componentBaselineName(comp, compDef),\n title: meta.title,\n version: meta.version,\n status: 'loaded',\n integrity,\n requirements,\n generator: {\n name: 'oscal-component-to-hdf',\n version: '1.0.0',\n },\n };\n\n return JSON.stringify(baseline, null, 2);\n}\n\n/** Converts a single ImplementedRequirement to a BaselineRequirement. */\nfunction implementedRequirementToBaselineRequirement(\n ir: ImplementedRequirementElement,\n): BaselineRequirement {\n const nistTag = controlIdToNistTag(ir['control-id']);\n\n const descriptions: Description[] = [];\n\n // Primary description\n descriptions.push({\n label: 'default',\n data: ir.description ?? '',\n });\n\n // Add statement prose as additional descriptions\n for (const stmt of ir.statements ?? []) {\n if (stmt.description) {\n descriptions.push({\n label: stmt['statement-id'],\n data: stmt.description,\n });\n }\n if (stmt.remarks) {\n descriptions.push({\n label: stmt['statement-id'] + '-remarks',\n data: stmt.remarks,\n });\n }\n }\n\n const tags: Record<string, unknown> = {\n nist: [nistTag],\n };\n\n return {\n id: nistTag,\n title: nistTag,\n impact: 0.5,\n descriptions,\n tags,\n };\n}\n\n/** Derives a baseline name from the component or component-definition metadata. */\nfunction componentBaselineName(\n comp: ComponentDefinitionComponent,\n compDef: ComponentDefinition,\n): string {\n const name = comp.title || compDef.metadata.title;\n return toKebabCase(name, 'oscal-component-definition');\n}\n","/**\n * OSCAL System Security Plan (SSP) to HDF System converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_ssp.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFSystem } from '@mitre/hdf-schema';\nimport {\n AuthorizationStatus,\n CategorizationLevel,\n TargetType,\n} from '@mitre/hdf-schema';\n// Import Component from system types to avoid type incompatibility with results Component\nimport type { Component as HdfComponent } from '@mitre/hdf-schema/hdf-system';\nimport type {\n Oscal,\n SystemSecurityPlanSSP,\n SecurityImpactLevel,\n AssessmentAssetsComponent,\n ControlImplementationClass,\n} from './types.js';\nimport { controlIdToNistTag, extractMetadata } from './shared.js';\n\n/**\n * Converts an OSCAL System Security Plan document to HDF System JSON.\n *\n * @param input - Raw JSON string containing an OSCAL SSP\n * @returns HDF System JSON string\n */\nexport async function convertOscalSspToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-ssp');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['system-security-plan']) {\n throw new Error(\n \"oscal-ssp: input is not a system-security-plan document (root key is not 'system-security-plan')\",\n );\n }\n\n const ssp = doc['system-security-plan'];\n const integrity = await inputIntegrity(input);\n\n const system: HDFSystem = {\n name: sspSystemName(ssp),\n integrity,\n components: [],\n generator: {\n name: 'oscal-ssp-to-hdf',\n version: '1.0.0',\n },\n };\n\n // Map system characteristics\n const sc = ssp['system-characteristics'];\n if (sc) {\n if (sc.description) {\n let desc = sc.description;\n if (sc['authorization-boundary']?.description) {\n desc += '\\n\\nAuthorization Boundary: ' + sc['authorization-boundary'].description;\n }\n system.description = desc;\n }\n\n // Map categorization level from security impact level\n const sil = sc['security-impact-level'];\n if (sil) {\n system.categorizationLevel = sspCategorizationLevel(sil) ?? undefined;\n } else if (sc['security-sensitivity-level']) {\n system.categorizationLevel = mapSensitivityToCategorizationLevel(sc['security-sensitivity-level']) ?? undefined;\n }\n\n // Map authorization status from system status\n if (sc.status) {\n system.authorizationStatus = sspAuthorizationStatus(sc.status.state) ?? undefined;\n }\n\n // Map boundary description\n if (sc['authorization-boundary']?.description) {\n system.boundaryDescription = sc['authorization-boundary'].description;\n }\n\n // Map system identifier\n const systemIds = sc['system-ids'];\n if (systemIds && systemIds.length > 0) {\n system.identifier = systemIds[0]!.id;\n if (systemIds[0]!['identifier-type']) {\n system.identifierScheme = systemIds[0]!['identifier-type'];\n }\n }\n }\n\n // Map version from metadata\n const meta = extractMetadata(ssp.metadata);\n if (meta.version) {\n system.version = meta.version;\n }\n\n // Build component-UUID -> control-ID mapping\n const componentControls = buildComponentControlMap(ssp['control-implementation']);\n\n // Map system-implementation components to HDF Components\n const si = ssp['system-implementation'];\n if (si?.components) {\n for (const comp of si.components) {\n system.components.push(sspComponentToHDFComponent(comp, componentControls));\n }\n }\n\n return JSON.stringify(system, null, 2);\n}\n\nfunction sspSystemName(ssp: SystemSecurityPlanSSP): string {\n const sc = ssp['system-characteristics'];\n if (sc?.['system-name']) {\n return sc['system-name'];\n }\n if (ssp.metadata.title) {\n return ssp.metadata.title;\n }\n return 'oscal-ssp';\n}\n\nfunction sspCategorizationLevel(\n sil: SecurityImpactLevel,\n): CategorizationLevel | null {\n const levels = [\n sil['security-objective-confidentiality'] ?? '',\n sil['security-objective-integrity'] ?? '',\n sil['security-objective-availability'] ?? '',\n ];\n\n let highest = '';\n for (const l of levels) {\n const normalized = normalizeFIPSLevel(l);\n if (fipsLevelRank(normalized) > fipsLevelRank(highest)) {\n highest = normalized;\n }\n }\n\n if (!highest) return null;\n\n switch (highest) {\n case 'high':\n return CategorizationLevel.High;\n case 'moderate':\n return CategorizationLevel.Moderate;\n case 'low':\n return CategorizationLevel.Low;\n default:\n return null;\n }\n}\n\nfunction normalizeFIPSLevel(level: string): string {\n let lower = level.toLowerCase();\n lower = lower.replace(/^fips-199-/, '');\n switch (lower) {\n case 'high':\n return 'high';\n case 'moderate':\n case 'medium':\n return 'moderate';\n case 'low':\n return 'low';\n default:\n return '';\n }\n}\n\nfunction fipsLevelRank(level: string): number {\n switch (level) {\n case 'high':\n return 3;\n case 'moderate':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n}\n\nfunction mapSensitivityToCategorizationLevel(\n level: string,\n): CategorizationLevel | null {\n const normalized = normalizeFIPSLevel(level);\n if (!normalized) return null;\n\n switch (normalized) {\n case 'high':\n return CategorizationLevel.High;\n case 'moderate':\n return CategorizationLevel.Moderate;\n case 'low':\n return CategorizationLevel.Low;\n default:\n return null;\n }\n}\n\nfunction sspAuthorizationStatus(state: string): AuthorizationStatus | null {\n switch (state.toLowerCase()) {\n case 'operational':\n return AuthorizationStatus.Authorized;\n case 'under-development':\n return AuthorizationStatus.PendingAuthorization;\n case 'disposition':\n return AuthorizationStatus.Revoked;\n case 'other':\n return AuthorizationStatus.NotYetRequested;\n default:\n return null;\n }\n}\n\nfunction buildComponentControlMap(\n ci: ControlImplementationClass | undefined,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n if (!ci) return result;\n\n for (const ir of ci['implemented-requirements'] ?? []) {\n const controlId = ir['control-id'];\n\n // Direct by-components on the implemented-requirement\n for (const bc of ir['by-components'] ?? []) {\n addComponentControl(result, bc['component-uuid'], controlId);\n }\n\n // by-components within statements\n for (const stmt of ir.statements ?? []) {\n for (const bc of stmt['by-components'] ?? []) {\n addComponentControl(result, bc['component-uuid'], controlId);\n }\n }\n }\n\n return result;\n}\n\nfunction addComponentControl(\n m: Map<string, Set<string>>,\n compUUID: string,\n controlId: string,\n): void {\n let controls = m.get(compUUID);\n if (!controls) {\n controls = new Set<string>();\n m.set(compUUID, controls);\n }\n controls.add(controlId);\n}\n\nfunction sspComponentToHDFComponent(\n sc: AssessmentAssetsComponent,\n componentControls: Map<string, Set<string>>,\n): HdfComponent {\n const comp: HdfComponent = {\n name: sc.title,\n type: mapOSCALComponentType(sc.type),\n };\n\n if (sc.description) {\n comp.description = sc.description;\n }\n\n // Add control IDs as baseline refs (NIST notation)\n const controls = componentControls.get(sc.uuid);\n if (controls && controls.size > 0) {\n const refs: string[] = [];\n for (const controlId of controls) {\n refs.push(controlIdToNistTag(controlId));\n }\n if (refs.length > 0) {\n comp.baselineRefs = refs;\n }\n }\n\n return comp;\n}\n\nfunction mapOSCALComponentType(oscalType: string): TargetType {\n switch (oscalType.toLowerCase()) {\n case 'software':\n case 'this-system':\n return TargetType.Application;\n case 'service':\n return TargetType.Application;\n case 'hardware':\n return TargetType.Host;\n case 'network':\n return TargetType.Network;\n case 'database':\n return TargetType.Database;\n case 'storage':\n return TargetType.Artifact;\n default:\n return TargetType.Application;\n }\n}\n","/**\n * OSCAL Assessment Plan (SAP) to HDF Plan converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_sap.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFPlan,\n Assessment,\n RunnerConfig,\n} from '@mitre/hdf-schema';\nimport { PlanType } from '@mitre/hdf-schema';\nimport type {\n Oscal,\n SecurityAssessmentPlanSAP,\n AssessedControls,\n ReferencedControlObjectives,\n} from './types.js';\nimport {\n controlIdToNistTag,\n controlIdsToNistTags,\n extractControlIdFromObjectiveId,\n extractPropValue,\n flattenParts,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Assessment Plan document to HDF Plan JSON.\n *\n * @param input - Raw JSON string containing an OSCAL assessment-plan\n * @returns HDF Plan JSON string\n */\nexport async function convertOscalSapToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-assessment-plan');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['assessment-plan']) {\n throw new Error(\n \"oscal-assessment-plan: input is not an assessment-plan document (root key is not 'assessment-plan')\",\n );\n }\n\n const ap = doc['assessment-plan'];\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(ap.metadata);\n\n // Build assessments from reviewed-controls\n const assessments = buildAssessments(ap);\n\n // Extract systemRef from import-ssp\n const systemRef = ap['import-ssp']?.href || undefined;\n\n // Determine plan type from assessment-assets/tasks\n const planType = determinePlanType(ap);\n\n // Build description from metadata remarks and terms-and-conditions\n const description = buildPlanDescription(ap);\n\n const plan: HDFPlan = {\n name: toKebabCase(ap.metadata.title, 'oscal-assessment-plan'),\n assessments,\n integrity,\n systemRef,\n version: meta.version,\n type: planType,\n description,\n generator: {\n name: 'oscal-sap-to-hdf',\n version: '1.0.0',\n },\n };\n\n return JSON.stringify(plan, null, 2);\n}\n\nfunction buildAssessments(ap: SecurityAssessmentPlanSAP): Assessment[] {\n if (!ap['reviewed-controls']) {\n return [{ baselineRef: 'oscal-assessment-plan' }];\n }\n\n const assessments: Assessment[] = [];\n\n for (const cs of ap['reviewed-controls']['control-selections'] ?? []) {\n const assessment: Assessment = {\n baselineRef: deriveBaselineRef(ap, cs),\n };\n\n if (cs.description) {\n assessment.description = cs.description;\n }\n\n assessment.runner = extractRunnerConfig(ap) ?? undefined;\n assessment.targetSelector = buildTargetSelector(ap) ?? undefined;\n\n assessments.push(assessment);\n }\n\n // If no control selections but there are control-objective-selections\n if (assessments.length === 0 && (ap['reviewed-controls']['control-objective-selections']?.length ?? 0) > 0) {\n for (const co of ap['reviewed-controls']['control-objective-selections']!) {\n const assessment: Assessment = {\n baselineRef: deriveBaselineRefFromObjectives(ap, co),\n runner: extractRunnerConfig(ap) ?? undefined,\n };\n if (co.description) {\n assessment.description = co.description;\n }\n assessments.push(assessment);\n }\n }\n\n // Ensure at least one assessment exists\n if (assessments.length === 0) {\n assessments.push({ baselineRef: 'oscal-assessment-plan' });\n }\n\n return assessments;\n}\n\nfunction deriveBaselineRef(ap: SecurityAssessmentPlanSAP, cs: AssessedControls): string {\n if (cs['include-all'] !== undefined) {\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n return 'all-controls';\n }\n\n if (cs['include-controls'] && cs['include-controls'].length > 0) {\n const ids = cs['include-controls'].map(sc => controlIdToNistTag(sc['control-id']));\n return ids.join(',');\n }\n\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n\n return 'oscal-assessment-plan';\n}\n\nfunction deriveBaselineRefFromObjectives(\n ap: SecurityAssessmentPlanSAP,\n co: ReferencedControlObjectives,\n): string {\n if (co['include-all'] !== undefined) {\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n return 'all-objectives';\n }\n\n if (co['include-objectives'] && co['include-objectives'].length > 0) {\n const ids = co['include-objectives'].map(sc =>\n extractControlIdFromObjectiveId(sc['objective-id']),\n );\n return controlIdsToNistTags(ids).join(',');\n }\n\n return 'oscal-assessment-plan';\n}\n\nfunction extractRunnerConfig(ap: SecurityAssessmentPlanSAP): RunnerConfig | null {\n const assets = ap['assessment-assets'];\n if (!assets) return null;\n\n // Look for the first assessment platform\n const platforms = assets['assessment-platforms'];\n if (platforms && platforms.length > 0) {\n const platform = platforms[0]!;\n const config: RunnerConfig = {};\n if (platform.title) {\n config.name = platform.title;\n }\n return config;\n }\n\n // Fall back to components\n if (assets.components && assets.components.length > 0) {\n const comp = assets.components[0]!;\n const config: RunnerConfig = {\n name: comp.title,\n };\n const version = extractPropValue(comp.props, 'version');\n if (version) {\n config.version = version;\n }\n return config;\n }\n\n return null;\n}\n\nfunction buildTargetSelector(\n ap: SecurityAssessmentPlanSAP,\n): Record<string, string> | null {\n const subjects = ap['assessment-subjects'];\n if (!subjects || subjects.length === 0) return null;\n\n const selector: Record<string, string> = {};\n for (const subject of subjects) {\n if (subject.type) {\n const key = 'subject-type';\n if (selector[key] !== undefined) {\n selector[key] += ',' + subject.type;\n } else {\n selector[key] = subject.type;\n }\n }\n if (subject['include-all'] !== undefined) {\n selector['include-' + subject.type] = 'all';\n }\n }\n\n if (Object.keys(selector).length === 0) return null;\n return selector;\n}\n\nfunction determinePlanType(ap: SecurityAssessmentPlanSAP): PlanType | undefined {\n const aType = extractPropValue(ap.metadata.props, 'assessment-type');\n if (aType) {\n switch (aType.toLowerCase()) {\n case 'automated':\n return PlanType.Automated;\n case 'manual':\n return PlanType.Manual;\n }\n }\n\n if (ap.tasks && ap.tasks.length > 0) {\n return PlanType.Hybrid;\n }\n\n return undefined;\n}\n\nfunction buildPlanDescription(ap: SecurityAssessmentPlanSAP): string | undefined {\n const parts: string[] = [];\n\n if (ap.metadata.remarks) {\n parts.push(ap.metadata.remarks);\n }\n\n if (ap['terms-and-conditions']?.parts && ap['terms-and-conditions'].parts.length > 0) {\n const terms = flattenParts(ap['terms-and-conditions'].parts);\n if (terms) {\n parts.push('Terms and Conditions: ' + terms);\n }\n }\n\n if (parts.length === 0) return undefined;\n return parts.join('\\n\\n');\n}\n","/**\n * OSCAL Plan of Action and Milestones (POA&M) to HDF Amendments converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_poam.go.\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { inputIntegrity, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFAmendments,\n StandaloneOverride,\n Milestone as HdfMilestone,\n} from '@mitre/hdf-schema';\nimport {\n OverrideType,\n} from '@mitre/hdf-schema';\n\n// The hdf-amendments schema defines its own ResultStatus, AppliedByType, and\n// milestone Status enums that conflict with hdf-results enums of the same name.\n// They aren't re-exported from the @mitre/hdf-schema barrel to avoid collisions.\n// We use string literals with type casts for these fields.\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Oscal,\n PlanOfActionAndMilestonesPOAM,\n POAMItem,\n IdentifiedRisk,\n DocumentMetadata,\n} from './types.js';\nimport {\n controlIdToNistTag,\n extractPropValue,\n oscalStatusToHdf,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL POA&M document to HDF Amendments JSON.\n *\n * @param input - Raw JSON string containing an OSCAL POA&M\n * @returns HDF Amendments JSON string\n */\nexport async function convertOscalPoamToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-poam');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['plan-of-action-and-milestones']) {\n throw new Error(\n \"oscal-poam: input is not a plan-of-action-and-milestones document (root key is not 'plan-of-action-and-milestones')\",\n );\n }\n\n const poam = doc['plan-of-action-and-milestones'];\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(poam.metadata);\n\n // Build risk lookup map\n const riskMap = buildRiskMap(poam.risks ?? []);\n\n // Convert poam-items to StandaloneOverrides\n const overrides: StandaloneOverride[] = [];\n for (const item of poam['poam-items']) {\n overrides.push(poamItemToOverride(item, riskMap, poam));\n }\n\n // Extract systemRef from import-ssp\n const systemRef = poam['import-ssp']?.href || undefined;\n\n // Build appliedBy from metadata responsible-parties\n const appliedBy = extractAppliedBy(poam.metadata);\n\n const amendments: HDFAmendments = {\n name: toKebabCase(poam.metadata.title, 'oscal-poam'),\n overrides,\n integrity,\n systemRef,\n version: meta.version,\n appliedBy,\n generator: {\n name: 'oscal-poam-to-hdf',\n version: '1.0.0',\n },\n };\n\n return serializeHdf(amendments);\n}\n\nfunction buildRiskMap(risks: IdentifiedRisk[]): Map<string, IdentifiedRisk> {\n const m = new Map<string, IdentifiedRisk>();\n for (const risk of risks) {\n m.set(risk.uuid, risk);\n }\n return m;\n}\n\nfunction poamItemToOverride(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n poam: PlanOfActionAndMilestonesPOAM,\n): StandaloneOverride {\n return {\n type: OverrideType.Poam,\n requirementId: extractRequirementIdFromPOAMItem(item, riskMap),\n reason: poamItemReason(item),\n status: poamItemStatus(item, riskMap),\n appliedBy: poamItemAppliedBy(poam),\n appliedAt: poamItemAppliedAt(poam),\n expiresAt: poamItemExpiresAt(),\n milestones: extractMilestones(item, riskMap) as any,\n };\n}\n\nfunction extractRequirementIdFromPOAMItem(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): string {\n // Check related risks for impacted-control-id\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (riskUuid) {\n const risk = riskMap.get(riskUuid);\n if (risk) {\n const controlId = extractPropValue(risk.props, 'impacted-control-id');\n if (controlId) {\n return controlIdToNistTag(controlId);\n }\n }\n }\n }\n\n // Check poam-item props for POAM-ID\n const poamId = extractPropValue(item.props, 'POAM-ID');\n if (poamId) return poamId;\n\n // Fall back to the title\n if (item.title) return item.title;\n\n return 'unknown';\n}\n\nfunction poamItemReason(item: POAMItem): string {\n if (item.description) return item.description;\n if (item.title) return item.title;\n return 'POA&M item';\n}\n\nfunction poamItemStatus(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): any {\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (riskUuid) {\n const risk = riskMap.get(riskUuid);\n if (risk) {\n const status = oscalStatusToHdf(risk.status);\n if (status === 'passed') return 'passed' as any;\n if (status === 'failed') return 'failed' as any;\n }\n }\n }\n\n // Default: POA&M items typically represent open/failed findings\n return 'failed' as any;\n}\n\nfunction poamItemAppliedBy(\n poam: PlanOfActionAndMilestonesPOAM,\n): StandaloneOverride['appliedBy'] {\n // Look for prepared-by in responsible-parties\n const rps = poam.metadata['responsible-parties'];\n if (rps) {\n for (const rp of rps) {\n if (rp['role-id'] === 'prepared-by' && rp['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rp['party-uuids'][0]!,\n };\n }\n }\n\n // Fall back to any responsible party\n if (rps.length > 0 && rps[0]!['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rps[0]!['party-uuids'][0]!,\n };\n }\n }\n\n return {\n type: 'system' as any,\n identifier: 'oscal-poam-converter',\n };\n}\n\nfunction poamItemAppliedAt(poam: PlanOfActionAndMilestonesPOAM): Date {\n if (poam.metadata['last-modified']) {\n // Generator types this as Date, but it is a string at runtime (parsed\n // without a Date reviver); coerce so parseTimestamp applies UTC handling.\n const t = parseTimestamp(String(poam.metadata['last-modified']));\n if (t) {\n return t;\n }\n }\n return new Date();\n}\n\nfunction poamItemExpiresAt(): Date {\n // Default: 1 year from now\n const d = new Date();\n d.setFullYear(d.getFullYear() + 1);\n return d;\n}\n\nfunction extractMilestones(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): HdfMilestone[] {\n const milestones: HdfMilestone[] = [];\n\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n\n for (const rem of risk.remediations ?? []) {\n if (rem.lifecycle !== 'planned') continue;\n\n const estimatedCompletion = new Date();\n estimatedCompletion.setMonth(estimatedCompletion.getMonth() + 3);\n\n milestones.push({\n description: rem.title + ': ' + rem.description,\n estimatedCompletion,\n status: 'pending' as any,\n });\n }\n }\n\n return milestones;\n}\n\nfunction extractAppliedBy(\n meta: DocumentMetadata,\n): HDFAmendments['appliedBy'] {\n const rps = meta['responsible-parties'];\n if (rps) {\n for (const rp of rps) {\n if (rp['role-id'] === 'prepared-by' && rp['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rp['party-uuids'][0]!,\n };\n }\n }\n }\n return undefined;\n}\n","/**\n * OSCAL Assessment Results (SAR) to HDF Results converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_sar.go.\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, inputChecksum, inputIntegrity, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\nimport type {\n Oscal,\n SecurityAssessmentResultsSAR,\n AssessmentResult,\n Finding,\n Observation,\n IdentifiedRisk,\n} from './types.js';\nimport {\n controlIdToNistTag,\n extractControlIdFromObjectiveId,\n oscalStatusToHdf,\n extractRiskSeverity,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Assessment Results (SAR) document to HDF Results JSON.\n *\n * @param input - Raw JSON string containing OSCAL assessment-results\n * @returns HDF Results JSON string\n */\nexport async function convertOscalSarToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-assessment-results');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['assessment-results']) {\n throw new Error(\n \"oscal-assessment-results: input is not an assessment-results document (root key is not 'assessment-results')\",\n );\n }\n\n const sar = doc['assessment-results'];\n const meta = extractMetadata(sar.metadata);\n\n // One conversion-time value, shared as the startTime fallback for any\n // finding whose OSCAL result lacks a usable start.\n const scanTime = new Date();\n\n // Skip results with no findings — an empty baseline would violate the\n // schema's requirements.minItems=1. Mirrors the Go SAR converter.\n const baselines: EvaluatedBaseline[] = [];\n for (const result of sar.results) {\n if (!result.findings || result.findings.length === 0) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Skipping assessment result \"${result.title || result.uuid}\": no findings (empty result set)`,\n );\n continue;\n }\n const baseline = await resultToEvaluatedBaseline(result, sar, input, scanTime);\n baselines.push(baseline);\n }\n\n // Extract planRef from import-ap\n const planRef = sar['import-ap']?.href || undefined;\n\n // Parse timestamp from metadata\n let timestamp: Date | undefined;\n if (meta.lastModified) {\n const t = parseTimestamp(meta.lastModified);\n if (t) {\n timestamp = t;\n }\n }\n\n const hdf: HDFResults = {\n baselines,\n generator: {\n name: 'oscal-assessment-results-to-hdf',\n version: '1.0.0',\n },\n tool: {\n name: 'OSCAL Assessment Results',\n format: 'OSCAL',\n },\n timestamp: timestamp ?? new Date(),\n planRef,\n };\n\n return serializeHdf(hdf);\n}\n\nasync function resultToEvaluatedBaseline(\n result: AssessmentResult,\n sar: SecurityAssessmentResultsSAR,\n rawInput: string,\n scanTime: Date,\n): Promise<EvaluatedBaseline> {\n const checksum = await inputChecksum(rawInput);\n\n // Build lookup maps for observations and risks\n const obsMap = buildObservationMap(result.observations ?? []);\n const riskMap = buildRiskMap(result.risks ?? []);\n\n // Group findings by control ID, preserving insertion order\n const controlOrder: string[] = [];\n const controlMap = new Map<string, Finding[]>();\n\n for (const f of result.findings ?? []) {\n const controlId = extractControlIdFromFinding(f);\n const existing = controlMap.get(controlId);\n if (existing) {\n existing.push(f);\n } else {\n controlOrder.push(controlId);\n controlMap.set(controlId, [f]);\n }\n }\n\n // Build requirements in insertion order\n const requirements: EvaluatedRequirement[] = [];\n for (const controlId of controlOrder) {\n const findings = controlMap.get(controlId)!;\n const req = findingsToEvaluatedRequirement(controlId, findings, obsMap, riskMap, result, scanTime);\n requirements.push(req);\n }\n\n // Derive baseline name\n const name = sarBaselineName(result, sar);\n\n const baseline = createMinimalBaseline(name, requirements, {\n resultsChecksum: checksum,\n integrity: await inputIntegrity(rawInput),\n status: 'loaded',\n title: result.title,\n }) as EvaluatedBaseline;\n\n if (result.description) {\n (baseline as Record<string, unknown>).description = result.description;\n }\n\n return baseline;\n}\n\nfunction findingsToEvaluatedRequirement(\n controlId: string,\n findings: Finding[],\n obsMap: Map<string, Observation>,\n riskMap: Map<string, IdentifiedRisk>,\n result: AssessmentResult,\n scanTime: Date,\n): EvaluatedRequirement {\n const nistTag = controlIdToNistTag(controlId);\n\n // Use the first finding for title\n const firstFinding = findings[0]!;\n const title = firstFinding.title || nistTag;\n\n // Determine impact from related risks\n const impact = sarFindingsImpact(findings, riskMap);\n\n // Build descriptions from findings and observations\n const descriptions = sarBuildDescriptions(findings, obsMap);\n\n // Build results from each finding\n const results: RequirementResult[] = [];\n for (const f of findings) {\n results.push(findingToRequirementResult(f, obsMap, riskMap, result, scanTime));\n }\n\n const tags: Record<string, unknown> = {\n nist: [nistTag],\n };\n\n const req = createRequirement(nistTag, title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags([nistTag]);\n if (controlType !== undefined) req.controlType = controlType;\n return req;\n}\n\nfunction findingToRequirementResult(\n f: Finding,\n obsMap: Map<string, Observation>,\n riskMap: Map<string, IdentifiedRisk>,\n result: AssessmentResult,\n scanTime: Date,\n): RequirementResult {\n const status = mapFindingStatus(f);\n const codeDesc = buildCodeDesc(f, obsMap);\n const message = buildRiskMessage(f, riskMap);\n // The OSCAL result's assessment-period start applies to all its findings;\n // fall back to the single conversion-time value when the source omits it.\n const startTime = parseResultStartTime(result);\n\n return createResult(status, message || undefined, {\n codeDesc,\n startTime: startTime.getTime() > 0 ? startTime : scanTime,\n });\n}\n\nfunction extractControlIdFromFinding(f: Finding): string {\n const targetId = f.target['target-id'];\n if (!targetId) return 'unknown';\n\n // For objective-id and statement-id, extract the base control ID\n let controlId = extractControlIdFromObjectiveId(targetId);\n\n // Handle statement-id format: \"au-1_smt.a\" -> \"au-1\"\n const idx = controlId.indexOf('_');\n if (idx > 0) {\n controlId = controlId.slice(0, idx);\n }\n\n return controlId;\n}\n\nfunction mapFindingStatus(f: Finding): ResultStatus {\n const status = oscalStatusToHdf(f.target.status.state);\n if (status === 'passed') return ResultStatus.Passed;\n if (status === 'failed') return ResultStatus.Failed;\n return ResultStatus.NotReviewed;\n}\n\nfunction buildCodeDesc(f: Finding, obsMap: Map<string, Observation>): string {\n const parts: string[] = [];\n\n for (const ref of f['related-observations'] ?? []) {\n const obsUuid = ref['observation-uuid'];\n if (!obsUuid) continue;\n const obs = obsMap.get(obsUuid);\n if (!obs) continue;\n\n if (obs.methods && obs.methods.length > 0) {\n parts.push('Methods: ' + obs.methods.join(', '));\n }\n\n for (const subj of obs.subjects ?? []) {\n let subjDesc = subj.type;\n if (subj.title) {\n subjDesc = subj.title + ' (' + subj.type + ')';\n }\n parts.push('Subject: ' + subjDesc);\n }\n }\n\n if (parts.length === 0) return f.title;\n\n return parts.join('; ');\n}\n\nfunction buildRiskMessage(f: Finding, riskMap: Map<string, IdentifiedRisk>): string {\n const messages: string[] = [];\n\n for (const ref of f['related-risks'] ?? []) {\n const riskUuid = ref['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n\n let msg = risk.title;\n if (risk.description) {\n msg += ': ' + risk.description;\n }\n messages.push(msg);\n }\n\n return messages.join('\\n');\n}\n\nfunction sarFindingsImpact(\n findings: Finding[],\n riskMap: Map<string, IdentifiedRisk>,\n): number {\n let highestImpact = -1.0;\n\n for (const f of findings) {\n for (const ref of f['related-risks'] ?? []) {\n const riskUuid = ref['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n const impact = extractRiskSeverity(risk.characterizations, -1.0);\n if (impact > highestImpact) {\n highestImpact = impact;\n }\n }\n }\n\n if (highestImpact < 0) return 0.5; // default medium impact\n return highestImpact;\n}\n\nfunction sarBuildDescriptions(\n findings: Finding[],\n obsMap: Map<string, Observation>,\n): Description[] {\n const descriptions: Description[] = [];\n\n // Default description from finding descriptions\n const findingDescs: string[] = [];\n for (const f of findings) {\n if (f.description) {\n findingDescs.push(f.description);\n }\n }\n descriptions.push({\n label: 'default',\n data: findingDescs.join('\\n') || '',\n });\n\n // Rationale from observation descriptions\n const obsDescs: string[] = [];\n const seen = new Set<string>();\n for (const f of findings) {\n for (const ref of f['related-observations'] ?? []) {\n const obsUuid = ref['observation-uuid'];\n if (!obsUuid || seen.has(obsUuid)) continue;\n seen.add(obsUuid);\n const obs = obsMap.get(obsUuid);\n if (obs?.description) {\n obsDescs.push(obs.description);\n }\n }\n }\n if (obsDescs.length > 0) {\n descriptions.push({\n label: 'rationale',\n data: obsDescs.join('\\n'),\n });\n }\n\n return descriptions;\n}\n\nfunction buildObservationMap(observations: Observation[]): Map<string, Observation> {\n const m = new Map<string, Observation>();\n for (const obs of observations) {\n m.set(obs.uuid, obs);\n }\n return m;\n}\n\nfunction buildRiskMap(risks: IdentifiedRisk[]): Map<string, IdentifiedRisk> {\n const m = new Map<string, IdentifiedRisk>();\n for (const risk of risks) {\n m.set(risk.uuid, risk);\n }\n return m;\n}\n\nfunction parseResultStartTime(result: AssessmentResult): Date {\n if (result.start) {\n // Generator types this as Date, but it is a string at runtime (parsed\n // without a Date reviver); coerce so parseTimestamp applies UTC handling.\n const t = parseTimestamp(String(result.start));\n if (t) {\n return t;\n }\n }\n return new Date(0);\n}\n\nfunction sarBaselineName(result: AssessmentResult, sar: SecurityAssessmentResultsSAR): string {\n const title = result.title || sar.metadata.title;\n return toKebabCase(title, 'oscal-assessment-results');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["CWE_PATTERN","DEFAULT_REMEDIATION_NIST_TAGS","buildAffectedPackage","normalizeStatus","parseFindings","mapComplianceStatus","DEFAULT_REMEDIATION_NIST_TAGS","buildResult","buildRequirement","buildBaseline","IMPACT_MAPPING","extractSourceLocation","buildDescriptions","buildTags","buildAffectedPackage","decodeXmlEntities","ARRAY_TAGS","buildCodeDesc","ARRAY_TAGS","xccdfParsed","extractVersion","severityToImpact","NAMED_ENTITIES","decodeXmlEntities","BUILD_OPTIONS","severityToImpact","setIf","buildRequirement","severityToImpact","buildAffectedPackage","IMPACT_MAPPING","getImpact","buildCodeDesc","CvssVersion","buildCvssEntries","buildEpss","IMPACT_MAPPING","NAMED_ENTITIES","decodeXmlEntities","buildTags","buildResult","CvssVersion","getStatus","buildNistTags","buildCodeDesc","buildRequirement","mapStatus","getImpact","severityToImpact","buildRequirement","IMPACT_MAPPING","buildRequirement","DEFAULT_REMEDIATION_NIST_TAGS","buildNistTags","buildCodeDesc","buildNistTags","buildCodeDesc","extractLicenses","buildModelExtension","canonicalize","severityToImpact","formatCodeDesc","canonicalize","buildVulnerability","severity","buildFinding","buildMetadata","canonicalize","mapStatus","wrap","severityToImpact","buildCodeDesc","buildCodeDesc","buildRequirement","IMPACT_MAPPING","getImpact","formatCodeDesc","buildRequirement","IMPACT_MAPPING","NAMED_ENTITIES","decodeXmlEntities","getStatus","getImpact","formatDesc","buildRequirement","buildTitle","CvssVersion","formatCodeDesc","buildRequirement","getImpact","getTitle","buildRequirement","buildAffectedPackage","extractCWEs","formatCodeDesc","buildRequirement","severityToImpact","buildAffectedPackage","getImpact","buildRequirement","buildAffectedPackage","NAMED_ENTITIES","decodeXmlEntities","buildCodeDesc","buildRequirement","DEFAULT_STATIC_ANALYSIS_NIST_TAGS","getImpact","DEFAULT_REMEDIATION_NIST_TAGS","buildRequirement","buildAffectedPackage","IMPACT_MAPPING","getImpact","formatMessage","buildRequirement","getImpact","getStatus","buildRequirement","buildCodeDesc","IMPACT_MAPPING","DEFAULT_REMEDIATION_NIST_TAGS","buildRequirement","IMPACT_MAPPING","severityToImpact","buildTags","impactToSeverity","impactToSeverity","impactToSeverity","DEFAULT_EXPIRY_HORIZON_MS","identityFor","buildReason","DEFAULT_EXPIRY_HORIZON_MS","buildProductLookup","buildReason","GO_ZERO_TIME","CVE_ID_PATTERN","PRODUCTS_LINE","DEFAULT_PRODUCT_ID","productIDsFor","stripProductsLine","allMilestonesCompleted","CVE_ID_PATTERN","PRODUCTS_LINE","DEFAULT_PRODUCT_ID","allMilestonesCompleted","buildRiskMap"],"sources":["../shared/typescript/converterutil.ts","../converters/legacyhdf-to-hdf/typescript/converter.ts","../converters/asff-to-hdf/typescript/converter.ts","../converters/sarif-to-hdf/typescript/converter.ts","../converters/junit-to-hdf/typescript/converter.ts","../converters/xccdf-results-to-hdf/typescript/converter.ts","../shared/typescript/checklist/status.ts","../shared/typescript/checklist/ckl.ts","../shared/typescript/checklist/cklb.ts","../shared/typescript/checklist/to-hdf.ts","../shared/typescript/checklist/from-hdf.ts","../converters/ckl-to-hdf/typescript/converter.ts","../converters/cklb-to-hdf/typescript/converter.ts","../converters/hdf-to-ckl/typescript/converter.ts","../converters/hdf-to-cklb/typescript/converter.ts","../converters/snyk-to-hdf/typescript/converter.ts","../converters/grype-to-hdf/typescript/converter.ts","../converters/nessus-to-hdf/typescript/converter.ts","../converters/sonarqube-to-hdf/typescript/converter.ts","../converters/aws-config-to-hdf/typescript/converter.ts","../converters/checkov-to-hdf/typescript/converter.ts","../converters/gosec-to-hdf/typescript/converter.ts","../converters/nikto-to-hdf/typescript/converter.ts","../converters/zap-to-hdf/typescript/converter.ts","../shared/typescript/bom/model.ts","../shared/typescript/bom/fingerprints.ts","../shared/typescript/bom/cyclonedx.ts","../shared/typescript/bom/spdx.ts","../shared/typescript/bom/spdx3.ts","../shared/typescript/bom/ml-bom.ts","../shared/typescript/bom/normalize.ts","../shared/typescript/exportmap.ts","../converters/cyclonedx-to-hdf/typescript/converter.ts","../converters/hdf-to-csv/typescript/converter.ts","../converters/hdf-to-ecs/typescript/converter.ts","../converters/hdf-to-splunk/typescript/converter.ts","../converters/hdf-to-ocsf/typescript/converter.ts","../converters/hdf-to-asff/typescript/converter.ts","../converters/splunk-to-hdf/typescript/converter.ts","../converters/hdf-to-xml/typescript/converter.ts","../converters/gitlab-to-hdf/typescript/converter.ts","../converters/trufflehog-to-hdf/typescript/converter.ts","../converters/burpsuite-to-hdf/typescript/converter.ts","../converters/dbprotect-to-hdf/typescript/converter.ts","../converters/twistlock-to-hdf/typescript/converter.ts","../converters/deptrack-to-hdf/typescript/converter.ts","../converters/jfrog-xray-to-hdf/typescript/converter.ts","../converters/neuvector-to-hdf/typescript/converter.ts","../converters/fortify-to-hdf/typescript/converter.ts","../converters/prisma-to-hdf/typescript/converter.ts","../converters/netsparker-to-hdf/typescript/converter.ts","../converters/scoutsuite-to-hdf/typescript/converter.ts","../converters/conveyor-to-hdf/typescript/converter.ts","../converters/veracode-to-hdf/typescript/converter.ts","../converters/msft-secure-score-to-hdf/typescript/converter.ts","../converters/msft-defender-devops-to-hdf/typescript/converter.ts","../converters/msft-defender-cloud-to-hdf/typescript/converter.ts","../converters/msft-defender-endpoint-to-hdf/typescript/converter.ts","../converters/hdf-to-xccdf/typescript/converter.ts","../converters/oscal-to-hdf/typescript/shared.ts","../converters/hdf-to-oscal-sar/typescript/converter.ts","../converters/hdf-to-oscal-poam/typescript/converter.ts","../converters/ionchannel-to-hdf/typescript/converter.ts","../shared/typescript/vex/mapping.ts","../converters/openvex-to-hdf/typescript/converter.ts","../converters/csaf-vex-to-hdf/typescript/converter.ts","../converters/cyclonedx-vex-to-hdf/typescript/converter.ts","../converters/hdf-to-csaf-vex/typescript/converter.ts","../converters/hdf-to-openvex/typescript/converter.ts","../converters/hdf-to-cyclonedx-vex/typescript/converter.ts","../converters/oscal-to-hdf/typescript/detect.ts","../converters/oscal-to-hdf/typescript/converter-catalog.ts","../converters/oscal-to-hdf/typescript/converter-component.ts","../converters/oscal-to-hdf/typescript/converter-poam.ts","../converters/oscal-to-hdf/typescript/converter-sap.ts","../converters/oscal-to-hdf/typescript/converter-sar.ts","../converters/oscal-to-hdf/typescript/converter-ssp.ts","../converters/oscal-to-hdf/typescript/converter-profile.ts"],"sourcesContent":["/**\n * Shared utilities for TypeScript HDF converters.\n *\n * Provides common patterns used across all converter implementations:\n * - Input checksum computation\n * - Re-exports of shared constants and utilities\n */\n\nimport { sha256, trimUtcFraction, parseJSON, normalizeHdfTimestamps, parseTimestamp } from '@mitre/hdf-utilities';\nimport type { AffectedPackage, Checksum, Component, EvaluatedBaseline, EvaluatedRequirement, HDFResults, Integrity, Statistics } from '@mitre/hdf-schema';\nimport { ControlType, Ecosystem, HashAlgorithm, ResultStatus, VerificationMethodEnum } from '@mitre/hdf-schema';\nimport { getCweNistControl, DEFAULT_STATIC_ANALYSIS_NIST_TAGS } from '@mitre/hdf-mappings';\n\nexport { DEFAULT_STATIC_ANALYSIS_NIST_TAGS };\n\n/**\n * Compute a SHA-256 checksum of raw converter input.\n *\n * Wraps the common 3-line pattern used in every converter into a single call.\n * The returned Checksum is suitable for the EvaluatedBaseline.resultsChecksum field.\n *\n * @param input - Raw input string (JSON, XML, etc.)\n * @returns Checksum with algorithm set to SHA-256\n */\nexport async function inputChecksum(input: string): Promise<Checksum> {\n return {\n algorithm: HashAlgorithm.Sha256,\n value: await sha256(input),\n };\n}\n\n/**\n * Compute an Integrity object (for root-level document integrity) from raw input.\n *\n * Returns an Integrity with algorithm and checksum fields, suitable for\n * HDFBaseline.integrity, HDFSystem.integrity, HDFPlan.integrity, etc.\n *\n * @param input - Raw input string (JSON, XML, etc.)\n * @returns Integrity object with SHA-256 algorithm and checksum\n */\nexport async function inputIntegrity(input: string): Promise<Integrity> {\n const checksum = await inputChecksum(input);\n return { algorithm: checksum.algorithm, checksum: checksum.value };\n}\n\n/**\n * Build a tags object with NIST controls and optional CCI mappings.\n *\n * If cci is empty, the \"cci\" key is omitted from the result.\n * Additional key-value pairs can be passed via extras.\n *\n * @param nist - NIST 800-53 control identifiers\n * @param cci - CCI identifiers (omitted if empty)\n * @param extras - Additional tag key-value pairs\n * @returns Tags object for HDF requirement\n */\nexport function buildNistCciTags(\n nist: string[],\n cci: string[],\n extras?: Record<string, unknown>,\n): Record<string, unknown> {\n const tags: Record<string, unknown> = { nist };\n if (cci.length > 0) {\n tags.cci = cci;\n }\n if (extras) {\n Object.assign(tags, extras);\n }\n return tags;\n}\n\n/** Maximum number of items processed from any single input array. */\nconst DEFAULT_MAX_ITEMS = 100_000;\n\n/**\n * Limit an array to at most maxItems elements.\n *\n * Returns the (possibly truncated) array and a flag indicating whether\n * truncation occurred. When truncated, callers should log a warning.\n *\n * @param items - Array to limit\n * @param maxItems - Maximum items (defaults to DEFAULT_MAX_ITEMS)\n * @returns Object with limited items array and truncated flag\n */\nexport function limitArray<T>(\n items: T[],\n maxItems = DEFAULT_MAX_ITEMS,\n): { items: T[]; truncated: boolean } {\n if (items.length <= maxItems) {\n return { items, truncated: false };\n }\n return { items: items.slice(0, maxItems), truncated: true };\n}\n\n// Re-export stripHTML from @mitre/hdf-utilities (canonical location).\n// Named stripHTML (uppercase H) for backwards compatibility with existing\n// converter imports; hdf-utilities exports stripHtml (lowercase h).\nexport { stripHtml as stripHTML } from '@mitre/hdf-utilities';\n\n/**\n * Limit an array and log a warning if truncated.\n *\n * Wraps {@link limitArray} with a console.warn call when items are truncated.\n *\n * @param items - Array to limit\n * @param label - Item type label for warning message (e.g., \"vulnerability\")\n * @param maxItems - Maximum items (defaults to DEFAULT_MAX_ITEMS)\n * @returns Limited array (original if within limit)\n */\nexport function limitArrayWithWarning<T>(\n items: T[],\n label: string,\n maxItems = DEFAULT_MAX_ITEMS,\n): T[] {\n const { items: limited, truncated } = limitArray(items, maxItems);\n if (truncated) {\n // eslint-disable-next-line no-console -- Intentional warning for truncated input\n console.warn(`WARNING: Input truncated at ${limited.length} ${label} items (original: ${items.length})`);\n }\n return limited;\n}\n\n/**\n * Map CWE identifiers to NIST 800-53 controls.\n *\n * Looks up each CWE ID, deduplicates, sorts, and falls back to the provided\n * default when no CWE has a mapping. CWE IDs may optionally have a \"CWE-\"\n * prefix (e.g., \"CWE-79\" or \"79\").\n *\n * @param cweIDs - CWE identifiers (e.g., [\"CWE-79\", \"89\"])\n * @param fallback - Default NIST controls when no mapping is found\n * @returns Sorted, deduplicated NIST control identifiers\n */\nexport function mapCWEToNIST(\n cweIDs: string[],\n fallback: string[],\n): string[] {\n const controls = new Set<string>();\n for (const id of cweIDs) {\n const numericStr = id.replace(/^CWE-/i, '');\n const numericId = parseInt(numericStr, 10);\n if (!isNaN(numericId)) {\n const nistControl = getCweNistControl(numericId);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n }\n return controls.size > 0 ? [...controls].sort() : fallback;\n}\n\n/** Matches CWE identifiers like \"CWE-79\", \"CWE 89\", \"cwe22\". */\nconst CWE_PATTERN = /CWE[- ]?(\\d+)/gi;\n\n/**\n * Extract all numeric CWE IDs from text.\n * Returns deduplicated sorted array of numeric ID strings (e.g., [\"79\", \"89\"]).\n *\n * @param text - Text potentially containing CWE identifiers\n * @returns Sorted, deduplicated numeric CWE ID strings\n */\nexport function extractCWEIDs(text: string): string[] {\n const matches = [...text.matchAll(CWE_PATTERN)];\n if (matches.length === 0) return [];\n const ids = [...new Set(matches.map(m => m[1]!))];\n ids.sort();\n return ids;\n}\n\n/** Default maximum input size for converters (50MB) */\nexport const DEFAULT_MAX_INPUT_SIZE = 50 * 1024 * 1024;\n\n/**\n * Validates that input string doesn't exceed maximum allowed size.\n *\n * Note: string.length gives char count, not bytes. For multi-byte chars this\n * underestimates. This is acceptable as a coarse safety check — exact byte\n * counting would require TextEncoder.\n *\n * @param input - Raw input string to validate\n * @param converterName - Name of the converter (used in error message)\n * @param maxSize - Maximum allowed character count (defaults to DEFAULT_MAX_INPUT_SIZE)\n * @throws Error if input exceeds maxSize\n */\nexport function validateInputSize(\n input: string,\n converterName: string,\n maxSize = DEFAULT_MAX_INPUT_SIZE,\n): void {\n if (input.length > maxSize) {\n throw new Error(\n `${converterName}: input exceeds maximum allowed size of ${maxSize} characters`,\n );\n }\n}\n\n/**\n * Parse an HDF document. The single ingest point for every HDF-consuming\n * converter: real HDF carries zone-less timestamps (InSpec emits startTime with\n * no offset), so the raw JSON is normalized to canonical trimmed-UTC RFC3339\n * before parsing — otherwise the non-canonical value is laundered into the\n * converter's output (and Go, whose schema types decode date-time into\n * time.Time, rejects the document outright).\n */\nexport function parseHdf<T>(input: string): T {\n return parseJSON<T>(normalizeHdfTimestamps(input));\n}\n\n/**\n * Read a timestamp field off a parsed HDF document.\n *\n * The generated schema types these as `Date` (startTime, appliedAt, ...), but\n * JSON.parse does not revive Dates, so at runtime they are strings. Reaching for\n * `new Date(value)` to bridge that gap reads a zone-less timestamp as host-local,\n * where Go reads it as UTC — so the same document converts differently depending\n * on the machine. parseTimestamp reads it as UTC, matching Go.\n *\n * Returns null when the field is absent or unparseable; callers decide the\n * fallback, since a missing time is not the same as the epoch.\n */\nexport function hdfTime(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (value === undefined || value === null || value === '') return null;\n return parseTimestamp(String(value));\n}\n\n/**\n * Normalise a value that may be a single item, an array, undefined, or null\n * into a guaranteed array.\n *\n * XML-to-JSON parsers often produce a single object when there is one child\n * element and an array when there are multiple. This helper smooths that out.\n *\n * @param value - A single item, an array of items, undefined, or null\n * @returns An array (empty if the input was nullish)\n */\nexport function ensureArray<T>(value: T | T[] | undefined | null): T[] {\n if (value === undefined || value === null) return [];\n return Array.isArray(value) ? value : [value];\n}\n\n\n/**\n * Default NIST 800-53 fallback for tools that identify outdated packages or\n * flaws requiring patching (SI-2: Flaw Remediation, RA-5: Vulnerability\n * Monitoring and Scanning).\n *\n * Mirrors Go shared.DefaultRemediationNIST.\n */\nexport const DEFAULT_REMEDIATION_NIST_TAGS = ['SI-2', 'RA-5'];\n\n/**\n * Map a PURL `type` segment to the AffectedPackage `ecosystem` enum.\n * Unknown types fall back to `generic`, which the schema enum permits\n * as a catch-all.\n */\nconst PURL_TYPE_TO_ECOSYSTEM: Record<string, Ecosystem> = {\n npm: Ecosystem.Npm,\n pypi: Ecosystem.Pypi,\n rpm: Ecosystem.RPM,\n deb: Ecosystem.Deb,\n maven: Ecosystem.Maven,\n gem: Ecosystem.Gem,\n nuget: Ecosystem.Nuget,\n golang: Ecosystem.Go,\n go: Ecosystem.Go,\n cargo: Ecosystem.Cargo,\n};\n\n/**\n * Resolve an Ecosystem from a PURL type string. Returns `generic` for\n * unknown types so callers can keep the schema's name+version+ecosystem\n * triple valid without inventing a synthetic ecosystem.\n */\nexport function ecosystemFromPurlType(type: string | undefined): Ecosystem {\n if (!type) return Ecosystem.Generic;\n return PURL_TYPE_TO_ECOSYSTEM[type.toLowerCase()] ?? Ecosystem.Generic;\n}\n\n/**\n * Build an Affected_Package primitive from any combination of the\n * vocabulary the schema accepts (purl / cpe / name+version+ecosystem).\n * Returns undefined when no identifier or full triple is present —\n * callers should skip the entry rather than emit a schema-invalid\n * AffectedPackage. Empty strings are treated as missing.\n *\n * The schema's anyOf requires at least one of:\n * - name + version + ecosystem\n * - purl alone\n * - cpe alone\n */\nexport function buildAffectedPackage(opts: {\n name?: string;\n version?: string;\n ecosystem?: Ecosystem;\n purl?: string;\n cpe?: string;\n fixedInVersion?: string;\n}): AffectedPackage | undefined {\n const pkg: AffectedPackage = {};\n if (opts.purl) pkg.purl = opts.purl;\n if (opts.cpe) pkg.cpe = opts.cpe;\n if (opts.name) pkg.name = opts.name;\n if (opts.version) pkg.version = opts.version;\n if (opts.ecosystem) pkg.ecosystem = opts.ecosystem;\n if (opts.fixedInVersion) pkg.fixedInVersion = opts.fixedInVersion;\n\n const hasTriple = Boolean(pkg.name && pkg.version && pkg.ecosystem);\n if (!hasTriple && !pkg.purl && !pkg.cpe) return undefined;\n return pkg;\n}\n\n/**\n * Options for building an HDF Results document.\n * Mirrors the Go shared.HDFResultsOptions struct.\n */\nexport interface HdfResultsOptions {\n /** Name of the converter that produced this HDF file (e.g., 'grype-to-hdf') */\n generatorName: string;\n /** Version of the converter */\n converterVersion: string;\n /** Name of the source security tool (e.g., 'Grype', 'Nessus') */\n toolName?: string;\n /** Version of the source tool */\n toolVersion?: string;\n /** Output format of the source tool (e.g., 'SARIF', 'XCCDF') */\n toolFormat?: string;\n /** Evaluated baselines with findings */\n baselines: EvaluatedBaseline[];\n /** Components that were assessed */\n components?: Component[];\n /** When the assessment was executed */\n timestamp?: Date;\n /** Assessment statistics */\n statistics?: Statistics;\n}\n\n/**\n * Build an HDF Results document from options.\n *\n * Eliminates the repeated boilerplate of constructing generator, tool,\n * and assembling the top-level HDFResults in every converter. Mirrors\n * the Go shared.BuildHDFResults() function.\n *\n * @returns JSON string of the HDF Results document (pretty-printed)\n */\nexport function buildHdfResults(opts: HdfResultsOptions): string {\n const hdf: HDFResults = {\n baselines: opts.baselines,\n generator: {\n name: opts.generatorName,\n version: opts.converterVersion,\n },\n };\n\n if (opts.toolName || opts.toolVersion || opts.toolFormat) {\n hdf.tool = {};\n if (opts.toolName) hdf.tool.name = opts.toolName;\n if (opts.toolVersion) hdf.tool.version = opts.toolVersion;\n if (opts.toolFormat) hdf.tool.format = opts.toolFormat;\n }\n\n if (opts.components) hdf.components = opts.components;\n if (opts.timestamp) hdf.timestamp = opts.timestamp;\n if (opts.statistics) hdf.statistics = opts.statistics;\n\n return serializeHdf(hdf);\n}\n\n// Full-match ISO-8601 UTC datetime carrying a fractional-second part. Date\n// values serialize via toISOString() as `...sssZ` (fixed 3-digit ms); Go emits\n// RFC3339Nano (trailing zeros trimmed). The replacer rewrites the former into\n// the latter so the two languages produce byte-identical output.\nconst ISO_UTC_WITH_FRACTION = /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}\\.\\d+Z$/;\n\nfunction hdfTimestampReplacer(_key: string, value: unknown): unknown {\n if (typeof value === 'string' && ISO_UTC_WITH_FRACTION.test(value)) {\n return trimUtcFraction(value);\n }\n return value;\n}\n\n/**\n * Serialize an HDF document to pretty-printed JSON, normalizing Date-derived\n * timestamps to canonical trimmed-UTC RFC3339 (byte-identical to the Go\n * converters). Use this instead of a bare `JSON.stringify` for any HDF output\n * so the fractional-second trim is applied consistently.\n */\nexport function serializeHdf(doc: unknown, space = 2): string {\n return JSON.stringify(doc, hdfTimestampReplacer, space);\n}\n\n/**\n * Captures a NIST 800-53 control identifier and its base sub-control number,\n * ignoring enhancement suffixes like \"(1)\" or \".1\". Mirrors the Go pattern\n * in shared/go/converterutil.go.\n */\nconst NIST_TAG_PATTERN = /^([A-Z]{2})-(\\d+)/;\n\n/**\n * Maps each recognized NIST 800-53 Rev 5 family to its HDF controlType per\n * SP 800-53 Appendix C / SP 800-53A classification. Unknown families resolve\n * to undefined.\n */\nconst NIST_FAMILY_CONTROL_TYPE: Record<string, ControlType> = {\n AC: ControlType.Technical,\n AT: ControlType.Operational,\n AU: ControlType.Operational,\n CA: ControlType.Management,\n CM: ControlType.Operational,\n CP: ControlType.Operational,\n IA: ControlType.Technical,\n IR: ControlType.Operational,\n MA: ControlType.Operational,\n MP: ControlType.Operational,\n PE: ControlType.Operational,\n PL: ControlType.Management,\n PM: ControlType.Management,\n PS: ControlType.Operational,\n PT: ControlType.Operational,\n RA: ControlType.Management,\n SA: ControlType.Management,\n SC: ControlType.Technical,\n SI: ControlType.Technical,\n SR: ControlType.Management,\n};\n\n/**\n * Derive the HDF `controlType` for a single NIST 800-53 control identifier\n * using a family-prefix heuristic. Returns undefined when the family is\n * unrecognized or the tag is not a NIST control identifier.\n *\n * Heuristic, per NIST SP 800-53 Rev 5 Appendix C and SP 800-53A:\n * - Management: PM, RA, CA, PL, SA, SR families\n * - Operational: AT, AU, CM, CP, IR, MA, MP, PE, PS, PT families\n * - Technical: AC, IA, SC, SI families\n * - Policy: any \"-1\" sub-control (the per-family policy/procedure\n * document, regardless of which family it belongs to). Enhancements of\n * -1 controls (e.g., AC-1(1)) also resolve to policy.\n *\n * The \"-1\" rule takes precedence over the family rule because the per-family\n * policy/procedure document is more usefully classified by its document\n * nature than by the family it documents.\n *\n * @example\n * deriveControlType(\"AC-3\") // ControlType.Technical\n * deriveControlType(\"AC-1\") // ControlType.Policy (any *-1 is policy)\n * deriveControlType(\"AC-3(1)\") // ControlType.Technical (enhancement of AC-3)\n * deriveControlType(\"PM-2\") // ControlType.Management\n * deriveControlType(\"SV-238196\") // undefined (not a NIST tag)\n */\nfunction deriveControlType(nistTag: string): ControlType | undefined {\n const match = NIST_TAG_PATTERN.exec(nistTag.trim().toUpperCase());\n if (!match || match[1] === undefined || match[2] === undefined) return undefined;\n const family = match[1];\n const subControl = match[2];\n const familyClass = NIST_FAMILY_CONTROL_TYPE[family];\n if (familyClass === undefined) return undefined;\n if (subControl === '1') return ControlType.Policy;\n return familyClass;\n}\n\n/**\n * NIST tag sets this package uses as per-converter static fallbacks when no\n * real per-finding mapping is available. When deriveControlTypeFromTags sees\n * an input that exactly matches one of these bundles, it returns undefined —\n * the input carries no real per-finding signal, and stamping every\n * requirement with the same derived controlType is misleading.\n *\n * Keep in sync with DEFAULT_STATIC_ANALYSIS_NIST_TAGS, DEFAULT_REMEDIATION_NIST_TAGS.\n */\nconst NIST_FALLBACK_BUNDLES: string[][] = [\n ['RA-5', 'SA-11'], // DEFAULT_STATIC_ANALYSIS_NIST_TAGS (sorted)\n ['RA-5', 'SI-2'], // DEFAULT_REMEDIATION_NIST_TAGS (sorted)\n ['CM-8'], // DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS\n];\n\nfunction tagsMatchFallback(tags: string[]): boolean {\n if (tags.length === 0) return false;\n const sorted = [...new Set(tags)].sort();\n return NIST_FALLBACK_BUNDLES.some(\n (bundle) =>\n bundle.length === sorted.length &&\n bundle.every((b, i) => b === sorted[i]),\n );\n}\n\n/**\n * Derive the HDF `controlType` for a slice of NIST tags. Resolves each tag\n * via {@link deriveControlType}, then picks the most-specific class by\n * precedence: technical > operational > management > policy > procedure.\n * The rationale is that a control enforced via configuration (technical)\n * is more actionable than the same control's management/policy framing.\n *\n * Returns undefined when no tag resolves to a known classification, OR when\n * the input exactly matches a converter-level static-fallback bundle (e.g.\n * the DEFAULT_STATIC_ANALYSIS_NIST_TAGS set). The fallback gate prevents\n * converters that have no per-finding NIST signal from stamping every\n * requirement with the same misleading controlType.\n */\nexport function deriveControlTypeFromTags(tags: string[]): ControlType | undefined {\n if (tagsMatchFallback(tags)) return undefined;\n const rank: Record<ControlType, number> = {\n [ControlType.Technical]: 0,\n [ControlType.Operational]: 1,\n [ControlType.Management]: 2,\n [ControlType.Policy]: 3,\n [ControlType.Procedure]: 4,\n };\n let best: ControlType | undefined;\n let bestRank = Number.POSITIVE_INFINITY;\n for (const tag of tags) {\n const ct = deriveControlType(tag);\n if (ct === undefined) continue;\n const r = rank[ct];\n if (r < bestRank) {\n bestRank = r;\n best = ct;\n }\n }\n return best;\n}\n\n/**\n * Derive the HDF `verificationMethod` for a requirement based on whether\n * check code is present. Returns `automated` when code is non-empty (a check\n * exists and runs without operator action), and undefined otherwise — the\n * converter is responsible for distinguishing manual-by-design (statement-form,\n * e.g. FedRAMP 20x KSI) from manual-pending-automation (a check that could\n * be automated but isn't yet) when it has the source-format context to do so.\n */\nexport function deriveVerificationMethod(code: string | undefined | null): VerificationMethodEnum | undefined {\n if (code === undefined || code === null || code === '') return undefined;\n return VerificationMethodEnum.Automated;\n}\n\n// Synthesized passed placeholder for tools that ran clean. Required because\n// the HDF schema enforces requirements.minItems=1.\nexport function buildNoFindingsRequirement(\n id: string,\n codeDesc: string,\n startTime: Date,\n): EvaluatedRequirement {\n return {\n id,\n title: 'No findings reported',\n impact: 0,\n descriptions: [{ label: 'default', data: codeDesc }],\n results: [\n {\n status: ResultStatus.Passed,\n codeDesc,\n startTime,\n },\n ],\n tags: {},\n };\n}\n","/**\n * HDF v1.0 to v2.0 converter.\n *\n * Comprehensive transformations:\n * - Top-level: version removed, profiles → baselines, platform → components\n * - Baseline: sha256 → checksum, controls → requirements\n * - Control: source_location → sourceLocation, waiver_data → waiverData, status → effectiveStatus\n * - Results: snake_case → camelCase for all fields\n * - Overlay flattening: merge overlay/wrapper baselines so every requirement has results\n */\n\nimport { flattenOverlays } from '@mitre/hdf-parsers';\nimport type { HDFResults } from '@mitre/hdf-schema';\nimport { impactToSeverity, parseTimestamp, formatTimestamp } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, validateInputSize } from '../../../shared/typescript/converterutil.js';\n\n// ===== V1.0 Type Definitions =====\n\nexport interface V1Result {\n status: string;\n code_desc?: string;\n run_time?: number;\n start_time?: string;\n message?: string;\n exception?: string;\n backtrace?: unknown;\n resource_class?: string;\n resource_params?: string;\n resource_id?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Control {\n id: string;\n title?: string;\n desc?: string;\n descriptions?: Array<{label: string; data: string}>;\n impact: number;\n refs?: unknown[];\n tags?: Record<string, unknown>;\n code?: string;\n source_location?: {\n ref?: string;\n line?: number;\n };\n waiver_data?: Record<string, unknown>;\n results?: V1Result[];\n status?: string; // overall_status in some v1.0 variants\n [key: string]: unknown;\n}\n\nexport interface V1Group {\n id: string;\n title?: string;\n controls: string[]; // Array of control IDs\n [key: string]: unknown;\n}\n\nexport interface V1Dependency {\n name?: string;\n url?: string;\n path?: string;\n git?: string;\n branch?: string;\n tag?: string;\n commit?: string;\n version?: string;\n supermarket?: string;\n compliance?: string;\n status?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Profile {\n name: string;\n version?: string;\n title?: string;\n maintainer?: string;\n summary?: string;\n license?: string;\n copyright?: string;\n copyright_email?: string;\n supports?: unknown[];\n attributes?: unknown[];\n groups?: V1Group[];\n controls?: V1Control[];\n sha256?: string;\n depends?: V1Dependency[];\n parent_profile?: string;\n status?: string;\n status_message?: string;\n skip_message?: string;\n [key: string]: unknown;\n}\n\nexport interface V1Platform {\n name: string;\n release?: string;\n target_id?: string;\n [key: string]: unknown;\n}\n\nexport interface HDFV1Results {\n version: string;\n platform: V1Platform;\n profiles: V1Profile[];\n statistics: unknown;\n generator?: unknown;\n timestamp?: string;\n [key: string]: unknown;\n}\n\n// ===== V2.0 Type Definitions =====\n\nexport interface V2Result {\n status: string;\n codeDesc?: string;\n runTime?: number;\n startTime?: string;\n message?: string;\n exception?: string;\n backtrace?: unknown;\n resource?: string;\n resourceId?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Requirement {\n id: string;\n title?: string;\n desc?: string;\n descriptions?: Array<{label: string; data: string}>;\n impact: number;\n refs?: unknown[];\n tags?: Record<string, unknown>;\n code?: string;\n sourceLocation?: {\n ref?: string;\n line?: number;\n };\n waiverData?: Record<string, unknown>;\n results?: V2Result[];\n effectiveStatus?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Group {\n id: string;\n title?: string;\n requirements: string[]; // Array of requirement IDs\n [key: string]: unknown;\n}\n\nexport interface V2Dependency {\n name?: string;\n url?: string;\n path?: string;\n git?: string;\n branch?: string;\n tag?: string;\n commit?: string;\n version?: string;\n supermarket?: string;\n compliance?: string;\n status?: string;\n skipMessage?: string;\n [key: string]: unknown;\n}\n\nexport interface V2Baseline {\n name: string;\n version?: string;\n title?: string;\n maintainer?: string;\n summary?: string;\n license?: string;\n copyright?: string;\n copyrightEmail?: string;\n supports?: unknown[];\n inputs?: unknown[];\n groups?: V2Group[];\n requirements?: V2Requirement[];\n checksum?: {\n algorithm: string;\n value: string;\n };\n depends?: V2Dependency[];\n parentBaseline?: string;\n status?: string;\n statusMessage?: string;\n skipMessage?: string;\n [key: string]: unknown;\n}\n\nexport interface HDFV2Results {\n baselines: V2Baseline[];\n statistics: unknown;\n components?: unknown[];\n generator?: unknown;\n tool?: { name?: string; version?: string; format?: string };\n timestamp?: string;\n id?: string;\n integrity?: unknown;\n runner?: unknown;\n remediation?: unknown;\n extensions?: Record<string, unknown>;\n}\n\n// ===== Severity Helpers =====\n\n/** Valid severity values per HDF v2.0 schema (matches the Go converter). */\nconst VALID_SEVERITIES = new Set(['critical', 'high', 'medium', 'low', 'informational']);\n\n/**\n * Convert tags.severity string to a valid severity value.\n * Returns null if the value is not a recognized severity.\n */\nfunction tagSeverityToSeverity(tagSeverity: unknown): string | null {\n if (typeof tagSeverity !== 'string') return null;\n const normalized = tagSeverity.toLowerCase().trim();\n return VALID_SEVERITIES.has(normalized) ? normalized : null;\n}\n\n// Severity is derived from numeric impact via the canonical\n// @mitre/hdf-utilities impactToSeverity (CVSS-aligned bands: >=0.9 critical,\n// >=0.7 high, >=0.4 medium, >0 low, else informational) — the same helper the\n// Go converter uses (hdfutil.ImpactToSeverity), so both languages agree.\n\n// ===== Conversion Functions =====\n\n/**\n * Normalize status values from v1.0 to v2.0 format.\n * Converts snake_case to camelCase.\n */\nfunction normalizeStatus(status: string): string {\n const statusMap: Record<string, string> = {\n 'passed': 'passed',\n 'failed': 'failed',\n 'error': 'error',\n 'not_applicable': 'notApplicable',\n 'not_reviewed': 'notReviewed',\n 'skipped': 'notReviewed', // v1.0 skipped → v2.0 notReviewed\n };\n return statusMap[status] || 'notReviewed'; // unknown statuses default to notReviewed (matches Go)\n}\n\n/**\n * Compute effectiveStatus from impact and v2 results.\n * Implements InSpec enhanced outcomes precedence:\n * impact=0 → notApplicable\n * error > failed > passed > notApplicable > notReviewed\n *\n * See docs/design/status-determination.md for full specification.\n */\nfunction computeEffectiveStatus(impact: number, results: V2Result[]): string {\n if (impact === 0) return 'notApplicable';\n if (results.length === 0) return 'notReviewed';\n\n let hasFailed = false;\n let hasPassed = false;\n let hasNotApplicable = false;\n\n for (const r of results) {\n switch (r.status) {\n case 'error': return 'error'; // fail-fast: highest precedence\n case 'failed': hasFailed = true; break;\n case 'passed': hasPassed = true; break;\n case 'notApplicable': hasNotApplicable = true; break;\n }\n }\n\n if (hasFailed) return 'failed';\n if (hasPassed) return 'passed';\n if (hasNotApplicable) return 'notApplicable';\n return 'notReviewed';\n}\n\n/**\n * Convert v1.0 result to v2.0 result.\n * Transforms snake_case field names to camelCase.\n */\n// Go's zero time.Time marshals as this; matched when a v1 result carries no\n// (or an unparseable) start_time so startTime — schema-required — stays present.\nconst LEGACY_ZERO_TIME = '0001-01-01T00:00:00Z';\n\n// Match the Go converter's startTime: canonical trimmed-UTC RFC3339 for a\n// parseable value, else Go's zero-value time. Offset-bearing inputs normalize\n// to UTC (ParseTimestamp().UTC() on the Go side).\nfunction legacyStartTime(s: string | undefined): string {\n if (s === undefined) return LEGACY_ZERO_TIME;\n const d = parseTimestamp(s);\n return d ? formatTimestamp(d) : LEGACY_ZERO_TIME;\n}\n\n// Emits only schema-valid Requirement_Result fields, mirroring the Go converter\n// (converter.go convertResult): v1 resource_class becomes v2 `resource`, and\n// the non-schema legacy fields (resource, resource_params, skip_message) are\n// dropped rather than passed through (Requirement_Result is closed).\nfunction convertResult(v1Result: V1Result): V2Result {\n const v2Result: V2Result = {\n status: normalizeStatus(v1Result.status),\n };\n\n // codeDesc and startTime are schema-required; the Go converter always emits\n // them (zero values when absent), so mirror that rather than omitting.\n v2Result.codeDesc = v1Result.code_desc ?? '';\n if (v1Result.run_time !== undefined) v2Result.runTime = v1Result.run_time;\n v2Result.startTime = legacyStartTime(v1Result.start_time);\n // v1 skipped results carry their reason in skip_message; v2 has no dedicated\n // field, so surface it as the result message (without clobbering an explicit\n // message), mirroring the Go converter.\n if (v1Result.message !== undefined) v2Result.message = v1Result.message;\n else if (v1Result.skip_message !== undefined) v2Result.message = v1Result.skip_message;\n if (v1Result.exception !== undefined) v2Result.exception = v1Result.exception;\n if (v1Result.backtrace !== undefined) v2Result.backtrace = v1Result.backtrace;\n if (v1Result.resource_class !== undefined) v2Result.resource = v1Result.resource_class;\n if (v1Result.resource_id !== undefined) v2Result.resourceId = v1Result.resource_id;\n\n return v2Result;\n}\n\n/**\n * Convert a v1 ref value (a string or an array of objects) to the v2\n * Reference.ref union value. Returns undefined when there is no content (e.g.\n * an empty array), so callers can drop empty references — matching the Go\n * converter's toRef.\n */\nfunction toRefValue(raw: unknown): string | Record<string, unknown>[] | undefined {\n if (typeof raw === 'string') return raw === '' ? undefined : raw;\n if (Array.isArray(raw)) {\n const maps = raw.filter(\n (e): e is Record<string, unknown> => !!e && typeof e === 'object' && !Array.isArray(e),\n );\n return maps.length === 0 ? undefined : maps;\n }\n return undefined;\n}\n\n/**\n * Convert a single v1 refs[] element (a bare string or an object with\n * ref/url/uri) to a v2 Reference object. Returns null when the element carries\n * no usable content. Key order (ref, url, uri) matches the Go Reference struct.\n */\nfunction convertRef(raw: unknown): Record<string, unknown> | null {\n if (typeof raw === 'string') {\n return raw === '' ? null : { ref: raw };\n }\n if (raw && typeof raw === 'object' && !Array.isArray(raw)) {\n const m = raw as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n let has = false;\n const refVal = toRefValue(m.ref);\n if (refVal !== undefined) {\n out.ref = refVal;\n has = true;\n }\n if (typeof m.url === 'string' && m.url !== '') {\n out.url = m.url;\n has = true;\n }\n if (typeof m.uri === 'string' && m.uri !== '') {\n out.uri = m.uri;\n has = true;\n }\n return has ? out : null;\n }\n return null;\n}\n\n/**\n * Map v1 control-level refs to v2 requirement refs, dropping empty/contentless\n * entries. Returns undefined when nothing maps.\n */\nfunction convertRefs(refs: unknown[]): Record<string, unknown>[] | undefined {\n const out: Record<string, unknown>[] = [];\n for (const raw of refs) {\n const ref = convertRef(raw);\n if (ref) out.push(ref);\n }\n return out.length ? out : undefined;\n}\n\n/**\n * Convert v1.0 control to v2.0 requirement.\n * Transforms field names and structure.\n */\nfunction convertControl(v1Control: V1Control): V2Requirement {\n const v2Req: V2Requirement = {\n id: v1Control.id,\n impact: v1Control.impact,\n };\n\n // Copy simple fields. `desc` and `waiver_data` are intentionally dropped:\n // neither is a valid v2 Requirement field (desc → descriptions; waivers are\n // expressed via amendments/overrides in v2), matching the Go converter.\n if (v1Control.title !== undefined) v2Req.title = v1Control.title;\n if (v1Control.descriptions !== undefined) v2Req.descriptions = v1Control.descriptions;\n if (v1Control.tags !== undefined) v2Req.tags = v1Control.tags;\n if (v1Control.code !== undefined) v2Req.code = v1Control.code;\n if (Array.isArray(v1Control.refs)) {\n const refs = convertRefs(v1Control.refs);\n if (refs) v2Req.refs = refs;\n }\n\n // Transform snake_case to camelCase\n if (v1Control.source_location !== undefined) {\n v2Req.sourceLocation = v1Control.source_location;\n }\n\n // Transform status to effectiveStatus with normalization\n if (v1Control.status !== undefined) {\n v2Req.effectiveStatus = normalizeStatus(v1Control.status);\n }\n\n // Transform results array\n if (v1Control.results && Array.isArray(v1Control.results)) {\n v2Req.results = v1Control.results.map(convertResult);\n }\n\n // Always compute effectiveStatus when not explicitly set.\n // Uses InSpec enhanced outcomes precedence:\n // impact=0 → notApplicable, error > failed > passed > notApplicable > notReviewed\n if (!v2Req.effectiveStatus) {\n v2Req.effectiveStatus = computeEffectiveStatus(v1Control.impact, v2Req.results ?? []);\n }\n\n // Populate severity: prefer tags.severity (preserves original STIG severity),\n // fall back to impact-derived. InSpec sets impact=0 for NA controls, losing\n // the original severity — tags.severity preserves it.\n v2Req.severity = tagSeverityToSeverity(v1Control.tags?.severity) ?? impactToSeverity(v1Control.impact);\n\n // Derive controlType from v1 tags.nist if present.\n const rawNist = v1Control.tags?.nist;\n if (Array.isArray(rawNist)) {\n const nistStrs = rawNist.filter((v): v is string => typeof v === 'string');\n const controlType = deriveControlTypeFromTags(nistStrs);\n if (controlType !== undefined) {\n v2Req.controlType = controlType;\n }\n }\n\n // verificationMethod is intentionally NOT set here. legacyhdf is a v1->v3\n // passthrough/upgrade converter; v1 HDF predates the verificationMethod\n // field, so the source carries no such signal. Stamping a value would\n // fabricate data not present in the input.\n\n // No catch-all passthrough: v2 Requirement is a closed shape, and the Go\n // converter emits only the explicit fields above. Carrying arbitrary leftover\n // v1 keys would produce schema-invalid output and diverge from Go.\n\n return v2Req;\n}\n\n/**\n * Convert v1.0 group to v2.0 group.\n * Renames controls array to requirements.\n */\nfunction convertGroup(v1Group: V1Group): V2Group {\n const v2Group: V2Group = {\n id: v1Group.id,\n requirements: v1Group.controls, // Rename controls to requirements\n };\n\n if (v1Group.title !== undefined) {\n v2Group.title = v1Group.title;\n }\n\n // Preserve any other fields\n const knownFields = new Set(['id', 'title', 'controls']);\n for (const [key, value] of Object.entries(v1Group)) {\n if (!knownFields.has(key) && !(key in v2Group)) {\n v2Group[key] = value;\n }\n }\n\n return v2Group;\n}\n\n/**\n * Convert v1.0 dependency to v2.0 dependency.\n * Transforms snake_case to camelCase for skip_message.\n */\nfunction convertDependency(v1Dep: V1Dependency): V2Dependency {\n const v2Dep: V2Dependency = {};\n\n // Copy most fields as-is\n if (v1Dep.name !== undefined) v2Dep.name = v1Dep.name;\n if (v1Dep.url !== undefined) v2Dep.url = v1Dep.url;\n if (v1Dep.path !== undefined) v2Dep.path = v1Dep.path;\n if (v1Dep.git !== undefined) v2Dep.git = v1Dep.git;\n if (v1Dep.branch !== undefined) v2Dep.branch = v1Dep.branch;\n if (v1Dep.tag !== undefined) v2Dep.tag = v1Dep.tag;\n if (v1Dep.commit !== undefined) v2Dep.commit = v1Dep.commit;\n if (v1Dep.version !== undefined) v2Dep.version = v1Dep.version;\n if (v1Dep.supermarket !== undefined) v2Dep.supermarket = v1Dep.supermarket;\n if (v1Dep.compliance !== undefined) v2Dep.compliance = v1Dep.compliance;\n if (v1Dep.status !== undefined) v2Dep.status = v1Dep.status;\n\n // Transform snake_case to camelCase\n if (v1Dep.skip_message !== undefined) {\n v2Dep.skipMessage = v1Dep.skip_message;\n }\n\n // Preserve any other fields\n const knownFields = new Set([\n 'name', 'url', 'path', 'git', 'branch', 'tag', 'commit', 'version',\n 'supermarket', 'compliance', 'status', 'skip_message'\n ]);\n for (const [key, value] of Object.entries(v1Dep)) {\n if (!knownFields.has(key) && !(key in v2Dep)) {\n v2Dep[key] = value;\n }\n }\n\n return v2Dep;\n}\n\n/**\n * Map v1 profile `supports` entries (InSpec hyphenated keys) to v2\n * SupportedPlatform objects. Entries that map no recognized key are dropped.\n * Key order (platform, platformFamily, platformName, release) matches the Go\n * SupportedPlatform struct. Returns undefined when nothing maps.\n */\nfunction convertSupports(supports: unknown[]): Record<string, string>[] | undefined {\n const out: Record<string, string>[] = [];\n for (const raw of supports) {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) continue;\n const s = raw as Record<string, unknown>;\n const sp: Record<string, string> = {};\n if (typeof s.platform === 'string' && s.platform !== '') sp.platform = s.platform;\n if (typeof s['platform-family'] === 'string' && s['platform-family'] !== '')\n sp.platformFamily = s['platform-family'] as string;\n if (typeof s['platform-name'] === 'string' && s['platform-name'] !== '')\n sp.platformName = s['platform-name'] as string;\n if (typeof s.release === 'string' && s.release !== '') sp.release = s.release;\n if (Object.keys(sp).length > 0) out.push(sp);\n }\n return out.length ? out : undefined;\n}\n\n/**\n * Convert v1.0 attributes to v2.0 Input objects. V1 attributes are\n * {name, options: {...}}; InSpec nests value/type/required/sensitive/description\n * under `options`. Mirrors convertAttributes in the Go converter (omit fields\n * absent from options so both languages produce identical output).\n */\nfunction convertAttributes(attrs: unknown[]): Record<string, unknown>[] {\n const inputs: Record<string, unknown>[] = [];\n for (const attr of attrs) {\n if (attr === null || typeof attr !== 'object') continue;\n const a = attr as Record<string, unknown>;\n const name = typeof a.name === 'string' ? a.name : '';\n if (!name) continue;\n const input: Record<string, unknown> = { name };\n const options = a.options;\n if (options !== null && typeof options === 'object') {\n const o = options as Record<string, unknown>;\n if ('value' in o) input.value = o.value;\n if (typeof o.description === 'string') input.description = o.description;\n if (typeof o.sensitive === 'boolean') input.sensitive = o.sensitive;\n if (typeof o.required === 'boolean') input.required = o.required;\n if (typeof o.type === 'string') input.type = o.type;\n }\n inputs.push(input);\n }\n return inputs;\n}\n\n/**\n * Convert v1.0 profile to v2.0 baseline.\n * Transforms field names and nested structures.\n */\nfunction convertProfile(v1Profile: V1Profile): V2Baseline {\n const v2Baseline: V2Baseline = {\n name: v1Profile.name,\n };\n\n // Copy simple fields\n if (v1Profile.version !== undefined) v2Baseline.version = v1Profile.version;\n if (v1Profile.title !== undefined) v2Baseline.title = v1Profile.title;\n if (v1Profile.maintainer !== undefined) v2Baseline.maintainer = v1Profile.maintainer;\n if (v1Profile.summary !== undefined) v2Baseline.summary = v1Profile.summary;\n if (v1Profile.license !== undefined) v2Baseline.license = v1Profile.license;\n if (v1Profile.copyright !== undefined) v2Baseline.copyright = v1Profile.copyright;\n if (v1Profile.copyright_email !== undefined) v2Baseline.copyrightEmail = v1Profile.copyright_email;\n // Omit empty optional arrays so output matches the Go converter (which uses\n // omitempty); only emit when there is data to carry.\n if (v1Profile.supports?.length) {\n const supports = convertSupports(v1Profile.supports);\n if (supports) v2Baseline.supports = supports;\n }\n if (v1Profile.attributes?.length) v2Baseline.inputs = convertAttributes(v1Profile.attributes);\n if (v1Profile.status !== undefined) v2Baseline.status = v1Profile.status;\n\n // Transform sha256 to integrity object\n if (v1Profile.sha256) {\n v2Baseline.integrity = {\n algorithm: 'sha256',\n checksum: v1Profile.sha256,\n };\n }\n\n // Transform snake_case to camelCase\n if (v1Profile.parent_profile !== undefined) {\n v2Baseline.parentBaseline = v1Profile.parent_profile;\n }\n if (v1Profile.status_message !== undefined) {\n v2Baseline.statusMessage = v1Profile.status_message;\n }\n if (v1Profile.skip_message !== undefined) {\n v2Baseline.skipMessage = v1Profile.skip_message;\n }\n\n // Transform groups (controls → requirements). Omit when empty to match the\n // Go converter (omitempty).\n if (v1Profile.groups?.length) {\n v2Baseline.groups = v1Profile.groups.map(convertGroup);\n }\n\n // Transform controls to requirements\n if (v1Profile.controls && Array.isArray(v1Profile.controls)) {\n v2Baseline.requirements = v1Profile.controls.map(convertControl);\n }\n\n // Transform depends. Omit when empty to match the Go converter.\n if (v1Profile.depends?.length) {\n v2Baseline.depends = v1Profile.depends.map(convertDependency);\n }\n\n // No catch-all passthrough: the Go converter emits only the explicit fields\n // above, and the v2 baseline is a closed shape.\n return v2Baseline;\n}\n\n/**\n * Convert HDF v1.0 results to v2.0 format.\n *\n * Performs comprehensive transformation at all levels:\n * - Top-level: version removed, profiles → baselines, platform → components\n * - Baselines: sha256 → checksum, controls → requirements, field renaming\n * - Requirements: snake_case → camelCase, status → effectiveStatus\n * - Results: snake_case → camelCase for all fields\n *\n * @param v1Data - HDF v1.0 results object\n * @returns HDF v2.0 results object\n *\n * @example\n * ```typescript\n * const v1 = {\n * version: \"1.0.0\",\n * platform: { name: \"ubuntu\", release: \"20.04\" },\n * profiles: [...],\n * statistics: {...}\n * };\n * const v2 = convertV1ToV2(v1);\n * // v2 = { baselines: [...], components: [{...}], statistics: {...} }\n * ```\n */\nexport function convertV1ToV2(v1Data: HDFV1Results): HDFV2Results {\n validateInputSize(JSON.stringify(v1Data), 'legacyhdf-to-hdf');\n const v2: HDFV2Results = {\n baselines: (v1Data.profiles || []).map(convertProfile),\n statistics: v1Data.statistics || {},\n };\n\n // Transform platform to components array. Mirrors the Go converter: emit only\n // {type, name}, adding osName/osVersion when the platform carries a target_id.\n if (v1Data.platform) {\n const component: { type: string; name: string; osName?: string; osVersion?: string } = {\n type: 'host', // v2.0 uses 'host' instead of 'system'\n name: v1Data.platform.name,\n };\n // Populate OS details whenever the platform carries an OS signal (a release\n // or a target_id). Previously gated on target_id alone, which dropped a\n // release-bearing platform that lacked a target_id.\n if (v1Data.platform.target_id || v1Data.platform.release !== undefined) {\n component.osName = v1Data.platform.name;\n if (v1Data.platform.release !== undefined) component.osVersion = v1Data.platform.release;\n }\n v2.components = [component];\n }\n\n // Copy optional fields\n if (v1Data.generator) {\n v2.generator = v1Data.generator;\n }\n\n v2.tool = { name: 'Heimdall Data Format v1' };\n\n if (v1Data.timestamp) {\n v2.timestamp = v1Data.timestamp;\n }\n\n // Preserve any extension fields not part of core schema\n const knownV1Fields = new Set(['version', 'platform', 'profiles', 'statistics', 'generator', 'timestamp']);\n const extensionFields: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(v1Data)) {\n if (!knownV1Fields.has(key)) {\n extensionFields[key] = value;\n }\n }\n\n if (Object.keys(extensionFields).length > 0) {\n v2.extensions = {\n ...extensionFields,\n v1_version: v1Data.version, // Preserve original version for tracking\n };\n }\n\n // Flatten overlays: merge overlay/wrapper baselines so every requirement\n // has results and consumers don't see duplicated controls (741→247 fix).\n const flat = flattenOverlays(v2 as unknown as HDFResults);\n return flat.results as unknown as HDFV2Results;\n}\n\n/**\n * Validate that data appears to be HDF v1.0 format.\n *\n * @param data - Unknown data to validate\n * @returns true if data looks like HDF v1.0\n */\nexport function isHDFV1(data: unknown): data is HDFV1Results {\n if (typeof data !== 'object' || data === null) {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n // V1.0 has version field, profiles, and platform\n return (\n typeof obj.version === 'string' &&\n Array.isArray(obj.profiles) &&\n typeof obj.platform === 'object' &&\n obj.platform !== null\n );\n}\n","/**\n * AWS Security Finding Format (ASFF) to HDF converter.\n *\n * A single ASFF envelope can carry findings from many products, and Security Hub\n * findings span multiple compliance standards (CIS, AFSBP, PCI, ...). Because\n * hdf-results supports multiple baselines in one document, each product — and\n * each Security Hub standard — becomes its own baseline entry, mirroring the\n * per-file split the predecessor SAF CLI produced.\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n getAwsConfigNistControlsBySubstring,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {\n buildNoFindingsRequirement,\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n serializeHdf,\n validateInputSize,\n DEFAULT_REMEDIATION_NIST_TAGS,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Description,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\ninterface AsffSeverity {\n Label?: string;\n Normalized?: number;\n}\n\nexport interface AsffFinding {\n Id?: string;\n GeneratorId?: string;\n ProductArn?: string;\n AwsAccountId?: string;\n Title?: string;\n Description?: string;\n Types?: string[];\n SourceUrl?: string;\n LastObservedAt?: string;\n UpdatedAt?: string;\n Severity?: AsffSeverity;\n Remediation?: { Recommendation?: { Text?: string; Url?: string } };\n ProductFields?: Record<string, string>;\n Resources?: { Type?: string; Id?: string; Partition?: string; Region?: string; Details?: { Other?: Record<string, string> } }[];\n Compliance?: { Status?: string; StatusReasons?: { ReasonCode?: string; Description?: string }[] };\n Workflow?: { Status?: string };\n // Standard ASFF field any producer may populate (Inspector, third-party\n // scanners); mapped generically so CVE/CVSS/fix data survives.\n Vulnerabilities?: AsffVulnerability[];\n}\n\nexport interface AsffVulnerability {\n Id?: string;\n Cvss?: { Version?: string; BaseScore?: number; Source?: string }[];\n VulnerablePackages?: { Name?: string; Version?: string; FixedInVersion?: string }[];\n ReferenceUrls?: string[];\n FixAvailable?: string;\n ExploitAvailable?: string;\n EpssScore?: number;\n}\n\nexport type Product = 'securityHub' | 'prowler' | 'trivy' | 'default';\n\nexport function productOf(f: AsffFinding): Product {\n const [company, prod] = productArnParts(f.ProductArn);\n if (prod === 'securityhub') return 'securityHub';\n if (company === 'prowler' && prod === 'prowler') return 'prowler';\n if (company === 'aquasecurity' && prod === 'aquasecurity') return 'trivy';\n return 'default';\n}\n\n/** The CVE id Trivy stashes under Resources[0].Details.Other. */\nexport function trivyCVE(f: AsffFinding): string {\n return f.Resources?.[0]?.Details?.Other?.['CVE ID'] ?? '';\n}\n\n/** Accepts the `{ \"Findings\": [...] }` envelope, a bare array, a single finding, or NDJSON (Prowler). */\nfunction parseFindings(input: string): AsffFinding[] {\n try {\n const parsed = parseJSON<unknown>(input);\n if (parsed !== null && typeof parsed === 'object' && 'Findings' in parsed) {\n const findings = (parsed as { Findings: unknown }).Findings;\n return Array.isArray(findings) ? (findings as AsffFinding[]) : [];\n }\n if (Array.isArray(parsed)) {\n return parsed as AsffFinding[];\n }\n if (parsed !== null && typeof parsed === 'object') {\n return [parsed as AsffFinding];\n }\n } catch {\n // fall through to NDJSON\n }\n const lines = input.trim().split('\\n').filter((l) => l.trim().length > 0);\n // Keep only object-shaped lines: valid-but-scalar JSON (e.g. `42`, `null`,\n // `\"x\"`) parses without throwing and must NOT be accepted as a finding — Go\n // rejects it too, so filtering to objects keeps the two languages in parity.\n const out = lines\n .map((l) => parseJSON<unknown>(l.trim()))\n .filter((x): x is AsffFinding => x !== null && typeof x === 'object' && !Array.isArray(x));\n if (out.length > 0) {\n return out;\n }\n throw new Error('invalid ASFF JSON');\n}\n\n/**\n * mapComplianceStatus maps ASFF Compliance.Status to an HDF result status.\n * hdf-results has no \"skipped\": WARNING and NOT_AVAILABLE (no clean pass/fail\n * verdict) map to notReviewed; an absent status defaults to failed.\n */\nexport function mapComplianceStatus(status: string | undefined): ResultStatus {\n switch (status) {\n case 'PASSED':\n return ResultStatus.Passed;\n case 'FAILED':\n return ResultStatus.Failed;\n case 'WARNING':\n case 'NOT_AVAILABLE':\n return ResultStatus.NotReviewed;\n case undefined:\n case '':\n return ResultStatus.Failed;\n default:\n return ResultStatus.Error;\n }\n}\n\nexport function severityLabelToImpact(label: string | undefined): number {\n switch ((label ?? '').toUpperCase()) {\n case 'CRITICAL':\n return 0.9;\n case 'HIGH':\n return 0.7;\n case 'MEDIUM':\n return 0.5;\n case 'LOW':\n return 0.3;\n default:\n return 0.0;\n }\n}\n\n/**\n * findingImpact derives a 0.0–1.0 impact. Suppressed findings are forced to 0.\n * Security Hub's INFORMATIONAL is up-graded to MEDIUM (Security Hub over-marks\n * findings INFORMATIONAL without context).\n */\nexport function findingImpact(f: AsffFinding): number {\n if (f.Workflow?.Status === 'SUPPRESSED') {\n return 0.0;\n }\n let label = f.Severity?.Label;\n if (isSecurityHub(f) && (label ?? '').toUpperCase() === 'INFORMATIONAL') {\n label = 'MEDIUM';\n }\n if (label) {\n return severityLabelToImpact(label);\n }\n if (typeof f.Severity?.Normalized === 'number') {\n return f.Severity.Normalized / 100.0;\n }\n return 0.0;\n}\n\nfunction productArnParts(arn: string | undefined): [string, string] {\n if (!arn) return ['', ''];\n const tail = arn.split(':').pop() ?? '';\n const segs = tail.split('/');\n if (segs.length >= 3) return [segs[1]!, segs[2]!];\n return ['', ''];\n}\n\nfunction isSecurityHub(f: AsffFinding): boolean {\n return productOf(f) === 'securityHub';\n}\n\nconst normalizeStd = (s: string): string => s.toLowerCase().replace(/-/g, ' ');\n\nfunction titleCaseWords(s: string): string {\n return s\n .split(/\\s+/)\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ');\n}\n\n/**\n * securityHubStandardName derives \"CIS AWS Foundations Benchmark v1.2.0\" from a\n * finding's StandardsControlArn, preferring the nicer Types[0] casing when it\n * matches the ARN's standard slug (mirrors the SAF CLI grouping key).\n */\nfunction securityHubStandardName(f: AsffFinding): string {\n const arn = f.ProductFields?.StandardsControlArn ?? '';\n if (!arn) return '';\n const segs = arn.split('/');\n if (segs.length < 4) return '';\n const slug = segs[segs.length - 4]!;\n const version = segs[segs.length - 2]!;\n\n let typesLast = '';\n if (f.Types && f.Types.length > 0) {\n const ts = f.Types[0]!.split('/');\n typesLast = ts[ts.length - 1]!;\n }\n\n const standard =\n typesLast && normalizeStd(typesLast) === normalizeStd(slug)\n ? typesLast.replace(/-/g, ' ')\n : titleCaseWords(slug.replace(/-/g, ' '));\n return `${standard} v${version}`;\n}\n\n/** Level-1 grouping key, per product. */\nfunction baselineName(f: AsffFinding): string {\n switch (productOf(f)) {\n case 'securityHub': {\n const name = securityHubStandardName(f);\n if (name) return name;\n break;\n }\n case 'prowler':\n if (f.ProductFields?.ProviderName) return f.ProductFields.ProviderName;\n break;\n case 'trivy':\n return 'Aqua Security - Trivy';\n }\n const [company, prod] = productArnParts(f.ProductArn);\n if (!company && !prod) return 'AWS Security Finding Format';\n return `${company} - ${prod}`;\n}\n\n/** Level-2 grouping key within a baseline, per product. */\nfunction controlId(f: AsffFinding): string {\n switch (productOf(f)) {\n case 'securityHub':\n if (f.ProductFields?.ControlId) return f.ProductFields.ControlId;\n if (f.ProductFields?.RuleId) return f.ProductFields.RuleId;\n break;\n case 'prowler': {\n const i = (f.GeneratorId ?? '').indexOf('-');\n if (i >= 0) return (f.GeneratorId ?? '').slice(i + 1);\n break;\n }\n case 'trivy':\n return `${f.GeneratorId ?? ''}/${trivyCVE(f) || f.Id || ''}`;\n }\n // Unrecognized producer. A compliance/control finding aggregates per-resource\n // under one requirement, so group it by its generator-derived control ref.\n // A per-instance finding (a vulnerability, a threat) has no such aggregation —\n // key it by the ASFF-unique finding Id so distinct findings never collapse.\n // GeneratorId is NOT guaranteed unique per finding: every Inspector finding\n // shares \"AWSInspector\", so keying on it lumped every CVE into one requirement.\n if (f.Compliance?.Status && f.GeneratorId) {\n const segs = f.GeneratorId.split('/');\n if (segs[segs.length - 1]) return segs[segs.length - 1]!;\n }\n return f.Id ?? '';\n}\n\n/**\n * nistTags derives NIST controls for a finding group: AWS Config rule → NIST via\n * the shared awsconfig mapping, falling back to the static analysis default\n * bundle (matching the SAF CLI) when no config rule applies.\n */\nfunction nistTags(group: AsffFinding[]): string[] {\n // Trivy CVE findings map to the update/remediation NIST bundle.\n if (group.length > 0 && productOf(group[0]!) === 'trivy' && trivyCVE(group[0]!)) {\n return DEFAULT_REMEDIATION_NIST_TAGS;\n }\n const out: string[] = [];\n const seen = new Set<string>();\n for (const f of group) {\n for (const tag of configRuleNist(f)) {\n if (!seen.has(tag)) {\n seen.add(tag);\n out.push(tag);\n }\n }\n }\n return out.length > 0 ? out : DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n}\n\nfunction configRuleNist(f: AsffFinding): string[] {\n if (f.ProductFields?.['RelatedAWSResources:0/type'] !== 'AWS::Config::ConfigRule') {\n return [];\n }\n const name = f.ProductFields?.['RelatedAWSResources:0/name'];\n if (!name) return [];\n return getAwsConfigNistControlsBySubstring(name);\n}\n\nfunction remediationText(f: AsffFinding): string {\n const parts: string[] = [];\n const rec = f.Remediation?.Recommendation;\n if (rec?.Text) parts.push(rec.Text);\n if (rec?.Url) parts.push(rec.Url);\n return parts.join('\\n');\n}\n\nfunction resourceCodeDesc(f: AsffFinding): string {\n const parts = (f.Resources ?? []).map((r) => {\n let seg = `Type: ${r.Type ?? ''}, Id: ${r.Id ?? ''}`;\n if (r.Partition) seg += `, Partition: ${r.Partition}`;\n if (r.Region) seg += `, Region: ${r.Region}`;\n return seg;\n });\n return `Resources: [${parts.join('; ')}]`;\n}\n\nfunction statusReason(f: AsffFinding): string {\n const lines: string[] = [];\n for (const r of f.Compliance?.StatusReasons ?? []) {\n if (r.ReasonCode) lines.push(`ReasonCode: ${r.ReasonCode}`);\n if (r.Description) lines.push(`Description: ${r.Description}`);\n }\n return lines.join('\\n');\n}\n\nfunction buildResult(f: AsffFinding): RequirementResult {\n const start = parseTimestamp(f.LastObservedAt ?? f.UpdatedAt ?? '') ?? new Date();\n let status = mapComplianceStatus(f.Compliance?.Status);\n let codeDesc = resourceCodeDesc(f);\n let message = statusReason(f);\n switch (productOf(f)) {\n case 'prowler':\n codeDesc = f.Description ?? '';\n break;\n case 'trivy': {\n status = ResultStatus.Failed;\n const m = trivyMessage(f);\n if (m) message = m;\n break;\n }\n }\n // A finding may carry structured vulnerability data (Inspector and other\n // scanners). Fold a summary into the message so CVE/CVSS/fix data survives —\n // it is otherwise dropped entirely.\n const vuln = vulnerabilitySummary(f);\n if (vuln) message = message ? `${message}\\n${vuln}` : vuln;\n return createResult(status, message || undefined, { codeDesc, startTime: start });\n}\n\n/**\n * Renders a finding's ASFF Vulnerabilities[] as a compact text block: CVE id,\n * CVSS base score, EPSS, exploit/fix availability, and affected packages.\n * Generic — applies to any producer that emits the field.\n */\nfunction vulnerabilitySummary(f: AsffFinding): string {\n return (f.Vulnerabilities ?? [])\n .map((v) => {\n const parts: string[] = [v.Id ?? ''];\n const cvss = v.Cvss?.[0];\n if (cvss && typeof cvss.BaseScore === 'number') parts.push(`CVSS ${cvss.Version ?? ''} ${cvss.BaseScore.toFixed(1)}`);\n if (typeof v.EpssScore === 'number') parts.push(`EPSS ${v.EpssScore.toFixed(4)}`);\n if (v.ExploitAvailable) parts.push(`exploit ${v.ExploitAvailable.toLowerCase()}`);\n if (v.FixAvailable) parts.push(`fix ${v.FixAvailable.toLowerCase()}`);\n for (const p of v.VulnerablePackages ?? []) {\n let pkg = `${p.Name ?? ''}@${p.Version ?? ''}`;\n if (p.FixedInVersion) pkg += ` (fixed in ${p.FixedInVersion})`;\n parts.push(pkg);\n }\n return parts.join('; ');\n })\n .join('\\n');\n}\n\n/** Summarizes the installed vs patched package for a Trivy CVE finding. */\nfunction trivyMessage(f: AsffFinding): string {\n const o = f.Resources?.[0]?.Details?.Other;\n if (!o || !o['CVE ID']) return '';\n const patched = o['Patched Package'];\n const patchMsg = patched\n ? `The package has been patched since version(s): ${patched}.`\n : 'There is no patched version of the package.';\n return `For package ${o['PkgName']}, the current version that is installed is ${o['Installed Package']}. ${patchMsg}`;\n}\n\nfunction buildRequirement(id: string, group: AsffFinding[]): EvaluatedRequirement {\n const primary = group[0]!;\n const impact = Math.max(...group.map(findingImpact));\n\n const descData = productOf(primary) === 'prowler' ? ' ' : (primary.Description ?? primary.Title ?? '');\n const descriptions: Description[] = [{ label: 'default', data: descData }];\n const fix = remediationText(primary);\n if (fix) descriptions.push({ label: 'fix', data: fix });\n\n const nist = nistTags(group);\n const tags = nist.length > 0 ? buildNistCciTags(nist, nistToCci(nist)) : {};\n\n const results = group.map(buildResult);\n\n const req = createRequirement(id, primary.Title ?? '', descriptions, impact, results, {\n tags,\n }) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n const refs: { url: string }[] = [];\n if (primary.SourceUrl) refs.push({ url: primary.SourceUrl });\n const seen = new Set<string>();\n for (const v of primary.Vulnerabilities ?? []) {\n for (const u of v.ReferenceUrls ?? []) {\n if (u && !seen.has(u)) {\n seen.add(u);\n refs.push({ url: u });\n }\n }\n }\n if (refs.length > 0) req.refs = refs;\n return req;\n}\n\nfunction buildBaseline(\n name: string,\n findings: AsffFinding[],\n resultsChecksum: HDFResults['baselines'][number]['resultsChecksum']\n): EvaluatedBaseline {\n const order: string[] = [];\n const groups = new Map<string, AsffFinding[]>();\n for (const f of findings) {\n const id = controlId(f);\n const existing = groups.get(id);\n if (existing) {\n existing.push(f);\n } else {\n order.push(id);\n groups.set(id, [f]);\n }\n }\n\n const requirements = order.map((id) => buildRequirement(id, groups.get(id)!));\n return createMinimalBaseline(name, requirements, { resultsChecksum }) as EvaluatedBaseline;\n}\n\n/** Converts an ASFF document to HDF Results JSON. */\nexport async function convertAsffToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('asff: empty input');\n }\n validateInputSize(input, 'asff');\n\n const findings = parseFindings(input);\n const resultsChecksum = await inputChecksum(input);\n\n const order: string[] = [];\n const byBaseline = new Map<string, AsffFinding[]>();\n const accounts: string[] = [];\n const seenAccount = new Set<string>();\n for (const f of findings) {\n const name = baselineName(f);\n const existing = byBaseline.get(name);\n if (existing) {\n existing.push(f);\n } else {\n order.push(name);\n byBaseline.set(name, [f]);\n }\n if (f.AwsAccountId && !seenAccount.has(f.AwsAccountId)) {\n seenAccount.add(f.AwsAccountId);\n accounts.push(f.AwsAccountId);\n }\n }\n\n let baselines = order.map((name) => buildBaseline(name, byBaseline.get(name)!, resultsChecksum));\n\n if (baselines.length === 0) {\n baselines = [\n createMinimalBaseline(\n 'AWS Security Finding Format',\n [\n buildNoFindingsRequirement(\n 'asff-no-findings',\n 'AWS Security Finding Format input contained zero findings.',\n new Date()\n ),\n ],\n { resultsChecksum }\n ) as EvaluatedBaseline,\n ];\n }\n\n const hdf: HDFResults = {\n baselines,\n generator: { name: 'asff-to-hdf', version: converterVersion },\n tool: { name: 'AWS Security Finding Format', format: 'JSON' },\n timestamp: new Date(),\n };\n\n if (accounts.length > 0) {\n const refs = baselines.map((b) => b.name);\n hdf.components = accounts.map(\n (acct): Component => ({ name: acct, type: TargetType.CloudAccount, baselineRefs: refs })\n );\n }\n\n return serializeHdf(hdf);\n}\n","import { parseJSON, parsePurl } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, extractCWEIDs, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type { EvaluatedBaseline, EvaluatedRequirement, RequirementResult, Checksum, Description } from '@mitre/hdf-schema';\nimport { ResultStatus, VerificationMethodEnum, createMinimalBaseline, createRequirement, createDescription, createResult } from '@mitre/hdf-schema';\n\n// --- SARIF 2.1.0 type definitions ---\n\ninterface SarifFile {\n $schema?: string;\n version: string;\n runs: SarifRun[];\n}\n\ninterface SarifRun {\n tool?: {\n driver?: SarifDriver;\n };\n results: SarifResult[];\n taxonomies?: SarifTaxonomy[];\n}\n\ninterface SarifDriver {\n name?: string;\n version?: string;\n informationUri?: string;\n rules?: ReportingDescriptor[];\n}\n\ninterface ReportingDescriptor {\n id: string;\n name?: string;\n shortDescription?: MultiformatMessage;\n fullDescription?: MultiformatMessage;\n helpUri?: string;\n help?: MultiformatMessage;\n defaultConfiguration?: ReportingConfiguration;\n relationships?: ReportingDescriptorRelation[];\n properties?: Record<string, unknown>;\n messageStrings?: Record<string, MultiformatMessage>;\n}\n\ninterface MultiformatMessage {\n text: string;\n markdown?: string;\n}\n\ninterface ReportingConfiguration {\n level?: string;\n}\n\ninterface ReportingDescriptorRelation {\n target: DescriptorReference;\n kinds?: string[];\n}\n\ninterface DescriptorReference {\n id: string;\n guid?: string;\n toolComponent?: ToolComponentReference;\n}\n\ninterface ToolComponentReference {\n name: string;\n guid?: string;\n}\n\ninterface SarifTaxonomy {\n name: string;\n version?: string;\n organization?: string;\n taxa?: ReportingDescriptor[];\n}\n\ninterface SarifResult {\n ruleId: string;\n ruleIndex?: number;\n kind?: string;\n level?: string;\n message: {\n text?: string;\n id?: string;\n arguments?: string[];\n };\n locations?: SarifLocation[];\n relatedLocations?: SarifLocation[];\n suppressions?: Suppression[];\n fixes?: Fix[];\n codeFlows?: CodeFlow[];\n fingerprints?: Record<string, string>;\n partialFingerprints?: Record<string, string>;\n /** SCA-SARIF property-bag carrying package identity. Populated by\n * SCA tools (Grype, Trivy, Dependency-Check); empty for SAST. */\n properties?: {\n purl?: string;\n cpe?: string;\n packageName?: string;\n packageVersion?: string;\n name?: string;\n version?: string;\n ecosystem?: string;\n fixedInVersion?: string;\n } & Record<string, unknown>;\n}\n\ninterface Suppression {\n kind: string;\n status?: string;\n justification?: string;\n}\n\ninterface Fix {\n description?: {\n text: string;\n };\n}\n\ninterface CodeFlow {\n threadFlows: ThreadFlow[];\n}\n\ninterface ThreadFlow {\n locations: ThreadFlowLocation[];\n}\n\ninterface ThreadFlowLocation {\n location: SarifLocation;\n importance?: string;\n}\n\ninterface SarifLocation {\n id?: number;\n physicalLocation?: {\n artifactLocation?: {\n uri?: string;\n };\n region?: {\n startLine?: number;\n startColumn?: number;\n endLine?: number;\n endColumn?: number;\n snippet?: {\n text: string;\n };\n };\n };\n message?: {\n text: string;\n };\n}\n\n// --- Impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n error: 0.7,\n warning: 0.5,\n note: 0.3,\n};\n\n// --- Conversion entry point ---\n\nexport async function convertSarifToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'sarif');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const sarif = parseJSON<SarifFile>(input);\n\n if (!sarif || typeof sarif !== 'object') {\n throw new Error('Invalid SARIF structure: not a valid JSON object');\n }\n\n if (!Array.isArray(sarif.runs)) {\n throw new Error('Invalid SARIF structure: missing or invalid runs field');\n }\n\n const firstDriver = sarif.runs[0]?.tool?.driver;\n\n const { items: limitedRuns, truncated: truncatedRuns } = limitArray(sarif.runs);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRuns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRuns.length} run items (original: ${sarif.runs.length})`);\n }\n\n const timestamp = new Date();\n\n return buildHdfResults({\n generatorName: 'sarif-to-hdf',\n converterVersion,\n toolName: firstDriver?.name,\n toolVersion: firstDriver?.version,\n toolFormat: 'SARIF',\n baselines: limitedRuns.map(run => convertRun(run, sarif.version, resultsChecksum, timestamp)),\n timestamp,\n });\n}\n\n// --- Run-level conversion ---\n\nfunction convertRun(run: SarifRun, version: string, resultsChecksum: Checksum, timestamp: Date): EvaluatedBaseline {\n const ruleMap = buildRuleMap(run);\n\n // Group SARIF results by ruleId — each group becomes one EvaluatedRequirement.\n // When ruleId is absent, fall back to message text as the grouping key.\n const { items: limitedResults, truncated: truncatedResults } = limitArray(run.results);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedResults) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedResults.length} result items (original: ${run.results.length})`);\n }\n const groupOrder: string[] = [];\n const groupMap = new Map<string, { rule?: ReportingDescriptor; results: SarifResult[] }>();\n for (const result of limitedResults) {\n const groupKey = result.ruleId || resolveMessageText(result.message, undefined);\n let group = groupMap.get(groupKey);\n if (!group) {\n const rule = ruleMap.get(result.ruleId);\n group = { rule, results: [] };\n groupMap.set(groupKey, group);\n groupOrder.push(groupKey);\n }\n group.results.push(result);\n }\n\n const requirements = groupOrder.map(ruleId => {\n const group = groupMap.get(ruleId)!;\n return convertResultGroup(ruleId, group.rule, group.results);\n });\n\n // Use tool name for baseline name if available\n const baselineName = run.tool?.driver?.name || 'SARIF';\n\n if (requirements.length === 0) {\n const driverName = run.tool?.driver?.name?.trim() || '';\n const target = driverName || 'SARIF analyzer';\n const idPrefix = driverName || 'sarif';\n requirements.push(buildNoFindingsRequirement(\n `${idPrefix}-no-findings`,\n `${target} ran and reported zero findings.`,\n timestamp,\n ));\n }\n\n return createMinimalBaseline(baselineName, requirements, {\n version,\n title: 'Static Analysis Results Interchange Format',\n resultsChecksum,\n });\n}\n\nfunction buildRuleMap(run: SarifRun): Map<string, ReportingDescriptor> {\n const map = new Map<string, ReportingDescriptor>();\n if (run.tool?.driver?.rules) {\n for (const rule of run.tool.driver.rules) {\n map.set(rule.id, rule);\n }\n }\n return map;\n}\n\n// --- Result-group conversion (one EvaluatedRequirement per ruleId) ---\n\nfunction convertResultGroup(ruleId: string, rule: ReportingDescriptor | undefined, sarifResults: SarifResult[]): EvaluatedRequirement {\n const firstResult = sarifResults[0]!;\n\n // Derive requirement-level metadata from the rule and first result\n const { title, description } = deriveMetadata(firstResult, rule);\n\n // Extract CWE IDs from rule (or first result message as fallback)\n let cweIds = extractCweFromRule(rule);\n if (cweIds.length === 0) {\n cweIds = extractCweIds(resolveMessageText(firstResult.message, rule));\n }\n\n const nistControls = mapCWEToNIST(cweIds, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciControls = nistToCci(nistControls);\n\n // Determine requirement-level impact from the rule's inherent severity\n const ruleLevel = resolveRuleLevel(rule, sarifResults);\n const impact = IMPACT_MAPPING[ruleLevel] || 0.1;\n\n // Source location from first result's first location\n const sourceLocation = firstResult.locations && firstResult.locations.length > 0\n ? extractSourceLocation(firstResult.locations[0]!)\n : undefined;\n\n // Convert each SARIF result into RequirementResult(s)\n const results: RequirementResult[] = [];\n for (const sr of sarifResults) {\n results.push(...convertSarifResultToHDFResults(sr));\n }\n\n // Build descriptions from rule metadata and first result\n const descriptions = buildDescriptions(description, rule, firstResult);\n\n // Build tags\n const tags = buildTags(firstResult, rule, ruleLevel, cweIds, nistControls, cciControls);\n\n const options: {\n sourceLocation?: { ref: string; line: number };\n tags: Record<string, unknown>;\n } = { tags };\n\n if (sourceLocation) {\n options.sourceLocation = sourceLocation;\n }\n\n const req = createRequirement(ruleId, title, descriptions, impact, results, options);\n const controlType = deriveControlTypeFromTags(nistControls);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n // SCA-shaped SARIF (Grype, Trivy, Dependency-Check) carries package\n // identity in result.properties. Pure SAST results have empty\n // properties → no affectedPackage. We dedupe by purl/cpe/name@version\n // across the grouped results since SCA tools sometimes emit one\n // SARIF result per occurrence.\n const seenKeys = new Set<string>();\n const packages = [];\n for (const sr of sarifResults) {\n const pkg = packageFromSarifProperties(sr.properties);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n packages.push(pkg);\n }\n if (packages.length > 0) {\n (req as EvaluatedRequirement).affectedPackages = packages;\n }\n return req;\n}\n\n/**\n * Extract an Affected_Package from a SARIF result.properties bag.\n * Recognizes the SCA-tool convention of carrying purl / cpe /\n * packageName+packageVersion / name+version. Returns undefined for\n * SAST results that lack any package identity.\n */\nfunction packageFromSarifProperties(props: SarifResult['properties']): ReturnType<typeof buildAffectedPackage> {\n if (!props) return undefined;\n const name = props.packageName ?? props.name;\n const version = props.packageVersion ?? props.version;\n let ecosystem: Ecosystem | undefined;\n if (props.purl) {\n const parsed = parsePurl(props.purl);\n ecosystem = ecosystemFromPurlType(parsed?.type);\n } else if (props.ecosystem) {\n ecosystem = ecosystemFromPurlType(props.ecosystem);\n } else if (name && version) {\n ecosystem = Ecosystem.Generic;\n }\n return buildAffectedPackage({\n name,\n version,\n ecosystem,\n purl: props.purl,\n cpe: props.cpe,\n fixedInVersion: props.fixedInVersion,\n });\n}\n\n// Determines the inherent severity level for a rule, independent of per-result kind overrides.\nfunction resolveRuleLevel(rule: ReportingDescriptor | undefined, results: SarifResult[]): string {\n if (rule?.defaultConfiguration?.level) {\n return rule.defaultConfiguration.level;\n }\n // Find first result that represents a failure with an explicit level\n for (const r of results) {\n if (!r.kind || r.kind === 'fail') {\n if (r.level) {\n return r.level;\n }\n }\n }\n return 'warning';\n}\n\n// Converts a single SARIF result into one or more HDF RequirementResults.\nfunction convertSarifResultToHDFResults(result: SarifResult): RequirementResult[] {\n // Map kind to HDF status\n let status = mapKindToStatus(result.kind);\n\n // Handle suppressions\n let suppressionJustification = '';\n if (status === ResultStatus.Failed || status === ResultStatus.Passed) {\n const suppResult = applySuppression(result.suppressions);\n if (suppResult.suppressed) {\n status = ResultStatus.NotReviewed;\n suppressionJustification = suppResult.justification;\n }\n }\n\n // Build backtrace from code flows\n const backtrace = extractBacktrace(result.codeFlows);\n\n // Create results for each location\n const results = (result.locations || [])\n .filter(loc => loc.physicalLocation?.artifactLocation?.uri)\n .map(loc => createHDFResult(loc, status, backtrace, suppressionJustification));\n\n // If no locations, create a location-less result so the finding isn't silently dropped\n if (results.length === 0) {\n const locationlessResult: RequirementResult = {\n status,\n codeDesc: 'No source location',\n startTime: new Date(),\n };\n if (backtrace.length > 0) {\n locationlessResult.backtrace = backtrace;\n }\n if (suppressionJustification) {\n locationlessResult.message = `Suppressed: ${suppressionJustification}`;\n }\n results.push(locationlessResult);\n }\n\n return results;\n}\n\n// --- Message resolution ---\n\nfunction resolveMessageText(msg: SarifResult['message'], rule?: ReportingDescriptor): string {\n if (msg?.text) {\n return msg.text;\n }\n if (msg?.id && rule) {\n const tmpl = rule.messageStrings?.[msg.id];\n if (tmpl) {\n let text = tmpl.text;\n for (const [i, arg] of (msg.arguments ?? []).entries()) {\n text = text.split(`{${i}}`).join(arg);\n }\n return text;\n }\n }\n return '';\n}\n\n// --- Metadata derivation ---\n\nfunction deriveMetadata(result: SarifResult, rule?: ReportingDescriptor): { title: string; description: string } {\n const messageText = resolveMessageText(result.message, rule);\n if (rule?.name) {\n return { title: rule.name, description: messageText };\n }\n if (rule?.shortDescription?.text) {\n return { title: rule.shortDescription.text, description: messageText };\n }\n return parseMessage(messageText);\n}\n\nfunction parseMessage(text: string): { title: string; description: string } {\n const colonIndex = (text ?? '').indexOf(':');\n if (colonIndex === -1) {\n return { title: text, description: '' };\n }\n return {\n title: text.substring(0, colonIndex).trim(),\n description: text.substring(colonIndex + 1).trim(),\n };\n}\n\n// --- CWE extraction with priority ---\n\nfunction extractCweFromRule(rule?: ReportingDescriptor): string[] {\n if (!rule) {\n return [];\n }\n\n // Priority 1: rule.relationships where toolComponent.name == \"CWE\"\n if (rule.relationships) {\n const cweIds: string[] = [];\n for (const rel of rule.relationships) {\n if (rel.target.toolComponent?.name?.toLowerCase() === 'cwe') {\n const id = rel.target.id.startsWith('CWE-') ? rel.target.id : `CWE-${rel.target.id}`;\n cweIds.push(id);\n }\n }\n if (cweIds.length > 0) {\n return cweIds;\n }\n }\n\n // Priority 2: CWE identifiers embedded in rule.properties.tags. CodeQL writes\n // them as taxonomy paths (\"external/cwe/cwe-022\"), so match anywhere in the\n // tag rather than requiring the whole tag to be a bare CWE id.\n if (rule.properties?.tags && Array.isArray(rule.properties.tags)) {\n const cweIds: string[] = [];\n for (const tag of rule.properties.tags as string[]) {\n if (typeof tag !== 'string') continue;\n cweIds.push(...extractCWEIDs(tag).map(id => `CWE-${id}`));\n }\n if (cweIds.length > 0) {\n return cweIds;\n }\n }\n\n return [];\n}\n\nfunction extractCweIds(text: string): string[] {\n return extractCWEIDs(text).map(id => `CWE-${id}`);\n}\n\n// --- Kind → Status mapping ---\n\nfunction mapKindToStatus(kind?: string): ResultStatus {\n switch (kind) {\n case 'pass':\n return ResultStatus.Passed;\n case 'open':\n return ResultStatus.Failed;\n case 'review':\n return ResultStatus.NotReviewed;\n case 'informational':\n return ResultStatus.NotApplicable;\n case 'notApplicable':\n return ResultStatus.NotApplicable;\n default: // \"fail\" or undefined\n return ResultStatus.Failed;\n }\n}\n\n// --- Suppression handling ---\n\nfunction applySuppression(suppressions?: Suppression[]): { suppressed: boolean; justification: string } {\n if (!suppressions || suppressions.length === 0) {\n return { suppressed: false, justification: '' };\n }\n\n const justifications: string[] = [];\n let hasSuppression = false;\n\n for (const s of suppressions) {\n if (s.status === 'rejected') {\n continue;\n }\n hasSuppression = true;\n if (s.justification) {\n justifications.push(s.justification);\n }\n }\n\n if (!hasSuppression) {\n return { suppressed: false, justification: '' };\n }\n\n return { suppressed: true, justification: justifications.join('; ') };\n}\n\n// --- Code flow → backtrace ---\n\nfunction extractBacktrace(codeFlows?: CodeFlow[]): string[] {\n if (!codeFlows || codeFlows.length === 0) {\n return [];\n }\n\n const backtrace: string[] = [];\n for (const cf of codeFlows) {\n for (const tf of cf.threadFlows) {\n for (const tfl of tf.locations) {\n const loc = tfl.location;\n const uri = loc.physicalLocation?.artifactLocation?.uri || '';\n const line = loc.physicalLocation?.region?.startLine || 0;\n const msg = loc.message?.text || '';\n\n let entry = `${uri}:${line}`;\n if (msg) {\n entry = `${uri}:${line} - ${msg}`;\n }\n backtrace.push(entry);\n }\n }\n }\n\n return backtrace;\n}\n\n// --- Description building ---\n\nfunction buildDescriptions(defaultDesc: string, rule: ReportingDescriptor | undefined, result: SarifResult): Description[] {\n const descriptions: Description[] = [\n createDescription('default', defaultDesc),\n ];\n\n if (rule) {\n if (rule.fullDescription?.text) {\n descriptions.push(createDescription('rationale', rule.fullDescription.text));\n } else if (rule.shortDescription?.text && !defaultDesc) {\n descriptions[0] = createDescription('default', rule.shortDescription.text);\n }\n\n if (rule.help?.text) {\n descriptions.push(createDescription('check', rule.help.text));\n }\n }\n\n if (result.fixes && result.fixes.length > 0 && result.fixes[0]?.description?.text) {\n descriptions.push(createDescription('fix', result.fixes[0].description.text));\n }\n\n return descriptions;\n}\n\n// --- Tag building ---\n\nfunction buildTags(\n result: SarifResult,\n rule: ReportingDescriptor | undefined,\n resolvedLevel: string,\n cweIds: string[],\n nistControls: string[],\n cciControls: string[]\n): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n severity: resolvedLevel,\n cwe: cweIds,\n nist: nistControls,\n cci: cciControls,\n };\n\n if (result.kind) {\n tags.kind = result.kind;\n }\n\n if (rule?.helpUri) {\n tags.helpUri = rule.helpUri;\n }\n\n if (result.suppressions && result.suppressions.length > 0) {\n tags.suppressions = result.suppressions.map(s => {\n const entry: Record<string, string> = { kind: s.kind };\n if (s.status) {\n entry.status = s.status;\n }\n if (s.justification) {\n entry.justification = s.justification;\n }\n return entry;\n });\n }\n\n if ((result.fingerprints && Object.keys(result.fingerprints).length > 0) ||\n (result.partialFingerprints && Object.keys(result.partialFingerprints).length > 0)) {\n const fp: Record<string, unknown> = {};\n if (result.fingerprints && Object.keys(result.fingerprints).length > 0) {\n fp.fingerprints = result.fingerprints;\n }\n if (result.partialFingerprints && Object.keys(result.partialFingerprints).length > 0) {\n fp.partialFingerprints = result.partialFingerprints;\n }\n tags.fingerprints = fp;\n }\n\n return tags;\n}\n\n// --- Location helpers ---\n\nfunction extractSourceLocation(location: SarifLocation): { ref: string; line: number } | undefined {\n const uri = location.physicalLocation?.artifactLocation?.uri;\n const line = location.physicalLocation?.region?.startLine;\n\n if (!uri || !line) {\n return undefined;\n }\n\n return { ref: uri, line };\n}\n\nfunction createHDFResult(\n location: SarifLocation,\n status: ResultStatus,\n backtrace: string[],\n suppressionMessage?: string\n): RequirementResult {\n const uri = location.physicalLocation?.artifactLocation?.uri || '';\n const line = location.physicalLocation?.region?.startLine || 0;\n const column = location.physicalLocation?.region?.startColumn || 0;\n const snippet = location.physicalLocation?.region?.snippet?.text;\n\n let codeDesc = `URL : ${uri} LINE : ${line} COLUMN : ${column}`;\n if (snippet) {\n codeDesc = `${codeDesc}\\n${snippet}`;\n }\n\n const result = createResult(status, undefined, {\n codeDesc,\n startTime: new Date(),\n });\n delete result.message;\n if (suppressionMessage) {\n result.message = `Suppressed: ${suppressionMessage}`;\n }\n if (backtrace.length > 0) {\n result.backtrace = backtrace;\n }\n return result;\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport { inputChecksum, limitArray, validateInputSize, buildHdfResults, buildNoFindingsRequirement, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n} from '@mitre/hdf-schema';\n\n// JUnit XML parsed types (from fast-xml-parser via parseXmlWithArrays)\n\ninterface JUnitTestSuites {\n testsuites?: {\n name?: string;\n testsuite?: JUnitTestSuite[];\n };\n testsuite?: JUnitTestSuite;\n}\n\ninterface JUnitTestSuite {\n name?: string;\n tests?: number;\n failures?: number;\n errors?: number;\n skipped?: number;\n time?: string;\n timestamp?: string;\n hostname?: string;\n testcase?: JUnitTestCase[];\n}\n\ninterface JUnitTestCase {\n classname?: string;\n name: string;\n time?: string;\n failure?: JUnitFailure;\n error?: JUnitError;\n skipped?: JUnitSkipped | '';\n}\n\ninterface JUnitFailure {\n message?: string;\n type?: string;\n '#text'?: string;\n}\n\ninterface JUnitError {\n message?: string;\n type?: string;\n '#text'?: string;\n}\n\ninterface JUnitSkipped {\n message?: string;\n}\n\nconst DEFAULT_NIST = ['SA-11'];\n\n/**\n * The shared XML parser runs with `processEntities: false` (XXE defense), so\n * character references reach us undecoded. Surefire escapes quotes and angle\n * brackets in failure messages, so decode them here.\n */\nfunction decodeXmlEntities(s: string): string {\n return s\n .replace(/&#x([0-9a-fA-F]+);/g, (_, hex: string) => String.fromCodePoint(parseInt(hex, 16)))\n .replace(/&#(\\d+);/g, (_, dec: string) => String.fromCodePoint(parseInt(dec, 10)))\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, '&');\n}\n\n// Tags to always parse as arrays (even when single element)\nconst ARRAY_TAGS = ['testsuite', 'testcase'];\n\n/**\n * Converts JUnit XML test results to HDF format.\n */\nexport async function convertJunitToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'junit');\n\n const { suites, name } = parseJUnitXML(input);\n const scanTime = resolveScanTime(suites);\n const requirements = buildRequirements(suites, scanTime);\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'junit-no-findings',\n `JUnit scanned ${noFindingsTarget(name, suites)} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const baseline = createMinimalBaseline(name, requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'junit-to-hdf',\n converterVersion,\n toolName: 'JUnit XML',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{\n type: TargetType.Application,\n name,\n }],\n timestamp: scanTime,\n });\n}\n\n// Computes one timestamp per conversion: the first available <testsuite> timestamp,\n// falling back to conversion time. Used for every result's startTime, the document\n// timestamp, and any no-findings placeholder.\nfunction resolveScanTime(suites: JUnitTestSuite[]): Date {\n for (const suite of suites) {\n if (suite.timestamp) {\n const parsed = parseTimestamp(suite.timestamp);\n if (parsed) {\n return parsed;\n }\n }\n }\n return new Date();\n}\n\nfunction parseJUnitXML(input: string): { suites: JUnitTestSuite[]; name: string } {\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS) as JUnitTestSuites;\n\n // <testsuites> root\n if (parsed.testsuites) {\n const suites = parsed.testsuites.testsuite ?? [];\n const name = parsed.testsuites.name ? decodeXmlEntities(parsed.testsuites.name) : 'JUnit Test Results';\n return { suites, name };\n }\n\n // <testsuite> root\n if (parsed.testsuite) {\n const suite = parsed.testsuite;\n // When testsuite is root, parseXmlWithArrays may return it directly\n // (not wrapped in an array since ARRAY_TAGS only forces arrays for child elements)\n const suites = Array.isArray(suite) ? (suite as JUnitTestSuite[]) : [suite];\n const suiteName = suites[0]?.name;\n const name = suiteName ? decodeXmlEntities(suiteName) : 'JUnit Test Results';\n return { suites, name };\n }\n\n throw new Error('Input is not a JUnit XML document: expected <testsuites> or <testsuite> root element');\n}\n\nfunction buildRequirements(suites: JUnitTestSuite[], scanTime: Date): EvaluatedRequirement[] {\n const { items: limitedSuites, truncated: truncatedSuites } = limitArray(suites);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedSuites) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedSuites.length} test suite items (original: ${suites.length})`);\n }\n const requirements: EvaluatedRequirement[] = [];\n\n for (const suite of limitedSuites) {\n const testcases = suite.testcase ?? [];\n const { items: limitedTestCases, truncated: truncatedTC } = limitArray(testcases);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedTC) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedTestCases.length} test case items (original: ${testcases.length})`);\n }\n for (const tc of limitedTestCases) {\n requirements.push(testCaseToRequirement(tc, scanTime));\n }\n }\n\n return requirements;\n}\n\nfunction testCaseToRequirement(\n tc: JUnitTestCase,\n scanTime: Date\n): EvaluatedRequirement {\n const id = buildID(tc);\n const { status, message } = resolveStatus(tc);\n const codeDesc = buildCodeDesc(tc);\n\n // A passing test has nothing to explain, so `message` stays absent rather\n // than an empty string.\n const result: RequirementResult = {\n status,\n codeDesc,\n startTime: scanTime,\n };\n if (message !== undefined) {\n result.message = message;\n }\n if (tc.time) {\n const parsed = parseFloat(tc.time);\n if (!isNaN(parsed)) {\n result.runTime = parsed;\n }\n }\n\n const name = decodeXmlEntities(tc.name);\n const descriptions: Description[] = [\n {\n label: 'default',\n data: `JUnit test: ${name} in ${tc.classname ? decodeXmlEntities(tc.classname) : 'unknown'}`,\n },\n ];\n\n const req = createRequirement(id, name, descriptions, 0.5, [result], {\n tags: { nist: DEFAULT_NIST },\n }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(DEFAULT_NIST);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\nfunction buildID(tc: JUnitTestCase): string {\n if (tc.classname) {\n return `${decodeXmlEntities(tc.classname)}.${decodeXmlEntities(tc.name)}`;\n }\n return decodeXmlEntities(tc.name);\n}\n\nfunction resolveStatus(tc: JUnitTestCase): { status: ResultStatus; message?: string } {\n if (tc.failure) {\n const msg = buildFailureMessage(\n tc.failure.message ?? '',\n tc.failure.type ?? '',\n tc.failure['#text'] ?? ''\n );\n return { status: ResultStatus.Failed, message: msg };\n }\n if (tc.error) {\n const msg = buildFailureMessage(\n tc.error.message ?? '',\n tc.error.type ?? '',\n tc.error['#text'] ?? ''\n );\n return { status: ResultStatus.Error, message: msg };\n }\n if (tc.skipped !== undefined) {\n const skipped = typeof tc.skipped === 'object' ? tc.skipped : null;\n if (skipped?.message) {\n return { status: ResultStatus.NotReviewed, message: `Skipped: ${decodeXmlEntities(skipped.message)}` };\n }\n return { status: ResultStatus.NotReviewed, message: 'Skipped' };\n }\n return { status: ResultStatus.Passed };\n}\n\nfunction buildFailureMessage(message: string, typeName: string, body: string): string {\n let result = '';\n if (typeName) {\n result = `${decodeXmlEntities(typeName)}: `;\n }\n result += decodeXmlEntities(message);\n if (body) {\n result += '\\n' + decodeXmlEntities(body);\n }\n return result;\n}\n\nfunction buildCodeDesc(tc: JUnitTestCase): string {\n if (tc.classname) {\n return `${decodeXmlEntities(tc.classname)} :: ${decodeXmlEntities(tc.name)}`;\n }\n return decodeXmlEntities(tc.name);\n}\n\nfunction noFindingsTarget(baselineName: string, suites: JUnitTestSuite[]): string {\n if (baselineName && baselineName !== 'JUnit Test Results') {\n return baselineName;\n }\n for (const s of suites) {\n if (s.name) return decodeXmlEntities(s.name);\n }\n return 'JUnit test suite';\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, inputIntegrity, limitArray, stripHTML, validateInputSize, serializeHdf } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n HDFBaseline,\n BaselineRequirement,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n RequirementGroup,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n Severity,\n createMinimalBaseline,\n createRequirement,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport { getCCINistMappings } from '@mitre/hdf-mappings';\n\n// ---------------------------------------------------------------------------\n// Parsed XCCDF types (post-fast-xml-parser with removeNSPrefix)\n// ---------------------------------------------------------------------------\n\ninterface XccdfBenchmark {\n Benchmark?: BenchmarkElement;\n}\n\ninterface BenchmarkElement {\n id?: string;\n title?: string | TextElement;\n description?: string | TextElement;\n version?: string | VersionElement;\n Group?: GroupElement[];\n Rule?: RuleElement[];\n Profile?: ProfileElement[];\n TestResult?: TestResultElement;\n 'plain-text'?: PlainText | PlainText[];\n}\n\ninterface TextElement {\n '#text'?: string;\n}\n\ninterface VersionElement {\n '#text'?: string;\n update?: string;\n}\n\ninterface PlainText {\n '#text'?: string;\n id?: string;\n}\n\ninterface ProfileElement {\n id?: string;\n title?: string | TextElement;\n}\n\n/**\n * An XCCDF Group. A Group may hold any number of Rules and may nest further\n * Groups — SCAP Security Guide content relies on both, so a Group must not be\n * treated as a flat, single-rule container.\n */\ninterface GroupElement {\n id?: string;\n title?: string | TextElement;\n Rule?: RuleElement[];\n Group?: GroupElement[];\n}\n\n/** A rule paired with the Group it was found in, at any depth. */\ninterface GroupedRule {\n rule: RuleElement;\n group: GroupElement;\n}\n\n/**\n * Map XCCDF's severity vocabulary (unknown|info|low|medium|high) onto HDF's\n * (critical|high|medium|low|informational). Casting the raw attribute straight to\n * Severity emitted schema-invalid documents, since XCCDF \"unknown\" and \"info\" are\n * not HDF severities.\n *\n * \"unknown\" states that severity was not determined. HDF cannot express that, so\n * emit no severity at all rather than assert \"informational\", which would silently\n * downgrade a rule whose severity is merely unstated.\n */\nfunction xccdfSeverityToHdf(severity: string): Severity | undefined {\n switch (severity.toLowerCase()) {\n case 'high':\n return Severity.High;\n case 'medium':\n return Severity.Medium;\n case 'low':\n return Severity.Low;\n case 'info':\n return Severity.Informational;\n default: // 'unknown', empty, or anything unrecognised\n return undefined;\n }\n}\n\n/**\n * Walk the Group tree depth-first, collecting every rule at any depth. Rules may\n * sit directly on a Group that also has nested Groups.\n */\nfunction flattenGroups(groups: GroupElement[]): GroupedRule[] {\n const out: GroupedRule[] = [];\n for (const group of groups) {\n for (const rule of group.Rule ?? []) {\n if (!rule.id) continue;\n out.push({ rule, group });\n }\n out.push(...flattenGroups(group.Group ?? []));\n }\n return out;\n}\n\ninterface RuleElement {\n id?: string;\n severity?: string;\n title?: string | TextElement;\n description?: string | TextElement;\n version?: string | VersionElement;\n fixtext?: string | FixtextElement;\n ident?: IdentElement[];\n check?: CheckElement | CheckElement[];\n}\n\ninterface CheckElement {\n system?: string;\n 'check-content'?: string | TextElement;\n}\n\ninterface FixtextElement {\n '#text'?: string;\n fixref?: string;\n}\n\ninterface IdentElement {\n '#text'?: string;\n system?: string;\n}\n\ninterface TestResultElement {\n id?: string;\n 'start-time'?: string;\n 'end-time'?: string;\n title?: string | TextElement;\n target?: string;\n 'target-address'?: string[];\n 'rule-result'?: RuleResultElement[];\n}\n\ninterface RuleResultElement {\n idref?: string;\n time?: string;\n severity?: string;\n version?: string;\n result?: string;\n ident?: IdentElement[];\n}\n\n// ---------------------------------------------------------------------------\n// Parsed ARF types (post-fast-xml-parser with removeNSPrefix)\n// ---------------------------------------------------------------------------\n\ninterface ArfParsed {\n 'asset-report-collection'?: ArfCollectionElement;\n}\n\ninterface ArfCollectionElement {\n relationships?: {\n relationship?: ArfRelationshipElement[];\n };\n 'report-requests'?: {\n 'report-request'?: ArfReportRequestElement[];\n };\n assets?: {\n asset?: ArfAssetElement[];\n };\n reports?: {\n report?: ArfReportElement[];\n };\n}\n\ninterface ArfRelationshipElement {\n type?: string;\n subject?: string;\n ref?: string[];\n}\n\ninterface ArfReportRequestElement {\n id?: string;\n content?: {\n 'data-stream-collection'?: {\n component?: ArfComponentElement[];\n 'data-stream'?: unknown[];\n };\n };\n}\n\ninterface ArfComponentElement {\n id?: string;\n Benchmark?: BenchmarkElement;\n}\n\ninterface ArfAssetElement {\n id?: string;\n 'computing-device'?: {\n connections?: {\n connection?: ArfConnectionElement[];\n };\n fqdn?: string;\n hostname?: string;\n };\n}\n\ninterface ArfConnectionElement {\n 'ip-address'?: {\n 'ip-v4'?: string;\n 'ip-v6'?: string;\n };\n 'mac-address'?: string;\n}\n\ninterface ArfReportElement {\n id?: string;\n content?: {\n TestResult?: TestResultElement;\n };\n}\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Tags that must always be parsed as arrays even if only one element exists. */\nconst ARRAY_TAGS = [\n 'Group',\n 'Rule',\n 'Profile',\n 'rule-result',\n 'ident',\n 'select',\n 'set-value',\n 'target-address',\n 'platform',\n 'check-content',\n // ARF-specific array tags\n 'report',\n 'report-request',\n 'asset',\n 'connection',\n 'relationship',\n 'ref',\n 'component',\n 'data-stream',\n];\n\n/** Map XCCDF result values to HDF ResultStatus. */\nconst STATUS_MAP: Record<string, ResultStatus> = {\n pass: ResultStatus.Passed,\n fail: ResultStatus.Failed,\n error: ResultStatus.Error,\n unknown: ResultStatus.Error,\n notapplicable: ResultStatus.NotApplicable,\n notchecked: ResultStatus.NotReviewed,\n notselected: ResultStatus.NotReviewed,\n informational: ResultStatus.NotReviewed,\n fixed: ResultStatus.Passed,\n};\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Converts an XCCDF results document (1.1 or 1.2) or ARF 1.1 XML to HDF Results JSON.\n * The input must contain TestResult elements.\n * For benchmark-only documents (no TestResult), use convertXccdfBenchmarkToHdf.\n *\n * @param input - Raw XML string (XCCDF Benchmark with TestResult, or ARF asset-report-collection)\n * @returns Stringified HDF Results JSON\n */\n\n// Parse an XCCDF start-time attribute, treating a present-but-invalid value the\n// same as missing: fall back to conversion time. An Invalid Date would later\n// throw in JSON.stringify (Date#toISOString RangeError).\nfunction parseStartTime(raw: string | undefined): Date {\n if (raw) {\n const t = parseTimestamp(raw);\n if (t) return t;\n }\n return new Date();\n}\n\nexport async function convertXccdfResultsToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf-results');\n\n // trimValues would strip each text node before the parser concatenates them, so\n // prose interrupted by an inline element (\"The <xhtml:code>x</xhtml:code> package\")\n // came back as \"Thepackage\". Keep the whitespace and let stripHTML collapse it, the\n // way the Go converter does when it strips tags from the raw element text.\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS, { trimValues: false });\n\n // Detect input format: ARF or raw XCCDF\n const arfParsed = parsed as ArfParsed;\n if (arfParsed['asset-report-collection']) {\n return convertArfCollection(arfParsed['asset-report-collection'], input, converterVersion);\n }\n\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF document: expected <Benchmark> root element'\n );\n }\n\n if (!benchmark.TestResult) {\n throw new Error(\n \"Input has no TestResult elements — this is a benchmark. Use 'xccdf-benchmark' or 'xccdf' instead\"\n );\n }\n\n return convertBenchmarkResultsToHdf(benchmark, input, converterVersion);\n}\n\n/**\n * Converts an XCCDF benchmark document (no TestResult) to HDF Baseline JSON.\n * Supports both XCCDF 1.1 and 1.2 (namespace-agnostic via fast-xml-parser).\n *\n * @param input - Raw XML string (XCCDF Benchmark without TestResult)\n * @returns Stringified HDF Baseline JSON\n */\nexport async function convertXccdfBenchmarkToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf-benchmark');\n\n // trimValues would strip each text node before the parser concatenates them, so\n // prose interrupted by an inline element (\"The <xhtml:code>x</xhtml:code> package\")\n // came back as \"Thepackage\". Keep the whitespace and let stripHTML collapse it, the\n // way the Go converter does when it strips tags from the raw element text.\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS, { trimValues: false });\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF Benchmark document'\n );\n }\n\n if (benchmark.TestResult) {\n throw new Error(\n \"Input contains TestResult elements — this is a results document, not a benchmark. Use 'xccdf-results' or 'xccdf' instead\"\n );\n }\n\n return convertBenchmarkToBaselineJson(benchmark, input, converterVersion);\n}\n\n/**\n * Auto-detects whether the input is an XCCDF benchmark, results, or ARF\n * document and returns the appropriate JSON output.\n *\n * @param input - Raw XML string\n * @returns Object with json output and outputType ('baseline' or 'results')\n */\nexport async function convertXccdfToHdf(input: string, converterVersion = '1.0.0'): Promise<{ json: string; outputType: 'baseline' | 'results' }> {\n if (!input || !input.trim()) {\n throw new Error('Empty input');\n }\n validateInputSize(input, 'xccdf');\n\n // trimValues would strip each text node before the parser concatenates them, so\n // prose interrupted by an inline element (\"The <xhtml:code>x</xhtml:code> package\")\n // came back as \"Thepackage\". Keep the whitespace and let stripHTML collapse it, the\n // way the Go converter does when it strips tags from the raw element text.\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS, { trimValues: false });\n\n // Check ARF first\n const arfParsed = parsed as ArfParsed;\n if (arfParsed['asset-report-collection']) {\n const json = await convertArfCollection(arfParsed['asset-report-collection'], input, converterVersion);\n return { json, outputType: 'results' };\n }\n\n // Check XCCDF Benchmark\n const xccdfParsed = parsed as XccdfBenchmark;\n const benchmark = xccdfParsed.Benchmark;\n if (!benchmark) {\n throw new Error(\n 'Input is not an XCCDF or ARF document'\n );\n }\n\n if (benchmark.TestResult) {\n const json = await convertBenchmarkResultsToHdf(benchmark, input, converterVersion);\n return { json, outputType: 'results' };\n }\n\n const json = await convertBenchmarkToBaselineJson(benchmark, input, converterVersion);\n return { json, outputType: 'baseline' };\n}\n\n// ---------------------------------------------------------------------------\n// XCCDF Benchmark results conversion (existing path)\n// ---------------------------------------------------------------------------\n\nasync function convertBenchmarkResultsToHdf(\n benchmark: BenchmarkElement,\n rawInput: string,\n converterVersion: string\n): Promise<string> {\n const testResult = benchmark.TestResult!;\n\n const ruleIndex = buildRuleIndex(benchmark);\n\n const ruleResults = testResult['rule-result'] ?? [];\n const { items: limitedRuleResults, truncated: truncatedRR } = limitArray(ruleResults);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRR) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRuleResults.length} rule-result items (original: ${ruleResults.length})`);\n }\n // The test result's start-time applies to every rule-result; fall back to\n // conversion time when absent or invalid (startTime is required on each result).\n const scanTime = parseStartTime(testResult['start-time']);\n\n const requirements = limitedRuleResults.map((rr) =>\n ruleResultToRequirement(rr, ruleIndex, scanTime)\n );\n\n if (requirements.length === 0) {\n const target = xccdfTargetName(testResult, benchmark);\n requirements.push(\n buildNoFindingsRequirement(\n 'xccdf-results-no-findings',\n `XCCDF scanned ${target} and reported zero findings.`,\n scanTime,\n ),\n );\n }\n\n const resultsChecksum: Checksum = await inputChecksum(rawInput);\n\n const baselineName = extractText(benchmark.title) || benchmark.id || '';\n\n // Assigned after createMinimalBaseline because that helper drops empty-string\n // options, while Go emits them (a benchmark with no description yields \"\").\n const baseline = createMinimalBaseline(\n baselineName,\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n baseline.title = baselineName;\n baseline.version = extractVersion(benchmark.version);\n baseline.status = 'loaded';\n baseline.summary = stripHTML(extractText(benchmark.description));\n\n const hdf: HDFResults = {\n baselines: [baseline],\n generator: { name: 'xccdf-results-to-hdf', version: converterVersion },\n tool: { name: 'XCCDF', format: 'XCCDF' },\n components: buildTargets(testResult),\n timestamp: scanTime,\n statistics: { duration: calculateDuration(testResult) },\n };\n\n return serializeHdf(hdf);\n}\n\n/** Seconds between the TestResult start-time and end-time; 0 when unavailable. */\nfunction calculateDuration(testResult: TestResultElement): number {\n const start = testResult['start-time'] ? parseTimestamp(testResult['start-time'])?.getTime() : undefined;\n const end = testResult['end-time'] ? parseTimestamp(testResult['end-time'])?.getTime() : undefined;\n if (start === undefined || end === undefined || end < start) {\n return 0;\n }\n return (end - start) / 1000;\n}\n\n// ---------------------------------------------------------------------------\n// Benchmark-to-Baseline conversion\n// ---------------------------------------------------------------------------\n\nasync function convertBenchmarkToBaselineJson(\n benchmark: BenchmarkElement,\n rawInput: string,\n converterVersion: string\n): Promise<string> {\n const integrity = await inputIntegrity(rawInput);\n\n const requirements: BaselineRequirement[] = [];\n const groups: RequirementGroup[] = [];\n\n // One RequirementGroup per XCCDF Group, carrying every rule found in it.\n const groupIndex = new Map<string, number>();\n for (const { rule, group } of flattenGroups(benchmark.Group ?? [])) {\n const req = ruleToBaselineRequirement(rule, group);\n requirements.push(req);\n\n const groupId = group.id ?? '';\n const existing = groupIndex.get(groupId);\n if (existing !== undefined) {\n groups[existing]!.requirements.push(req.id);\n continue;\n }\n groupIndex.set(groupId, groups.length);\n groups.push({\n id: groupId,\n title: extractText(group.title),\n requirements: [req.id],\n });\n }\n\n const topRules = benchmark.Rule ?? [];\n for (const rule of topRules) {\n if (!rule.id) {\n continue;\n }\n const req = ruleToBaselineRequirement(rule, undefined);\n requirements.push(req);\n }\n\n const baselineName = kebabCase(benchmark.id ?? 'xccdf-benchmark');\n\n const baseline: HDFBaseline = {\n name: baselineName,\n title: extractText(benchmark.title),\n version: extractVersion(benchmark.version),\n status: 'loaded',\n summary: stripHTML(extractText(benchmark.description)),\n integrity,\n requirements,\n groups,\n generator: { name: 'xccdf-results-to-hdf', version: converterVersion },\n };\n\n return serializeHdf(baseline);\n}\n\n/**\n * Convert a single XCCDF Rule to an HDF BaselineRequirement.\n */\nfunction ruleToBaselineRequirement(\n rule: RuleElement,\n group: GroupElement | undefined\n): BaselineRequirement {\n const id = extractRuleID(rule.id ?? '') || extractVersion(rule.version);\n // A title-less rule gets no title at all: an empty string is junk, and\n // synthesizing one from the id would invent data. Go omits it too.\n const title = extractText(rule.title) || undefined;\n const severity = (rule.severity ?? '').toLowerCase();\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n const descriptions: Description[] = [{\n label: 'default',\n data: stripHTML(extractVulnDiscussion(extractText(rule.description))),\n }];\n\n const check = selectCheck(rule.check);\n const checkContent = extractCheckContent(check);\n if (checkContent) {\n descriptions.push({ label: 'check', data: stripHTML(checkContent) });\n }\n\n const fixtext = extractFixtext(rule.fixtext);\n if (fixtext) {\n descriptions.push({ label: 'fix', data: stripHTML(fixtext) });\n }\n\n const tags = buildCciNistTags(extractCCIs(rule.ident ?? []));\n const nistTags = tags['nist'] as string[];\n\n // STIG-specific tags\n tags['rid'] = rule.id;\n tags['stig_id'] = extractVersion(rule.version);\n if (severity) {\n tags['severity'] = severity.toLowerCase();\n }\n if (check?.system) {\n tags['check_id'] = check.system;\n }\n const fixtextObj = rule.fixtext;\n if (fixtextObj && typeof fixtextObj !== 'string' && fixtextObj.fixref) {\n tags['fix_id'] = fixtextObj.fixref;\n }\n if (group) {\n tags['gid'] = group.id;\n tags['gtitle'] = extractText(group.title);\n }\n\n const req: BaselineRequirement = {\n id,\n title,\n impact,\n descriptions,\n tags,\n };\n\n const hdfSeverity = xccdfSeverityToHdf(severity);\n if (hdfSeverity) {\n req.severity = hdfSeverity;\n }\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n// ---------------------------------------------------------------------------\n// ARF conversion\n// ---------------------------------------------------------------------------\n\nasync function convertArfCollection(\n arc: ArfCollectionElement,\n rawInput: string,\n converterVersion: string\n): Promise<string> {\n const resultsChecksum: Checksum = await inputChecksum(rawInput);\n\n // Find the Benchmark from data-stream-collection components\n const benchmark = findBenchmarkInArf(arc);\n\n // Build rule index from Benchmark\n const ruleIndex = benchmark\n ? buildRuleIndex(benchmark)\n : new Map<string, RuleElement>();\n\n // Build asset metadata map: asset ID -> asset element\n const assetMap = new Map<string, ArfAssetElement>();\n for (const asset of arc.assets?.asset ?? []) {\n if (asset.id) {\n assetMap.set(asset.id, asset);\n }\n }\n\n // Build relationship map: report ID -> asset IDs (isAbout)\n const reportToAssets = new Map<string, string[]>();\n for (const rel of arc.relationships?.relationship ?? []) {\n if (rel.type?.includes('isAbout') && rel.subject) {\n reportToAssets.set(rel.subject, rel.ref ?? []);\n }\n }\n\n // Process each report\n const baselines: EvaluatedBaseline[] = [];\n const components: Component[] = [];\n let firstTimestamp: Date | undefined;\n let totalDuration = 0;\n\n for (const report of arc.reports?.report ?? []) {\n const testResult = report.content?.TestResult;\n // Skip non-XCCDF reports (e.g. OVAL)\n if (!testResult?.id) {\n continue;\n }\n\n // The test result's start-time applies to its rule-results; fall back to\n // conversion time when absent or invalid (startTime is required on each result).\n const scanTime = parseStartTime(testResult['start-time']);\n\n if (!firstTimestamp) {\n firstTimestamp = scanTime;\n }\n totalDuration += calculateDuration(testResult);\n\n // Convert rule-results\n const ruleResults = testResult['rule-result'] ?? [];\n const { items: limitedARFRuleResults, truncated: truncatedARFRR } = limitArray(ruleResults);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedARFRR) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedARFRuleResults.length} rule-result items (original: ${ruleResults.length})`);\n }\n const requirements = limitedARFRuleResults.map((rr) =>\n ruleResultToRequirement(rr, ruleIndex, scanTime)\n );\n\n if (requirements.length === 0) {\n const target = xccdfTargetName(testResult, benchmark);\n requirements.push(\n buildNoFindingsRequirement(\n 'xccdf-results-no-findings',\n `XCCDF scanned ${target} and reported zero findings.`,\n scanTime,\n ),\n );\n }\n\n // Baseline name from Benchmark title\n let baselineName = '';\n if (benchmark) {\n baselineName = extractText(benchmark.title) || benchmark.id || '';\n }\n if (!baselineName) {\n baselineName = extractText(testResult.title) || testResult.id || '';\n }\n\n const baseline = createMinimalBaseline(\n baselineName,\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n baseline.title = baselineName;\n baseline.status = 'loaded';\n if (benchmark) {\n baseline.version = extractVersion(benchmark.version);\n baseline.summary = stripHTML(extractText(benchmark.description));\n }\n baselines.push(baseline);\n\n // Build target from TestResult, then enrich with ARF asset metadata\n const reportTargets = buildTargets(testResult);\n const target = reportTargets[0];\n if (target && report.id) {\n const assetIds = reportToAssets.get(report.id) ?? [];\n for (const assetId of assetIds) {\n const asset = assetMap.get(assetId);\n if (asset) {\n enrichTargetWithAsset(target, asset);\n }\n }\n }\n components.push(...reportTargets);\n }\n\n if (baselines.length === 0) {\n throw new Error('ARF document contains no XCCDF TestResult reports');\n }\n\n const hdf: HDFResults = {\n baselines,\n generator: { name: 'xccdf-results-to-hdf', version: converterVersion },\n tool: { name: 'ARF', format: 'ARF' },\n components,\n timestamp: firstTimestamp ?? new Date(),\n statistics: { duration: totalDuration },\n };\n\n return serializeHdf(hdf);\n}\n\n/**\n * Find the XCCDF Benchmark embedded in an ARF data-stream-collection.\n */\nfunction findBenchmarkInArf(\n arc: ArfCollectionElement\n): BenchmarkElement | undefined {\n for (const req of arc['report-requests']?.['report-request'] ?? []) {\n const components =\n req.content?.['data-stream-collection']?.component ?? [];\n for (const comp of components) {\n if (comp.Benchmark?.id) {\n return comp.Benchmark;\n }\n }\n }\n return undefined;\n}\n\n/**\n * Enrich an HDF Component with metadata from an ARF asset element.\n */\nfunction enrichTargetWithAsset(\n target: Component,\n asset: ArfAssetElement\n): void {\n const cd = asset['computing-device'];\n if (!cd) {\n return;\n }\n\n if (cd.fqdn) {\n target.fqdn = cd.fqdn;\n }\n\n // Extract first non-loopback MAC address\n const connections = cd.connections?.connection ?? [];\n for (const conn of connections) {\n const mac = conn['mac-address'];\n if (mac && mac !== '00:00:00:00:00:00') {\n target.macAddress = mac;\n break;\n }\n }\n\n // If target has no IP yet, try ARF asset connections\n if (!target.ipAddress) {\n for (const conn of connections) {\n const ip = conn['ip-address'];\n if (ip?.['ip-v4']) {\n target.ipAddress = ip['ip-v4'];\n break;\n }\n if (ip?.['ip-v6']) {\n target.ipAddress = ip['ip-v6'];\n break;\n }\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Shared helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Builds an index of Rule elements keyed by their @id attribute.\n * Rules can appear directly under Benchmark or nested inside Group elements.\n */\nfunction buildRuleIndex(benchmark: BenchmarkElement): Map<string, RuleElement> {\n const index = new Map<string, RuleElement>();\n\n const topRules = benchmark.Rule ?? [];\n for (const rule of topRules) {\n if (rule.id) {\n index.set(rule.id, rule);\n }\n }\n\n for (const { rule } of flattenGroups(benchmark.Group ?? [])) {\n index.set(rule.id!, rule);\n }\n\n return index;\n}\n\n/**\n * Convert a single <rule-result> into an EvaluatedRequirement.\n */\nfunction ruleResultToRequirement(\n rr: RuleResultElement,\n ruleIndex: Map<string, RuleElement>,\n scanTime: Date\n): EvaluatedRequirement {\n const ruleId = rr.idref ?? '';\n const ruleDef = ruleIndex.get(ruleId);\n\n const id = ruleDef?.id ? extractRuleID(ruleDef.id) : ruleId;\n const title = extractText(ruleDef?.title) || ruleId;\n\n const severity = (rr.severity || ruleDef?.severity || '').toLowerCase();\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n const descriptions: Description[] = [{\n label: 'default',\n data: stripHTML(extractVulnDiscussion(extractText(ruleDef?.description))),\n }];\n const fixtext = extractFixtext(ruleDef?.fixtext);\n if (fixtext) {\n descriptions.push({ label: 'fix', data: stripHTML(fixtext) });\n }\n\n const xccdfResult = (rr.result ?? '').trim().toLowerCase();\n const status = STATUS_MAP[xccdfResult] ?? ResultStatus.Error;\n\n // Prefer each rule-result's own @time (per-finding evaluation time), matching\n // the Go converter; fall back to the TestResult-level start-time (scanTime).\n const perRuleTime = rr.time ? parseTimestamp(rr.time) : null;\n\n const result: RequirementResult = {\n status,\n codeDesc: `XCCDF rule ${ruleId}`,\n startTime: perRuleTime ?? scanTime,\n };\n\n const tags = buildCciNistTags(extractCCIs([...(rr.ident ?? []), ...(ruleDef?.ident ?? [])]));\n const nistTags = tags['nist'] as string[];\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n impact,\n [result],\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Pick the most specific identifier available for a no-findings codeDesc.\n * Falls back through TestResult target/title, benchmark title/id, then a generic phrase.\n */\nfunction xccdfTargetName(\n testResult: TestResultElement | undefined,\n benchmark: BenchmarkElement | undefined,\n): string {\n const tr = testResult ?? {};\n const target = (tr.target ?? '').trim();\n if (target) {\n return target;\n }\n const trTitle = extractText(tr.title).trim();\n if (trTitle) {\n return trTitle;\n }\n const benchTitle = extractText(benchmark?.title).trim();\n if (benchTitle) {\n return benchTitle;\n }\n const benchId = (benchmark?.id ?? '').trim();\n if (benchId) {\n return benchId;\n }\n return 'the target';\n}\n\n/**\n * Build Component array from TestResult metadata.\n */\nfunction buildTargets(testResult: TestResultElement): Component[] {\n const targetName = testResult.target;\n if (!targetName) {\n return [];\n }\n\n const addresses = testResult['target-address'] ?? [];\n const target: Component = {\n name: targetName,\n type: TargetType.Host,\n };\n\n if (addresses.length > 0) {\n target.ipAddress = addresses[0];\n }\n\n return [target];\n}\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n amp: '&',\n};\n\n// The shared XML parser runs with processEntities off as XXE defense-in-depth,\n// so character references arrive undecoded; Go's encoding/xml decodes them for\n// free. STIG fix texts rely on this (an entity-encoded \"<partition>\" must\n// become a real tag before stripHTML can drop it). Only predefined and numeric\n// references are decoded; document-defined entities stay untouched.\nfunction decodeXmlEntities(s: string): string {\n return s.replace(\n /&(?:#(\\d+)|#[xX]([0-9a-fA-F]+)|(lt|gt|quot|apos|amp));/g,\n (match, dec: string | undefined, hex: string | undefined, name: string | undefined) => {\n if (dec !== undefined) return String.fromCodePoint(Number.parseInt(dec, 10));\n if (hex !== undefined) return String.fromCodePoint(Number.parseInt(hex, 16));\n return name !== undefined ? NAMED_ENTITIES[name] ?? match : match;\n },\n );\n}\n\n/**\n * Extract plain text from a field that may be a string or {#text: string}.\n */\n/**\n * A rule can carry several <check> elements (SSG emits SCE, OVAL and OCIL for the\n * same rule). Go decodes <check> into one struct field, so encoding/xml overwrites\n * it and the last element wins; match that or the two languages disagree.\n */\n// checkPriority ranks XCCDF check systems. A rule can carry several <check>\n// elements (SSG emits SCE + OVAL + OCIL for one rule); ranking resolves it to a\n// single deterministic check instead of whichever the author placed last.\n// Automated engines win over the manual questionnaire: OVAL > SCE > OCIL > else.\nfunction checkPriority(system: string | undefined): number {\n const s = system ?? '';\n if (s.includes('oval.mitre.org')) return 0;\n if (s.includes('open-scap.org') || s.includes('/SCE')) return 1;\n if (s.includes('ocil')) return 2;\n return 3;\n}\n\n// selectCheck picks the preferred <check>: the automated OVAL check when\n// present, else SCE, else OCIL, else the first in document order (ties keep\n// document order). Mirrors the Go selectCheck for byte-identical parity.\nfunction selectCheck(check: CheckElement | CheckElement[] | undefined): CheckElement | undefined {\n if (check === undefined) return undefined;\n const checks = Array.isArray(check) ? check : [check];\n let best: CheckElement | undefined;\n let bestPri = Infinity;\n for (const c of checks) {\n const p = checkPriority(c.system);\n if (p < bestPri) {\n best = c;\n bestPri = p;\n }\n }\n return best;\n}\n\nfunction extractText(\n field: string | TextElement | VersionElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return decodeXmlEntities(field);\n }\n return decodeXmlEntities((field as TextElement)['#text'] ?? '');\n}\n\n/**\n * Extract version string from a version field.\n */\nfunction extractVersion(\n field: string | VersionElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return field;\n }\n return (field as VersionElement)['#text'] ?? '';\n}\n\n/**\n * Extract fixtext content from fixtext field.\n */\nfunction extractFixtext(\n field: string | FixtextElement | undefined\n): string {\n if (field === undefined || field === null) {\n return '';\n }\n if (typeof field === 'string') {\n return decodeXmlEntities(field);\n }\n return decodeXmlEntities((field as FixtextElement)['#text'] ?? '');\n}\n\n/**\n * Extract check-content text from a check element.\n */\nfunction extractCheckContent(\n check: CheckElement | undefined\n): string {\n if (!check) {\n return '';\n }\n const cc = check['check-content'];\n if (!cc) {\n return '';\n }\n if (typeof cc === 'string') {\n return decodeXmlEntities(cc);\n }\n // check-content is forced into an array by ARRAY_TAGS — handle both cases\n if (Array.isArray(cc)) {\n const first = (cc as unknown[])[0];\n if (typeof first === 'string') {\n return decodeXmlEntities(first);\n }\n if (first && typeof first === 'object' && '#text' in first) {\n return decodeXmlEntities((first as TextElement)['#text'] ?? '');\n }\n return '';\n }\n return decodeXmlEntities((cc as TextElement)['#text'] ?? '');\n}\n\n/**\n * Extract the VulnDiscussion text from an XCCDF description that contains\n * embedded XML like `<VulnDiscussion>...</VulnDiscussion>`. If no\n * VulnDiscussion tag is found, returns the original text.\n */\nfunction extractVulnDiscussion(description: string): string {\n const match = description.match(\n /<VulnDiscussion>([\\s\\S]*?)<\\/VulnDiscussion>/\n );\n return match ? match[1]! : description;\n}\n\n/**\n * Extract CCI identifiers from ident elements, deduplicated in first-seen order.\n */\nfunction extractCCIs(idents: IdentElement[]): string[] {\n const ccis = idents\n .filter((i) => (i.system ?? '').toLowerCase().includes('cci'))\n .map((i) => i['#text'] ?? '')\n .filter((v) => v.length > 0);\n return [...new Set(ccis)];\n}\n\n/**\n * Build the cci/nist tag pair. `nist` is always present (empty when there are no\n * CCIs) and sorted, matching Go's cci.CCIToNIST.\n */\nfunction buildCciNistTags(cciIds: string[]): Record<string, unknown> {\n if (cciIds.length === 0) {\n return { nist: [] };\n }\n const nist = [...new Set(cciIds.flatMap((c) => getCCINistMappings(c) ?? []))].sort();\n return { cci: cciIds, nist };\n}\n\n/**\n * Extract the vulnerability ID from an XCCDF Rule ID:\n * \"SV-254238r991589_rule\" and \"xccdf_mil.disa.stig_rule_SV-204393r603261_rule\"\n * both yield \"SV-254238\"/\"SV-204393\". Non-SV IDs pass through unchanged.\n */\nfunction extractRuleID(ruleID: string): string {\n const svIdx = ruleID.toUpperCase().indexOf('SV-');\n if (svIdx < 0) {\n return ruleID;\n }\n const digits = ruleID.slice(svIdx + 3);\n const revIdx = digits.indexOf('r');\n if (revIdx > 0) {\n return `SV-${digits.slice(0, revIdx)}`;\n }\n return `SV-${digits}`;\n}\n\n/**\n * Convert a string to kebab-case (e.g., \"MS_Windows_Server_2022_STIG\" -> \"ms-windows-server-2022-stig\").\n */\nfunction kebabCase(s: string): string {\n return s.toLowerCase().replace(/_/g, '-');\n}\n","import { ResultStatus } from '@mitre/hdf-schema';\nimport { CheckStatus } from './model.js';\n\nfunction normalizeKey(s: string): string {\n return s.toLowerCase().trim().split('_').join('').split(' ').join('');\n}\n\nconst STATUS_BY_KEY: Record<string, CheckStatus> = {\n open: CheckStatus.Open,\n notafinding: CheckStatus.NotAFinding,\n notreviewed: CheckStatus.NotReviewed,\n notapplicable: CheckStatus.NotApplicable,\n};\n\n/** Map any CKL/CKLB status spelling to the canonical CheckStatus. */\nexport function parseStatus(s: string | undefined): CheckStatus {\n return STATUS_BY_KEY[normalizeKey(s ?? '')] ?? CheckStatus.NotReviewed;\n}\n\n/** CKL (XML) spelling. */\nexport function statusToCkl(s: CheckStatus): string {\n return s || CheckStatus.NotReviewed;\n}\n\n/** CKLB (JSON) snake_case spelling. */\nexport function statusToCklb(s: CheckStatus): string {\n switch (s) {\n case CheckStatus.Open:\n return 'open';\n case CheckStatus.NotAFinding:\n return 'not_a_finding';\n case CheckStatus.NotApplicable:\n return 'not_applicable';\n default:\n return 'not_reviewed';\n }\n}\n\n/** Canonical status -> HDF Result_Status. */\nexport function statusToHdf(s: CheckStatus): ResultStatus {\n switch (s) {\n case CheckStatus.Open:\n return ResultStatus.Failed;\n case CheckStatus.NotAFinding:\n return ResultStatus.Passed;\n case CheckStatus.NotApplicable:\n return ResultStatus.NotApplicable;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/** HDF Result_Status -> canonical status (error -> Open). */\nexport function statusFromHdf(s: ResultStatus | undefined): CheckStatus {\n switch (s) {\n case ResultStatus.Passed:\n return CheckStatus.NotAFinding;\n case ResultStatus.Failed:\n case ResultStatus.Error:\n return CheckStatus.Open;\n case ResultStatus.NotApplicable:\n return CheckStatus.NotApplicable;\n default:\n return CheckStatus.NotReviewed;\n }\n}\n","import { parseXmlWithArrays, buildXml } from '@mitre/hdf-utilities';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { parseStatus, statusToCkl } from './status.js';\n\nconst ARRAY_TAGS = ['iSTIG', 'VULN', 'STIG_DATA', 'SI_DATA'];\n\n// attributeNamePrefix is set to a token none of our element keys use, so every\n// plain key renders as a child ELEMENT (with the hdf-utilities default of '',\n// fast-xml-parser would emit scalar leaves like STATUS/HOST_NAME as attributes,\n// producing malformed CKL).\nconst BUILD_OPTIONS = {\n attributeNamePrefix: '@_',\n textNodeName: '#text',\n ignoreAttributes: false,\n format: true,\n indentBy: '\\t',\n suppressEmptyNode: false,\n};\n\ninterface CklParsed {\n CHECKLIST?: {\n ASSET?: Record<string, unknown>;\n STIGS?: { iSTIG?: IStigEl[] };\n };\n}\ninterface IStigEl {\n STIG_INFO?: { SI_DATA?: { SID_NAME?: string; SID_DATA?: unknown }[] };\n VULN?: VulnEl[];\n}\ninterface VulnEl {\n STIG_DATA?: { VULN_ATTRIBUTE?: string; ATTRIBUTE_DATA?: unknown }[];\n STATUS?: string;\n FINDING_DETAILS?: unknown;\n COMMENTS?: unknown;\n SEVERITY_OVERRIDE?: unknown;\n SEVERITY_JUSTIFICATION?: unknown;\n}\n\nfunction str(v: unknown): string {\n return v === undefined || v === null ? '' : String(v);\n}\n\nconst VULN_ATTR_ORDER = [\n 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver', 'Rule_Title',\n 'Vuln_Discuss', 'IA_Controls', 'Check_Content', 'Fix_Text', 'False_Positives',\n 'False_Negatives', 'Documentable', 'Mitigations', 'Potential_Impact',\n 'Third_Party_Tools', 'Mitigation_Control', 'Responsibility',\n 'Security_Override_Guidance', 'Check_Content_Ref', 'Weight', 'Class', 'STIG_UUID',\n];\nconst CORE_VULN_ATTR = new Set([\n 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver', 'Rule_Title',\n 'Vuln_Discuss', 'Check_Content', 'Fix_Text', 'Weight', 'Class',\n]);\n\n/** Parse CKL XML into the format-neutral Checklist model. */\nexport function parseCkl(input: string): Checklist {\n // processEntities decodes XML entities (&lt; &gt; &amp; …) so CKL text matches\n // Go's encoding/xml (which decodes by default); without it, entity-encoded\n // markup like \"&lt;b&gt;\" survives and stripHTML in checklistToHdf can't act\n // on it — diverging from the Go output.\n const parsed = parseXmlWithArrays(input, ARRAY_TAGS, {\n processEntities: true,\n }) as CklParsed;\n const checklist = parsed.CHECKLIST;\n const istigs = checklist?.STIGS?.iSTIG;\n if (!checklist || !istigs || istigs.length === 0) {\n throw new Error('parse ckl: no <iSTIG> blocks found (not a CKL document?)');\n }\n\n const a = checklist.ASSET ?? {};\n const asset: Asset = {\n role: str(a['ROLE']),\n assetType: str(a['ASSET_TYPE']),\n marking: str(a['MARKING']),\n hostName: str(a['HOST_NAME']),\n hostIP: str(a['HOST_IP']),\n hostMAC: str(a['HOST_MAC']),\n hostFQDN: str(a['HOST_FQDN']),\n targetComment: str(a['TARGET_COMMENT']),\n techArea: str(a['TECH_AREA']),\n targetKey: str(a['TARGET_KEY']),\n webOrDatabase: str(a['WEB_OR_DATABASE']) === 'true',\n webDBSite: str(a['WEB_DB_SITE']),\n webDBInstance: str(a['WEB_DB_INSTANCE']),\n };\n\n const stigs: Stig[] = istigs.map((is, i) => {\n // An iSTIG with no rules would yield requirements: [] downstream, which\n // violates the HDF schema's requirements.minItems=1. Reject as malformed,\n // consistent with the no-<iSTIG> guard above.\n const vulns = is.VULN ?? [];\n if (vulns.length === 0) {\n throw new Error(`parse ckl: <iSTIG> block ${i + 1} contains no <VULN> rules`);\n }\n const si = is.STIG_INFO?.SI_DATA ?? [];\n const siVal = (name: string): string =>\n str(si.find((d) => d.SID_NAME === name)?.SID_DATA);\n return {\n stigID: siVal('stigid'),\n title: siVal('title'),\n version: siVal('version'),\n releaseInfo: siVal('releaseinfo'),\n uuid: siVal('uuid'),\n classification: siVal('classification'),\n vulns: vulns.map(cklVulnToModel),\n };\n });\n\n return { format: 'ckl', asset, stigs };\n}\n\nfunction cklVulnToModel(v: VulnEl): Vuln {\n const data = v.STIG_DATA ?? [];\n const attr = (name: string): string =>\n str(data.find((sd) => sd.VULN_ATTRIBUTE === name)?.ATTRIBUTE_DATA);\n const ccis: string[] = [];\n const extra: Record<string, string> = {};\n const promoted = new Set([\n 'CCI_REF', 'Vuln_Num', 'Severity', 'Group_Title', 'Rule_ID', 'Rule_Ver',\n 'Rule_Title', 'Vuln_Discuss', 'Check_Content', 'Fix_Text', 'Weight', 'Class',\n ]);\n for (const sd of data) {\n const name = sd.VULN_ATTRIBUTE ?? '';\n const val = str(sd.ATTRIBUTE_DATA);\n if (name === 'CCI_REF') {\n if (val) ccis.push(val);\n } else if (!promoted.has(name) && val) {\n extra[name] = val;\n }\n }\n return {\n vulnNum: attr('Vuln_Num'),\n ruleID: attr('Rule_ID'),\n ruleVer: attr('Rule_Ver'),\n groupTitle: attr('Group_Title'),\n severity: attr('Severity'),\n ruleTitle: attr('Rule_Title'),\n vulnDiscuss: attr('Vuln_Discuss'),\n checkContent: attr('Check_Content'),\n fixText: attr('Fix_Text'),\n weight: attr('Weight'),\n classification: attr('Class'),\n ccis,\n status: parseStatus(v.STATUS),\n findingDetails: str(v.FINDING_DETAILS),\n comments: str(v.COMMENTS),\n severityOverride: str(v.SEVERITY_OVERRIDE),\n severityJustification: str(v.SEVERITY_JUSTIFICATION),\n extra,\n };\n}\n\n/** Serialize the Checklist model to CKL XML (with declaration). */\nexport function serializeCkl(cl: Checklist): string {\n const xmlObj = {\n CHECKLIST: {\n ASSET: {\n ROLE: cl.asset.role || 'None',\n ASSET_TYPE: cl.asset.assetType || 'Computing',\n HOST_NAME: cl.asset.hostName ?? '',\n HOST_IP: cl.asset.hostIP ?? '',\n HOST_MAC: cl.asset.hostMAC ?? '',\n HOST_FQDN: cl.asset.hostFQDN ?? '',\n TARGET_COMMENT: cl.asset.targetComment ?? '',\n TECH_AREA: cl.asset.techArea ?? '',\n TARGET_KEY: cl.asset.targetKey ?? '',\n WEB_OR_DATABASE: cl.asset.webOrDatabase ? 'true' : 'false',\n WEB_DB_SITE: cl.asset.webDBSite ?? '',\n WEB_DB_INSTANCE: cl.asset.webDBInstance ?? '',\n },\n STIGS: {\n iSTIG: cl.stigs.map((s) => ({\n STIG_INFO: { SI_DATA: stigInfoSiData(s) },\n VULN: s.vulns.map(modelVulnToCkl),\n })),\n },\n },\n };\n const body = buildXml(xmlObj, BUILD_OPTIONS);\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${body}`;\n}\n\nfunction stigInfoSiData(s: Stig): { SID_NAME: string; SID_DATA: string }[] {\n return [\n { name: 'version', data: s.version },\n { name: 'classification', data: s.classification },\n { name: 'stigid', data: s.stigID },\n { name: 'releaseinfo', data: s.releaseInfo },\n { name: 'title', data: s.title },\n { name: 'uuid', data: s.uuid },\n ]\n .filter((p) => p.data)\n .map((p) => ({ SID_NAME: p.name, SID_DATA: p.data as string }));\n}\n\nfunction modelVulnToCkl(v: Vuln): {\n STIG_DATA: { VULN_ATTRIBUTE: string; ATTRIBUTE_DATA: string }[];\n STATUS: string;\n FINDING_DETAILS: string;\n COMMENTS: string;\n SEVERITY_OVERRIDE: string;\n SEVERITY_JUSTIFICATION: string;\n} {\n const typed: Record<string, string> = {\n Vuln_Num: v.vulnNum,\n Severity: v.severity ?? '',\n Group_Title: v.groupTitle ?? '',\n Rule_ID: v.ruleID ?? '',\n Rule_Ver: v.ruleVer ?? '',\n Rule_Title: v.ruleTitle ?? '',\n Vuln_Discuss: v.vulnDiscuss ?? '',\n Check_Content: v.checkContent ?? '',\n Fix_Text: v.fixText ?? '',\n Weight: v.weight || '10.0',\n Class: v.classification || 'Unclass',\n };\n const stigData: { VULN_ATTRIBUTE: string; ATTRIBUTE_DATA: string }[] = [];\n for (const name of VULN_ATTR_ORDER) {\n const val = typed[name] ?? v.extra?.[name] ?? '';\n if (!val && !CORE_VULN_ATTR.has(name)) continue;\n stigData.push({ VULN_ATTRIBUTE: name, ATTRIBUTE_DATA: val });\n }\n for (const cci of v.ccis) {\n stigData.push({ VULN_ATTRIBUTE: 'CCI_REF', ATTRIBUTE_DATA: cci });\n }\n return {\n STIG_DATA: stigData,\n STATUS: statusToCkl(v.status),\n FINDING_DETAILS: v.findingDetails ?? '',\n COMMENTS: v.comments ?? '',\n // STIG Viewer always writes these two, even empty; the Go serializer does too.\n SEVERITY_OVERRIDE: v.severityOverride ?? '',\n SEVERITY_JUSTIFICATION: v.severityJustification ?? '',\n };\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { parseStatus, statusToCklb } from './status.js';\n\ninterface CklbDoc {\n title?: string;\n cklb_version?: string;\n active?: boolean;\n mode?: number;\n has_path?: boolean;\n target_data?: CklbTarget;\n stigs?: CklbStig[];\n}\ninterface CklbTarget {\n target_type?: string;\n host_name?: string;\n ip_address?: string;\n mac_address?: string;\n fqdn?: string;\n comments?: string;\n role?: string;\n is_web_database?: boolean;\n technology_area?: string;\n web_db_site?: string;\n web_db_instance?: string;\n classification?: string;\n}\ninterface CklbStig {\n stig_name?: string;\n display_name?: string;\n stig_id?: string;\n release_info?: string;\n version?: string;\n uuid?: string;\n reference_identifier?: string;\n rules?: CklbRule[];\n}\ninterface CklbRule {\n group_id?: string;\n group_title?: string;\n rule_id?: string;\n rule_version?: string;\n rule_title?: string;\n severity?: string;\n weight?: string;\n check_content?: string;\n fix_text?: string;\n discussion?: string;\n classification?: string;\n ccis?: string[];\n legacy_ids?: string[];\n srg_id?: string;\n status?: string;\n comments?: string;\n finding_details?: string;\n third_party_tools?: string;\n}\n\n/** Parse CKLB JSON into the format-neutral Checklist model. */\nexport function parseCklb(input: string): Checklist {\n const doc = parseJSON<CklbDoc>(input);\n if (!doc || !Array.isArray(doc.stigs) || doc.stigs.length === 0) {\n throw new Error('parse cklb: no stigs[] found (not a CKLB document?)');\n }\n const t = doc.target_data ?? {};\n const asset: Asset = {\n role: nz(t.role),\n assetType: nz(t.target_type),\n hostName: nz(t.host_name),\n hostIP: nz(t.ip_address),\n hostMAC: nz(t.mac_address),\n hostFQDN: nz(t.fqdn),\n targetComment: nz(t.comments),\n webOrDatabase: t.is_web_database === true,\n webDBSite: nz(t.web_db_site),\n webDBInstance: nz(t.web_db_instance),\n techArea: nz(t.technology_area),\n classification: nz(t.classification),\n };\n\n const stigs: Stig[] = doc.stigs.map((s, i) => {\n // A stig with no rules would yield requirements: [] downstream, which\n // violates the HDF schema's requirements.minItems=1. Reject as malformed,\n // consistent with the empty-stigs[] guard above.\n const rules = s.rules ?? [];\n if (rules.length === 0) {\n throw new Error(`parse cklb: stigs[${i}] contains no rules[]`);\n }\n return {\n stigID: nz(s.stig_id),\n title: nz(s.stig_name) || nz(s.display_name),\n displayName: nz(s.display_name),\n version: nz(s.version),\n releaseInfo: nz(s.release_info),\n uuid: nz(s.uuid),\n referenceIdentifier: nz(s.reference_identifier),\n vulns: rules.map(cklbRuleToModel),\n };\n });\n\n return {\n format: 'cklb',\n cklbVersion: nz(doc.cklb_version),\n active: doc.active ?? false,\n hasPath: doc.has_path ?? false,\n mode: doc.mode ?? 0,\n asset,\n stigs,\n };\n}\n\n/** Coerce a possibly-null/non-string JSON value to string | undefined.\n * Real STIG Viewer CKLB output uses null for unset fields (e.g.\n * target_data.classification: null); the model expects string | undefined. */\nfunction nz(v: unknown): string | undefined {\n return typeof v === 'string' ? v : undefined;\n}\n\nfunction cklbRuleToModel(r: CklbRule): Vuln {\n const extra: Record<string, string> = {};\n if (r.third_party_tools) extra['Third_Party_Tools'] = r.third_party_tools;\n if (r.srg_id) extra['SRG_ID'] = r.srg_id;\n return {\n vulnNum: nz(r.group_id) ?? '',\n ruleID: nz(r.rule_id),\n ruleVer: nz(r.rule_version),\n groupID: nz(r.group_id),\n groupTitle: nz(r.group_title),\n severity: nz(r.severity),\n ruleTitle: nz(r.rule_title),\n vulnDiscuss: nz(r.discussion),\n checkContent: nz(r.check_content),\n fixText: nz(r.fix_text),\n weight: nz(r.weight),\n classification: nz(r.classification),\n ccis: Array.isArray(r.ccis) ? r.ccis.filter((c): c is string => typeof c === 'string') : [],\n legacyIDs: r.legacy_ids,\n status: parseStatus(r.status),\n findingDetails: nz(r.finding_details),\n comments: nz(r.comments),\n extra,\n };\n}\n\n/** Serialize the Checklist model to CKLB JSON. */\nexport function serializeCklb(cl: Checklist): string {\n const doc: CklbDoc & { active: boolean; has_path: boolean } = {\n title: cklbTitle(cl),\n cklb_version: cl.cklbVersion || '1.0',\n active: cl.active ?? false,\n // mode is omitempty in the Go struct — emit only when non-zero, in the same\n // key position (between active and has_path) for byte-for-byte parity.\n ...(cl.mode ? { mode: cl.mode } : {}),\n // has_path is a required top-level key in real STIG Viewer CKLB output;\n // the Go serializer always emits it, so emit it here for parity.\n has_path: cl.hasPath ?? false,\n target_data: {\n target_type: cl.asset.assetType || 'Computing',\n host_name: cl.asset.hostName ?? '',\n ip_address: cl.asset.hostIP ?? '',\n mac_address: cl.asset.hostMAC ?? '',\n fqdn: cl.asset.hostFQDN ?? '',\n comments: cl.asset.targetComment ?? '',\n role: cl.asset.role || 'None',\n is_web_database: cl.asset.webOrDatabase ?? false,\n technology_area: cl.asset.techArea ?? '',\n web_db_site: cl.asset.webDBSite ?? '',\n web_db_instance: cl.asset.webDBInstance ?? '',\n ...(cl.asset.classification ? { classification: cl.asset.classification } : {}),\n },\n stigs: cl.stigs.map((s) => ({\n stig_name: s.title ?? '',\n display_name: s.displayName || s.title || '',\n stig_id: s.stigID ?? '',\n release_info: s.releaseInfo ?? '',\n version: s.version ?? '',\n uuid: s.uuid ?? '',\n ...(s.referenceIdentifier ? { reference_identifier: s.referenceIdentifier } : {}),\n rules: s.vulns.map((v) => ({\n group_id: v.groupID || v.vulnNum,\n group_title: v.groupTitle ?? '',\n rule_id: v.ruleID ?? '',\n rule_version: v.ruleVer ?? '',\n rule_title: v.ruleTitle ?? '',\n severity: v.severity ?? '',\n weight: v.weight || '10.0',\n check_content: v.checkContent ?? '',\n fix_text: v.fixText ?? '',\n discussion: v.vulnDiscuss ?? '',\n ccis: v.ccis,\n ...(v.legacyIDs && v.legacyIDs.length ? { legacy_ids: v.legacyIDs } : {}),\n status: statusToCklb(v.status),\n comments: v.comments ?? '',\n finding_details: v.findingDetails ?? '',\n ...(v.extra?.['Third_Party_Tools'] ? { third_party_tools: v.extra['Third_Party_Tools'] } : {}),\n })),\n })),\n };\n return JSON.stringify(doc, null, 2);\n}\n\nfunction cklbTitle(cl: Checklist): string {\n return cl.stigs[0]?.title || 'STIG Checklist';\n}\n","import type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Component,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n Severity,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport { getCCINistMappings } from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, stripHTML } from '../converterutil.js';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { statusToHdf } from './status.js';\n\nconst CONVERTER_VERSION = '1.0.0';\n\n/**\n * Map the format-neutral Checklist model to an HDF Results object.\n * controlType is derived per-Vuln from CCI->NIST; verificationMethod and\n * applicability are omitted (the checklist format cannot substantiate them).\n * Original-format metadata is stashed in extensions/tags for round-trip.\n */\nexport function checklistToHdf(cl: Checklist, resultsChecksum: Checksum, generatorName: string): HDFResults {\n // Checklists carry no per-finding timestamp; use one conversion-time value\n // for every result's startTime and the document timestamp.\n const scanTime = new Date();\n const baselines = cl.stigs.map((s) => stigToBaseline(s, resultsChecksum, scanTime));\n\n const hdf: HDFResults = {\n baselines,\n generator: { name: generatorName, version: CONVERTER_VERSION },\n tool: { name: 'DISA STIG Viewer', format: cl.format === 'cklb' ? 'CKLB' : 'CKL' },\n timestamp: scanTime,\n };\n\n const component = assetToComponent(cl.asset);\n if (component) hdf.components = [component];\n\n const ext = rootExtensions(cl);\n if (Object.keys(ext).length > 0) hdf.extensions = ext;\n return hdf;\n}\n\nfunction stigToBaseline(s: Stig, resultsChecksum: Checksum, scanTime: Date): EvaluatedBaseline {\n const requirements = s.vulns.map((v) => vulnToRequirement(v, scanTime));\n const baseline = createMinimalBaseline('STIG Checklist Scan', requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n if (s.title) baseline.title = s.title;\n if (s.version) baseline.version = s.version;\n const ext = baselineExtensions(s);\n if (Object.keys(ext).length > 0) baseline.extensions = ext;\n return baseline;\n}\n\nfunction vulnToRequirement(v: Vuln, scanTime: Date): EvaluatedRequirement {\n const severity = (v.severity ?? '').toLowerCase();\n const impact = severity ? severityToImpact(severity) : 0.5;\n\n // stripHTML for parity with the Go mapping (CKL text can embed markup).\n const descriptions: Description[] = [\n { label: 'default', data: stripHTML(v.vulnDiscuss ?? '') },\n ];\n if (v.checkContent) descriptions.push({ label: 'check', data: stripHTML(v.checkContent) });\n if (v.fixText) descriptions.push({ label: 'fix', data: stripHTML(v.fixText) });\n\n const message = (v.findingDetails ?? '').trim();\n const result = createResult(statusToHdf(v.status), message, {\n codeDesc: `STIG rule ${v.ruleVer ?? ''}`,\n startTime: scanTime,\n });\n\n const tags: Record<string, unknown> = {};\n let nistTags: string[] = [];\n if (v.ccis.length > 0) {\n tags['cci'] = v.ccis;\n nistTags = [...new Set(v.ccis.flatMap((c) => getCCINistMappings(c) ?? []))].sort();\n tags['nist'] = nistTags;\n } else {\n tags['nist'] = [];\n }\n setIf(tags, 'rid', v.ruleID);\n setIf(tags, 'stig_id', v.ruleVer);\n setIf(tags, 'gtitle', v.groupTitle);\n setIf(tags, 'group_id', v.groupID);\n setIf(tags, 'weight', v.weight);\n // COMMENTS is a field of its own in CKL/CKLB. Merging it into the single HDF\n // message would make it indistinguishable from FINDING_DETAILS on export.\n setIf(tags, 'comments', v.comments);\n setIf(tags, 'severity', severity);\n if (v.legacyIDs && v.legacyIDs.length) tags['legacy_ids'] = v.legacyIDs;\n if (v.extra && Object.keys(v.extra).length > 0) tags['cklMetadata'] = { ...v.extra };\n\n const req = createRequirement(\n v.vulnNum,\n v.ruleTitle ?? v.vulnNum,\n descriptions,\n impact,\n [result],\n { tags }\n ) as EvaluatedRequirement;\n if (severity) req.severity = severity as Severity;\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) req.controlType = controlType;\n return req;\n}\n\nfunction assetToComponent(a: Asset): Component | undefined {\n if (!a.hostName && !a.hostIP && !a.hostFQDN) return undefined;\n // Name falls back to FQDN then IP so the component always has a usable\n // identity (a checklist may carry only HOST_IP / HOST_FQDN).\n const name = a.hostName || a.hostFQDN || a.hostIP || '';\n const c: Component = { name, type: TargetType.Host };\n // HOST_NAME is the short, OS-reported hostname; store it in the dedicated\n // field so it stays distinct from the Name display-fallback and from fqdn.\n if (a.hostName) c.hostname = a.hostName;\n if (a.hostIP) c.ipAddress = a.hostIP;\n if (a.hostFQDN) c.fqdn = a.hostFQDN;\n if (a.hostMAC) c.macAddress = a.hostMAC;\n return c;\n}\n\nfunction rootExtensions(cl: Checklist): Record<string, unknown> {\n const ext: Record<string, unknown> = { checklistFormat: cl.format || 'ckl' };\n if (cl.cklbVersion) ext['cklbVersion'] = cl.cklbVersion;\n // CKLB STIG Viewer document flags: stash only the non-default values so the\n // round-trip restores them (serializeCklb defaults the rest to false/0).\n if (cl.active) ext['cklbActive'] = true;\n if (cl.hasPath) ext['cklbHasPath'] = true;\n if (cl.mode) ext['cklbMode'] = cl.mode;\n const ax: Record<string, unknown> = {};\n setIf(ax, 'role', cl.asset.role);\n setIf(ax, 'assetType', cl.asset.assetType);\n setIf(ax, 'marking', cl.asset.marking);\n setIf(ax, 'targetKey', cl.asset.targetKey);\n setIf(ax, 'techArea', cl.asset.techArea);\n setIf(ax, 'targetComment', cl.asset.targetComment);\n setIf(ax, 'webDbSite', cl.asset.webDBSite);\n setIf(ax, 'webDbInstance', cl.asset.webDBInstance);\n setIf(ax, 'classification', cl.asset.classification);\n if (cl.asset.webOrDatabase) ax['webOrDatabase'] = true;\n if (Object.keys(ax).length > 0) ext['assetExtras'] = ax;\n return ext;\n}\n\nfunction baselineExtensions(s: Stig): Record<string, unknown> {\n const ext: Record<string, unknown> = {};\n setIf(ext, 'stigid', s.stigID);\n setIf(ext, 'uuid', s.uuid);\n setIf(ext, 'releaseInfo', s.releaseInfo);\n setIf(ext, 'displayName', s.displayName);\n setIf(ext, 'referenceIdentifier', s.referenceIdentifier);\n setIf(ext, 'classification', s.classification);\n return ext;\n}\n\nfunction setIf(m: Record<string, unknown>, key: string, val: string | undefined): void {\n if (val) m[key] = val;\n}\n","import { parseHdf } from '../converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Description,\n} from '@mitre/hdf-schema';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport { Asset, Checklist, Stig, Vuln } from './model.js';\nimport { statusFromHdf } from './status.js';\n\n/**\n * Map HDF Results back to the format-neutral Checklist model. When the HDF\n * carries checklist passthrough (extensions/tags from checklistToHdf), the\n * original fields are reproduced losslessly; otherwise required checklist\n * fields are synthesized best-effort so any HDF yields a valid checklist.\n */\nexport function hdfToChecklist(input: string): Checklist {\n const hdf = parseHdf<HDFResults>(input);\n if (!hdf || !Array.isArray(hdf.baselines) || hdf.baselines.length === 0) {\n throw new Error('hdf to checklist: HDF has no baselines');\n }\n\n const ext = (hdf.extensions ?? {}) as Record<string, unknown>;\n const format = strVal(ext, 'checklistFormat') || 'ckl';\n const cklbVersion = strVal(ext, 'cklbVersion');\n\n const asset = buildAsset(hdf, ext);\n const stigs = hdf.baselines.map(baselineToStig);\n\n return {\n format,\n cklbVersion: cklbVersion || undefined,\n active: boolVal(ext, 'cklbActive'),\n hasPath: boolVal(ext, 'cklbHasPath'),\n mode: numVal(ext, 'cklbMode'),\n asset,\n stigs,\n };\n}\n\nfunction buildAsset(hdf: HDFResults, ext: Record<string, unknown>): Asset {\n const asset: Asset = {};\n const comp = hdf.components?.[0];\n if (comp) {\n // Prefer the dedicated hostname. For HDF produced before hostname existed,\n // fall back to Name — but only when Name holds a real short name, not when\n // it merely mirrors the fqdn/ip fallback the old converter stored there\n // (which would fabricate a HOST_NAME the source never had).\n if (comp.hostname) {\n asset.hostName = comp.hostname;\n } else if (comp.name && comp.name !== comp.fqdn && comp.name !== comp.ipAddress) {\n asset.hostName = comp.name;\n }\n asset.hostIP = comp.ipAddress;\n asset.hostFQDN = comp.fqdn;\n asset.hostMAC = comp.macAddress;\n }\n const ax = ext['assetExtras'];\n if (ax && typeof ax === 'object') {\n const a = ax as Record<string, unknown>;\n asset.role = strVal(a, 'role');\n asset.assetType = strVal(a, 'assetType');\n asset.marking = strVal(a, 'marking');\n asset.targetKey = strVal(a, 'targetKey');\n asset.techArea = strVal(a, 'techArea');\n asset.targetComment = strVal(a, 'targetComment');\n asset.webDBSite = strVal(a, 'webDbSite');\n asset.webDBInstance = strVal(a, 'webDbInstance');\n asset.classification = strVal(a, 'classification');\n asset.webOrDatabase = a['webOrDatabase'] === true;\n }\n return asset;\n}\n\nfunction baselineToStig(bl: EvaluatedBaseline): Stig {\n const ext = (bl.extensions ?? {}) as Record<string, unknown>;\n const stigID = strVal(ext, 'stigid') || bl.title || '';\n return {\n stigID,\n title: bl.title,\n version: bl.version,\n uuid: strVal(ext, 'uuid'),\n releaseInfo: strVal(ext, 'releaseInfo'),\n displayName: strVal(ext, 'displayName'),\n referenceIdentifier: strVal(ext, 'referenceIdentifier'),\n classification: strVal(ext, 'classification'),\n vulns: bl.requirements.map(requirementToVuln),\n };\n}\n\nfunction requirementToVuln(req: EvaluatedRequirement): Vuln {\n const tags = (req.tags ?? {}) as Record<string, unknown>;\n const descs = req.descriptions ?? [];\n return {\n vulnNum: req.id,\n ruleID: strVal(tags, 'rid'),\n ruleVer: strVal(tags, 'stig_id'),\n groupID: strVal(tags, 'group_id') || req.id,\n groupTitle: strVal(tags, 'gtitle'),\n ruleTitle: req.title,\n weight: strVal(tags, 'weight'),\n severity: resolveSeverity(req, tags),\n vulnDiscuss: descData(descs, 'default'),\n checkContent: descData(descs, 'check'),\n fixText: descData(descs, 'fix'),\n ccis: resolveCcis(tags),\n legacyIDs: strSlice(tags, 'legacy_ids'),\n status: statusFromHdf(req.results?.[0]?.status),\n findingDetails: req.results?.[0]?.message,\n comments: strVal(tags, 'comments'),\n extra: extractCklMetadata(tags),\n };\n}\n\nfunction resolveSeverity(req: EvaluatedRequirement, tags: Record<string, unknown>): string {\n const tagSev = strVal(tags, 'severity');\n if (tagSev) return tagSev;\n if (req.severity) return String(req.severity).toLowerCase();\n const i = req.impact ?? 0;\n if (i >= 0.7) return 'high';\n if (i >= 0.4) return 'medium';\n if (i > 0) return 'low';\n return '';\n}\n\nfunction resolveCcis(tags: Record<string, unknown>): string[] {\n const direct = strSlice(tags, 'cci');\n if (direct.length > 0) return direct;\n const nist = strSlice(tags, 'nist');\n if (nist.length > 0) {\n const ccis = nistToCci(nist);\n if (ccis.length > 0) return ccis;\n }\n return [];\n}\n\nfunction extractCklMetadata(tags: Record<string, unknown>): Record<string, string> | undefined {\n const meta = tags['cklMetadata'];\n if (!meta || typeof meta !== 'object') return undefined;\n const out: Record<string, string> = {};\n for (const [k, v] of Object.entries(meta as Record<string, unknown>)) {\n if (typeof v === 'string') out[k] = v;\n }\n return Object.keys(out).length > 0 ? out : undefined;\n}\n\nfunction descData(descs: Description[], label: string): string {\n return descs.find((d) => d.label === label)?.data ?? '';\n}\n\nfunction strVal(m: Record<string, unknown>, key: string): string {\n const v = m[key];\n return typeof v === 'string' ? v : '';\n}\n\nfunction boolVal(m: Record<string, unknown>, key: string): boolean {\n return m[key] === true;\n}\n\nfunction numVal(m: Record<string, unknown>, key: string): number {\n const v = m[key];\n return typeof v === 'number' ? v : 0;\n}\n\nfunction strSlice(m: Record<string, unknown>, key: string): string[] {\n const v = m[key];\n if (Array.isArray(v)) return v.filter((e): e is string => typeof e === 'string');\n return [];\n}\n","import type { Checksum } from '@mitre/hdf-schema';\nimport { inputChecksum, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport { parseCkl, checklistToHdf } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert a DISA STIG Viewer .ckl document to HDF Results JSON.\n *\n * Parsing and the HDF mapping live in the shared checklist module. v3.2\n * classification: controlType is derived per-VULN from CCI->NIST;\n * verificationMethod and applicability are omitted (the checklist format\n * cannot substantiate them — see the Go package doc and build-converter\n * skill Step 4d).\n */\nexport async function convertCklToHdf(input: string): Promise<string> {\n validateInputSize(input, 'ckl-to-hdf');\n const resultsChecksum: Checksum = await inputChecksum(input);\n const checklist = parseCkl(input);\n return JSON.stringify(checklistToHdf(checklist, resultsChecksum, 'ckl-to-hdf'), null, 2);\n}\n","import type { Checksum } from '@mitre/hdf-schema';\nimport { inputChecksum, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport { parseCklb, checklistToHdf } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert a DISA STIG Viewer 3.x .cklb document to HDF Results JSON.\n *\n * Parsing and the HDF mapping live in the shared checklist module. v3.2\n * classification: controlType is derived per-rule from CCI->NIST;\n * verificationMethod and applicability are omitted (the checklist format\n * cannot substantiate them — see the Go package doc and build-converter\n * skill Step 4d).\n */\nexport async function convertCklbToHdf(input: string): Promise<string> {\n validateInputSize(input, 'cklb-to-hdf');\n const resultsChecksum: Checksum = await inputChecksum(input);\n const checklist = parseCklb(input);\n return JSON.stringify(checklistToHdf(checklist, resultsChecksum, 'cklb-to-hdf'), null, 2);\n}\n","import { hdfToChecklist, serializeCkl } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert HDF Results JSON into a DISA STIG Viewer checklist (.ckl XML).\n *\n * This is a thin wrapper over the shared checklist module, mirroring the\n * hdf-to-csv reverse converter. It produces a STIG Viewer 2.x .ckl from ANY\n * HDF: when the HDF carries checklist passthrough (extensions/tags written by\n * a prior ckl/cklb-to-hdf conversion) the original fields are reproduced\n * losslessly; otherwise the required checklist fields are synthesized\n * best-effort (id->Vuln_Num, nist->CCI reverse, status reverse) with safe\n * defaults. Mirrors heimdall2 PR #4841.\n *\n * @param input HDF Results JSON string\n * @returns CKL XML string (with the `<?xml ...?>` header)\n */\nexport function convertHdfToCkl(input: string): string {\n return serializeCkl(hdfToChecklist(input));\n}\n","import { hdfToChecklist, serializeCklb } from '../../../shared/typescript/checklist/index.js';\n\n/**\n * Convert HDF Results JSON into a DISA STIG Viewer 3.x checklist (.cklb, JSON).\n *\n * The HDF->checklist mapping and CKLB serialization live in the shared\n * checklist module; this converter is a thin wrapper. Any HDF input produces a\n * valid CKLB: when the HDF carries checklist passthrough (it originated from a\n * CKL/CKLB via the reverse converters), the original fields are reproduced\n * losslessly; otherwise the required checklist fields are synthesized\n * best-effort from the HDF requirements, tags, and results.\n *\n * @param input HDF Results JSON string\n * @returns CKLB JSON string\n */\nexport function convertHdfToCklb(input: string): string {\n return serializeCklb(hdfToChecklist(input));\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n Ecosystem,\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Snyk JSON output structures\n * See https://docs.snyk.io/snyk-cli/commands/test for the full schema.\n */\ninterface SnykReport {\n ok: boolean;\n vulnerabilities: SnykVuln[];\n dependencyCount?: number;\n org?: string;\n packageManager?: string;\n summary?: string;\n projectName?: string;\n path?: string;\n}\n\ninterface SnykVuln {\n id: string;\n title: string;\n description: string;\n severity: string;\n cvssScore?: number;\n CVSSv3?: string;\n identifiers: SnykIdentifiers;\n language?: string;\n packageName?: string;\n moduleName?: string;\n version?: string;\n from: string[];\n upgradePath?: unknown[];\n fixedIn?: string[];\n exploit?: string;\n}\n\ninterface SnykIdentifiers {\n CVE?: string[];\n CWE?: string[];\n GHSA?: string[];\n}\n\n/**\n * Formats the \"from\" array as a human-readable dependency path.\n */\nfunction formatDependencyPath(from: string[]): string {\n if (!from || from.length === 0) {\n return 'Unknown dependency path';\n }\n return `From: [ ${from.join(', ')} ]`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of vulnerabilities sharing an ID.\n */\n/**\n * Map Snyk's `packageManager` value to an Affected_Package ecosystem.\n * Snyk reports values that don't always match PURL types one-to-one\n * (pip → pypi, rubygems → gem, yarn → npm). Unknown managers fall back\n * to `generic`.\n */\nfunction ecosystemFromSnykPackageManager(pm: string | undefined): Ecosystem {\n if (!pm) return Ecosystem.Generic;\n const lower = pm.toLowerCase();\n if (lower === 'pip' || lower === 'pip3') return Ecosystem.Pypi;\n if (lower === 'rubygems' || lower === 'bundler') return Ecosystem.Gem;\n if (lower === 'yarn' || lower === 'npm') return Ecosystem.Npm;\n return ecosystemFromPurlType(lower);\n}\n\n/** Synthesize a `pkg:<type>/<name>@<version>` PURL when the ecosystem\n * maps cleanly. Returns undefined for `generic` so we don't emit a\n * fake `pkg:generic/...` PURL that downstream tools can't dereference. */\nfunction synthesizePurl(ecosystem: Ecosystem, name: string, version: string): string | undefined {\n if (ecosystem === Ecosystem.Generic) return undefined;\n return `pkg:${ecosystem}/${name}@${version}`;\n}\n\nfunction buildRequirement(vulnID: string, vulns: SnykVuln[], scanTime: Date, packageManager?: string): EvaluatedRequirement {\n const rep = vulns[0]!;\n const cweIDs = rep.identifiers.CWE ?? [];\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweid'] = cweIDs;\n }\n if (rep.identifiers.CVE && rep.identifiers.CVE.length > 0) {\n tags['cveid'] = rep.identifiers.CVE;\n }\n if (rep.identifiers.GHSA && rep.identifiers.GHSA.length > 0) {\n tags['ghsaid'] = rep.identifiers.GHSA;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.description },\n ];\n\n const results = vulns.map(vuln => {\n const result = createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatDependencyPath(vuln.from),\n startTime: scanTime,\n });\n delete result.message;\n return result;\n });\n\n const req = createRequirement(\n vulnID,\n rep.title,\n descriptions,\n severityToImpact(rep.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const name = rep.packageName ?? rep.moduleName;\n const version = rep.version;\n if (name && version) {\n const ecosystem = ecosystemFromSnykPackageManager(packageManager);\n const pkg = buildAffectedPackage({\n name,\n version,\n ecosystem,\n purl: synthesizePurl(ecosystem, name, version),\n fixedInVersion: rep.fixedIn?.[0],\n });\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n }\n\n return req;\n}\n\n/**\n * Converts a single Snyk project report to an HDF baseline.\n */\nfunction convertSingleProject(\n report: SnykReport,\n resultsChecksum: Checksum,\n scanTime: Date\n): EvaluatedBaseline {\n // Group vulnerabilities by ID, preserving insertion order\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(report.vulnerabilities);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${report.vulnerabilities.length})`);\n }\n const groups = new Map<string, SnykVuln[]>();\n for (const vuln of limitedVulns) {\n const existing = groups.get(vuln.id);\n if (existing) {\n existing.push(vuln);\n } else {\n groups.set(vuln.id, [vuln]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [vulnID, vulns] of groups) {\n requirements.push(buildRequirement(vulnID, vulns, scanTime, report.packageManager));\n }\n\n if (requirements.length === 0) {\n const target = report.projectName ?? report.path ?? 'project';\n requirements.push(\n buildNoFindingsRequirement(\n 'snyk-no-findings',\n `Snyk scanned ${target} and reported zero vulnerable components.`,\n scanTime,\n ),\n );\n }\n\n const title = `Snyk Project: ${report.projectName ?? ''} Snyk Path: ${report.path ?? ''}`;\n\n return createMinimalBaseline(\n 'Snyk Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: report.summary,\n }\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Snyk output to HDF format.\n * Accepts both native Snyk JSON and SARIF format — SARIF input is detected\n * automatically and delegated to the shared SARIF converter.\n * Handles both single-project (object) and multi-project (array) input.\n *\n * @param input - Snyk JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertSnykToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('snyk: empty input');\n }\n validateInputSize(input, 'snyk');\n\n // Detect format: if SARIF, delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input, converterVersion);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Snyk native JSON carries no scan timestamp, so use one conversion-time\n // value for every result's startTime and the document timestamp.\n const scanTime = new Date();\n\n const parsed = parseJSON<SnykReport | SnykReport[]>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('snyk: invalid JSON');\n }\n\n let baselines: EvaluatedBaseline[];\n let targetName: string;\n\n if (Array.isArray(parsed)) {\n // Multi-project output\n const { items: limitedProjects, truncated: truncatedProjects } = limitArray(parsed);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedProjects) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedProjects.length} project items (original: ${parsed.length})`);\n }\n baselines = limitedProjects.map(report => convertSingleProject(report, resultsChecksum, scanTime));\n targetName = limitedProjects[0]?.projectName ?? limitedProjects[0]?.path ?? '';\n } else {\n // Single project\n baselines = [convertSingleProject(parsed, resultsChecksum, scanTime)];\n targetName = parsed.projectName ?? parsed.path ?? '';\n }\n\n return buildHdfResults({\n generatorName: 'snyk-to-hdf',\n converterVersion,\n toolName: 'Snyk',\n toolFormat: 'JSON',\n baselines,\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: scanTime,\n });\n}\n","import {\n type AffectedPackage,\n type Checksum,\n TargetType,\n createMinimalBaseline,\n type Cvss,\n CVSSSeverity,\n Ecosystem,\n type Epss,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type Kev,\n type RequirementResult,\n ResultStatus,\n VerificationMethodEnum,\n Version as CvssVersion,\n} from '@mitre/hdf-schema';\nimport {nistToCci, DEFAULT_STATIC_ANALYSIS_NIST_TAGS} from '@mitre/hdf-mappings';\nimport {cvssScoreToSeverity, parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {inputChecksum, buildNistCciTags, buildNoFindingsRequirement, deriveControlTypeFromTags, limitArray, validateInputSize, buildHdfResults} from '../../../shared/typescript/converterutil.js';\n\n// Input types for Grype JSON\n\ninterface GrypeReport {\n descriptor: GrypeDescriptor;\n source: GrypeSource;\n distro?: GrypeDistro;\n matches: GrypeMatch[];\n ignoredMatches?: GrypeMatch[];\n}\n\ninterface GrypeDescriptor {\n name: string;\n version: string;\n timestamp?: string;\n configuration?: unknown;\n}\n\ninterface GrypeSource {\n target: {\n userInput: string;\n };\n}\n\ninterface GrypeDistro {\n name?: string;\n version?: string;\n idLike?: string[];\n}\n\ninterface GrypeMatch {\n vulnerability: GrypeVulnerability;\n relatedVulnerabilities?: GrypeRelatedVulnerability[];\n matchDetails: GrypeMatchDetail[];\n artifact: GrypeArtifact;\n}\n\ninterface GrypeVulnerability {\n id: string;\n dataSource?: string;\n namespace?: string;\n severity?: string;\n urls?: string[];\n description?: string;\n cvss?: GrypeCVSS[];\n fix?: GrypeFix;\n advisories?: unknown[];\n cwe?: string[];\n epss?: GrypeEpssEntry[];\n kev?: GrypeKev;\n}\n\ninterface GrypeEpssEntry {\n cve?: string;\n epss?: number;\n percentile?: number;\n date?: string;\n}\n\ninterface GrypeKev {\n inKev?: boolean;\n dateAdded?: string;\n dueDate?: string;\n notes?: string;\n}\n\ninterface GrypeRelatedVulnerability {\n id: string;\n dataSource?: string;\n namespace?: string;\n severity?: string;\n urls?: string[];\n description?: string;\n cvss?: GrypeCVSS[];\n}\n\ninterface GrypeCVSS {\n source?: string;\n type?: string;\n version?: string;\n vector?: string;\n metrics?: {\n baseScore?: number;\n exploitabilityScore?: number;\n impactScore?: number;\n };\n vendorMetadata?: unknown;\n}\n\ninterface GrypeFix {\n versions?: string[];\n state?: string; // \"fixed\", \"unknown\", \"wontfix\", \"not-fixed\"\n}\n\ninterface GrypeMatchDetail {\n type?: string; // \"exact-direct-match\", \"exact-indirect-match\", \"cpe-match\"\n matcher?: string;\n searchedBy?: Record<string, unknown>;\n found?: Record<string, unknown>;\n}\n\ninterface GrypeArtifact {\n id?: string;\n name: string;\n version: string;\n type?: string; // \"apk\", \"rpm\", \"deb\", \"npm\", \"python\", etc.\n locations?: GrypeLocation[];\n licenses?: string[];\n language?: string;\n cpes?: string[];\n purl?: string;\n upstreams?: unknown[];\n metadata?: unknown;\n}\n\ninterface GrypeLocation {\n path?: string;\n layerID?: string;\n}\n\n// Severity to impact mapping\nconst IMPACT_MAPPING: Map<string, number> = new Map([\n ['critical', 0.9],\n ['high', 0.7],\n ['medium', 0.5],\n ['low', 0.3],\n ['negligible', 0.0],\n ['unknown', 0.5],\n]);\n\n\nfunction getImpact(severity?: string): number {\n if (!severity) {\n return 0.5; // default for unknown\n }\n return IMPACT_MAPPING.get(severity.toLowerCase()) ?? 0.5;\n}\n\nfunction isNegligibleOrUnknown(severity?: string): boolean {\n if (!severity) {\n return true;\n }\n const lower = severity.toLowerCase();\n return lower === 'negligible' || lower === 'unknown';\n}\n\nfunction getDescription(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string {\n // Use primary vulnerability description if available\n if (vuln.description) {\n return vuln.description;\n }\n\n // Fall back to related vulnerability with matching ID\n if (relatedVulns) {\n for (const related of relatedVulns) {\n if (related.id === vuln.id && related.description) {\n return related.description;\n }\n }\n }\n\n return `Vulnerability ${vuln.id}`;\n}\n\nfunction getFixInfo(fix?: GrypeFix): string {\n if (!fix || !fix.state) {\n return 'vulnerability is not known to be fixed in any versions';\n }\n\n if (fix.state === 'fixed' && fix.versions && fix.versions.length > 0) {\n return `vulnerability is ${fix.state} for versions ${fix.versions.join(', ')}`;\n }\n\n return `vulnerability is ${fix.state}`;\n}\n\nfunction getCVSSInfo(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string {\n const cvssData: Record<string, unknown> = {};\n\n // Collect CVSS from primary vulnerability\n if (vuln.cvss && vuln.cvss.length > 0) {\n cvssData.primary = vuln.cvss;\n }\n\n // Collect CVSS from related vulnerabilities\n const related = (relatedVulns ?? [])\n .filter(r => r.cvss && r.cvss.length > 0)\n .map(r => ({\n id: r.id,\n dataSource: r.dataSource,\n cvss: r.cvss,\n }));\n if (related.length > 0) {\n cvssData.related = related;\n }\n\n return JSON.stringify(cvssData);\n}\n\nfunction getReferences(vuln: GrypeVulnerability, relatedVulns?: GrypeRelatedVulnerability[]): string[] {\n const refs = new Set<string>();\n\n // Add URLs from primary vulnerability\n if (vuln.urls) {\n for (const url of vuln.urls) {\n refs.add(url);\n }\n }\n\n // Add URLs from related vulnerabilities\n if (relatedVulns) {\n for (const related of relatedVulns) {\n if (related.urls) {\n for (const url of related.urls) {\n refs.add(url);\n }\n }\n }\n }\n\n return Array.from(refs);\n}\n\nfunction buildCodeDesc(match: GrypeMatch): string {\n const parts: string[] = [];\n\n // Package info\n parts.push(`Package: ${match.artifact.name}@${match.artifact.version}`);\n\n // Package type if available\n if (match.artifact.type) {\n parts.push(`Type: ${match.artifact.type}`);\n }\n\n // Location if available\n if (match.artifact.locations && match.artifact.locations.length > 0) {\n const location = match.artifact.locations[0]!;\n if (location.path) {\n parts.push(`Location: ${location.path}`);\n }\n }\n\n // Match type if available\n if (match.matchDetails && match.matchDetails.length > 0) {\n const matchType = match.matchDetails[0]!.type;\n if (matchType) {\n parts.push(`Match Type: ${matchType}`);\n }\n }\n\n return parts.join(' | ');\n}\n\n// cvssVersionToSchema maps Grype's CVSS version string (\"2.0\"/\"3.0\"/\"3.1\"/\"4.0\")\n// to the schema Version enum. Unrecognized values default to \"3.1\".\nfunction cvssVersionToSchema(v?: string): CvssVersion {\n switch (v) {\n case '2.0': return CvssVersion.The20;\n case '3.0': return CvssVersion.The30;\n case '4.0': return CvssVersion.The40;\n default: return CvssVersion.The31;\n }\n}\n\n// cvssBandSeverity converts a CVSS base score to the schema CVSSSeverity enum\n// via hdf-utilities' band thresholds.\nfunction cvssBandSeverity(score: number): CVSSSeverity {\n switch (cvssScoreToSeverity(score)) {\n case 'critical': return CVSSSeverity.Critical;\n case 'high': return CVSSSeverity.High;\n case 'medium': return CVSSSeverity.Medium;\n case 'low': return CVSSSeverity.Low;\n default: return CVSSSeverity.None;\n }\n}\n\n// buildCvssEntries emits one schema Cvss entry per element of\n// vulnerability.cvss[]. Related-vulnerability CVSS arrays are NOT merged in;\n// the schema contract is \"one entry per source-CVE metric set\".\nfunction buildCvssEntries(vuln: GrypeVulnerability): Cvss[] | undefined {\n if (!vuln.cvss || vuln.cvss.length === 0) {\n return undefined;\n }\n const entries: Cvss[] = [];\n for (const c of vuln.cvss) {\n const entry: Cvss = {version: cvssVersionToSchema(c.version)};\n // Only emit base fields that are present: an empty baseVector fails the\n // schema pattern, and a missing baseScore must not be coerced to 0.\n if (c.vector) {\n entry.baseVector = c.vector;\n }\n const score = c.metrics?.baseScore;\n if (typeof score === 'number' && Number.isFinite(score)) {\n entry.baseScore = score;\n entry.baseSeverity = cvssBandSeverity(score);\n }\n if (vuln.id) {\n entry.source = vuln.id;\n }\n // An entry with neither vector nor score cannot satisfy the schema anyOf.\n if (entry.baseVector === undefined && entry.baseScore === undefined) {\n continue;\n }\n entries.push(entry);\n }\n return entries.length > 0 ? entries : undefined;\n}\n\n// mapGrypeTypeToEcosystem translates Grype artifact.type to schema Ecosystem.\n// Anything outside the schema's published enum (apk, binary, future types)\n// falls back to \"generic\".\nexport function mapGrypeTypeToEcosystem(grypeType?: string): Ecosystem {\n switch ((grypeType ?? '').toLowerCase()) {\n case 'rpm': return Ecosystem.RPM;\n case 'deb': return Ecosystem.Deb;\n case 'npm': return Ecosystem.Npm;\n case 'python': return Ecosystem.Pypi;\n case 'gem': return Ecosystem.Gem;\n case 'go-module': return Ecosystem.Go;\n case 'java-archive':\n case 'jenkins-plugin':\n return Ecosystem.Maven;\n case 'dotnet': return Ecosystem.Nuget;\n case 'rust-crate': return Ecosystem.Cargo;\n default: return Ecosystem.Generic;\n }\n}\n\n// buildAffectedPackages produces a single AffectedPackage from match.artifact.\n// First cpes[] element is taken (Grype lists alias-generator variants; the\n// first matches the package's canonical vendor:product identity).\nfunction buildAffectedPackages(match: GrypeMatch): AffectedPackage[] {\n const artifact = match.artifact;\n const pkg: AffectedPackage = {\n name: artifact.name,\n version: artifact.version,\n ecosystem: mapGrypeTypeToEcosystem(artifact.type),\n };\n if (artifact.cpes && artifact.cpes.length > 0 && artifact.cpes[0]) {\n pkg.cpe = artifact.cpes[0];\n }\n if (artifact.purl) {\n pkg.purl = artifact.purl;\n }\n const fix = match.vulnerability.fix;\n if (fix && fix.state === 'fixed' && fix.versions && fix.versions.length > 0 && fix.versions[0]) {\n pkg.fixedInVersion = fix.versions[0];\n }\n return [pkg];\n}\n\n// Valid canonical CWE-N identifier (MITRE catalog convention: no leading zeros).\nconst CWE_ID_PATTERN = /^CWE-[1-9]\\d*$/;\n\n// extractCwe filters Grype's vulnerability.cwe[] to valid CWE-N entries.\n// Malformed entries are dropped silently — the schema layer would reject them.\nfunction extractCwe(raw?: string[]): string[] | undefined {\n if (!raw || raw.length === 0) return undefined;\n const out = raw.filter(c => CWE_ID_PATTERN.test(c));\n return out.length === 0 ? undefined : out;\n}\n\n// buildEpss picks the most-recent entry from vulnerability.epss[]. Grype's\n// array is typically ordered newest-first; we trust that and take index 0.\nfunction buildEpss(entries?: GrypeEpssEntry[]): Epss | undefined {\n if (!entries || entries.length === 0) return undefined;\n const e = entries[0]!;\n if (!e.date) return undefined;\n return {\n score: e.epss ?? 0,\n percentile: e.percentile ?? 0,\n // format: date (YYYY-MM-DD) string; quicktype types it as Date.\n date: e.date as unknown as Date,\n };\n}\n\n// buildKev maps Grype's vulnerability.kev block to the schema Kev primitive.\nfunction buildKev(k?: GrypeKev): Kev | undefined {\n if (!k) return undefined;\n const out: Kev = {inKev: Boolean(k.inKev)};\n // format: date (YYYY-MM-DD) strings; quicktype types them as Date.\n if (k.dateAdded) out.dateAdded = k.dateAdded as unknown as Date;\n if (k.dueDate) out.dueDate = k.dueDate as unknown as Date;\n if (k.notes) out.notes = k.notes;\n return out;\n}\n\nfunction convertMatchToRequirement(match: GrypeMatch, isIgnored: boolean): EvaluatedRequirement {\n const vuln = match.vulnerability;\n const cveId = vuln.id;\n const severity = vuln.severity;\n const impact = getImpact(severity);\n const description = getDescription(vuln, match.relatedVulnerabilities);\n const fixInfo = getFixInfo(vuln.fix);\n const cvssInfo = getCVSSInfo(vuln, match.relatedVulnerabilities);\n const refs = getReferences(vuln, match.relatedVulnerabilities);\n\n // Determine status\n let status: ResultStatus;\n if (isIgnored) {\n status = ResultStatus.NotReviewed; // Ignored by configured rules\n } else if (isNegligibleOrUnknown(severity)) {\n status = ResultStatus.NotApplicable;\n } else {\n status = ResultStatus.Failed;\n }\n\n // Build result message\n const messageParts: string[] = [];\n if (isIgnored) {\n messageParts.push('This vulnerability was ignored by configured rules.');\n }\n if (isNegligibleOrUnknown(severity) && !isIgnored) {\n messageParts.push(\n 'Manual review required because a Grype rating severity is set to `negligible` or `unknown`.'\n );\n }\n messageParts.push(`Severity: ${severity || 'unknown'}`);\n messageParts.push(fixInfo);\n const message = messageParts.join(' ');\n\n // Build execution result\n const result: RequirementResult = {\n status,\n codeDesc: buildCodeDesc(match),\n message,\n startTime: new Date('0001-01-01T00:00:00Z'), // Go zero time format\n };\n\n // Get CCI mappings for NIST controls using curated mapping table\n const cciTags = nistToCci(DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n\n // Build tags object - only include cci if not empty\n const tags = buildNistCciTags(DEFAULT_STATIC_ANALYSIS_NIST_TAGS, cciTags);\n\n // Build requirement\n const requirement: EvaluatedRequirement = {\n id: isIgnored ? `Grype-Ignored-Match/${cveId}` : `Grype/${cveId}`,\n impact,\n results: [result],\n tags,\n descriptions: [\n {label: 'default', data: description},\n {label: 'fix', data: fixInfo},\n {label: 'check', data: cvssInfo},\n ],\n refs: refs.length > 0 ? refs.map(url => ({url})) : undefined,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n if (controlType !== undefined) {\n requirement.controlType = controlType;\n }\n\n // Structured CVE-ecosystem fields (omit when empty/absent so output stays\n // tight; the schema treats all five as optional).\n const cvss = buildCvssEntries(vuln);\n if (cvss) requirement.cvss = cvss;\n requirement.affectedPackages = buildAffectedPackages(match);\n const cwe = extractCwe(vuln.cwe);\n if (cwe) requirement.cwe = cwe;\n const epss = buildEpss(vuln.epss);\n if (epss) requirement.epss = epss;\n const kev = buildKev(vuln.kev);\n if (kev) requirement.kev = kev;\n\n return requirement;\n}\n\nexport async function convertGrypeToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'grype');\n // Calculate checksum of input data\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse Grype JSON\n const grypeData = parseJSON<GrypeReport>(input);\n\n // Build requirements from matches\n const requirements: EvaluatedRequirement[] = [];\n\n // Process regular matches\n if (grypeData.matches && grypeData.matches.length > 0) {\n const { items: limitedMatches, truncated: truncatedMatches } = limitArray(grypeData.matches);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedMatches) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedMatches.length} match items (original: ${grypeData.matches.length})`);\n }\n for (const match of limitedMatches) {\n requirements.push(convertMatchToRequirement(match, false));\n }\n }\n\n // Process ignored matches\n if (grypeData.ignoredMatches && grypeData.ignoredMatches.length > 0) {\n const { items: limitedIgnored, truncated: truncatedIgnored } = limitArray(grypeData.ignoredMatches);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIgnored) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIgnored.length} ignoredMatch items (original: ${grypeData.ignoredMatches.length})`);\n }\n for (const match of limitedIgnored) {\n requirements.push(convertMatchToRequirement(match, true));\n }\n }\n\n // Build baseline name from source\n const targetName = grypeData.source?.target?.userInput || 'Grype Scan';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'grype-no-findings',\n `Grype scanned ${targetName} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n // Create baseline\n const baseline: EvaluatedBaseline = createMinimalBaseline(targetName, requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n // Build HDF results\n return buildHdfResults({\n generatorName: 'grype-to-hdf',\n converterVersion,\n toolName: 'Grype',\n toolVersion: grypeData.descriptor?.version,\n baselines: [baseline],\n components: [{\n type: TargetType.Artifact,\n name: targetName,\n }],\n timestamp: (grypeData.descriptor?.timestamp ? parseTimestamp(grypeData.descriptor.timestamp) : null) ?? new Date(),\n });\n}\n","import { parseXmlWithArrays, cvssScoreToSeverity, parseTimestamp } from '@mitre/hdf-utilities';\nimport { getNessusNistControl, getCCINistMappings } from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, deriveVerificationMethod, inputChecksum, limitArray, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Component,\n Description,\n Reference,\n Checksum,\n Tool,\n Cvss,\n Epss,\n} from '@mitre/hdf-schema';\nimport { ResultStatus, TargetType, createMinimalBaseline, CVSSSeverity, Version as CvssVersion } from '@mitre/hdf-schema';\n\nconst CVE_SOURCE_RE = /^CVE-\\d{4}-\\d{4,}$/;\nconst CWE_PATTERN = /CWE[- ]?(\\d+)/gi;\n\ninterface NessusXml {\n NessusClientData_v2: {\n Policy: {\n policyName: string;\n Preferences?: {\n ServerPreferences?: {\n preference?: Array<{ name: string; value: string }>;\n };\n };\n };\n Report: {\n '@name'?: string;\n ReportHost: ReportHost[];\n };\n };\n}\n\ninterface ReportHost {\n name: string;\n HostProperties?: {\n tag?: HostPropertyTag[];\n };\n ReportItem?: ReportItem[];\n}\n\ninterface HostPropertyTag {\n name: string;\n '#text'?: string;\n}\n\ninterface ReportItem {\n port: string;\n svc_name: string;\n protocol: string;\n severity: string;\n pluginID: string;\n pluginName: string;\n pluginFamily: string;\n description?: string;\n fname?: string;\n plugin_modification_date?: string;\n plugin_name?: string;\n plugin_publication_date?: string;\n plugin_type?: string;\n risk_factor?: string;\n script_version?: string;\n see_also?: string;\n solution?: string;\n synopsis?: string;\n plugin_output?: string;\n cvss_base_score?: string;\n cvss3_base_score?: string;\n cve?: string | string[];\n // Structured CVSS fields (Wave 2: CVE-ecosystem)\n cvss_vector?: string;\n cvss3_vector?: string;\n cvss_temporal_vector?: string;\n cvss3_temporal_vector?: string;\n cvss_temporal_score?: string;\n cvss3_temporal_score?: string;\n cvss_score_source?: string;\n // EPSS (newer Tenable plugins emit these inline)\n epss_score?: string;\n epss_percentile?: string;\n // CWE references — Nessus sometimes emits multiple <cwe> elements\n cwe?: string | string[];\n // Compliance fields\n 'compliance-reference'?: string;\n 'compliance-check-name'?: string;\n 'compliance-info'?: string;\n 'compliance-solution'?: string;\n 'compliance-result'?: string;\n 'compliance-actual-value'?: string;\n}\n\n// Severity to impact mapping from heimdall2\nconst IMPACT_MAPPING: Record<string, number> = {\n '4': 0.9, // Critical\n '3': 0.7, // High\n 'i': 0.7,\n '2': 0.5, // Medium\n 'ii': 0.5,\n '1': 0.3, // Low\n 'iii': 0.3,\n '0': 0.0, // Info\n};\n\n/**\n * Strip HTML tags from a string\n */\nfunction parseHtml(html: string): string {\n return html.replace(/<[^>]*>/g, '').trim();\n}\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n amp: '&',\n};\n\n/**\n * Resolve XML predefined and numeric character references. The shared parser\n * runs with `processEntities: false` (XXE defense), which also leaves `&apos;`\n * and friends unresolved — so scan text would otherwise carry raw entity\n * markup into every title, description and message.\n */\nfunction decodeXmlEntities(text: string): string {\n return text.replace(/&(#x[0-9a-fA-F]+|#\\d+|[a-zA-Z]+);/g, (match, ref: string) => {\n if (ref.startsWith('#x') || ref.startsWith('#X')) {\n return String.fromCodePoint(Number.parseInt(ref.slice(2), 16));\n }\n if (ref.startsWith('#')) {\n return String.fromCodePoint(Number.parseInt(ref.slice(1), 10));\n }\n return NAMED_ENTITIES[ref] ?? match;\n });\n}\n\n/** Apply decodeXmlEntities to every string in a parsed XML document. */\nfunction decodeEntitiesDeep(value: unknown): unknown {\n if (typeof value === 'string') return decodeXmlEntities(value);\n if (Array.isArray(value)) return value.map(decodeEntitiesDeep);\n if (value !== null && typeof value === 'object') {\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n (value as Record<string, unknown>)[k] = decodeEntitiesDeep(v);\n }\n }\n return value;\n}\n\n/**\n * Convert Nessus XML scan results to HDF format\n */\nexport async function convertNessusToHdf(nessusXml: string, converterVersion = '1.0.0'): Promise<HDFResults> {\n validateInputSize(nessusXml, 'nessus');\n // Calculate checksum of source scan data for integrity verification\n const resultsChecksum: Checksum = await inputChecksum(nessusXml);\n\n const parsed = decodeEntitiesDeep(\n parseXmlWithArrays(nessusXml, ['preference', 'tag', 'ReportItem', 'ReportHost', 'cwe', 'cve']),\n ) as NessusXml;\n\n const policyName = parsed.NessusClientData_v2.Policy.policyName;\n const version = extractVersion(parsed);\n // parseXmlWithArrays ensures ReportHost is always an array\n const reportHosts = parsed.NessusClientData_v2.Report.ReportHost as ReportHost[];\n\n const { items: limitedHosts, truncated: truncatedHosts } = limitArray(reportHosts);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedHosts) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedHosts.length} ReportHost items (original: ${reportHosts.length})`);\n }\n\n // Calculate start and end times from first and last host\n const { startTime, duration } = calculateTiming(limitedHosts);\n\n const baselines: EvaluatedBaseline[] = [];\n const components: Component[] = [];\n\n // Process each ReportHost\n limitedHosts.forEach(host => {\n const baseline = convertReportHostToBaseline(host, policyName, version, resultsChecksum);\n baselines.push(baseline);\n\n const target = convertReportHostToTarget(host);\n components.push(target);\n });\n\n const tool: Tool = { name: 'Nessus' };\n\n const result: HDFResults = {\n baselines,\n components,\n statistics: {\n duration,\n },\n generator: {\n name: 'nessus-to-hdf',\n version: converterVersion,\n },\n tool,\n timestamp: startTime,\n };\n\n return result;\n}\n\nfunction extractVersion(parsed: NessusXml): string {\n const prefs = parsed.NessusClientData_v2.Policy.Preferences?.ServerPreferences?.preference;\n if (!prefs) return '';\n\n // parseXmlWithArrays ensures preference is always an array\n const scVersion = (prefs as Array<{ name: string; value: string }>).find(p => p.name === 'sc_version');\n return scVersion?.value || '';\n}\n\nfunction calculateTiming(hosts: ReportHost[]): { startTime: Date; endTime: Date; duration: number } {\n if (hosts.length === 0) {\n const now = new Date();\n return { startTime: now, endTime: now, duration: 0 };\n }\n\n const firstHost = hosts[0]!;\n const lastHost = hosts[hosts.length - 1]!;\n\n const startTimeStr = getHostPropertyValue(firstHost, 'HOST_START');\n const endTimeStr = getHostPropertyValue(lastHost, 'HOST_END') || getHostPropertyValue(lastHost, 'HOST_START');\n\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n const endTime = endTimeStr ? (parseTimestamp(endTimeStr) ?? startTime) : startTime;\n\n const duration = (endTime.getTime() - startTime.getTime()) / 1000; // seconds\n\n return { startTime, endTime, duration };\n}\n\nfunction getHostPropertyValue(host: ReportHost, name: string): string | undefined {\n const tags = host.HostProperties?.tag;\n if (!tags) return undefined;\n\n // parseXmlWithArrays ensures tag is always an array\n const tag = (tags as HostPropertyTag[]).find(t => t['name'] === name);\n return tag?.['#text'];\n}\n\nfunction convertReportHostToBaseline(\n host: ReportHost,\n policyName: string,\n version: string,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n const items = host.ReportItem;\n // parseXmlWithArrays ensures ReportItem is always an array\n let requirements: EvaluatedRequirement[];\n if (items) {\n const { items: limitedItems, truncated: truncatedItems } = limitArray(items as ReportItem[]);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedItems) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedItems.length} ReportItem items (original: ${(items as ReportItem[]).length})`);\n }\n requirements = limitedItems.map(item => convertReportItemToRequirement(item, host));\n } else {\n requirements = [];\n }\n\n if (requirements.length === 0) {\n const target = host.name || getHostPropertyValue(host, 'host-ip') || 'host';\n const startTimeStr = getHostPropertyValue(host, 'HOST_START');\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n requirements = [\n buildNoFindingsRequirement(\n 'nessus-no-findings',\n `Nessus scanned ${target} and reported zero findings.`,\n startTime,\n ),\n ];\n }\n\n return createMinimalBaseline(`Nessus ${policyName}`, requirements, {\n title: `Nessus ${policyName}`,\n version,\n resultsChecksum,\n status: 'loaded',\n summary: `Nessus ${policyName}`,\n });\n}\n\nfunction convertReportItemToRequirement(item: ReportItem, host: ReportHost): EvaluatedRequirement {\n const isCompliance = !!item['compliance-reference'];\n const id = isCompliance\n ? parseComplianceRef(item['compliance-reference']!, 'Vuln-ID')[0] || item['pluginID']\n : item['pluginID'];\n\n const title = isCompliance\n ? (item['compliance-check-name'] || item['pluginName'])\n : item['pluginName'];\n\n const descriptions = buildDescriptions(item, isCompliance);\n const impact = calculateImpact(item, isCompliance);\n const tags = buildTags(item, isCompliance);\n const refs = buildRefs(item);\n const results = [buildResult(item, host, isCompliance)];\n const code = JSON.stringify(item, null, 2);\n const nistTags = (tags as Record<string, unknown>)['nist'] as string[] | undefined;\n const controlType = deriveControlTypeFromTags(nistTags ?? []);\n const verificationMethod = deriveVerificationMethod(code);\n\n const req: EvaluatedRequirement = {\n id,\n title,\n descriptions,\n impact,\n tags,\n refs,\n results,\n code,\n };\n if (controlType !== undefined) req.controlType = controlType;\n if (verificationMethod !== undefined) req.verificationMethod = verificationMethod;\n\n // Structured CVE-ecosystem fields. Only populated for non-compliance items\n // whose cvss_score_source is a CVE identifier.\n if (!isCompliance) {\n const cvssEntries = buildCvssEntries(item);\n if (cvssEntries.length > 0) req.cvss = cvssEntries;\n\n const cweIDs = buildCweIDs(item);\n if (cweIDs.length > 0) req.cwe = cweIDs;\n\n const epss = buildEpss(item, host);\n if (epss !== undefined) req.epss = epss;\n }\n\n return req;\n}\n\n/**\n * Build a structured Cvss entry for a CVE finding. Returns an array because\n * the schema models cvss as a multi-entry array (Nessus emits one entry per\n * item; multi-vendor convergence may yield more).\n */\nfunction buildCvssEntries(item: ReportItem): Cvss[] {\n const source = (item.cvss_score_source || '').trim();\n if (!source || !CVE_SOURCE_RE.test(source)) return [];\n\n const hasV3 = !!(item.cvss3_vector || item.cvss3_base_score);\n const hasV2 = !!(item.cvss_vector || item.cvss_base_score);\n if (!hasV3 && !hasV2) return [];\n\n let version: CvssVersion;\n let baseVector: string | undefined;\n let baseScore: number | undefined;\n let threatVector: string | undefined;\n let threatScore: number | undefined;\n\n if (hasV3) {\n version = detectV3Version(item.cvss3_vector ?? '');\n baseVector = item.cvss3_vector || undefined;\n baseScore = parseFloatOrUndef(item.cvss3_base_score);\n threatVector = stripVersionPrefix(item.cvss3_temporal_vector);\n threatScore = item.cvss3_temporal_score ? parseFloatSafe(item.cvss3_temporal_score) : undefined;\n } else {\n version = CvssVersion.The20;\n baseVector = stripV2Prefix(item.cvss_vector ?? '') || undefined;\n baseScore = parseFloatOrUndef(item.cvss_base_score);\n threatVector = stripV2Prefix(item.cvss_temporal_vector ?? '') || undefined;\n threatScore = item.cvss_temporal_score ? parseFloatSafe(item.cvss_temporal_score) : undefined;\n }\n\n // Only emit base fields that are actually present: an empty baseVector would\n // fail the schema pattern, and a missing baseScore must not be coerced to 0.\n const entry: Cvss = {version, source};\n if (baseVector) entry.baseVector = baseVector;\n if (baseScore !== undefined) {\n entry.baseScore = baseScore;\n const baseSeverity = mapCvssSeverity(baseScore);\n if (baseSeverity !== undefined) entry.baseSeverity = baseSeverity;\n }\n if (threatVector !== undefined && threatVector !== '') entry.threatVector = threatVector;\n if (threatScore !== undefined) {\n entry.threatScore = threatScore;\n // Per the spec, the temporal score IS the post-threat-enrichment\n // computed score for both v2 and v3.\n entry.computedScore = threatScore;\n const computedSeverity = mapCvssSeverity(threatScore);\n if (computedSeverity !== undefined) entry.computedSeverity = computedSeverity;\n }\n\n return [entry];\n}\n\nfunction detectV3Version(vector: string): CvssVersion {\n if (vector.startsWith('CVSS:3.1/')) return CvssVersion.The31;\n if (vector.startsWith('CVSS:3.0/')) return CvssVersion.The30;\n // Default to 3.0 (Nessus historically emits CVSS:3.0).\n return CvssVersion.The30;\n}\n\nfunction stripVersionPrefix(vector: string | undefined): string | undefined {\n if (!vector) return undefined;\n for (const prefix of ['CVSS:3.0/', 'CVSS:3.1/', 'CVSS:4.0/']) {\n if (vector.startsWith(prefix)) {\n return vector.slice(prefix.length);\n }\n }\n return vector;\n}\n\nfunction stripV2Prefix(vector: string): string {\n return vector.startsWith('CVSS2#') ? vector.slice('CVSS2#'.length) : vector;\n}\n\nfunction parseFloatSafe(s: string | undefined): number {\n if (!s) return 0;\n const f = Number.parseFloat(s);\n return Number.isFinite(f) ? f : 0;\n}\n\n// parseFloatOrUndef returns the parsed number, or undefined when the source\n// field is absent or unparseable (so callers can omit it rather than emit 0).\nfunction parseFloatOrUndef(s: string | undefined): number | undefined {\n if (s === undefined || s === '') return undefined;\n const f = Number.parseFloat(s);\n return Number.isFinite(f) ? f : undefined;\n}\n\nfunction mapCvssSeverity(score: number): CVSSSeverity | undefined {\n switch (cvssScoreToSeverity(score)) {\n case 'critical': return CVSSSeverity.Critical;\n case 'high': return CVSSSeverity.High;\n case 'medium': return CVSSSeverity.Medium;\n case 'low': return CVSSSeverity.Low;\n case 'none': return CVSSSeverity.None;\n default: return undefined;\n }\n}\n\n/**\n * Extract CWE IDs from a ReportItem's <cwe> elements. Nessus emits bare\n * numeric IDs (e.g. <cwe>200</cwe>); occasionally pipe-separated or prefixed\n * forms appear. Output is \"CWE-N\" form per schema convention.\n */\nfunction buildCweIDs(item: ReportItem): string[] {\n if (!item.cwe) return [];\n const raws = Array.isArray(item.cwe) ? item.cwe : [item.cwe];\n const seen = new Set<string>();\n for (const raw of raws) {\n const text = String(raw);\n // Match \"CWE-N\" / \"CWE N\" / \"cweN\" patterns.\n for (const m of text.matchAll(CWE_PATTERN)) {\n if (m[1]) seen.add(m[1]);\n }\n // Fallback: bare numeric tokens (Nessus' typical form).\n for (const tok of text.split(/[^0-9]+/)) {\n if (tok !== '') seen.add(tok);\n }\n }\n if (seen.size === 0) return [];\n return [...seen].sort().map(id => `CWE-${id}`);\n}\n\n/**\n * Build a structured Epss entry when the ReportItem includes EPSS data.\n * The date is derived from the host's HOST_START in YYYY-MM-DD form.\n */\nfunction buildEpss(item: ReportItem, host: ReportHost): Epss | undefined {\n const hasScore = item.epss_score !== undefined && item.epss_score !== '';\n const hasPct = item.epss_percentile !== undefined && item.epss_percentile !== '';\n if (!hasScore && !hasPct) return undefined;\n // The schema requires a publish date on every Epss entry. If the scan has no\n // reliable date, omit the entry entirely rather than stamping a\n // non-deterministic \"today\".\n const date = epssDate(host);\n if (date === undefined) return undefined;\n const score = hasScore ? parseFloatSafe(item.epss_score) : 0;\n const percentile = hasPct ? parseFloatSafe(item.epss_percentile) : 0;\n return { date: date as unknown as Date, score, percentile };\n}\n\nfunction epssDate(host: ReportHost): string | undefined {\n const hs = getHostPropertyValue(host, 'HOST_START');\n if (hs) {\n const d = parseTimestamp(hs);\n if (d) {\n return d.toISOString().slice(0, 10);\n }\n }\n return undefined;\n}\n\nfunction buildDescriptions(item: ReportItem, isCompliance: boolean): Description[] {\n const descriptions: Description[] = [];\n\n // Default description\n if (isCompliance && item['compliance-info']) {\n descriptions.push({\n label: 'default',\n data: parseHtml(item['compliance-info']),\n });\n } else {\n // Non-compliance: create description from metadata\n const parts = [\n `Plugin Family: ${item['pluginFamily']}`,\n `Port: ${item['port']}`,\n `Protocol: ${item['protocol']}`,\n ];\n descriptions.push({\n label: 'default',\n data: parts.join('; ') + ';',\n });\n }\n\n // Fix/solution description\n const solution = isCompliance ? item['compliance-solution'] : item.solution;\n if (solution && solution !== 'n/a') {\n descriptions.push({\n label: 'fix',\n data: parseHtml(solution),\n });\n } else if (solution === 'n/a') {\n descriptions.push({\n label: 'fix',\n data: 'n/a',\n });\n }\n\n return descriptions;\n}\n\nfunction calculateImpact(item: ReportItem, isCompliance: boolean): number {\n if (isCompliance && item['compliance-reference']) {\n const cat = parseComplianceRef(item['compliance-reference'], 'CAT')[0];\n const catKey = cat?.toLowerCase();\n return catKey ? (IMPACT_MAPPING[catKey] ?? 0.5) : 0.5;\n }\n\n return IMPACT_MAPPING[item['severity']] ?? 0.0;\n}\n\nfunction buildTags(item: ReportItem, isCompliance: boolean): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n rid: isCompliance\n ? parseComplianceRef(item['compliance-reference']!, 'Rule-ID').join(',')\n : item['pluginID'],\n };\n\n // NIST tags\n if (isCompliance && item['compliance-reference']) {\n const cciTags = parseComplianceRef(item['compliance-reference'], 'CCI');\n tags.cci = cciTags;\n // Map CCI IDs to NIST controls using hdf-mappings\n // Pattern: Extract source IDs → Map each ID → Flatten results → Deduplicate\n const mappedControls = cciTags.flatMap(cci => getCCINistMappings(cci) ?? []);\n tags.nist = [...new Set(mappedControls)].sort();\n } else {\n const nistControls = getNessusNistControl(item['pluginFamily'], item['pluginID']);\n tags.nist = nistControls ? nistControls.split('|') : [];\n }\n\n // STIG ID for compliance\n if (isCompliance && item['compliance-reference']) {\n const stigId = parseComplianceRef(item['compliance-reference'], 'STIG-ID').join(',');\n if (stigId) {\n tags.stig_id = stigId;\n }\n }\n\n // Additional Nessus metadata tags\n if (item.risk_factor) tags.risk_factor = item.risk_factor;\n if (item.plugin_type) tags.plugin_type = item.plugin_type;\n if (item.plugin_publication_date) tags.plugin_publication_date = item.plugin_publication_date;\n if (item.fname) tags.fname = item.fname;\n if (item.cvss3_base_score) tags.cvss3_base_score = item.cvss3_base_score;\n if (item.cvss_base_score) tags.cvss_base_score = item.cvss_base_score;\n\n return tags;\n}\n\nfunction buildRefs(item: ReportItem): Reference[] | undefined {\n const refs: Reference[] = [];\n\n if (item.see_also) {\n // Nessus see_also is a whitespace-separated list of URLs (typically\n // newline-delimited). Emit one Reference per URL so each .url is a\n // standalone URI (schema requires format: uri).\n for (const url of item.see_also.split(/\\s+/).filter(Boolean)) {\n refs.push({ url });\n }\n }\n\n return refs.length > 0 ? refs : undefined;\n}\n\nfunction buildResult(item: ReportItem, host: ReportHost, isCompliance: boolean): RequirementResult {\n const status = getStatus(item, isCompliance);\n const codeDesc = getCodeDesc(item);\n const message =\n isCompliance && item['compliance-actual-value']\n ? item['compliance-actual-value']\n : item.plugin_output;\n const startTimeStr = getHostPropertyValue(host, 'HOST_START');\n const startTime = startTimeStr ? (parseTimestamp(startTimeStr) ?? new Date()) : new Date();\n\n return {\n status,\n codeDesc,\n message: message || undefined,\n startTime,\n };\n}\n\nfunction getStatus(item: ReportItem, isCompliance: boolean): ResultStatus {\n if (isCompliance && item['compliance-result']) {\n const result = item['compliance-result'];\n switch (result) {\n case 'PASSED':\n return ResultStatus.Passed;\n case 'WARNING':\n return ResultStatus.NotApplicable; // Heimdall2 maps WARNING to skipped\n case 'ERROR':\n return ResultStatus.Error;\n default:\n return ResultStatus.Failed;\n }\n }\n\n // Non-compliance items are always failed (informational findings)\n return ResultStatus.Failed;\n}\n\nfunction getCodeDesc(item: ReportItem): string {\n const desc = item.description || item.plugin_output || 'This Nessus Plugin does not provide output message.';\n return parseHtml(desc);\n}\n\nfunction parseComplianceRef(ref: string, key: string): string[] {\n const matches = ref.split(',').filter(element => element.startsWith(key));\n return matches.map(element => element.split('|')[1] || '');\n}\n\nfunction convertReportHostToTarget(host: ReportHost): Component {\n const hostName = host['name'];\n\n // Extract host properties into a lookup map\n const hostProps: Record<string, string> = {};\n const tags = host.HostProperties?.tag;\n if (tags) {\n // parseXmlWithArrays ensures tag is always an array\n (tags as HostPropertyTag[]).forEach(tag => {\n const name = tag['name'];\n const value = tag['#text'];\n if (name && value) {\n hostProps[name] = value;\n }\n });\n }\n\n const target: Component = {\n name: hostName,\n type: TargetType.Host,\n };\n\n // The short, OS-reported hostname is a distinct property from the FQDN;\n // carry it in the dedicated field instead of dropping it.\n if (hostProps['hostname']) {\n target.hostname = hostProps['hostname'];\n }\n\n // Map host properties to typed Component fields\n if (isFQDN(hostName)) {\n target.fqdn = hostName;\n }\n\n const hostIp = hostProps['host-ip'];\n if (hostIp) {\n target.ipAddress = hostIp;\n } else if (isIPAddress(hostName)) {\n target.ipAddress = hostName;\n }\n\n if (hostProps['operating-system']) {\n target.osName = hostProps['operating-system'];\n }\n\n if (hostProps['os']) {\n target.osVersion = hostProps['os'];\n }\n\n if (hostProps['mac-address']) {\n target.macAddress = hostProps['mac-address'].split('\\n')[0];\n }\n\n if (hostProps['host-fqdn']) {\n target.fqdn = hostProps['host-fqdn'];\n }\n\n return target;\n}\n\nfunction isFQDN(s: string): boolean {\n return s.includes('.') && !/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(s);\n}\n\nfunction isIPAddress(s: string): boolean {\n return /^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(s) || s.includes(':');\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, extractCWEIDs, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n TargetType,\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * SonarQube /api/issues/search response structure\n */\ninterface SonarQubeIssuesResponse {\n total: number;\n p: number;\n ps: number;\n paging: {\n pageIndex: number;\n pageSize: number;\n total: number;\n };\n issues: SonarQubeIssue[];\n components?: SonarQubeComponent[];\n rules?: SonarQubeRule[];\n // Populated by the fetcher from /api/server/version, so it travels with the\n // data and lands on tool.version.\n serverVersion?: string;\n}\n\ntype MqrSeverity = 'BLOCKER' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO';\n\n/**\n * One MQR software-quality severity. SonarQube rates an issue independently per\n * quality, and in MQR mode treats these — not the deprecated top-level\n * `severity` — as authoritative.\n */\ninterface SonarQubeImpact {\n softwareQuality: 'SECURITY' | 'RELIABILITY' | 'MAINTAINABILITY';\n severity: MqrSeverity;\n}\n\ninterface SonarQubeIssue {\n key: string;\n rule: string;\n severity: 'BLOCKER' | 'CRITICAL' | 'MAJOR' | 'MINOR' | 'INFO';\n component: string;\n project: string;\n line?: number;\n hash?: string;\n textRange?: {\n startLine: number;\n endLine: number;\n startOffset: number;\n endOffset: number;\n };\n flows?: SonarQubeFlow[];\n status: 'OPEN' | 'CONFIRMED' | 'REOPENED' | 'RESOLVED' | 'CLOSED';\n message: string;\n effort?: string;\n debt?: string;\n author?: string;\n tags?: string[];\n impacts?: SonarQubeImpact[];\n cleanCodeAttribute?: string;\n cleanCodeAttributeCategory?: string;\n creationDate: string;\n updateDate: string;\n type: 'CODE_SMELL' | 'BUG' | 'VULNERABILITY' | 'SECURITY_HOTSPOT';\n}\n\ninterface SonarQubeFlow {\n locations: SonarQubeLocation[];\n}\n\ninterface SonarQubeLocation {\n component: string;\n textRange?: {\n startLine: number;\n endLine: number;\n };\n msg?: string;\n}\n\ninterface SonarQubeComponent {\n key: string;\n enabled?: boolean;\n qualifier?: string;\n name?: string;\n longName?: string;\n path?: string;\n}\n\n/**\n * A section of a SonarQube rule description.\n * SonarQube 26+ returns rule descriptions as structured sections\n * instead of monolithic htmlDesc/mdDesc fields.\n */\ninterface SonarQubeDescriptionSection {\n key: string;\n content: string;\n}\n\ninterface SonarQubeRule {\n key: string;\n name: string;\n status?: string;\n lang?: string;\n langName?: string;\n htmlDesc?: string;\n mdDesc?: string;\n severity?: string;\n type?: string;\n tags?: string[];\n sysTags?: string[];\n scope?: string;\n descriptionSections?: SonarQubeDescriptionSection[];\n}\n\n/**\n * Deprecated legacy severity to impact mapping.\n * Canonical reference: heimdall2 sonarqube-mapper.ts IMPACT_MAPPING.\n */\nconst SEVERITY_IMPACT_MAPPING: Record<string, number> = {\n BLOCKER: 1.0,\n CRITICAL: 0.7,\n MAJOR: 0.5,\n MINOR: 0.3,\n INFO: 0.0,\n};\n\n/** MQR software-quality severity to impact mapping. */\nconst MQR_IMPACT_MAPPING: Record<MqrSeverity, number> = {\n BLOCKER: 1.0,\n HIGH: 0.7,\n MEDIUM: 0.5,\n LOW: 0.3,\n INFO: 0.0,\n};\n\n/** MQR severities ordered weakest to strongest. */\nconst MQR_SEVERITY_RANK: Record<MqrSeverity, number> = {\n INFO: 0,\n LOW: 1,\n MEDIUM: 2,\n HIGH: 3,\n BLOCKER: 4,\n};\n\n/**\n * Which severity axis drove a requirement's severity/impact. Emitted as the\n * severitySource tag so downstream gates can pin the meaning of severity.\n */\nconst SEVERITY_SOURCE_MQR = 'mqr';\nconst SEVERITY_SOURCE_LEGACY = 'legacy';\n\n/**\n * Order by code unit, matching Go's sort.Strings (byte order). Not\n * localeCompare: locale-aware collation would order keys differently than the Go\n * converter and break output parity between the two implementations.\n */\nconst byCodeUnit = (a: string, b: string): number => (a < b ? -1 : a > b ? 1 : 0);\n\n/**\n * Pick the authoritative severity axis for an issue. In MQR mode SonarQube\n * deprecates the top-level severity and the UI reports impacts[], so impacts[]\n * wins whenever present; pre-MQR servers fall back to the legacy field. An issue\n * is rated per software quality, so the worst rating governs — matching how the\n * SonarQube UI buckets it. The legacy→MQR relationship is per-rule, not a\n * constant offset, so the legacy value can never be relabelled after the fact.\n */\nexport function selectSeverity(issue: Pick<SonarQubeIssue, 'severity' | 'impacts'>): {\n severity: string;\n source: string;\n impact: number;\n} {\n const impacts = issue.impacts ?? [];\n if (impacts.length > 0) {\n const worst = impacts.reduce((a, b) =>\n MQR_SEVERITY_RANK[b.severity] > MQR_SEVERITY_RANK[a.severity] ? b : a\n );\n return {\n severity: worst.severity,\n source: SEVERITY_SOURCE_MQR,\n impact: MQR_IMPACT_MAPPING[worst.severity] ?? 0.5,\n };\n }\n return {\n severity: issue.severity,\n source: SEVERITY_SOURCE_LEGACY,\n impact: SEVERITY_IMPACT_MAPPING[issue.severity] ?? 0.5,\n };\n}\n\n/**\n * Default NIST tag for SonarQube findings without CWE mappings.\n * SA-11 (Developer Security Testing and Evaluation) applies to all issue types —\n * SonarQube is fundamentally a static analysis tool. Matches heimdall2.\n */\nconst DEFAULT_NIST_TAGS = ['SA-11'];\n\n/**\n * Convert SonarQube issues JSON to HDF format\n *\n * @param input - JSON string from SonarQube /api/issues/search endpoint\n * @returns HDF JSON string\n */\nexport async function convertSonarqubeToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'sonarqube');\n // Calculate checksum of source scan data\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse SonarQube JSON\n const sonarData = parseJSON<SonarQubeIssuesResponse>(input);\n\n if (!sonarData || typeof sonarData !== 'object') {\n throw new Error('Invalid SonarQube structure: not a valid JSON object');\n }\n\n if (!Array.isArray(sonarData.issues)) {\n throw new Error('Invalid SonarQube structure: missing or invalid issues field');\n }\n\n // Create lookup maps for components and rules\n const componentMap = new Map<string, SonarQubeComponent>();\n if (sonarData.components) {\n for (const component of sonarData.components) {\n componentMap.set(component.key, component);\n }\n }\n\n const ruleMap = new Map<string, SonarQubeRule>();\n if (sonarData.rules) {\n for (const rule of sonarData.rules) {\n ruleMap.set(rule.key, rule);\n }\n }\n\n // Group issues by project (each project becomes a baseline)\n const { items: limitedIssues, truncated: truncatedIssues } = limitArray(sonarData.issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIssues) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${sonarData.issues.length})`);\n }\n const issuesByProject = new Map<string, SonarQubeIssue[]>();\n for (const issue of limitedIssues) {\n const projectKey = issue.project;\n if (!issuesByProject.has(projectKey)) {\n issuesByProject.set(projectKey, []);\n }\n issuesByProject.get(projectKey)!.push(issue);\n }\n\n // Convert each project to a baseline, project-key sorted to match the Go converter.\n const projectKeys = Array.from(issuesByProject.keys()).sort(byCodeUnit);\n const baselines: EvaluatedBaseline[] = [];\n for (const projectKey of projectKeys) {\n const baseline = convertProjectToBaseline(\n projectKey,\n issuesByProject.get(projectKey)!,\n componentMap,\n ruleMap,\n resultsChecksum\n );\n baselines.push(baseline);\n }\n\n // Build components from project keys\n let components = projectKeys.map(projectKey => ({\n type: TargetType.Application,\n name: projectKey,\n }));\n\n if (baselines.length === 0) {\n const targetName = deriveEmptyScanTarget(sonarData.components);\n baselines.push({\n name: targetName,\n title: `SonarQube Analysis for ${targetName}`,\n requirements: [buildNoFindingsRequirement(\n 'sonarqube-no-findings',\n `SonarQube scanned ${targetName} and reported zero findings.`,\n new Date(),\n )],\n resultsChecksum,\n });\n components = [{ type: TargetType.Application, name: targetName }];\n }\n\n // Build HDF\n return buildHdfResults({\n generatorName: 'sonarqube-to-hdf',\n converterVersion,\n toolName: 'SonarQube',\n toolVersion: sonarData.serverVersion || undefined,\n baselines,\n components,\n timestamp: new Date(),\n });\n}\n\nfunction deriveEmptyScanTarget(components: SonarQubeComponent[] | undefined): string {\n if (components) {\n const project = components.find(c => c.qualifier === 'TRK');\n if (project) return project.key;\n if (components.length > 0) return components[0]!.key;\n }\n return 'the SonarQube project';\n}\n\nfunction convertProjectToBaseline(\n projectKey: string,\n issues: SonarQubeIssue[],\n componentMap: Map<string, SonarQubeComponent>,\n ruleMap: Map<string, SonarQubeRule>,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n // Group issues by rule (each rule becomes a requirement)\n const issuesByRule = new Map<string, SonarQubeIssue[]>();\n for (const issue of issues) {\n const ruleKey = issue.rule;\n if (!issuesByRule.has(ruleKey)) {\n issuesByRule.set(ruleKey, []);\n }\n issuesByRule.get(ruleKey)!.push(issue);\n }\n\n // Convert each rule to a requirement, rule-key sorted to match the Go converter.\n const requirements: EvaluatedRequirement[] = [];\n for (const ruleKey of Array.from(issuesByRule.keys()).sort(byCodeUnit)) {\n const requirement = convertRuleToRequirement(\n ruleKey,\n issuesByRule.get(ruleKey)!,\n componentMap,\n ruleMap\n );\n requirements.push(requirement);\n }\n\n return createMinimalBaseline(projectKey, requirements, {\n title: `SonarQube Analysis for ${projectKey}`,\n resultsChecksum,\n });\n}\n\nfunction convertRuleToRequirement(\n ruleKey: string,\n issues: SonarQubeIssue[],\n componentMap: Map<string, SonarQubeComponent>,\n ruleMap: Map<string, SonarQubeRule>\n): EvaluatedRequirement {\n const rule = ruleMap.get(ruleKey);\n\n // Extract rule name and description\n const title = rule?.name || ruleKey;\n const description = extractDescription(rule);\n\n // Severity is a property of the rule, so the first issue speaks for the group.\n const firstIssue = issues[0]!;\n const { severity, source: severitySource, impact } = selectSeverity(firstIssue);\n\n // Extract tags and mappings\n const { cweIds, owaspTags, allTags } = extractTags(rule, issues);\n const nistControls = mapCWEToNIST(cweIds, DEFAULT_NIST_TAGS);\n const cciControls = nistToCci(nistControls);\n\n // Create results for each issue\n const results: RequirementResult[] = issues.map(issue =>\n createResultFromIssue(issue, componentMap)\n );\n\n // Get source location from first issue with a line number\n const issueWithLocation = issues.find(i => i.line !== undefined);\n const sourceLocation = issueWithLocation\n ? extractSourceLocation(issueWithLocation, componentMap)\n : undefined;\n\n const options: {\n sourceLocation?: { ref: string; line: number };\n tags: Record<string, unknown>;\n } = {\n tags: {\n severity: severity.toLowerCase(),\n severitySource,\n type: firstIssue.type.toLowerCase(),\n cwe: cweIds,\n owasp: owaspTags,\n nist: nistControls,\n cci: cciControls,\n // Keep both axes available in MQR mode so consumers can select. In legacy\n // mode tags.severity already is the legacy axis, so repeating it adds nothing.\n ...(severitySource === SEVERITY_SOURCE_MQR\n ? {\n legacySeverity: firstIssue.severity.toLowerCase(),\n impacts: firstIssue.impacts,\n ...(firstIssue.cleanCodeAttribute\n ? { cleanCodeAttribute: firstIssue.cleanCodeAttribute }\n : {}),\n }\n : {}),\n ...allTags,\n },\n };\n\n if (sourceLocation) {\n options.sourceLocation = sourceLocation;\n }\n\n const req = createRequirement(\n ruleKey,\n title,\n [createDescription('default', description)],\n impact,\n results,\n options\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nistControls);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\nfunction extractDescription(rule: SonarQubeRule | undefined): string {\n if (!rule) {\n return '';\n }\n\n // Prefer markdown description, fall back to HTML (stripped), then name\n if (rule.mdDesc) {\n return rule.mdDesc;\n }\n\n if (rule.htmlDesc) {\n // Strip HTML tags for plain text description\n return rule.htmlDesc.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n\n // Fall back to descriptionSections (SonarQube 26+ format)\n if (rule.descriptionSections && rule.descriptionSections.length > 0) {\n // Prefer root_cause section (closest to the old monolithic description)\n const rootCause = rule.descriptionSections.find(s => s.key === 'root_cause');\n if (rootCause) {\n return rootCause.content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim();\n }\n // If no root_cause, concatenate all sections\n const parts = rule.descriptionSections\n .map(s => s.content.replace(/<[^>]*>/g, ' ').replace(/\\s+/g, ' ').trim())\n .filter(s => s.length > 0);\n if (parts.length > 0) {\n return parts.join('\\n\\n');\n }\n }\n\n return rule.name || '';\n}\n\nfunction extractTags(\n rule: SonarQubeRule | undefined,\n issues: SonarQubeIssue[]\n): {\n cweIds: string[];\n owaspTags: string[];\n allTags: Record<string, string[]>;\n} {\n const cweSet = new Set<string>();\n const owaspSet = new Set<string>();\n const allTagsMap = new Map<string, Set<string>>();\n\n // Extract from rule tags\n if (rule) {\n const ruleTags = [...(rule.tags || []), ...(rule.sysTags || [])];\n\n for (const tag of ruleTags) {\n const lowerTag = tag.toLowerCase();\n\n // Check for CWE tags\n if (lowerTag.startsWith('cwe-') || lowerTag.includes('cwe')) {\n for (const id of extractCWEIDs(tag)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n // Check for OWASP tags\n if (lowerTag.includes('owasp')) {\n owaspSet.add(tag);\n }\n\n // Collect other tags by category\n const parts = tag.split(':');\n if (parts.length === 2) {\n const [category, value] = parts;\n if (!allTagsMap.has(category!)) {\n allTagsMap.set(category!, new Set());\n }\n allTagsMap.get(category!)!.add(value!);\n }\n }\n }\n\n // Extract from issue tags\n for (const issue of issues) {\n if (issue.tags) {\n for (const tag of issue.tags) {\n const lowerTag = tag.toLowerCase();\n\n if (lowerTag.startsWith('cwe-')) {\n for (const id of extractCWEIDs(tag)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n if (lowerTag.includes('owasp')) {\n owaspSet.add(tag);\n }\n }\n }\n }\n\n // Also parse CWE from rule description\n if (rule?.htmlDesc || rule?.mdDesc) {\n const desc = (rule.htmlDesc || '') + (rule.mdDesc || '');\n for (const id of extractCWEIDs(desc)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n\n // Parse CWE from descriptionSections (SonarQube 26+ format)\n if (rule?.descriptionSections) {\n for (const section of rule.descriptionSections) {\n for (const id of extractCWEIDs(section.content)) {\n cweSet.add(`CWE-${id}`);\n }\n }\n }\n\n const allTags: Record<string, string[]> = {};\n for (const [category, values] of allTagsMap) {\n allTags[category] = Array.from(values);\n }\n\n return {\n cweIds: Array.from(cweSet),\n owaspTags: Array.from(owaspSet),\n allTags,\n };\n}\n\nfunction createResultFromIssue(\n issue: SonarQubeIssue,\n componentMap: Map<string, SonarQubeComponent>\n): RequirementResult {\n const status = issue.status === 'RESOLVED' || issue.status === 'CLOSED'\n ? ResultStatus.Passed\n : ResultStatus.Failed;\n\n const component = componentMap.get(issue.component);\n const componentPath = component?.path || component?.longName || issue.component;\n\n const lineInfo = issue.line ? ` LINE : ${issue.line}` : '';\n const codeDesc = `${componentPath}${lineInfo}`;\n\n return createResult(status, issue.message, {\n codeDesc,\n startTime: parseTimestamp(issue.creationDate) ?? new Date('0001-01-01T00:00:00Z'),\n });\n}\n\nfunction extractSourceLocation(\n issue: SonarQubeIssue,\n componentMap: Map<string, SonarQubeComponent>\n): { ref: string; line: number } | undefined {\n if (!issue.line) {\n return undefined;\n }\n\n const component = componentMap.get(issue.component);\n const ref = component?.path || component?.key || issue.component;\n\n return { ref, line: issue.line };\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n getAwsConfigNistControlByIdentifier,\n getAwsConfigNistControlByName,\n awsConfigMappedRevisions,\n getCurrentNistRevision,\n isNistStrict,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport {\n TargetType,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type Checksum,\n type Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * AWS Config static export structures.\n * Produced by combining `aws configservice describe-config-rules` with\n * `aws configservice get-compliance-details-by-config-rule`.\n */\ninterface ConfigRulesFile {\n ConfigRules: ConfigRule[];\n}\n\ninterface ConfigRule {\n ConfigRuleId: string;\n ConfigRuleName: string;\n ConfigRuleArn: string;\n Description: string;\n Source: ConfigRuleSource;\n InputParameters: string;\n EvaluationResults: EvaluationResult[];\n}\n\ninterface ConfigRuleSource {\n Owner: string;\n SourceIdentifier: string;\n}\n\ninterface EvaluationResult {\n EvaluationResultIdentifier: EvaluationResultIdentifier;\n ComplianceType: string;\n Annotation?: string;\n ConfigRuleInvokedTime: string;\n ResultRecordedTime: string;\n}\n\ninterface EvaluationResultIdentifier {\n EvaluationResultQualifier: EvaluationResultQualifier;\n}\n\ninterface EvaluationResultQualifier {\n ConfigRuleName: string;\n ResourceType: string;\n ResourceId: string;\n}\n\nconst ARN_RE = /arn:aws[^:]*:config:([^:]+):(\\d{12}):config-rule/;\n\nfunction getAccountId(arn: string): string {\n const m = ARN_RE.exec(arn);\n return m ? m[2]! : 'no-account-id';\n}\n\nfunction getRegion(arn: string): string {\n const m = ARN_RE.exec(arn);\n return m ? m[1]! : 'unknown';\n}\n\nfunction mapComplianceStatus(complianceType: string): ResultStatus {\n switch (complianceType) {\n case 'COMPLIANT': return ResultStatus.Passed;\n case 'NON_COMPLIANT': return ResultStatus.Failed;\n case 'NOT_APPLICABLE': return ResultStatus.NotApplicable;\n default: return ResultStatus.NotReviewed; // INSUFFICIENT_DATA etc.\n }\n}\n\n/** Mapping values pack multiple controls into one pipe-delimited string. */\nfunction splitControls(nistId: string): string[] {\n return nistId.split('|').map(c => c.trim()).filter(Boolean);\n}\n\nfunction buildNistTags(sourceIdentifier: string, ruleName: string): string[] {\n const byIdentifier = sourceIdentifier ? getAwsConfigNistControlByIdentifier(sourceIdentifier) : undefined;\n if (byIdentifier) return splitControls(byIdentifier);\n const byName = getAwsConfigNistControlByName(ruleName);\n if (byName) return splitControls(byName);\n return [];\n}\n\n/**\n * Flag rules whose NIST mappings exist at a revision other than the one\n * currently selected — they emit no NIST tags here even though a mapping\n * exists elsewhere, a likely sign of a wrong revision selection. Rules\n * unmapped at every revision are not flagged. Throws in strict mode; otherwise\n * logs a single aggregated warning.\n */\nfunction checkRevisionAlignment(rules: ConfigRule[]): void {\n const rev = getCurrentNistRevision();\n const seen = new Set<string>();\n const lines: string[] = [];\n for (const rule of rules) {\n const covered = awsConfigMappedRevisions(rule.Source.SourceIdentifier, rule.ConfigRuleName);\n if (covered.length === 0 || covered.includes(rev) || seen.has(rule.ConfigRuleName)) continue;\n seen.add(rule.ConfigRuleName);\n lines.push(` - ${rule.ConfigRuleName} (mapped at Rev ${covered.join(', ')})`);\n }\n if (lines.length === 0) return;\n\n const detail =\n `${lines.length} AWS Config rule(s) have NIST 800-53 mappings at a different revision ` +\n `than the requested Rev ${rev}; their NIST tags were omitted:\\n${lines.join('\\n')}`;\n if (isNistStrict()) {\n throw new Error(\n `aws-config: ${detail}\\nre-run with a matching revision, or disable strict mode to convert with the gaps`\n );\n }\n // eslint-disable-next-line no-console\n console.warn(`WARNING: ${detail}`);\n}\n\nfunction buildCheckText(rule: ConfigRule): string {\n const parts: string[] = [\n `ARN: ${rule.ConfigRuleArn || 'N/A'}`,\n `Source Identifier: ${rule.Source.SourceIdentifier || 'N/A'}`,\n ];\n if (rule.InputParameters && rule.InputParameters !== '{}') {\n const params = rule.InputParameters\n .replace(/[{}\"]/g, '')\n .split(',')\n .map(p => p.trim())\n .filter(Boolean);\n parts.push(...params);\n }\n return parts.join('<br/>');\n}\n\nfunction buildCodeDesc(q: EvaluationResultQualifier): string {\n return `config_rule_name: ${q.ConfigRuleName}, resource_type: ${q.ResourceType}, resource_id: ${q.ResourceId}`;\n}\n\nfunction buildResultMessage(codeDesc: string, annotation: string | undefined, status: ResultStatus): string | undefined {\n if (status !== ResultStatus.Failed) return undefined;\n const text = annotation || 'Rule does not pass rule compliance';\n return `(${codeDesc}): ${text}`;\n}\n\n/** Elapsed seconds between rule invocation and result recording; omitted if either time is unusable. */\nfunction computeRunTime(invoked: string, recorded: string): number | undefined {\n const start = invoked ? parseTimestamp(invoked) : null;\n const end = recorded ? parseTimestamp(recorded) : null;\n if (!start || !end) return undefined;\n return (end.getTime() - start.getTime()) / 1000;\n}\n\nfunction buildResult(r: EvaluationResult): RequirementResult {\n const q = r.EvaluationResultIdentifier.EvaluationResultQualifier;\n const status = mapComplianceStatus(r.ComplianceType);\n const codeDesc = buildCodeDesc(q);\n const message = buildResultMessage(codeDesc, r.Annotation, status);\n const startTime = (r.ConfigRuleInvokedTime ? parseTimestamp(r.ConfigRuleInvokedTime) : null) ?? new Date('0001-01-01T00:00:00Z');\n const runTime = computeRunTime(r.ConfigRuleInvokedTime, r.ResultRecordedTime);\n\n // message is a failure explanation, so non-failed results carry no message key at all.\n return createResult(status, message, { codeDesc, startTime, runTime });\n}\n\n/**\n * Synthesizes a single HDF result for a Config rule whose live evaluation\n * returned zero in-scope resources. The HDF schema requires `results` to have\n * minItems >= 1; this honestly signals to auditors that the rule's check ran\n * but had no scope in this account/region rather than vacuously claiming\n * \"passed\". See issue #80 bug 2.\n */\nfunction buildNotApplicableResult(rule: ConfigRule): RequirementResult {\n const codeDesc = `AWS Config rule ${rule.ConfigRuleName} evaluated zero in-scope resources in this account/region.`;\n return createResult(ResultStatus.NotApplicable, undefined, {\n codeDesc,\n startTime: new Date(),\n });\n}\n\nfunction buildRequirement(rule: ConfigRule): EvaluatedRequirement {\n const nist = buildNistTags(rule.Source.SourceIdentifier, rule.ConfigRuleName);\n const tags: Record<string, unknown> = nist.length > 0 ? { nist } : {};\n\n const descriptions: Description[] = [\n { label: 'default', data: rule.Description },\n { label: 'check', data: buildCheckText(rule) },\n ];\n\n const title = `${getAccountId(rule.ConfigRuleArn)} - ${rule.ConfigRuleName}`;\n // Issue #80 bug 2: a Config rule that was deployed and active but evaluated\n // zero in-scope resources (e.g. rds-cluster-multi-az-enabled in an account\n // with no RDS clusters) returns an empty EvaluationResults from\n // GetComplianceDetailsByConfigRule. The HDF schema requires `results` to\n // have minItems >= 1, so synthesize one notApplicable result honestly\n // signaling that the rule had no scope rather than emitting `results: []`.\n const results = rule.EvaluationResults.length > 0\n ? rule.EvaluationResults.map(buildResult)\n : [buildNotApplicableResult(rule)];\n\n const req = createRequirement(\n rule.ConfigRuleId,\n title,\n descriptions,\n 0.5,\n results,\n {\n tags,\n sourceLocation: { ref: rule.ConfigRuleArn, line: 1 },\n }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts an AWS Config static export (ConfigRulesFile JSON) to HDF format.\n *\n * @param input - JSON string produced by combining aws configservice describe-config-rules\n * with get-compliance-details-by-config-rule\n * @returns HDF JSON string\n */\nexport async function convertAwsConfigToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'aws-config');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const data = parseJSON<ConfigRulesFile>(input);\n\n if (!data || typeof data !== 'object') {\n throw new Error('Invalid AWS Config export: not a valid JSON object');\n }\n if (!Array.isArray(data.ConfigRules)) {\n throw new Error('Invalid AWS Config export: ConfigRules field is required');\n }\n\n const { items: limitedRules, truncated: truncatedRules } = limitArray(data.ConfigRules);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedRules) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedRules.length} ConfigRule items (original: ${data.ConfigRules.length})`);\n }\n\n checkRevisionAlignment(limitedRules);\n const requirements = limitedRules.map(buildRequirement);\n\n const baseline: EvaluatedBaseline = {\n ...createMinimalBaseline('AWS Config', requirements, { resultsChecksum }),\n title: 'AWS Config Compliance Results',\n version: '1.0.0',\n maintainer: 'Amazon Web Services',\n } as EvaluatedBaseline;\n\n // Extract account/region from the first rule's ARN for target labels\n const firstArn = limitedRules[0]?.ConfigRuleArn ?? '';\n const accountId = getAccountId(firstArn);\n const region = getRegion(firstArn);\n\n return buildHdfResults({\n generatorName: 'aws-config-to-hdf',\n converterVersion,\n toolName: 'AWS Config',\n baselines: [baseline],\n components: [{\n type: TargetType.CloudAccount,\n name: `AWS Account ${accountId}`,\n labels: {\n account: accountId,\n region,\n provider: 'aws',\n },\n }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { DEFAULT_STATIC_ANALYSIS_NIST_TAGS } from '@mitre/hdf-mappings';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n severityToImpact,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Checkov JSON output structures.\n */\ninterface CheckovReport {\n check_type: string;\n results: CheckovResults;\n summary: CheckovSummary;\n}\n\ninterface CheckovResults {\n passed_checks: CheckovCheck[];\n failed_checks: CheckovCheck[];\n skipped_checks: CheckovCheck[];\n}\n\ninterface CheckovSummary {\n passed: number;\n failed: number;\n skipped: number;\n parsing_errors: number;\n resource_count: number;\n checkov_version: string;\n}\n\ninterface CheckovCheck {\n check_id: string;\n check_name: string;\n check_result: CheckovCheckResult;\n severity: string | null;\n file_path: string;\n file_line_range: number[];\n resource: string;\n guideline: string | null;\n code_block: unknown;\n check_class: string;\n}\n\ninterface CheckovCheckResult {\n result: string;\n suppress_comment?: string;\n}\n\n/**\n * Maps checkov result string to HDF ResultStatus.\n */\nfunction mapStatus(result: string): ResultStatus {\n switch (result.toUpperCase()) {\n case 'PASSED':\n return ResultStatus.Passed;\n case 'FAILED':\n return ResultStatus.Failed;\n case 'SKIPPED':\n return ResultStatus.NotReviewed;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Maps severity to impact, defaulting to 0.5 for null/unknown.\n */\nfunction getImpact(severity: string | null): number {\n if (!severity) return 0.5;\n return severityToImpact(severity);\n}\n\n/**\n * Converts a single CheckovCheck to an HDF RequirementResult.\n */\nfunction checkToResult(check: CheckovCheck, scanTime: Date): RequirementResult {\n const status = mapStatus(check.check_result.result);\n const codeDesc = `Resource: ${check.resource}\\nFile: ${check.file_path} (lines ${JSON.stringify(check.file_line_range)})`;\n\n let message: string | undefined;\n if (status === ResultStatus.NotReviewed && check.check_result.suppress_comment) {\n message = check.check_result.suppress_comment;\n }\n\n // message carries the suppression comment, so results without one carry no message key.\n return createResult(status, message, { codeDesc, startTime: scanTime });\n}\n\n/**\n * Converts a group of checks sharing a check_id into one EvaluatedRequirement.\n */\nfunction buildRequirement(checkId: string, checks: CheckovCheck[], scanTime: Date): EvaluatedRequirement {\n const rep = checks[0]!;\n const impact = getImpact(rep.severity);\n\n const tags: Record<string, unknown> = {\n nist: [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS],\n };\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.check_name },\n ];\n if (rep.guideline) {\n descriptions.push({ label: 'check', data: rep.guideline });\n }\n\n const results = checks.map((check) => checkToResult(check, scanTime));\n\n const req = createRequirement(checkId, rep.check_name, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...DEFAULT_STATIC_ANALYSIS_NIST_TAGS]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Parses checkov input which can be a single object or array.\n */\nfunction parseInput(input: string): CheckovReport[] {\n const parsed = parseJSON<CheckovReport | CheckovReport[]>(input);\n if (Array.isArray(parsed)) {\n return parsed;\n }\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('Invalid checkov structure: not a valid JSON object');\n }\n if (!parsed.results || typeof parsed.results !== 'object') {\n throw new Error('Invalid checkov structure: missing or invalid results field');\n }\n return [parsed];\n}\n\n/**\n * Converts checkov output to HDF format.\n * Accepts native checkov JSON (single object or array) and SARIF format.\n * SARIF input is detected automatically and delegated to the shared SARIF converter.\n *\n * @param input - checkov JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertCheckovToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'checkov');\n\n // Detect SARIF format and delegate\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input, converterVersion);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Checkov native JSON carries no per-finding or scan timestamp; use conversion time\n // for every result's startTime, the no-findings placeholder, and the document timestamp.\n const scanTime = new Date();\n\n const reports = parseInput(input);\n\n // Merge all checks from all frameworks\n const allChecks: CheckovCheck[] = [];\n const checkTypes: string[] = [];\n let version: string | undefined;\n\n for (const report of reports) {\n checkTypes.push(report.check_type);\n if (!version && report.summary.checkov_version) {\n version = report.summary.checkov_version;\n }\n allChecks.push(...report.results.passed_checks);\n allChecks.push(...report.results.failed_checks);\n allChecks.push(...report.results.skipped_checks);\n }\n\n const { items: limitedChecks, truncated } = limitArray(allChecks);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedChecks.length} check items (original: ${allChecks.length})`);\n }\n\n // Group by check_id preserving insertion order\n const groups = new Map<string, CheckovCheck[]>();\n for (const check of limitedChecks) {\n const existing = groups.get(check.check_id);\n if (existing) {\n existing.push(check);\n } else {\n groups.set(check.check_id, [check]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [checkId, checks] of groups) {\n requirements.push(buildRequirement(checkId, checks, scanTime));\n }\n\n const format = checkTypes.join(', ');\n\n if (requirements.length === 0) {\n const target = format || 'input';\n requirements.push(buildNoFindingsRequirement(\n 'checkov-no-findings',\n `Checkov scanned ${target} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Checkov Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'checkov-to-hdf',\n converterVersion,\n toolName: 'Checkov',\n toolVersion: version,\n toolFormat: format,\n baselines: [baseline],\n timestamp: scanTime,\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { detectConverter } from '../../../shared/typescript/fingerprint.js';\nimport { registerAllFingerprints } from '../../../shared/typescript/register-all.js';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, inputChecksum, limitArray, validateInputSize, mapCWEToNIST, DEFAULT_REMEDIATION_NIST_TAGS, buildHdfResults, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * gosec JSON output structures\n * See https://github.com/securego/gosec for the full schema.\n */\ninterface GosecReport {\n 'Golang errors': unknown;\n Issues: GosecIssue[];\n Stats: GosecStats;\n GosecVersion: string;\n}\n\ninterface GosecStats {\n files: number;\n lines: number;\n nosec: number;\n found: number;\n}\n\ninterface GosecCWE {\n id: string;\n url: string;\n}\n\ninterface GosecSuppression {\n kind: string;\n justification: string;\n}\n\ninterface GosecIssue {\n severity: string;\n confidence: string;\n cwe: GosecCWE;\n rule_id: string;\n details: string;\n file: string;\n code: string;\n line: string;\n column: string;\n nosec: boolean;\n suppressions: GosecSuppression[] | null;\n}\n\n/**\n * Severity to HDF impact mapping for gosec.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n HIGH: 0.7,\n MEDIUM: 0.5,\n LOW: 0.3,\n};\n\n\n/**\n * Returns true if the issue is suppressed (via nosec flag or suppressions list).\n */\nfunction isSuppressed(issue: GosecIssue): boolean {\n return issue.nosec || issue.suppressions !== null;\n}\n\n/**\n * Builds a skip message from a suppressions list.\n * Returns undefined when suppressions is null (issue not suppressed via list).\n */\nfunction formatSkipMessage(suppressions: GosecSuppression[] | null): string | undefined {\n if (suppressions === null) {\n return undefined;\n }\n if (suppressions.length === 0) {\n return 'No justification provided';\n }\n return suppressions\n .map(s => `${s.justification || 'No justification provided'} (${s.kind})`)\n .join('\\n');\n}\n\n/**\n * Converts a single GosecIssue to an HDF RequirementResult.\n */\nfunction issueToResult(issue: GosecIssue, scanTime: Date): RequirementResult {\n const suppressed = isSuppressed(issue);\n const status = suppressed ? ResultStatus.NotReviewed : ResultStatus.Failed;\n\n let message: string;\n if (suppressed) {\n const skipMsg = formatSkipMessage(issue.suppressions);\n message = skipMsg ?? 'No justification provided';\n } else {\n message = `${issue.confidence} confidence of rule violation at:\\n${issue.code}`;\n }\n\n const codeDesc = `Rule ${issue.rule_id} violation detected at:\\nFile: ${issue.file}\\nLine: ${issue.line}\\nColumn: ${issue.column}`;\n\n return createResult(status, message, { codeDesc, startTime: scanTime });\n}\n\n/**\n * Converts a group of issues sharing a rule_id into one EvaluatedRequirement.\n */\nfunction buildRequirement(ruleId: string, issues: GosecIssue[], scanTime: Date): EvaluatedRequirement {\n const rep = issues[0]!;\n const impact = IMPACT_MAPPING[rep.severity.toUpperCase()] ?? 0.5;\n const nist = mapCWEToNIST([rep.cwe.id], DEFAULT_REMEDIATION_NIST_TAGS);\n\n const tags: Record<string, unknown> = {\n nist,\n cwe: { id: rep.cwe.id, url: rep.cwe.url },\n };\n\n const results = issues.map((issue) => issueToResult(issue, scanTime));\n\n const descriptions: Description[] = [\n { label: 'default', data: rep.details },\n { label: 'check', data: `CWE-${rep.cwe.id}: ${rep.cwe.url}` },\n ];\n\n const req = createRequirement(ruleId, rep.details, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n return req;\n}\n\n/**\n * Converts gosec output to HDF format.\n * Accepts both native gosec JSON and SARIF format — SARIF input is detected\n * automatically and delegated to the shared SARIF converter.\n *\n * @param input - gosec JSON or SARIF string\n * @returns HDF JSON string\n */\nexport async function convertGosecToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'gosec');\n // Detect format: if SARIF, delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input, converterVersion);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const report = parseJSON<GosecReport>(input);\n\n if (!report || typeof report !== 'object') {\n throw new Error('Invalid gosec structure: not a valid JSON object');\n }\n\n if (!Array.isArray(report.Issues)) {\n throw new Error('Invalid gosec structure: missing or invalid Issues field');\n }\n\n // Group issues by rule_id, preserving insertion order.\n const { items: limitedIssues, truncated: truncatedIssues } = limitArray(report.Issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedIssues) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${report.Issues.length})`);\n }\n const groups = new Map<string, GosecIssue[]>();\n for (const issue of limitedIssues) {\n const existing = groups.get(issue.rule_id);\n if (existing) {\n existing.push(issue);\n } else {\n groups.set(issue.rule_id, [issue]);\n }\n }\n\n // gosec output carries no per-finding timestamp; use one conversion-time\n // value for every result's startTime and the document timestamp.\n const scanTime = new Date();\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [ruleId, issues] of groups) {\n requirements.push(buildRequirement(ruleId, issues, scanTime));\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'gosec-no-findings',\n 'gosec scanned Go codebase and reported zero findings.',\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'gosec Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'gosec-to-hdf',\n converterVersion,\n toolName: 'gosec',\n toolVersion: report.GosecVersion || undefined,\n baselines: [baseline],\n timestamp: scanTime,\n });\n}\n","import {\n type Checksum,\n TargetType,\n createMinimalBaseline,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n ResultStatus,\n VerificationMethodEnum,\n} from '@mitre/hdf-schema';\nimport {\n getNiktoNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON} from '@mitre/hdf-utilities';\nimport {buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, validateInputSize, buildHdfResults} from '../../../shared/typescript/converterutil.js';\n\n// Nikto JSON input types\n\ninterface NiktoReport {\n banner?: string;\n host?: string;\n ip?: string;\n port?: string;\n vulnerabilities: NiktoVulnerability[];\n}\n\ninterface NiktoVulnerability {\n OSVDB?: string;\n id: string;\n method?: string;\n msg: string;\n url?: string;\n}\n\nfunction buildNistTags(niktoId: string): string[] {\n const control = getNiktoNistControl(niktoId);\n if (control) {\n return [control];\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\nfunction buildCodeDesc(vuln: NiktoVulnerability): string {\n const parts: string[] = [];\n if (vuln.url) {\n parts.push(`URL: ${vuln.url}`);\n }\n if (vuln.method) {\n parts.push(`Method: ${vuln.method}`);\n }\n return parts.join(' ');\n}\n\nfunction convertVulnToRequirement(vuln: NiktoVulnerability): EvaluatedRequirement {\n const nistTags = buildNistTags(vuln.id);\n const cciTags = nistToCci(nistTags);\n\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vuln),\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n\n const extras: Record<string, unknown> = {};\n if (vuln.OSVDB && vuln.OSVDB !== '0') {\n extras.osvdb = vuln.OSVDB;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n const req: EvaluatedRequirement = {\n id: vuln.id,\n title: vuln.msg,\n impact: 0.5,\n results: [result],\n tags,\n descriptions: [\n {label: 'default', data: vuln.msg},\n ],\n };\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\nexport async function convertNiktoToHdf(input: string, converterVersion = 'unknown'): Promise<string> {\n validateInputSize(input, 'nikto');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const niktoData = parseJSON<NiktoReport>(input);\n\n // Group vulnerabilities by ID to handle duplicates\n const vulnGroups = new Map<string, NiktoVulnerability[]>();\n if (niktoData.vulnerabilities) {\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(niktoData.vulnerabilities);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${niktoData.vulnerabilities.length})`);\n }\n for (const vuln of limitedVulns) {\n const existing = vulnGroups.get(vuln.id);\n if (existing) {\n existing.push(vuln);\n } else {\n vulnGroups.set(vuln.id, [vuln]);\n }\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [, vulns] of vulnGroups) {\n // Use first vuln for the requirement definition\n const primary = vulns[0]!;\n const req = convertVulnToRequirement(primary);\n\n // Add results from duplicate IDs\n if (vulns.length > 1) {\n for (let i = 1; i < vulns.length; i++) {\n req.results.push({\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vulns[i]!),\n startTime: new Date('0001-01-01T00:00:00Z'),\n });\n }\n }\n\n requirements.push(req);\n }\n\n const targetParts: string[] = [];\n if (niktoData.host) {\n targetParts.push(`Host: ${niktoData.host}`);\n }\n if (niktoData.port) {\n targetParts.push(`Port: ${niktoData.port}`);\n }\n const targetName = targetParts.length > 0 ? targetParts.join(' ') : 'Nikto Scan';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'nikto-no-findings',\n `Nikto scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(targetName, requirements, {\n resultsChecksum,\n title: `Nikto Target: ${targetName}`,\n summary: niktoData.banner || '',\n }) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'nikto-to-hdf',\n converterVersion,\n toolName: 'Nikto',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{\n type: TargetType.Application,\n name: targetName,\n }],\n });\n}\n","import {\n type Checksum,\n createMinimalBaseline,\n TargetType,\n type Tool,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type HDFResults,\n ResultStatus,\n VerificationMethodEnum,\n} from '@mitre/hdf-schema';\nimport {\n getCweNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {detectConverter} from '../../../shared/typescript/fingerprint.js';\nimport {registerAllFingerprints} from '../../../shared/typescript/register-all.js';\nimport {convertSarifToHdf} from '../../sarif-to-hdf/typescript/converter.js';\nimport {buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, stripHTML, validateInputSize, serializeHdf} from '../../../shared/typescript/converterutil.js';\n\n// --- ZAP JSON input types ---\n\ninterface ZapReport {\n '@generated'?: string;\n '@version'?: string;\n site?: ZapSite[];\n}\n\ninterface ZapSite {\n '@host'?: string;\n '@name'?: string;\n '@port'?: string;\n '@ssl'?: string;\n alerts?: ZapAlert[];\n}\n\ninterface ZapAlert {\n pluginid: string;\n name: string;\n alert?: string;\n cweid?: string;\n wascid?: string;\n riskcode?: string;\n riskdesc?: string;\n confidence?: string;\n count?: string;\n desc?: string;\n solution?: string;\n otherinfo?: string;\n reference?: string;\n sourceid?: string;\n instances?: ZapInstance[];\n}\n\ninterface ZapInstance {\n uri?: string;\n method?: string;\n param?: string;\n evidence?: string;\n attack?: string;\n}\n\n// --- Risk code to impact ---\n\nfunction riskCodeToImpact(riskCode: string): number {\n switch (riskCode) {\n case '0':\n case '1':\n return 0.3;\n case '2':\n return 0.5;\n case '3':\n return 0.7;\n default:\n return 0.5;\n }\n}\n\n// --- NIST tag building ---\n\nfunction buildNistTags(cweid: string): string[] {\n if (cweid && cweid !== '0') {\n const cweNum = parseInt(cweid, 10);\n if (!isNaN(cweNum)) {\n const control = getCweNistControl(cweNum);\n if (control) {\n return [control];\n }\n }\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n// --- Instance to code desc ---\n\nfunction buildCodeDesc(instance: ZapInstance): string {\n const parts: string[] = [];\n if (instance.uri) {\n parts.push(`URI: ${instance.uri}`);\n }\n if (instance.method) {\n parts.push(`Method: ${instance.method}`);\n }\n if (instance.param) {\n parts.push(`Param: ${instance.param}`);\n }\n if (instance.evidence) {\n parts.push(`Evidence: ${instance.evidence}`);\n }\n return parts.join(' | ');\n}\n\n// --- Build check description ---\n\nfunction buildCheckDescription(alert: ZapAlert): string {\n const parts: string[] = [];\n if (alert.solution) {\n const stripped = stripHTML(alert.solution);\n if (stripped) {\n parts.push(stripped);\n }\n }\n if (alert.otherinfo) {\n const stripped = stripHTML(alert.otherinfo);\n if (stripped) {\n parts.push(stripped);\n }\n }\n return parts.join('\\n');\n}\n\n// --- Select site with most alerts ---\n\nfunction selectSite(sites: ZapSite[]): ZapSite | undefined {\n if (sites.length === 0) return undefined;\n let best = sites[0]!;\n for (let i = 1; i < sites.length; i++) {\n const site = sites[i]!;\n if ((site.alerts?.length ?? 0) > (best.alerts?.length ?? 0)) {\n best = site;\n }\n }\n return best;\n}\n\n// ZAP emits a zone-less RFC1123-like timestamp (\"Thu, 6 Dec 2018 10:53:11\");\n// parse it as UTC to match the Go peer's parseZapTimestamp and stay host-independent.\nconst ZAP_RFC1123_LIKE = /^[A-Za-z]{3}, \\d{1,2} [A-Za-z]{3} \\d{4} \\d{2}:\\d{2}:\\d{2}$/;\n\nfunction parseZapTimestamp(s: string): Date | undefined {\n const trimmed = s.trim();\n if (ZAP_RFC1123_LIKE.test(trimmed)) {\n // Appending GMT forces UTC interpretation, so this new Date() is\n // host-independent and safe — unlike a bare tool value.\n // eslint-disable-next-line no-restricted-syntax\n const d = new Date(`${trimmed} GMT`);\n if (!isNaN(d.getTime())) {\n return d;\n }\n }\n return parseTimestamp(s) ?? undefined;\n}\n\n// --- Main converter ---\n\nexport async function convertZapToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'zap');\n // SARIF routing — delegate to the shared SARIF converter\n registerAllFingerprints();\n const detected = detectConverter(input);\n if (detected && detected.fingerprint.id === 'sarif-to-hdf') {\n return convertSarifToHdf(input, converterVersion);\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const zapData = parseJSON<ZapReport>(input);\n\n const sites = Array.isArray(zapData.site) ? zapData.site : [];\n const site = selectSite(sites);\n const alerts = site?.alerts ?? [];\n\n // Deduplicate by pluginid — append .1, .2 for duplicates\n const pluginIdCount = new Map<string, number>();\n const {items: limitedAlerts, truncated} = limitArray(alerts);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAlerts.length} alert items (original: ${alerts.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n for (const alert of limitedAlerts) {\n // Deduplicate pluginid\n const count = pluginIdCount.get(alert.pluginid) ?? 0;\n pluginIdCount.set(alert.pluginid, count + 1);\n const reqId = count === 0 ? alert.pluginid : `${alert.pluginid}.${count}`;\n\n // Build NIST tags\n const nistTags = buildNistTags(alert.cweid ?? '');\n const cciTags = nistToCci(nistTags);\n\n // Build extra tags\n const extras: Record<string, unknown> = {};\n if (alert.cweid) {\n extras.cweid = alert.cweid;\n }\n if (alert.wascid) {\n extras.wascid = alert.wascid;\n }\n if (alert.riskdesc) {\n extras.riskdesc = alert.riskdesc;\n }\n if (alert.confidence) {\n extras.confidence = alert.confidence;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build results from instances\n const results: RequirementResult[] = [];\n if (alert.instances && alert.instances.length > 0) {\n const {items: limitedInstances, truncated: instTruncated} = limitArray(alert.instances);\n if (instTruncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Instances truncated at ${limitedInstances.length} for alert ${alert.pluginid}`);\n }\n for (const instance of limitedInstances) {\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(instance),\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n if (instance.attack) {\n result.message = instance.attack;\n }\n results.push(result);\n }\n }\n\n // Build descriptions\n const descriptions: Array<{label: string; data: string}> = [];\n if (alert.desc) {\n descriptions.push({label: 'default', data: stripHTML(alert.desc)});\n }\n const checkDesc = buildCheckDescription(alert);\n if (checkDesc) {\n descriptions.push({label: 'check', data: checkDesc});\n }\n\n const impact = riskCodeToImpact(alert.riskcode ?? '');\n\n const req: EvaluatedRequirement = {\n id: reqId,\n title: alert.name,\n impact,\n results,\n tags,\n descriptions,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n requirements.push(req);\n }\n\n const targetName = site?.['@host'] ?? 'Unknown Host';\n const siteName = site?.['@name'] ?? '';\n const baselineName = site && (site['@name'] || site['@host'])\n ? `OWASP ZAP Scan of ${site['@name'] ?? targetName}`\n : 'OWASP ZAP Scan';\n\n if (requirements.length === 0) {\n let target = siteName || targetName;\n if (!target || target === 'Unknown Host') {\n target = 'the target site';\n }\n requirements.push(buildNoFindingsRequirement(\n 'zap-no-findings',\n `OWASP ZAP scanned ${target} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline('OWASP ZAP Scan', requirements, {\n resultsChecksum,\n title: baselineName,\n summary: `ZAP Version ${zapData['@version'] ?? 'unknown'}`,\n }) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'OWASP ZAP',\n format: 'JSON',\n };\n if (zapData['@version']) {\n tool.version = zapData['@version'];\n }\n\n // Build components — ZAP is a DAST tool scanning web applications\n const components: Array<{name: string; type: TargetType; url?: string; labels?: Record<string, string>}> = [];\n if (site?.['@name']) {\n components.push({name: targetName, type: TargetType.Application, url: site['@name']});\n } else if (targetName !== 'Unknown Host') {\n components.push({name: targetName, type: TargetType.Application});\n }\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components,\n generator: {\n name: 'zap-to-hdf',\n version: converterVersion,\n },\n tool,\n };\n\n if (zapData['@generated']) {\n const ts = parseZapTimestamp(zapData['@generated']);\n if (ts) {\n hdf.timestamp = ts;\n }\n }\n\n return serializeHdf(hdf);\n}\n","/**\n * Shared BOM parser model (ADR-0001 Phase 2 / kirq.2).\n *\n * Re-exports the generated HDF Bill-of-Materials types so the parser and its\n * consumers depend on a single source of truth, and defines the relational\n * graph scaffolding reserved for future CBOM/SaaSBOM normalization. The graph\n * types are present but UNPOPULATED today — they satisfy the card's \"supports\n * relational extensions\" contract without asserting relationships no current\n * format cleanly provides. Mirrors hdf-converters/shared/go/bom.\n */\n\nimport type {\n AIModelBOMExtension,\n BillOfMaterials,\n Checksum,\n DatasetBOMExtension,\n Hyperparameter,\n InputOutput,\n PerformanceMetric,\n SBOMPackage,\n} from '@mitre/hdf-schema';\n\nexport { DatasetDerivationType, ModelAdaptationType } from '@mitre/hdf-schema';\n\n/**\n * BOM manifest-kind discriminator. The schema allows custom 'x-'-prefixed kinds\n * beyond the reserved set, so the generated `bomType` field is a plain string;\n * the reserved values below are the parser's normalized vocabulary. Mirrors the\n * Go bom package.\n */\nexport const BOMType = {\n Sbom: 'sbom',\n AIModel: 'ai-model',\n Dataset: 'dataset',\n} as const;\nexport type BOMType = (typeof BOMType)[keyof typeof BOMType];\n\nexport type {\n AIModelBOMExtension,\n BillOfMaterials,\n Checksum,\n DatasetBOMExtension,\n Hyperparameter,\n InputOutput,\n PerformanceMetric,\n SBOMPackage,\n};\n\n/** Supported source BOM formats the parser can detect and normalize. */\nexport type BomFormat = 'cyclonedx' | 'spdx' | 'cyclonedx-ml' | 'spdx-3-ai';\n\n/**\n * A node in the reserved relational-BOM graph (CBOM cryptographic assets,\n * SaaSBOM services, dependency edges). Reserved scaffolding — not populated by\n * the current CycloneDX/SPDX/ML parsers.\n */\nexport interface RelationalNode {\n /** Stable identifier within the graph (e.g. a bom-ref or SPDXID). */\n id: string;\n /** Node category (e.g. 'component', 'service', 'crypto-algorithm'). */\n kind: string;\n /** Human-readable label. */\n label?: string;\n /** Opaque per-node attributes carried until a normalized shape ships. */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * A directed relationship in the reserved relational-BOM graph (e.g.\n * DEPENDS_ON, DESCRIBES). Reserved scaffolding — not populated today.\n */\nexport interface RelationalEdge {\n /** Source node id. */\n from: string;\n /** Target node id. */\n to: string;\n /** Relationship type (e.g. 'depends-on', 'describes', 'derived-from'). */\n relationship: string;\n /** Opaque per-edge attributes. */\n attributes?: Record<string, unknown>;\n}\n\n/**\n * The normalized parser output: a schema-valid BillOfMaterials plus optional\n * relational-graph scaffolding. buildBom() emits the BillOfMaterials core;\n * nodes/edges stay undefined until a relational format is normalized.\n */\nexport type NormalizedBom = BillOfMaterials & {\n nodes?: RelationalNode[];\n edges?: RelationalEdge[];\n};\n","/**\n * BOM format fingerprints + detectFormat dispatcher.\n *\n * Self-contained structural detectors for the three supported BOM formats.\n * Detection precedence: an ML-BOM is a CycloneDX document with a\n * machine-learning-model component, so the ML detector must win over the plain\n * CycloneDX detector.\n *\n * ASYMMETRY NOTE (parity with Go): the Go peer exposes the same detectFormat\n * logic but has NO fingerprint registry — CLI auto-detect wiring is Phase 3 in\n * both languages. These BOM detectors are deliberately NOT registered in the\n * shared ConverterFingerprint registry (shared/typescript/registry.ts): that\n * registry drives full-document CLI auto-detection, and a BOM detector\n * returning 1.0 for a CycloneDX file would tie with the existing\n * cyclonedx-to-hdf converter fingerprint, making detectConverter refuse to\n * guess (ambiguous-tie rule) and regressing every CycloneDX input. BOM parsing\n * is a sub-document concern with no CLI converter until Phase 3.\n */\n\nimport type { BomFormat } from './model.js';\n\nexport interface FormatDetection {\n format: BomFormat;\n /** Detection confidence in the range 0..1. */\n confidence: number;\n}\n\nfunction record(input: unknown): Record<string, unknown> | undefined {\n return typeof input === 'object' && input !== null && !Array.isArray(input)\n ? (input as Record<string, unknown>)\n : undefined;\n}\n\n/** CycloneDX: bomFormat === 'CycloneDX'. Returns 0..1 confidence. */\nexport function detectCycloneDX(input: unknown): number {\n const obj = record(input);\n return obj?.bomFormat === 'CycloneDX' ? 1 : 0;\n}\n\n/**\n * CycloneDX ML-BOM: a CycloneDX document with at least one\n * machine-learning-model component. Strictly more specific than plain\n * CycloneDX.\n */\nexport function detectCycloneDXML(input: unknown): number {\n const obj = record(input);\n if (obj?.bomFormat !== 'CycloneDX') return 0;\n const components = obj.components;\n if (!Array.isArray(components)) return 0;\n const hasModel = components.some(\n c => record(c)?.type === 'machine-learning-model',\n );\n return hasModel ? 1 : 0;\n}\n\n/** SPDX: a non-empty spdxVersion string is present. Returns 0..1 confidence. */\nexport function detectSPDX(input: unknown): number {\n const obj = record(input);\n return typeof obj?.spdxVersion === 'string' && obj.spdxVersion.length > 0 ? 1 : 0;\n}\n\n/**\n * SPDX 3.0 AI/Dataset (JSON-LD): a document with an `@context` and an `@graph`\n * array carrying at least one ai_AIPackage or dataset_DatasetPackage element.\n * Structurally disjoint from the SPDX 2.3 detector (which keys on spdxVersion),\n * so the two never conflict.\n */\nexport function detectSPDX3(input: unknown): number {\n const obj = record(input);\n if (!obj || obj['@context'] === undefined) return 0;\n const graph = obj['@graph'];\n if (!Array.isArray(graph)) return 0;\n const hasAISubject = graph.some(el => {\n const type = record(el)?.type;\n return type === 'ai_AIPackage' || type === 'dataset_DatasetPackage';\n });\n return hasAISubject ? 1 : 0;\n}\n\n/**\n * Detect the BOM format of a parsed JSON object. ML wins over plain CycloneDX\n * by precedence; returns undefined when no supported format matches.\n */\nexport function detectFormat(input: unknown): FormatDetection | undefined {\n const ml = detectCycloneDXML(input);\n if (ml > 0) return { format: 'cyclonedx-ml', confidence: ml };\n const cdx = detectCycloneDX(input);\n if (cdx > 0) return { format: 'cyclonedx', confidence: cdx };\n const spdx3 = detectSPDX3(input);\n if (spdx3 > 0) return { format: 'spdx-3-ai', confidence: spdx3 };\n const spdx = detectSPDX(input);\n if (spdx > 0) return { format: 'spdx', confidence: spdx };\n return undefined;\n}\n","/**\n * CycloneDX SBOM -> normalized HDF BillOfMaterials.\n *\n * Flattens the top-level components[] into SBOM packages. Nested subcomponents\n * (metadata.component.components[]) are the tool's own assembly tree and are\n * intentionally not treated as inventory packages here.\n */\n\nimport {\n BOMType,\n type NormalizedBom,\n type SBOMPackage,\n} from './model.js';\nimport {\n asRecord,\n asString,\n buildBom,\n enrichFromPurl,\n} from './normalize.js';\nimport { limitArrayWithWarning } from '../converterutil.js';\n\n/** Extract license identifiers/expressions from a CycloneDX licenses[] array. */\nfunction extractLicenses(raw: unknown): string[] {\n if (!Array.isArray(raw)) return [];\n const out: string[] = [];\n for (const entry of raw) {\n const e = asRecord(entry);\n if (!e) continue;\n const license = asRecord(e.license);\n const id = license ? (asString(license.id) ?? asString(license.name)) : undefined;\n const value = id ?? asString(e.expression);\n if (value) out.push(value);\n }\n return out;\n}\n\nfunction componentToPackage(component: unknown): SBOMPackage | undefined {\n const c = asRecord(component);\n const name = c ? asString(c.name) : undefined;\n if (!c || !name) return undefined;\n\n const pkg: SBOMPackage = { name };\n const version = asString(c.version);\n if (version) pkg.version = version;\n const purl = asString(c.purl);\n if (purl) pkg.purl = purl;\n const licenses = extractLicenses(c.licenses);\n if (licenses.length > 0) pkg.licenses = licenses;\n\n enrichFromPurl(pkg);\n return pkg;\n}\n\nexport function parseCycloneDX(obj: Record<string, unknown>): NormalizedBom {\n const components = Array.isArray(obj.components) ? obj.components : [];\n const packages: SBOMPackage[] = [];\n for (const component of components) {\n const pkg = componentToPackage(component);\n if (pkg) packages.push(pkg);\n }\n\n const uniqueId = asString(obj.serialNumber);\n return buildBom({\n bomType: BOMType.Sbom,\n format: 'cyclonedx',\n packages: limitArrayWithWarning(packages, 'package'),\n uniqueId,\n });\n}\n","/**\n * SPDX SBOM -> normalized HDF BillOfMaterials.\n *\n * Maps packages[] to normalized SBOM packages. purl comes from an externalRefs\n * entry with referenceType 'purl'; licenses come from licenseConcluded /\n * licenseDeclared with NOASSERTION/NONE sentinels filtered out.\n */\n\nimport {\n BOMType,\n type NormalizedBom,\n type SBOMPackage,\n} from './model.js';\nimport {\n asRecord,\n asString,\n buildBom,\n cleanLicense,\n enrichFromPurl,\n} from './normalize.js';\nimport { limitArrayWithWarning } from '../converterutil.js';\n\nconst SPDX_LICENSE_FIELDS = ['licenseConcluded', 'licenseDeclared'] as const;\n\n/** First externalRefs[].referenceLocator whose referenceType is 'purl'. */\nfunction purlFromExternalRefs(refs: unknown): string | undefined {\n if (!Array.isArray(refs)) return undefined;\n for (const ref of refs) {\n const r = asRecord(ref);\n if (r?.referenceType === 'purl') {\n const locator = asString(r.referenceLocator);\n if (locator) return locator;\n }\n }\n return undefined;\n}\n\nfunction extractLicenses(pkg: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const field of SPDX_LICENSE_FIELDS) {\n const license = cleanLicense(pkg[field]);\n if (license && !out.includes(license)) out.push(license);\n }\n return out;\n}\n\nfunction packageToPackage(source: unknown): SBOMPackage | undefined {\n const p = asRecord(source);\n const name = p ? asString(p.name) : undefined;\n if (!p || !name) return undefined;\n\n const pkg: SBOMPackage = { name };\n const version = asString(p.versionInfo);\n if (version) pkg.version = version;\n const purl = purlFromExternalRefs(p.externalRefs);\n if (purl) pkg.purl = purl;\n const licenses = extractLicenses(p);\n if (licenses.length > 0) pkg.licenses = licenses;\n\n enrichFromPurl(pkg);\n return pkg;\n}\n\nexport function parseSPDX(obj: Record<string, unknown>): NormalizedBom {\n const sourcePackages = Array.isArray(obj.packages) ? obj.packages : [];\n const packages: SBOMPackage[] = [];\n for (const source of sourcePackages) {\n const pkg = packageToPackage(source);\n if (pkg) packages.push(pkg);\n }\n\n const uniqueId = asString(obj.documentNamespace);\n return buildBom({\n bomType: BOMType.Sbom,\n format: 'spdx',\n packages: limitArrayWithWarning(packages, 'package'),\n uniqueId,\n });\n}\n","/**\n * SPDX 3.0 AI/Dataset (JSON-LD) -> normalized HDF BillOfMaterials subjects.\n *\n * SPDX 3.0 is JSON-LD: a top-level { \"@context\", \"@graph\" } where \"@graph\" is an\n * array of typed elements. A single document is inherently MULTI-SUBJECT — it\n * can carry several ai_AIPackage and dataset_DatasetPackage elements — so this\n * parser returns one subject per AI/dataset element (unlike the single-BOM\n * parseSPDX / parseMLBOM paths). This is completely distinct from SPDX 2.3\n * (spdxVersion + packages[]), handled by parseSPDX.\n *\n * PARTIAL-FIDELITY: only fields that map cleanly onto the normalized extensions\n * are lifted; everything else (energy, autonomy, safety, bias, sensor, size, …)\n * is carried opaquely via the BOM `document` passthrough of the raw element.\n * Two conflation traps are deliberately avoided: ai_hyperparameter is training\n * knobs (-> hyperparameters, NEVER parameterCount) and dataset_datasetSize is\n * ambiguous/unlabeled (never -> recordCount).\n */\n\nimport {\n BOMType,\n type AIModelBOMExtension,\n type DatasetBOMExtension,\n type Hyperparameter,\n type NormalizedBom,\n type PerformanceMetric,\n} from './model.js';\nimport { asRecord, asString, buildBom, stringifyScalar } from './normalize.js';\nimport { limitArrayWithWarning } from '../converterutil.js';\n\n/** A single normalized AI/dataset subject lifted from the SPDX-3 @graph. */\nexport interface SPDX3Subject {\n kind: 'aiModel' | 'dataset';\n name: string;\n id: string;\n bom: NormalizedBom;\n}\n\n/** Result of parsing an SPDX-3 document: every AI/dataset subject it carries. */\nexport interface SPDX3ParseResult {\n subjects: SPDX3Subject[];\n}\n\n/** SPDX-3 relationship types that link a model to a training/eval dataset. */\nconst DATASET_RELATIONSHIP_TYPES = new Set(['trainedOn', 'testedOn']);\n\nfunction graphElements(obj: Record<string, unknown>): Record<string, unknown>[] {\n const graph = obj['@graph'];\n if (!Array.isArray(graph)) return [];\n const out: Record<string, unknown>[] = [];\n for (const el of graph) {\n const r = asRecord(el);\n if (r) out.push(r);\n }\n return out;\n}\n\n/** Map SPDX DictionaryEntry[] ({key,value}) to normalized {name,value} pairs. */\nfunction dictionaryEntries(value: unknown): Array<{ name: string; value: string }> {\n if (!Array.isArray(value)) return [];\n const out: Array<{ name: string; value: string }> = [];\n for (const entry of value) {\n const e = asRecord(entry);\n if (!e) continue;\n const name = asString(e.key);\n if (name === undefined) continue;\n const value = e.value !== undefined && e.value !== null ? stringifyScalar(e.value) : '';\n out.push({ name, value });\n }\n return out;\n}\n\n/** First element of a non-empty string array, else undefined. */\nfunction firstString(value: unknown): string | undefined {\n if (!Array.isArray(value)) return undefined;\n for (const item of value) {\n const s = asString(item);\n if (s !== undefined) return s;\n }\n return undefined;\n}\n\n/** Distinct non-empty strings of an array, joined with \"; \". */\nfunction joinDistinct(value: unknown): string | undefined {\n if (!Array.isArray(value)) return undefined;\n const seen: string[] = [];\n for (const item of value) {\n const s = asString(item);\n if (s !== undefined && !seen.includes(s)) seen.push(s);\n }\n return seen.length > 0 ? seen.join('; ') : undefined;\n}\n\n/**\n * Dataset references for a model: targets of trainedOn/testedOn relationships\n * whose `from` is this model. Each target is resolved to the referenced\n * dataset element's name when present in the graph, else the raw id. Distinct,\n * first-seen order.\n */\nfunction datasetRefsFor(\n modelId: string,\n relationships: Record<string, unknown>[],\n datasetNameById: Map<string, string>,\n): string[] {\n const out: string[] = [];\n for (const rel of relationships) {\n if (asString(rel.from) !== modelId) continue;\n if (!DATASET_RELATIONSHIP_TYPES.has(asString(rel.relationshipType) ?? '')) continue;\n const targets = Array.isArray(rel.to) ? rel.to : [rel.to];\n for (const target of targets) {\n const targetId = asString(target);\n if (targetId === undefined) continue;\n const ref = datasetNameById.get(targetId) ?? targetId;\n if (!out.includes(ref)) out.push(ref);\n }\n }\n return out;\n}\n\nfunction buildModelExtension(\n element: Record<string, unknown>,\n relationships: Record<string, unknown>[],\n datasetNameById: Map<string, string>,\n): AIModelBOMExtension {\n const model: AIModelBOMExtension = {};\n\n const hyperparameters: Hyperparameter[] = dictionaryEntries(element.ai_hyperparameter);\n if (hyperparameters.length > 0) model.hyperparameters = hyperparameters;\n\n const performanceMetrics: PerformanceMetric[] = dictionaryEntries(element.ai_metric);\n if (performanceMetrics.length > 0) model.performanceMetrics = performanceMetrics;\n\n const task = firstString(element.ai_domain);\n if (task !== undefined) model.task = task;\n\n const architecture = joinDistinct(element.ai_typeOfModel);\n if (architecture !== undefined) model.modelArchitecture = architecture;\n\n const intendedUse = asString(element.ai_informationAboutApplication);\n if (intendedUse !== undefined) model.intendedUse = intendedUse;\n\n const datasetRefs = datasetRefsFor(asString(element.spdxId) ?? '', relationships, datasetNameById);\n if (datasetRefs.length > 0) model.datasetRefs = datasetRefs;\n\n return model;\n}\n\nfunction buildDatasetExtension(element: Record<string, unknown>): DatasetBOMExtension {\n const dataset: DatasetBOMExtension = {};\n\n const modality = element.dataset_datasetType;\n if (Array.isArray(modality)) {\n const values = modality.map(asString).filter((s): s is string => s !== undefined);\n if (values.length > 0) dataset.modality = values;\n }\n\n const dataClassification = asString(element.dataset_confidentialityLevel);\n if (dataClassification !== undefined) dataset.dataClassification = dataClassification;\n\n const intendedUse = asString(element.dataset_intendedUse);\n if (intendedUse !== undefined) dataset.intendedUse = intendedUse;\n\n const provenance = asString(element.dataset_dataCollectionProcess);\n if (provenance !== undefined) dataset.provenance = provenance;\n\n return dataset;\n}\n\n/**\n * Parse an SPDX-3 JSON-LD document into its AI/dataset subjects. Emits one\n * aiModel subject per ai_AIPackage and one dataset subject per\n * dataset_DatasetPackage, in graph order.\n */\nexport function parseSPDX3(obj: Record<string, unknown>): SPDX3ParseResult {\n const elements = graphElements(obj);\n const relationships = elements.filter(el => el.type === 'Relationship');\n\n const datasetNameById = new Map<string, string>();\n for (const el of elements) {\n if (el.type !== 'dataset_DatasetPackage') continue;\n const id = asString(el.spdxId);\n const name = asString(el.name);\n if (id !== undefined && name !== undefined) datasetNameById.set(id, name);\n }\n\n const subjects: SPDX3Subject[] = [];\n for (const element of elements) {\n if (element.type === 'ai_AIPackage') {\n const model = buildModelExtension(element, relationships, datasetNameById);\n subjects.push({\n kind: 'aiModel',\n name: asString(element.name) ?? '',\n id: asString(element.spdxId) ?? '',\n bom: buildBom({\n bomType: BOMType.AIModel,\n format: 'spdx-3-ai',\n model,\n document: element,\n uniqueId: asString(element.spdxId),\n }),\n });\n } else if (element.type === 'dataset_DatasetPackage') {\n const dataset = buildDatasetExtension(element);\n subjects.push({\n kind: 'dataset',\n name: asString(element.name) ?? '',\n id: asString(element.spdxId) ?? '',\n bom: buildBom({\n bomType: BOMType.Dataset,\n format: 'spdx-3-ai',\n dataset,\n document: element,\n uniqueId: asString(element.spdxId),\n }),\n });\n }\n }\n\n return { subjects: limitArrayWithWarning(subjects, 'subject') };\n}\n","/**\n * CycloneDX ML-BOM -> normalized HDF ai-model BillOfMaterials.\n *\n * PARTIAL-FIDELITY: only modelCard fields that map cleanly onto the normalized\n * AI_Model_Extension are lifted (modelArchitecture, datasetRefs, intendedUse,\n * learningApproach, task, performanceMetrics, inputOutput.dataTypes).\n * parameterCount, serializationFormat, hyperparameters, and the rest of\n * inputOutput have NO native CycloneDX ML source, so they are left undefined —\n * never fabricated. The raw machine-learning-model component is carried verbatim\n * in the BOM `document` passthrough so nothing is lost, satisfying the\n * \"drop-or-passthrough, never invent\" rule.\n */\n\nimport {\n BOMType,\n type AIModelBOMExtension,\n type InputOutput,\n type NormalizedBom,\n type PerformanceMetric,\n} from './model.js';\nimport {\n asRecord,\n asString,\n buildBom,\n stringifyScalar,\n} from './normalize.js';\n\nfunction findModelComponent(obj: Record<string, unknown>): Record<string, unknown> | undefined {\n const components = Array.isArray(obj.components) ? obj.components : [];\n for (const component of components) {\n const c = asRecord(component);\n if (c?.type === 'machine-learning-model') return c;\n }\n return undefined;\n}\n\n/**\n * References to training/evaluation datasets. Only ref-shaped entries (a bare\n * ref string, or an object with a `ref`) are lifted; inline dataset descriptors\n * without a reference are left for a future dataset-normalization pass rather\n * than being synthesized into a ref.\n */\nfunction extractDatasetRefs(datasets: unknown): string[] {\n if (!Array.isArray(datasets)) return [];\n const out: string[] = [];\n for (const dataset of datasets) {\n if (typeof dataset === 'string') {\n if (dataset.length > 0) out.push(dataset);\n continue;\n }\n const ref = asString(asRecord(dataset)?.ref);\n if (ref) out.push(ref);\n }\n return out;\n}\n\n/** Intended-use statement from modelCard.considerations.useCases, if present. */\nfunction extractIntendedUse(considerations: unknown): string | undefined {\n const c = asRecord(considerations);\n if (!c || !Array.isArray(c.useCases)) return undefined;\n const parts = c.useCases\n .map(asString)\n .filter((s): s is string => s !== undefined);\n return parts.length > 0 ? parts.join('; ') : undefined;\n}\n\n/**\n * Reported evaluation metrics from modelCard.quantitativeAnalysis. Each native\n * metric's `type` becomes the normalized `name` and its `value` is carried as a\n * string (metrics are heterogeneous). An entry contributes only when it has a\n * name or value; native slice/confidenceInterval are left in the `document`.\n */\nfunction extractPerformanceMetrics(quantitativeAnalysis: unknown): PerformanceMetric[] {\n const qa = asRecord(quantitativeAnalysis);\n if (!qa || !Array.isArray(qa.performanceMetrics)) return [];\n const out: PerformanceMetric[] = [];\n for (const entry of qa.performanceMetrics) {\n const e = asRecord(entry);\n if (!e) continue;\n const name = asString(e.type);\n const value = e.value !== undefined && e.value !== null ? stringifyScalar(e.value) : undefined;\n if (name === undefined && value === undefined) continue;\n const metric: PerformanceMetric = {};\n if (name !== undefined) metric.name = name;\n if (value !== undefined) metric.value = value;\n out.push(metric);\n }\n return out;\n}\n\n/** Distinct `format` strings across modelParameters.inputs[] and outputs[]. */\nfunction extractIODataTypes(parameters: Record<string, unknown>): string[] {\n const out: string[] = [];\n for (const key of ['inputs', 'outputs']) {\n const entries = parameters[key];\n if (!Array.isArray(entries)) continue;\n for (const entry of entries) {\n const format = asString(asRecord(entry)?.format);\n if (format && !out.includes(format)) out.push(format);\n }\n }\n return out;\n}\n\nfunction buildModelExtension(modelComponent: Record<string, unknown>): AIModelBOMExtension {\n const model: AIModelBOMExtension = {};\n const modelCard = asRecord(modelComponent.modelCard);\n if (!modelCard) return model;\n\n const parameters = asRecord(modelCard.modelParameters);\n if (parameters) {\n const architecture =\n asString(parameters.modelArchitecture) ?? asString(parameters.architectureFamily);\n if (architecture) model.modelArchitecture = architecture;\n const datasetRefs = extractDatasetRefs(parameters.datasets);\n if (datasetRefs.length > 0) model.datasetRefs = datasetRefs;\n\n const learningApproach = asString(asRecord(parameters.approach)?.type);\n if (learningApproach) model.learningApproach = learningApproach;\n\n const task = asString(parameters.task);\n if (task) model.task = task;\n\n const dataTypes = extractIODataTypes(parameters);\n if (dataTypes.length > 0) {\n const inputOutput: InputOutput = { dataTypes };\n model.inputOutput = inputOutput;\n }\n }\n\n const performanceMetrics = extractPerformanceMetrics(modelCard.quantitativeAnalysis);\n if (performanceMetrics.length > 0) model.performanceMetrics = performanceMetrics;\n\n const intendedUse = extractIntendedUse(modelCard.considerations);\n if (intendedUse) model.intendedUse = intendedUse;\n\n return model;\n}\n\nexport function parseMLBOM(obj: Record<string, unknown>): NormalizedBom {\n const modelComponent = findModelComponent(obj);\n const model = modelComponent ? buildModelExtension(modelComponent) : {};\n\n return buildBom({\n bomType: BOMType.AIModel,\n format: 'cyclonedx-ml',\n model,\n document: modelComponent,\n uniqueId: asString(obj.serialNumber),\n });\n}\n","/**\n * Shared BOM normalization: parseBom / buildBom / detectFormat re-dispatch and\n * the cross-format helpers (object guards, license cleaning, purl handling).\n * Format-specific extraction lives in cyclonedx.ts / spdx.ts / ml-bom.ts.\n */\n\nimport { parseJSON, parsePurl } from '@mitre/hdf-utilities';\nimport { validateInputSize } from '../converterutil.js';\nimport {\n BOMType,\n type AIModelBOMExtension,\n type BillOfMaterials,\n type Checksum,\n type DatasetBOMExtension,\n type NormalizedBom,\n type SBOMPackage,\n} from './model.js';\nimport { detectFormat } from './fingerprints.js';\nimport { parseCycloneDX } from './cyclonedx.js';\nimport { parseSPDX } from './spdx.js';\nimport { parseSPDX3 } from './spdx3.js';\nimport { parseMLBOM } from './ml-bom.js';\n\nexport { detectFormat, type FormatDetection } from './fingerprints.js';\n\nconst CONVERTER = 'bom-parser';\n\n/** SPDX sentinels that mean \"no license\", filtered out of normalized output. */\nconst SPDX_NULL_LICENSES = new Set(['noassertion', 'none']);\n\nexport interface ParseResult {\n format: string;\n normalized: NormalizedBom;\n}\n\n/** Parts accepted by buildBom. Only the extension matching bomType is kept. */\nexport interface BuildBomParts {\n bomType: BOMType;\n format: string;\n packages?: SBOMPackage[];\n model?: AIModelBOMExtension;\n dataset?: DatasetBOMExtension;\n ref?: string;\n document?: Record<string, unknown>;\n uniqueId?: string;\n hashes?: Checksum[];\n license?: string | null;\n}\n\n/** Narrow an unknown value to a plain object (not array, not null). */\nexport function asRecord(value: unknown): Record<string, unknown> | undefined {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : undefined;\n}\n\n/** Narrow an unknown value to a non-empty string. */\nexport function asString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\n/**\n * Render a heterogeneous scalar BOM value (metric value, SPDX DictionaryEntry\n * value) to a string. This is the REFERENCE the Go side matches byte-for-byte\n * (see stringifyScalar / jsNumberToString in normalize.go): JS String() gives\n * numbers their shortest round-tripping form, and Go reimplements that exact\n * formatting. Callers must guard null/undefined before calling.\n */\nexport function stringifyScalar(value: unknown): string {\n return String(value);\n}\n\n/** Return an SPDX license string unless it is a NOASSERTION/NONE sentinel. */\nexport function cleanLicense(value: unknown): string | undefined {\n const s = asString(value);\n if (!s) return undefined;\n return SPDX_NULL_LICENSES.has(s.trim().toLowerCase()) ? undefined : s;\n}\n\n/**\n * Fill a package's missing name/version from its purl when parseable. Never\n * overwrites values the source BOM already provided (e.g. an SPDX versionInfo\n * is authoritative over a purl whose @segment is a git commit).\n */\nexport function enrichFromPurl(pkg: SBOMPackage): void {\n if (!pkg.purl) return;\n const parsed = parsePurl(pkg.purl);\n if (!parsed) return;\n if (!pkg.version && parsed.version) pkg.version = parsed.version;\n if (!pkg.name && parsed.name) pkg.name = parsed.name;\n}\n\n/**\n * Assemble a schema-valid BillOfMaterials from normalized parts, enforcing the\n * three-tier discipline: the packages/model/dataset extension is kept only when\n * it matches bomType; a mismatched extension is silently dropped (the schema\n * forbids it, so carrying it would produce invalid output).\n */\nexport function buildBom(parts: BuildBomParts): BillOfMaterials {\n const bom: BillOfMaterials = { bomType: parts.bomType, format: parts.format };\n\n if (parts.ref !== undefined) bom.ref = parts.ref;\n if (parts.document !== undefined) bom.document = parts.document;\n if (parts.uniqueId !== undefined) bom.uniqueId = parts.uniqueId;\n if (parts.hashes !== undefined && parts.hashes.length > 0) bom.hashes = parts.hashes;\n if (parts.license !== undefined) bom.license = parts.license;\n\n if (parts.bomType === BOMType.Sbom && parts.packages !== undefined) {\n bom.packages = parts.packages;\n }\n if (parts.bomType === BOMType.AIModel && parts.model !== undefined) {\n bom.model = parts.model;\n }\n if (parts.bomType === BOMType.Dataset && parts.dataset !== undefined) {\n bom.dataset = parts.dataset;\n }\n\n return bom;\n}\n\n/**\n * Detect and parse a BOM document into normalized form. Validates input size\n * FIRST (security boundary), then dispatches on the detected format. Throws on\n * oversized or undetectable input.\n */\nexport function parseBom(input: string): ParseResult {\n validateInputSize(input, CONVERTER);\n const obj = parseJSON<unknown>(input);\n const detected = detectFormat(obj);\n if (!detected) {\n throw new Error(\n 'bom-parser: could not detect a supported BOM format (expected CycloneDX or SPDX JSON)',\n );\n }\n const record = asRecord(obj) ?? {};\n switch (detected.format) {\n case 'cyclonedx-ml':\n return { format: detected.format, normalized: parseMLBOM(record) };\n case 'cyclonedx':\n return { format: detected.format, normalized: parseCycloneDX(record) };\n case 'spdx':\n return { format: detected.format, normalized: parseSPDX(record) };\n case 'spdx-3-ai': {\n // SPDX-3 is multi-subject; parseBom's single-BOM contract returns the\n // first subject's BOM. The full multi-subject consumer is parseSPDX3.\n const [first] = parseSPDX3(record).subjects;\n if (!first) {\n throw new Error('bom-parser: SPDX-3 document carries no AI/dataset subjects');\n }\n return { format: detected.format, normalized: first.bom };\n }\n }\n}\n","/**\n * Generic, source-tool-agnostic mapping helpers shared by the HDF export\n * converters (hdf-to-ecs, hdf-to-splunk, ...).\n *\n * The export converters deliberately operate on generically-parsed JSON rather\n * than typed HDF structs, so their output can be held byte-identical with the\n * Go implementations. This module centralizes the generic accessors, the status\n * roll-up, the requirement/document field extraction, and the canonical\n * (key-sorted, HTML-unescaped) line serialization. Target-specific event shaping\n * (ECS field names, CIM field names, envelopes) stays in each converter.\n */\n\nimport { parseTimestamp } from '@mitre/hdf-utilities';\nimport { validateInputSize, parseHdf } from './converterutil.js';\n\nexport type Obj = Record<string, unknown>;\n\n// --- generic JSON access ---\n\nexport function asMap(v: unknown): Obj | undefined {\n return v !== null && typeof v === 'object' && !Array.isArray(v) ? (v as Obj) : undefined;\n}\n\nexport function asArr(v: unknown): unknown[] | undefined {\n return Array.isArray(v) ? v : undefined;\n}\n\nexport function getStr(m: Obj | undefined, key: string): string {\n const v = m?.[key];\n return typeof v === 'string' ? v : '';\n}\n\nexport function setIf(m: Obj, key: string, val: string): void {\n if (val !== '') m[key] = val;\n}\n\nexport function stringSlice(v: unknown): string[] {\n if (typeof v === 'string') return [v];\n if (Array.isArray(v)) return v.filter((e): e is string => typeof e === 'string');\n return [];\n}\n\n// --- status roll-up ---\n\n/** Most-significant status across a requirement's results[] (lossless). */\nexport function worstOfResults(req: Obj): string {\n const results = asArr(req.results) ?? [];\n const precedence = ['failed', 'error', 'passed', 'notReviewed', 'notApplicable'];\n const present = new Set<string>();\n for (const rRaw of results) {\n const r = asMap(rRaw);\n if (r) present.add(getStr(r, 'status'));\n }\n for (const s of precedence) {\n if (present.has(s)) return s;\n }\n return 'notReviewed';\n}\n\n/**\n * Whether an HDF Result_Status is a failing verdict. Only 'failed' fails;\n * 'error' is indeterminate (not a compliance failure) and every other value is\n * non-failing. Single shared definition of \"failing\" for the suppression axis\n * and the per-exporter outcome maps.\n */\nexport function isFailing(status: string): boolean {\n return status === 'failed';\n}\n\nexport interface Status {\n raw: string; // worstOf(results[].status) — the RAW verdict\n effective: string; // effectiveStatus, '' when absent\n rollup: string; // effective when set, else raw\n overridden: boolean; // statusOverrides present or effectiveStatus set\n // Acceptance axis, orthogonal to the raw verdict: raw is failing but an\n // override drove the effective status non-failing (waiver / falsePositive /\n // attestation). A riskAdjustment / operationalRequirement / poam that leaves\n // effectiveStatus failing is NOT suppressed — it stays actionable, only its\n // impact is re-scored. Keyed on effective STATUS, not \"any override present\".\n suppressed: boolean;\n}\n\n/** Resolve the status context for a requirement. */\nexport function statusOf(req: Obj): Status {\n const raw = worstOfResults(req);\n const effective = getStr(req, 'effectiveStatus');\n const overrides = asArr(req.statusOverrides);\n const rollup = effective !== '' ? effective : raw;\n return {\n raw,\n effective,\n rollup,\n overridden: (overrides !== undefined && overrides.length > 0) || 'effectiveStatus' in req,\n suppressed: isFailing(raw) && !isFailing(rollup),\n };\n}\n\n// --- document / requirement field extraction ---\n\nexport function firstComponent(doc: Obj): Obj | undefined {\n const comps = asArr(doc.components);\n if (!comps || comps.length === 0) return undefined;\n return asMap(comps[0]);\n}\n\nexport function firstResultStartTime(req: Obj, fallback: string): string {\n const results = asArr(req.results) ?? [];\n if (results.length > 0) {\n const st = getStr(asMap(results[0]), 'startTime');\n if (st !== '') return st;\n }\n return fallback;\n}\n\nexport function defaultDescription(req: Obj): string {\n const descs = asArr(req.descriptions) ?? [];\n for (const dRaw of descs) {\n const d = asMap(dRaw);\n if (d && getStr(d, 'label') === 'default') return getStr(d, 'data');\n }\n return '';\n}\n\nexport function firstRefURL(req: Obj): string {\n const refs = asArr(req.refs) ?? [];\n for (const rRaw of refs) {\n const url = getStr(asMap(rRaw), 'url');\n if (url !== '') return url;\n }\n return '';\n}\n\n/** Deterministic event id: component | baseline | control. */\nexport function eventID(component: Obj | undefined, baselineName: string, controlID: string): string {\n let comp = '';\n if (component) comp = getStr(component, 'componentId') || getStr(component, 'name');\n return [comp, baselineName, controlID].join('|');\n}\n\n// --- lossless hdf.* block ---\n\n/**\n * Build the lossless hdf.* namespace shared by the export converters: promoted\n * snake_case scalars plus the full requirement sub-objects preserved verbatim.\n * `status` is the lossless results roll-up (statusOf().raw); `suppressed` is the\n * acceptance axis (statusOf().suppressed).\n */\nexport function buildHDFBlock(\n req: Obj,\n baseline: Obj,\n status: string,\n overridden: boolean,\n suppressed: boolean,\n generator: Obj | undefined,\n tool: Obj | undefined,\n converterVersion: string,\n): Obj {\n const hdf: Obj = { status, overridden, suppressed, exporter_version: converterVersion };\n setIf(hdf, 'control_id', getStr(req, 'id'));\n setIf(hdf, 'baseline', getStr(baseline, 'name'));\n if ('effectiveStatus' in req) hdf.effective_status = req.effectiveStatus;\n if ('effectiveImpact' in req) hdf.effective_impact = req.effectiveImpact;\n if ('impact' in req) hdf.impact = req.impact;\n if ('severity' in req) hdf.severity = req.severity;\n if ('disposition' in req) hdf.disposition = req.disposition;\n const tags = asMap(req.tags);\n if (tags?.nist !== undefined) hdf.nist = tags.nist;\n if (tags?.cci !== undefined) hdf.cci = tags.cci;\n\n const passthrough: Record<string, string> = {\n tags: 'tags',\n cvss: 'cvss',\n cwe: 'cwe',\n epss: 'epss',\n kev: 'kev',\n affectedPackages: 'affected_packages',\n descriptions: 'descriptions',\n results: 'results',\n statusOverrides: 'status_overrides',\n poams: 'poams',\n code: 'code',\n refs: 'refs',\n };\n for (const [src, dst] of Object.entries(passthrough)) {\n if (src in req) hdf[dst] = req[src];\n }\n if (generator) hdf.generator = generator;\n if (tool) hdf.tool = tool;\n return hdf;\n}\n\n// --- canonical line serialization ---\n\n/**\n * A numeric value that must serialize with an explicit decimal point, so a\n * whole-number renders as `10.0` rather than the integer `10`. Some consumers\n * type-check strictly (OCSF's `float_t` rejects an integer-shaped token).\n * JSON.stringify cannot emit `10.0` for a JS number, so the value is carried in\n * this wrapper (passed through canonicalize untouched) and rendered as a bare\n * numeric token by stringifyLine. Go's counterpart is encoding/json's json.Number.\n */\nexport class RawNumber {\n constructor(readonly token: string) {}\n}\n\n/** Wrap a number as a RawNumber whose token always bears a decimal point. */\nexport function floatNumber(f: number): RawNumber {\n let s = String(f);\n if (!/[.eE]/.test(s)) s += '.0';\n return new RawNumber(s);\n}\n\n// SOH (U+0001) delimits a raw numeric token inside stringifyLine's intermediate\n// JSON. SOH is a control character that does not occur in HDF text, so in\n// practice it never collides. The only theoretical collision is a string whose\n// ENTIRE value is exactly SOH + <bare number> + SOH — unreachable from real HDF,\n// which carries no raw control characters.\nconst RAWNUM_MARK = String.fromCharCode(1);\nconst RAWNUM_RE = /\"\\\\u0001(-?\\d+(?:\\.\\d+)?(?:[eE][+-]?\\d+)?)\\\\u0001\"/g;\n\n/**\n * Compare two strings by Unicode code point. This matches Go's `encoding/json`\n * key ordering, which is a bytewise comparison of the UTF-8 encoding \\u2014 and UTF-8\n * byte order is identical to code-point order. JS's default Array.sort() instead\n * compares UTF-16 code units, which diverges for supplementary-plane (non-BMP)\n * characters: a lead surrogate (0xD800\\u20130xDBFF) sorts before a BMP char in\n * [0xE000,0xFFFF] under UTF-16, but a non-BMP code point (\\u22650x10000) sorts after\n * it under UTF-8. Iterating the string yields whole code points (surrogate pairs\n * combined), so this comparator is correct for the full Unicode range.\n */\nfunction byCodePoint(a: string, b: string): number {\n const ai = [...a];\n const bi = [...b];\n const n = Math.min(ai.length, bi.length);\n for (let i = 0; i < n; i++) {\n const ca = ai[i]?.codePointAt(0) ?? 0;\n const cb = bi[i]?.codePointAt(0) ?? 0;\n if (ca !== cb) return ca - cb;\n }\n return ai.length - bi.length;\n}\n\n/**\n * Recursively sort object keys in Go's map-key order (bytewise UTF-8 / code\n * point) so the emitted JSON is byte-identical to Go's encoder.\n */\nexport function canonicalize(v: unknown): unknown {\n if (v instanceof RawNumber) return v; // preserve the wrapper; not an object to sort\n if (Array.isArray(v)) return v.map(canonicalize);\n const m = asMap(v);\n if (m) {\n const out: Obj = {};\n for (const k of Object.keys(m).sort(byCodePoint)) out[k] = canonicalize(m[k]);\n return out;\n }\n return v;\n}\n\n/**\n * Emit compact JSON matching Go's encoder byte-for-byte. A RawNumber is rendered\n * as a bare numeric token (Go's json.Number) via an SOH-delimited placeholder\n * that is stripped back to the token afterward. Go's encoding/json escapes\n * U+2028/U+2029 (JSONP safety) while JSON.stringify emits them raw, so we escape\n * them here. Key ordering is handled upstream by canonicalize (code point order).\n */\nexport function stringifyLine(v: unknown): string {\n return JSON.stringify(v, (_key, val) => (val instanceof RawNumber ? RAWNUM_MARK + val.token + RAWNUM_MARK : val))\n .replace(RAWNUM_RE, '$1')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029');\n}\n\n// --- shared export driver ---\n\n/**\n * Maps one requirement (with its baseline and doc-level context) to one output\n * object. Doc-level context is supplied by the driver; per-exporter constants\n * (e.g. the converter version) are captured by the closure the exporter passes\n * in — keeping the driver target-agnostic.\n */\nexport type EventBuilder = (\n req: Obj,\n baseline: Obj,\n docTimestamp: string,\n tool: Obj | undefined,\n generator: Obj | undefined,\n component: Obj | undefined,\n) => Obj;\n\n/**\n * Shared entry-point driver for the HDF→SIEM exporters: runs the identical\n * prologue (validate, parse, baselines extraction, doc-level context), fans out\n * one output object per requirement via `build`, and joins the canonical NDJSON\n * lines (byte-identical with the Go `Export` driver). `converterName` prefixes\n * the missing-baselines error and drives validateInputSize.\n */\nexport function runExport(input: string, converterName: string, build: EventBuilder): string {\n validateInputSize(input, converterName);\n const doc = parseHdf<Obj>(input);\n\n const baselines = asArr(doc.baselines);\n if (!baselines) {\n throw new Error(`${converterName}: invalid HDF structure: missing baselines field`);\n }\n\n const docTimestamp = getStr(doc, 'timestamp');\n const tool = asMap(doc.tool);\n const generator = asMap(doc.generator);\n const component = firstComponent(doc);\n\n const lines: string[] = [];\n for (const bRaw of baselines) {\n const baseline = asMap(bRaw);\n if (!baseline) continue;\n const reqs = asArr(baseline.requirements) ?? [];\n for (const rRaw of reqs) {\n const req = asMap(rRaw);\n if (!req) continue;\n lines.push(stringifyLine(canonicalize(build(req, baseline, docTimestamp, tool, generator, component))));\n }\n }\n return lines.length === 0 ? '' : lines.join('\\n') + '\\n';\n}\n\n/**\n * The first cvss[].source that looks like a CVE id (case-insensitive \"CVE-\"\n * prefix), or ''. Shared by the exporters that key vulnerability identity off\n * the CVE (splunk, ocsf).\n */\nexport function firstCVE(cvssList: unknown[]): string {\n for (const c of cvssList) {\n const src = getStr(asMap(c), 'source');\n if (src.toUpperCase().startsWith('CVE-')) return src;\n }\n return '';\n}\n\n/**\n * Parse an HDF RFC3339 timestamp into integer epoch seconds (Splunk HEC `time`)\n * via the canonical parser, returning undefined when empty/unparseable. Integer\n * epoch keeps Go and TypeScript byte-identical.\n */\nexport function epochSeconds(s: string): number | undefined {\n const d = parseTimestamp(s);\n if (d === null) return undefined;\n return Math.floor(d.getTime() / 1000);\n}\n\n/**\n * Parse an HDF RFC3339 timestamp into integer epoch milliseconds (OCSF `time`)\n * via the canonical parser, returning undefined when empty/unparseable.\n */\nexport function epochMillis(s: string): number | undefined {\n const d = parseTimestamp(s);\n if (d === null) return undefined;\n return d.getTime();\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { parseBom, buildBom, BOMType, type BuildBomParts } from '../../../shared/typescript/bom/index.js';\nimport { canonicalize } from '../../../shared/typescript/exportmap.js';\nimport type {\n Component,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n createMinimalBaseline,\n createRequirement,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * CycloneDX JSON structures (subset relevant to vulnerability mapping)\n */\ninterface CycloneDXBom {\n bomFormat: string;\n specVersion: string;\n metadata?: CycloneDXMetadata;\n components?: CycloneDXComponent[];\n vulnerabilities?: CycloneDXVulnerability[];\n}\n\ninterface CycloneDXMetadata {\n timestamp?: string;\n component?: CycloneDXMetadataComponent;\n}\n\ninterface CycloneDXMetadataComponent {\n type?: string;\n name?: string;\n version?: string;\n 'bom-ref'?: string;\n}\n\ninterface CycloneDXComponent {\n type: string;\n name: string;\n version?: string;\n group?: string;\n 'bom-ref'?: string;\n components?: CycloneDXComponent[];\n}\n\ninterface CycloneDXVulnerability {\n id: string;\n source?: CycloneDXSource;\n ratings?: CycloneDXRating[];\n cwes?: number[];\n description?: string;\n detail?: string;\n recommendation?: string;\n affects?: CycloneDXAffect[];\n analysis?: CycloneDXAnalysis;\n}\n\ninterface CycloneDXSource {\n name?: string;\n url?: string;\n}\n\ninterface CycloneDXRating {\n source?: CycloneDXSource;\n score?: number;\n severity?: string;\n method?: string;\n vector?: string;\n}\n\ninterface CycloneDXAffect {\n ref: string;\n}\n\ninterface CycloneDXAnalysis {\n state?: string;\n justification?: string;\n response?: string[];\n detail?: string;\n}\n\nconst CVSS_METHODS = new Set([\n 'CVSSv2',\n 'CVSSv3',\n 'CVSSv31',\n 'CVSSv4',\n]);\n\n// NOTE: heimdall2 mapped info/unknown severity to NotReviewed status.\n// We intentionally do NOT replicate that — a vulnerability is a finding\n// regardless of severity confidence. Info/unknown severity vulns are Failed\n// with impact from the severity mapping (info→0.1, unknown→0.5).\n\n/**\n * Computes the maximum impact across all ratings for a vulnerability.\n * Prefers CVSS score/10 when available, falls back to severityToImpact().\n */\nfunction maxImpact(ratings: CycloneDXRating[]): number {\n if (ratings.length === 0) {\n return 0.5;\n }\n\n let max = 0;\n for (const rating of ratings) {\n let impact: number;\n if (\n rating.method &&\n CVSS_METHODS.has(rating.method) &&\n rating.score !== undefined &&\n rating.score !== null\n ) {\n impact = rating.score / 10;\n } else {\n impact = severityToImpact(rating.severity ?? 'medium');\n }\n if (impact > max) {\n max = impact;\n }\n }\n return max;\n}\n\n\n/**\n * Formats the ratings as a human-readable tag string.\n */\nfunction formatRatingsTag(ratings: CycloneDXRating[]): string {\n return ratings\n .map((r) => `${r.source?.name ?? 'Unknown'} - ${r.severity ?? 'unrated'}`)\n .join(', ');\n}\n\n/**\n * Formats a component reference as a code_desc string.\n */\nfunction formatCodeDesc(\n componentLookup: Map<string, CycloneDXComponent>,\n ref: string\n): string {\n const comp = componentLookup.get(ref);\n if (!comp) {\n // VEX case: no matching component, use the ref directly\n return `Component ${ref} is vulnerable`;\n }\n\n let name = '';\n if (comp.group) {\n name += comp.group + '/';\n }\n name += comp.name;\n if (comp.version) {\n name += '@' + comp.version;\n }\n return `Component ${name} is vulnerable`;\n}\n\n/**\n * Flattens nested CycloneDX components into a single array.\n */\nfunction flattenComponents(components: CycloneDXComponent[]): CycloneDXComponent[] {\n const result: CycloneDXComponent[] = [];\n for (const comp of components) {\n result.push(comp);\n if (comp.components) {\n result.push(...flattenComponents(comp.components));\n }\n }\n return result;\n}\n\n/**\n * Reports whether any (possibly nested) component is a machine-learning-model,\n * i.e. the CycloneDX document is an AI-BOM.\n */\nfunction hasMLModelComponent(components: CycloneDXComponent[]): boolean {\n return flattenComponents(components).some(\n (comp) => comp.type === 'machine-learning-model'\n );\n}\n\n/**\n * Converts CycloneDX SBOM/VEX JSON to HDF format.\n *\n * @param input - CycloneDX JSON string\n * @returns HDF JSON string\n */\nexport async function convertCyclonedxToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('cyclonedx: empty input');\n }\n validateInputSize(input, 'cyclonedx');\n\n const bom = parseJSON<CycloneDXBom>(input);\n\n if (!bom || typeof bom !== 'object') {\n throw new Error('cyclonedx: invalid JSON');\n }\n\n if (bom.bomFormat !== 'CycloneDX') {\n throw new Error(\n `cyclonedx: missing or invalid bomFormat (expected \"CycloneDX\", got \"${bom.bomFormat ?? 'undefined'}\")`\n );\n }\n\n if (\n (!bom.components || bom.components.length === 0) &&\n (!bom.vulnerabilities || bom.vulnerabilities.length === 0)\n ) {\n throw new Error(\n 'cyclonedx: input has neither components nor vulnerabilities'\n );\n }\n\n if (!bom.vulnerabilities || bom.vulnerabilities.length === 0) {\n if (hasMLModelComponent(bom.components ?? [])) {\n throw new Error(\n 'cyclonedx: this file is a CycloneDX AI-BOM (machine-learning-model inventory) with no vulnerabilities; ' +\n 'to import it into a system document, use:\\n' +\n ' hdf system create <file> --from cyclonedx-mlbom'\n );\n }\n throw new Error(\n 'cyclonedx: this file is an SBOM inventory with no vulnerabilities; ' +\n 'to import SBOM data into a system document, use:\\n' +\n ' hdf system create <sbom-file> --component-name <name>'\n );\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Prefer the BOM creation time as the scan timestamp; fall back to now.\n const parsedTimestamp = bom.metadata?.timestamp\n ? (parseTimestamp(bom.metadata.timestamp) ?? undefined)\n : undefined;\n const scanTime =\n parsedTimestamp && !isNaN(parsedTimestamp.getTime())\n ? parsedTimestamp\n : new Date();\n\n // Flatten nested components and build lookup by bom-ref\n const allComponents = flattenComponents(bom.components ?? []);\n const componentLookup = new Map<string, CycloneDXComponent>();\n for (const comp of allComponents) {\n if (comp['bom-ref']) {\n componentLookup.set(comp['bom-ref'], comp);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n const { items: limitedVulns, truncated: truncatedVulns } = limitArray(bom.vulnerabilities ?? []);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedVulns) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${(bom.vulnerabilities ?? []).length})`);\n }\n for (const vuln of limitedVulns) {\n const ratings = vuln.ratings ?? [];\n const impact = maxImpact(ratings);\n const cwes = vuln.cwes ?? [];\n const nist = mapCWEToNIST(cwes.map(c => `${c}`), DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cwes.length > 0) {\n tags['cweid'] = cwes.map((c) => `CWE-${c}`);\n }\n\n if (ratings.length > 0) {\n tags['ratings'] = formatRatingsTag(ratings);\n }\n\n // Build descriptions (must always include a 'default' label per HDF schema)\n const descriptions: Description[] = [];\n\n // Default description: description + detail\n const defaultParts: string[] = [];\n if (vuln.description) {\n defaultParts.push(`Description: ${vuln.description}`);\n }\n if (vuln.detail) {\n defaultParts.push(`Detail: ${vuln.detail}`);\n }\n if (defaultParts.length > 0) {\n descriptions.push({ label: 'default', data: defaultParts.join('\\n\\n') });\n } else {\n descriptions.push({ label: 'default', data: vuln.id });\n }\n\n // Fix description: recommendation + workaround from analysis\n const fixParts: string[] = [];\n if (vuln.recommendation) {\n fixParts.push(vuln.recommendation);\n }\n if (vuln.analysis?.detail) {\n fixParts.push(`Workaround: ${vuln.analysis.detail}`);\n }\n if (fixParts.length > 0) {\n descriptions.push({ label: 'fix', data: fixParts.join('\\n\\n') });\n }\n\n // Build results: one per affected component.\n // All vulnerabilities are Failed — info/unknown severity affects impact\n // score but not status.\n const affects = vuln.affects ?? [];\n // CycloneDX carries no per-affect explanation, so results carry no message key.\n const toResult = (codeDesc: string): RequirementResult =>\n createResult(ResultStatus.Failed, undefined, { codeDesc, startTime: scanTime });\n const results =\n affects.length > 0\n ? affects.map((affect) => toResult(formatCodeDesc(componentLookup, affect.ref)))\n : [toResult(`Vulnerability ${vuln.id}`)];\n\n const title = vuln.source?.name\n ? `${vuln.id} (${vuln.source.name})`\n : vuln.id;\n\n // verificationMethod is intentionally NOT set. CycloneDX carries both\n // machine-generated SBOM vulnerability data and human-authored VEX\n // statements (analyst assertions about CVE exploitability). The converter\n // cannot reliably distinguish the two, so stamping \"automated\" would\n // misclassify VEX-derived requirements.\n const req = createRequirement(vuln.id, title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n requirements.push(req);\n }\n\n const baseline = createMinimalBaseline('CycloneDX Scan', requirements, {\n resultsChecksum,\n }) as EvaluatedBaseline;\n\n const targetComponent: Component = {\n name: bom.metadata?.component?.name ?? '',\n type: TargetType.Application,\n };\n if (bom.metadata?.component?.version) {\n targetComponent.version = bom.metadata.component.version;\n }\n\n // Attach the CycloneDX BOM to the component as a generalized boms[] entry.\n // The shared BOM parser yields the normalized package inventory; the raw\n // manifest is also carried via document passthrough so no data is dropped.\n // Vuln-only inputs (no components) have no packages and carry the document only.\n const parsedBom = parseBom(input);\n const bomParts: BuildBomParts = {\n bomType: BOMType.Sbom,\n format: 'cyclonedx',\n uniqueId: parsedBom.normalized.uniqueId,\n // Sort keys in code-point order to match Go's json.Marshal, which sorts map\n // keys — keeps the raw passthrough byte-identical across the two languages.\n document: canonicalize(JSON.parse(input)) as Record<string, unknown>,\n };\n if (parsedBom.normalized.packages && parsedBom.normalized.packages.length > 0) {\n bomParts.packages = parsedBom.normalized.packages;\n }\n const componentBom = buildBom(bomParts);\n\n return buildHdfResults({\n generatorName: 'cyclonedx-to-hdf',\n converterVersion,\n toolName: 'CycloneDX',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ ...targetComponent, boms: [componentBom] }],\n timestamp: scanTime,\n });\n}\n","import { buildCsv } from '@mitre/hdf-utilities';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Component, Description } from '@mitre/hdf-schema';\nimport { validateInputSize, parseHdf } from '../../../shared/typescript/converterutil.js';\n\n/**\n * Row structure for CSV export\n */\ninterface CsvRow {\n 'Baseline ID': string;\n 'Baseline Version': string;\n 'Baseline Title': string;\n 'Target ID': string;\n 'Target Type': string;\n 'Requirement ID': string;\n 'Requirement Title': string;\n 'Description': string;\n 'Check': string;\n 'Fix': string;\n 'Rationale': string;\n 'Code': string;\n 'References': string;\n 'Severity': string;\n 'Impact': number;\n 'Status': string;\n 'NIST Controls': string;\n 'CCI Controls': string;\n 'Control Type': string;\n 'Verification Method': string;\n 'Applicability': string;\n 'Result Message': string;\n}\n\n/**\n * Convert HDF JSON to CSV format\n * @param input HDF JSON string\n * @returns CSV string with sanitized output\n */\nexport function convertHdfToCsv(input: string): string {\n validateInputSize(input, 'hdf-to-csv');\n const hdf = parseHdf<HDFResults>(input);\n\n if (!hdf || typeof hdf !== 'object' || !('baselines' in hdf)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdf.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n const rows: CsvRow[] = [];\n\n // Get components array (may be empty or undefined)\n const components = hdf.components || [];\n\n // If no components, create a single default target entry\n const targetList: Array<{ name: string; type: string }> = components.length > 0\n ? components.map((t: Component) => ({ name: t.name, type: t.type }))\n : [{ name: '', type: '' }];\n\n // Iterate through each baseline\n for (const baseline of hdf.baselines) {\n // Iterate through each requirement in the baseline\n for (const requirement of baseline.requirements) {\n // Create a row for each target\n for (const target of targetList) {\n rows.push(createRow(baseline, requirement, target));\n }\n }\n }\n\n // Convert to CSV with sanitization enabled\n return buildCsv(rows, { sanitize: true });\n}\n\n/**\n * Create a CSV row from baseline, requirement, and target data\n */\nfunction createRow(\n baseline: EvaluatedBaseline,\n requirement: EvaluatedRequirement,\n target: { name: string; type: string }\n): CsvRow {\n // Get default description (required to be present per schema)\n const defaultDesc = requirement.descriptions.find((d: Description) => d.label === 'default');\n const description = defaultDesc?.data || '';\n\n // Other conventional description labels (check/fix/rationale) — empty when absent\n const check = descriptionByLabel(requirement, 'check');\n const fix = descriptionByLabel(requirement, 'fix');\n const rationale = descriptionByLabel(requirement, 'rationale');\n const code = requirement.code ?? '';\n const references = flattenRefs(requirement.refs);\n\n // Get severity from tags or derive from impact\n const severity = getSeverity(requirement);\n\n // Get status from first result (results is required, minItems: 1 per schema)\n const firstResult = requirement.results[0];\n const status = firstResult?.status || '';\n const message = firstResult?.message || '';\n\n // Extract NIST and CCI controls from tags\n const nistControls = extractArrayFromTags(requirement.tags, 'nist');\n const cciControls = extractArrayFromTags(requirement.tags, 'cci');\n\n return {\n 'Baseline ID': baseline.name,\n 'Baseline Version': baseline.version || '',\n 'Baseline Title': baseline.title || '',\n 'Target ID': target.name,\n 'Target Type': target.type,\n 'Requirement ID': requirement.id,\n 'Requirement Title': requirement.title || '',\n 'Description': description,\n 'Check': check,\n 'Fix': fix,\n 'Rationale': rationale,\n 'Code': code,\n 'References': references,\n 'Severity': severity,\n 'Impact': requirement.impact,\n 'Status': String(status),\n 'NIST Controls': nistControls,\n 'CCI Controls': cciControls,\n 'Control Type': requirement.controlType ?? '',\n 'Verification Method': requirement.verificationMethod ?? '',\n 'Applicability': requirement.applicability ?? '',\n 'Result Message': message\n };\n}\n\n/**\n * Get severity from requirement tags or derive from impact\n */\nfunction getSeverity(requirement: EvaluatedRequirement): string {\n // Check if severity is explicitly provided in tags\n if (requirement.tags && typeof requirement.tags === 'object') {\n if ('severity' in requirement.tags) {\n const sev = requirement.tags.severity;\n if (typeof sev === 'string') {\n return sev;\n }\n if (Array.isArray(sev) && sev.length > 0) {\n return String(sev[0]);\n }\n }\n }\n\n // Derive from impact if not provided\n const impact = requirement.impact;\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'medium';\n return 'low';\n}\n\n/**\n * Extract array values from tags object and join with semicolons\n */\nfunction extractArrayFromTags(\n tags: Record<string, unknown>,\n key: string\n): string {\n if (!tags || typeof tags !== 'object') {\n return '';\n }\n\n const value = tags[key];\n if (Array.isArray(value)) {\n return value.map(v => String(v)).join('; ');\n }\n\n return '';\n}\n\n/**\n * Get the data of the first description matching a label. Empty when absent.\n */\nfunction descriptionByLabel(\n requirement: EvaluatedRequirement,\n label: string\n): string {\n const match = requirement.descriptions.find((d: Description) => d.label === label);\n return match?.data || '';\n}\n\n/**\n * Flatten a requirement's refs to one string: each Reference rendered as its\n * url/uri (or a string `ref`); array-form refs are skipped. Joined with '; ' to\n * match the NIST/CCI column convention.\n */\nfunction flattenRefs(refs: EvaluatedRequirement['refs']): string {\n if (!Array.isArray(refs)) {\n return '';\n }\n const out: string[] = [];\n for (const r of refs) {\n if (!r || typeof r !== 'object') {\n continue;\n }\n const o = r as Record<string, unknown>;\n if (typeof o.url === 'string') {\n out.push(o.url);\n } else if (typeof o.uri === 'string') {\n out.push(o.uri);\n } else if (typeof o.ref === 'string') {\n out.push(o.ref);\n }\n }\n return out.join('; ');\n}\n","import {\n type Obj,\n asMap,\n asArr,\n getStr,\n setIf,\n statusOf,\n stringSlice,\n firstResultStartTime,\n defaultDescription,\n firstRefURL,\n eventID,\n buildHDFBlock,\n runExport,\n} from '../../../shared/typescript/exportmap.js';\n\n/**\n * HDF Results -> Elastic Common Schema (ECS) NDJSON exporter.\n *\n * One ECS event per Evaluated_Requirement, in the hybrid shape from ADR-0002:\n * a core-ECS-native projection plus a lossless hdf.* block, hot filter scalars\n * promoted flat. Output is plain NDJSON (LF-delimited, trailing newline), ECS\n * 9.4.0.\n *\n * Status is raw-primary: event.outcome carries the RAW verdict (a waived failure\n * is still failure), and hdf.suppressed is the separate acceptance axis. The\n * canonical \"still actionable\" query is\n * event.outcome:\"failure\" AND hdf.suppressed:false.\n *\n * Generic JSON access, the status roll-up, requirement/document field\n * extraction, and the canonical line serialization are shared with the other\n * export converters via ../../../shared/typescript/exportmap.js; only\n * ECS-specific event shaping lives here. Output is held byte-identical with the\n * Go implementation via key-sorted, HTML-unescaped compact JSON.\n */\n\nconst ECS_VERSION = '9.4.0';\n\nexport function convertHdfToEcs(input: string, converterVersion = '0.1.0'): string {\n return runExport(input, 'hdf-to-ecs', (req, baseline, docTimestamp, tool, generator, component) =>\n buildEvent(req, baseline, docTimestamp, tool, generator, component, converterVersion),\n );\n}\n\nfunction buildEvent(\n req: Obj,\n baseline: Obj,\n docTimestamp: string,\n tool: Obj | undefined,\n generator: Obj | undefined,\n component: Obj | undefined,\n converterVersion: string,\n): Obj {\n const st = statusOf(req);\n const outcome = statusToOutcome(st.raw);\n const controlID = getStr(req, 'id');\n const baselineName = getStr(baseline, 'name');\n const title = getStr(req, 'title');\n\n const cvssList = asArr(req.cvss);\n const hasCVSS = cvssList !== undefined && cvssList.length > 0;\n\n const categories: unknown[] = ['configuration'];\n if (hasCVSS) categories.push('vulnerability');\n\n const event: Obj = {\n kind: 'state',\n category: categories,\n type: ['info'],\n outcome,\n id: eventID(component, baselineName, controlID),\n dataset: 'hdf.findings',\n module: 'hdf',\n };\n\n const obj: Obj = {\n '@timestamp': firstResultStartTime(req, docTimestamp),\n ecs: { version: ECS_VERSION },\n event,\n message: (title + ' — ' + st.raw).trim(),\n };\n\n const observer = buildObserver(tool, generator);\n if (observer) obj.observer = observer;\n\n const host = buildHost(component);\n if (host) {\n obj.host = host;\n const related = buildRelated(component);\n if (related) obj.related = related;\n }\n\n obj.rule = buildRule(req, baseline, controlID, title);\n\n if (hasCVSS) {\n obj.vulnerability = buildVulnerability(cvssList!, req, tool);\n }\n\n const threat = buildThreat(req);\n if (threat) obj.threat = threat;\n\n obj.hdf = buildHDFBlock(req, baseline, st.raw, st.overridden, st.suppressed, generator, tool, converterVersion);\n\n return obj;\n}\n// (buildHDFBlock now lives in exportmap and is shared with hdf-to-splunk.)\n\nfunction buildObserver(tool: Obj | undefined, generator: Obj | undefined): Obj | undefined {\n let name = getStr(tool, 'name');\n let version = getStr(tool, 'version');\n if (name === '' && generator) {\n name = getStr(generator, 'name');\n version = getStr(generator, 'version');\n }\n if (name === '') return undefined;\n const observer: Obj = { name, type: 'scanner' };\n if (version !== '') observer.version = version;\n const product = getStr(tool, 'format');\n if (product !== '') observer.product = product;\n return observer;\n}\n\nfunction buildHost(component: Obj | undefined): Obj | undefined {\n if (!component) return undefined;\n const host: Obj = {};\n const name = getStr(component, 'fqdn') || getStr(component, 'name');\n if (name !== '') host.name = name;\n setIf(host, 'id', getStr(component, 'componentId'));\n setIf(host, 'ip', getStr(component, 'ipAddress'));\n setIf(host, 'mac', getStr(component, 'macAddress'));\n const os: Obj = {};\n setIf(os, 'name', getStr(component, 'osName'));\n setIf(os, 'version', getStr(component, 'osVersion'));\n if (Object.keys(os).length > 0) host.os = os;\n return Object.keys(host).length === 0 ? undefined : host;\n}\n\nfunction buildRelated(component: Obj | undefined): Obj | undefined {\n const related: Obj = {};\n const name = getStr(component, 'fqdn') || getStr(component, 'name');\n if (name !== '') related.hosts = [name];\n const ip = getStr(component, 'ipAddress');\n if (ip !== '') related.ip = [ip];\n return Object.keys(related).length === 0 ? undefined : related;\n}\n\nfunction buildRule(req: Obj, baseline: Obj, controlID: string, title: string): Obj {\n const rule: Obj = { id: controlID };\n if (title !== '') rule.name = title;\n setIf(rule, 'description', defaultDescription(req));\n setIf(rule, 'ruleset', getStr(baseline, 'name'));\n setIf(rule, 'version', getStr(baseline, 'version'));\n setIf(rule, 'reference', firstRefURL(req));\n return rule;\n}\n\nfunction buildVulnerability(cvssList: unknown[], req: Obj, tool: Obj | undefined): Obj {\n const first = asMap(cvssList[0]) ?? {};\n const vuln: Obj = {};\n const source = getStr(first, 'source');\n if (source !== '') {\n vuln.id = source;\n if (source.toUpperCase().startsWith('CVE-')) vuln.enumeration = 'CVE';\n } else {\n setIf(vuln, 'id', getStr(req, 'id'));\n }\n vuln.classification = 'CVSS';\n const score: Obj = {};\n if ('baseScore' in first) score.base = first.baseScore;\n setIf(score, 'version', getStr(first, 'version'));\n if (Object.keys(score).length > 0) vuln.score = score;\n const severity = getStr(first, 'baseSeverity') || getStr(req, 'severity');\n if (severity !== '') vuln.severity = severity;\n const vendor = getStr(tool, 'name');\n if (vendor !== '') vuln.scanner = { vendor };\n setIf(vuln, 'description', defaultDescription(req));\n return vuln;\n}\n\nfunction buildThreat(req: Obj): Obj | undefined {\n const tags = asMap(req.tags);\n if (!tags) return undefined;\n const techniques: unknown[] = [];\n for (const key of ['mitre_attack', 'attack', 'mitre_techniques']) {\n for (const id of stringSlice(tags[key])) {\n techniques.push({ id });\n }\n }\n if (techniques.length === 0) return undefined;\n return { framework: 'MITRE ATT&CK', technique: techniques };\n}\n\nfunction statusToOutcome(status: string): string {\n switch (status) {\n case 'passed':\n return 'success';\n case 'failed':\n return 'failure';\n default:\n return 'unknown';\n }\n}\n","import {\n type Obj,\n asMap,\n asArr,\n getStr,\n setIf,\n statusOf,\n firstResultStartTime,\n buildHDFBlock,\n runExport,\n firstCVE,\n epochSeconds,\n} from '../../../shared/typescript/exportmap.js';\nimport { impactToSeverity } from '@mitre/hdf-utilities';\n\n/**\n * HDF Results -> Splunk HEC-envelope NDJSON, normalized to the Common\n * Information Model (CIM). See ADR-0004.\n *\n * One HEC event per Evaluated_Requirement, hybrid shape: flat CIM-named scalars\n * (signature/signature_id/cve/cvss/severity/dest/vendor_product/category) are\n * promoted to the top of the event payload; the hot query scalars among them\n * (signature/signature_id/dest/severity/cve/cvss + hdf_status + suppressed) are\n * additionally mirrored into the HEC indexed `fields` (surviving Splunk's\n * ~5000-char cutoff), plus a lossless hdf.* block.\n *\n * Status is raw-primary: hdf_status carries the RAW verdict (a waived failure is\n * still failed) and suppressed is the separate acceptance axis. The companion TA\n * (Splunk_TA_hdf) tags failed/error/CVE findings into the CIM Vulnerabilities\n * data model but excludes suppressed=true, so a waived control drops out while a\n * risk-adjusted still-failing control stays in. Canonical \"still actionable\"\n * query: hdf_status=failed suppressed=false.\n *\n * Generic access, the status roll-up, field extraction, the lossless hdf.*\n * block, and the canonical line serialization are shared with the other\n * exporters via exportmap; output is held byte-identical with the Go side.\n */\n\nconst SOURCETYPE = 'hdf:results';\nconst SOURCE = 'hdf-exporter';\n\nexport function convertHdfToSplunk(input: string, converterVersion = '0.1.0'): string {\n return runExport(input, 'hdf-to-splunk', (req, baseline, docTimestamp, tool, generator, component) =>\n buildHECEvent(req, baseline, docTimestamp, tool, generator, component, converterVersion),\n );\n}\n\nfunction buildHECEvent(\n req: Obj,\n baseline: Obj,\n docTimestamp: string,\n tool: Obj | undefined,\n generator: Obj | undefined,\n component: Obj | undefined,\n converterVersion: string,\n): Obj {\n const st = statusOf(req);\n const title = getStr(req, 'title');\n const controlID = getStr(req, 'id');\n\n const signature = title !== '' ? title : controlID;\n const dest = destHost(component);\n const sev = severity(req);\n const [cvss, hasCVSS] = maxCVSS(req);\n const cve = firstCVE(asArr(req.cvss) ?? []);\n const category = firstCWE(req);\n const vendorProduct = getStr(tool, 'name');\n\n const event: Obj = {\n signature,\n hdf_status: st.raw,\n suppressed: st.suppressed,\n hdf: buildHDFBlock(req, baseline, st.raw, st.overridden, st.suppressed, generator, tool, converterVersion),\n };\n setIf(event, 'signature_id', controlID);\n setIf(event, 'dest', dest);\n setIf(event, 'severity', sev);\n setIf(event, 'cve', cve);\n setIf(event, 'category', category);\n setIf(event, 'vendor_product', vendorProduct);\n if (hasCVSS) event.cvss = cvss;\n\n const fields: Obj = { signature, hdf_status: st.raw, suppressed: st.suppressed };\n setIf(fields, 'signature_id', controlID);\n setIf(fields, 'dest', dest);\n setIf(fields, 'severity', sev);\n setIf(fields, 'cve', cve);\n if (hasCVSS) fields.cvss = cvss;\n\n const hec: Obj = {\n source: SOURCE,\n sourcetype: SOURCETYPE,\n event,\n fields,\n };\n const t = epochSeconds(firstResultStartTime(req, docTimestamp));\n if (t !== undefined) hec.time = t;\n setIf(hec, 'host', dest);\n return hec;\n}\n\nfunction destHost(component: Obj | undefined): string {\n if (!component) return '';\n return getStr(component, 'fqdn') || getStr(component, 'name') || getStr(component, 'ipAddress');\n}\n\nfunction severity(req: Obj): string {\n if (typeof req.impact === 'number') {\n return impactToSeverity(req.impact);\n }\n return normalizeSeverity(getStr(req, 'severity'));\n}\n\nfunction normalizeSeverity(s: string): string {\n switch (s) {\n case 'critical':\n case 'high':\n case 'medium':\n case 'low':\n case 'informational':\n return s;\n default:\n return 'informational';\n }\n}\n\nfunction maxCVSS(req: Obj): [number, boolean] {\n const list = asArr(req.cvss) ?? [];\n let max = 0;\n let found = false;\n for (const c of list) {\n const m = asMap(c);\n if (m && typeof m.baseScore === 'number') {\n if (!found || m.baseScore > max) max = m.baseScore;\n found = true;\n }\n }\n return [max, found];\n}\n\nfunction firstCWE(req: Obj): string {\n const list = asArr(req.cwe) ?? [];\n for (const c of list) {\n if (typeof c === 'string' && c !== '') return c;\n }\n return '';\n}\n\n","import {\n type Obj,\n asMap,\n asArr,\n getStr,\n setIf,\n statusOf,\n stringSlice,\n firstResultStartTime,\n defaultDescription,\n firstRefURL,\n runExport,\n firstCVE,\n epochMillis,\n floatNumber,\n} from '../../../shared/typescript/exportmap.js';\nimport { impactToSeverity } from '@mitre/hdf-utilities';\n\n/**\n * HDF Results -> OCSF (Open Cybersecurity Schema Framework) Finding NDJSON.\n * See the ADR-0002 addendum (HDF -> OCSF, wvc3.5). Pinned to OCSF v1.8.0.\n *\n * One Finding per requirement: a CVE finding -> Vulnerability Finding\n * (class_uid 2002), any other -> Compliance Finding (class_uid 2003), both in\n * the Findings category (2). Status model is raw-primary: compliance.status_id\n * carries the RAW verdict (a failed control stays Fail even when waived). The\n * acceptance axis rides the base finding status_id: a raw-failing finding that\n * an override drove non-failing (waiver/falsePositive/attestation) -> 3\n * Suppressed, everything else -> 1 New; a riskAdjustment/operationalRequirement/\n * poam that leaves the finding failing stays New (actionable, only re-scored).\n * The exact override chain is preserved in unmapped.hdf_requirement (+ comment).\n * Canonical \"still actionable\" query: compliance.status_id=3 AND status_id=1.\n *\n * Shares the generic access / status roll-up / field extraction / canonical\n * line serialization with the other exporters via exportmap; output is held\n * byte-identical with the Go implementation.\n */\n\nconst OCSF_VERSION = '1.8.0';\nconst CATEGORY_FINDINGS = 2;\nconst CLASS_COMPLIANCE = 2003;\nconst CLASS_VULNERABILITY = 2002;\nconst ACTIVITY_CREATE = 1;\nconst STATUS_NEW = 1;\nconst STATUS_SUPPRESSED = 3;\n\nexport function convertHdfToOcsf(input: string, converterVersion = '0.1.0'): string {\n return runExport(input, 'hdf-to-ocsf', (req, baseline, docTimestamp, tool, generator, component) =>\n buildFinding(req, baseline, docTimestamp, tool, generator, component, converterVersion),\n );\n}\n\nfunction buildFinding(\n req: Obj,\n baseline: Obj,\n docTimestamp: string,\n tool: Obj | undefined,\n generator: Obj | undefined,\n component: Obj | undefined,\n converterVersion: string,\n): Obj {\n const st = statusOf(req);\n const cvssList = asArr(req.cvss);\n const hasCVSS = cvssList !== undefined && cvssList.length > 0;\n const title = getStr(req, 'title');\n const controlID = getStr(req, 'id');\n\n const cls = hasCVSS ? CLASS_VULNERABILITY : CLASS_COMPLIANCE;\n\n const findingInfo: Obj = { uid: controlID };\n setIf(findingInfo, 'title', title);\n setIf(findingInfo, 'desc', defaultDescription(req));\n // A Vulnerability Finding (class 2002) has no compliance.checks[] field, so a\n // CVE that also carries NIST/CCI framework tags would otherwise lose that\n // mapping to unmapped only. Surface it on finding_info.tags (OCSF's queryable\n // key/value tag surface). Compliance Findings keep the native compliance.checks[].\n if (hasCVSS) {\n const tags = frameworkTags(req);\n if (tags.length > 0) findingInfo.tags = tags;\n }\n\n const finding: Obj = {\n category_uid: CATEGORY_FINDINGS,\n class_uid: cls,\n type_uid: cls * 100 + ACTIVITY_CREATE,\n activity_id: ACTIVITY_CREATE,\n severity_id: severityID(req),\n status_id: st.suppressed ? STATUS_SUPPRESSED : STATUS_NEW,\n metadata: buildMetadata(tool, generator, converterVersion),\n finding_info: findingInfo,\n unmapped: { hdf_requirement: req },\n };\n // time is OCSF-required: fall back to 0 (epoch sentinel) when the source\n // carries no parseable timestamp, so the record stays schema-valid.\n finding.time = epochMillis(firstResultStartTime(req, docTimestamp)) ?? 0;\n setIf(finding, 'comment', overrideComment(req));\n const device = buildDevice(component);\n if (device) finding.device = device;\n\n if (hasCVSS) {\n finding.vulnerabilities = buildVulnerabilities(cvssList!, req);\n } else {\n finding.compliance = buildCompliance(req, baseline, title, st.raw);\n }\n return finding;\n}\n\nfunction severityID(req: Obj): number {\n if (typeof req.impact === 'number') {\n return severityIDFromString(impactToSeverity(req.impact));\n }\n return severityIDFromString(getStr(req, 'severity'));\n}\n\nfunction severityIDFromString(s: string): number {\n switch (s.toLowerCase()) {\n case 'critical':\n return 5;\n case 'high':\n return 4;\n case 'medium':\n return 3;\n case 'low':\n return 2;\n case 'informational':\n case 'info':\n case 'none':\n return 1;\n default:\n return 0;\n }\n}\n\nfunction complianceStatusID(rawStatus: string): number {\n switch (rawStatus) {\n case 'passed':\n return 1;\n case 'failed':\n return 3;\n default: // error, notApplicable, notReviewed\n return 2;\n }\n}\n\n// OCSF caption for a compliance.status_id, carried in the sibling\n// compliance.status string (OCSF convention: the enum sibling string is the\n// caption of the enum value). HDF-native status — which distinguishes\n// notApplicable/notReviewed/error, all -> Warning — stays in unmapped.\nfunction complianceStatusCaption(statusID: number): string {\n switch (statusID) {\n case 1:\n return 'Pass';\n case 3:\n return 'Fail';\n default:\n return 'Warning';\n }\n}\n\n// Builds a human-readable governance note from the disposition (override type)\n// and the governing override's required free-text `reason`.\n// (Status_Override.justification is an optional structured controlled-vocabulary\n// object, not the human rationale — reason is the field to surface.)\nfunction overrideComment(req: Obj): string {\n const disposition = getStr(req, 'disposition');\n const overrides = asArr(req.statusOverrides) ?? [];\n if (disposition === '' && overrides.length === 0) return '';\n let reason = '';\n if (overrides.length > 0) reason = getStr(asMap(overrides[0]), 'reason');\n if (disposition !== '' && reason !== '') return `${disposition}: ${reason}`;\n if (disposition !== '') return disposition;\n return reason;\n}\n\n// metadata.product is OCSF-required: identify the source scanning tool when\n// present, else fall back to this exporter's own identity (never omitted).\nfunction buildMetadata(tool: Obj | undefined, generator: Obj | undefined, converterVersion: string): Obj {\n const metadata: Obj = { version: OCSF_VERSION };\n let name = getStr(tool, 'name');\n let version = getStr(tool, 'version');\n let vendor = getStr(tool, 'format');\n if (name === '' && generator) {\n name = getStr(generator, 'name');\n version = getStr(generator, 'version');\n }\n if (name === '') {\n name = 'hdf-to-ocsf';\n version = converterVersion;\n vendor = '';\n }\n const product: Obj = { name };\n setIf(product, 'version', version);\n setIf(product, 'vendor_name', vendor);\n metadata.product = product;\n return metadata;\n}\n\nfunction buildDevice(component: Obj | undefined): Obj | undefined {\n if (!component) return undefined;\n const device: Obj = { type_id: 0 };\n setIf(device, 'name', getStr(component, 'name'));\n setIf(device, 'hostname', getStr(component, 'fqdn'));\n setIf(device, 'ip', getStr(component, 'ipAddress'));\n setIf(device, 'uid', getStr(component, 'componentId'));\n const osName = getStr(component, 'osName');\n if (osName !== '') {\n const os: Obj = { name: osName, type_id: osTypeID(osName) };\n setIf(os, 'version', getStr(component, 'osVersion'));\n device.os = os;\n }\n // device requires at least one identifying attribute (beyond type_id)\n return Object.keys(device).length === 1 ? undefined : device;\n}\n\nconst OS_LINUX = ['linux', 'rhel', 'red hat', 'ubuntu', 'centos', 'debian', 'fedora', 'suse'];\nconst OS_MAC = ['mac', 'darwin', 'os x'];\n\nfunction osTypeID(osName: string): number {\n const n = osName.toLowerCase();\n if (n.includes('windows')) return 100;\n if (OS_LINUX.some((k) => n.includes(k))) return 200;\n if (OS_MAC.some((k) => n.includes(k))) return 300;\n return 0;\n}\n\n// frameworkTags builds OCSF finding_info.tags (a key_value_object list) from the\n// requirement's NIST/CCI mappings, e.g. {name:'nist', values:['SI-2','RA-5']}.\n// Only non-empty mappings are emitted.\nfunction frameworkTags(req: Obj): Obj[] {\n const tags = asMap(req.tags);\n const out: Obj[] = [];\n for (const key of ['nist', 'cci']) {\n const vals = stringSlice(tags?.[key]);\n if (vals.length > 0) out.push({ name: key, values: vals });\n }\n return out;\n}\n\nfunction buildCompliance(req: Obj, baseline: Obj, title: string, rawStatus: string): Obj {\n const statusID = complianceStatusID(rawStatus);\n const compliance: Obj = { status_id: statusID, status: complianceStatusCaption(statusID) };\n const controlID = getStr(req, 'id');\n setIf(compliance, 'control', controlID);\n\n const baselineName = getStr(baseline, 'name');\n const tags = asMap(req.tags);\n const nist = stringSlice(tags?.nist);\n const cci = stringSlice(tags?.cci);\n\n const standards: unknown[] = [];\n if (baselineName !== '') standards.push(baselineName);\n if (nist.length > 0) standards.push('NIST SP 800-53');\n if (cci.length > 0) standards.push('CCI');\n if (standards.length > 0) compliance.standards = standards;\n\n const checks: unknown[] = [];\n if (controlID !== '') {\n const check: Obj = { uid: controlID, status_id: statusID };\n setIf(check, 'name', title);\n if (baselineName !== '') check.standards = [baselineName];\n checks.push(check);\n }\n for (const id of nist) checks.push({ uid: id, standards: ['NIST SP 800-53'] });\n for (const id of cci) checks.push({ uid: id, standards: ['CCI'] });\n if (checks.length > 0) compliance.checks = checks;\n return compliance;\n}\n\nfunction buildVulnerabilities(cvssList: unknown[], req: Obj): unknown[] {\n const cve: Obj = {};\n cve.uid = firstCVE(cvssList) || getStr(req, 'id');\n\n const cvssArr: unknown[] = [];\n for (const c of cvssList) {\n const m = asMap(c);\n if (!m) continue;\n const entry: Obj = {};\n if (typeof m.baseScore === 'number') entry.base_score = floatNumber(m.baseScore); // OCSF cvss.base_score is float_t\n setIf(entry, 'version', getStr(m, 'version'));\n setIf(entry, 'vector_string', getStr(m, 'baseVector'));\n setIf(entry, 'severity', getStr(m, 'baseSeverity'));\n cvssArr.push(entry);\n }\n if (cvssArr.length > 0) cve.cvss = cvssArr;\n const cwes = stringSlice(req.cwe);\n if (cwes.length > 0) cve.related_cwes = cwes.map((id) => ({ uid: id }));\n\n const vuln: Obj = { cve };\n setIf(vuln, 'title', getStr(req, 'title'));\n setIf(vuln, 'desc', defaultDescription(req));\n const ref = firstRefURL(req);\n if (ref !== '') vuln.references = [ref];\n return [vuln];\n}\n\n","import {\n type Obj,\n asMap,\n asArr,\n getStr,\n setIf,\n statusOf,\n defaultDescription,\n firstResultStartTime,\n firstRefURL,\n firstComponent,\n canonicalize,\n stringifyLine,\n} from '../../../shared/typescript/exportmap.js';\nimport {validateInputSize, parseHdf} from '../../../shared/typescript/converterutil.js';\nimport {impactToSeverity, parseTimestamp} from '@mitre/hdf-utilities';\n\n/**\n * HDF Results -> AWS Security Finding Format (ASFF), the reverse of\n * asff-to-hdf. Output is the standard {\"Findings\": [...]} envelope that\n * BatchImportFindings accepts and asff-to-hdf reads back.\n *\n * One finding per requirement (matching hdf-to-ocsf): a requirement's results\n * roll up to one Compliance.Status via the shared statusOf. The mapping is\n * deliberately LOSSY and standard-compliant — HDF structure ASFF cannot hold is\n * dropped, NOT crammed into Types[] (heimdall2's rejected Types-string\n * encoding). Provenance rides ProductFields (ASFF's official string map).\n *\n * ProductArn / AwsAccountId / Region are ASFF-required but absent from HDF: the\n * account is recovered from a cloudAccount component when present, otherwise a\n * placeholder is emitted; the push path overrides all three. Output is held\n * byte-identical with the Go implementation via canonicalize + stringifyLine.\n */\n\nconst ASFF_SCHEMA_VERSION = '2018-10-08';\nconst PLACEHOLDER_REGION = 'us-east-1';\nconst PLACEHOLDER_ACCOUNT_ID = '000000000000';\n// Matches the arn:aws:... ProductArn; the push path overrides it (with Region)\n// for aws-cn / aws-us-gov targets.\nconst DEFAULT_PARTITION = 'aws';\nconst MAX_TITLE = 256;\nconst MAX_DESCRIPTION = 1024;\nconst EPOCH_SENTINEL = '1970-01-01T00:00:00Z';\n\nexport function convertHdfToAsff(input: string, converterVersion = '0.1.0'): string {\n const name = 'hdf-to-asff';\n validateInputSize(input, name);\n const doc = parseHdf<Obj>(input);\n\n const baselines = asArr(doc.baselines);\n if (!baselines) {\n throw new Error(`${name}: invalid HDF structure: missing baselines field`);\n }\n\n const docTimestamp = getStr(doc, 'timestamp');\n const component = firstComponent(doc);\n const accountID = recoverAccountID(doc);\n const productArn = `arn:aws:securityhub:${PLACEHOLDER_REGION}:${accountID}:product/${accountID}/default`;\n\n const findings: Obj[] = [];\n for (const bRaw of baselines) {\n const baseline = asMap(bRaw);\n if (!baseline) continue;\n const baselineName = getStr(baseline, 'name');\n const reqs = asArr(baseline.requirements) ?? [];\n for (const rRaw of reqs) {\n const req = asMap(rRaw);\n if (!req) continue;\n findings.push(buildFinding(req, baselineName, docTimestamp, component, accountID, productArn, converterVersion));\n }\n }\n return stringifyLine(canonicalize({Findings: findings})) + '\\n';\n}\n\n// recoverAccountID reads AwsAccountId back out of a cloudAccount component (the\n// reverse of asff-to-hdf's AwsAccountId -> component mapping).\nfunction recoverAccountID(doc: Obj): string {\n for (const cRaw of asArr(doc.components) ?? []) {\n const c = asMap(cRaw);\n if (!c || getStr(c, 'type') !== 'cloudAccount') continue;\n const id = getStr(c, 'accountId') || getStr(c, 'name');\n if (id) return id;\n }\n return PLACEHOLDER_ACCOUNT_ID;\n}\n\nfunction buildFinding(\n req: Obj,\n baselineName: string,\n docTimestamp: string,\n component: Obj | undefined,\n accountID: string,\n productArn: string,\n converterVersion: string,\n): Obj {\n const controlID = getStr(req, 'id');\n const st = statusOf(req);\n\n const title = getStr(req, 'title') || controlID;\n const desc = defaultDescription(req) || title;\n\n const cvssList = asArr(req.cvss);\n const hasCVSS = cvssList !== undefined && cvssList.length > 0;\n\n const ts = canonicalTime(firstResultStartTime(req, docTimestamp));\n const id = findingID(accountID, baselineName, controlID);\n\n const finding: Obj = {\n SchemaVersion: ASFF_SCHEMA_VERSION,\n Id: id,\n ProductArn: productArn,\n GeneratorId: controlID,\n AwsAccountId: accountID,\n CreatedAt: ts,\n UpdatedAt: ts,\n Title: truncate(title, MAX_TITLE),\n Description: truncate(desc, MAX_DESCRIPTION),\n Types: asffTypes(hasCVSS),\n Severity: severity(req),\n Resources: resources(component, id),\n RecordState: 'ACTIVE',\n Compliance: {Status: complianceStatus(st.rollup)},\n };\n if (st.suppressed) {\n finding.Workflow = {Status: 'SUPPRESSED'};\n }\n const pf = productFields(baselineName, controlID, converterVersion);\n if (Object.keys(pf).length > 0) {\n finding.ProductFields = pf;\n }\n const rem = remediation(req);\n if (rem) {\n finding.Remediation = rem;\n }\n return finding;\n}\n\nfunction findingID(accountID: string, baselineName: string, controlID: string): string {\n return [accountID, PLACEHOLDER_REGION, baselineName, controlID].join('/');\n}\n\nfunction asffTypes(hasCVSS: boolean): string[] {\n return hasCVSS\n ? ['Software and Configuration Checks/Vulnerabilities/CVE']\n : ['Software and Configuration Checks'];\n}\n\nfunction complianceStatus(status: string): string {\n switch (status) {\n case 'passed':\n return 'PASSED';\n case 'failed':\n return 'FAILED';\n case 'notApplicable':\n return 'NOT_AVAILABLE';\n default:\n return 'WARNING';\n }\n}\n\nfunction severity(req: Obj): Obj {\n let label = 'INFORMATIONAL';\n let normalized = 0;\n if (typeof req.impact === 'number') {\n label = impactToSeverity(req.impact).toUpperCase();\n normalized = Math.trunc(req.impact * 100);\n }\n return {Label: label, Normalized: normalized};\n}\n\nfunction resources(component: Obj | undefined, id: string): Obj[] {\n const res: Obj = {Type: 'Other', Id: id, Partition: DEFAULT_PARTITION, Region: PLACEHOLDER_REGION};\n if (component) {\n const details: Obj = {};\n setIf(details, 'Name', getStr(component, 'name'));\n setIf(details, 'Type', getStr(component, 'type'));\n setIf(details, 'IpAddress', getStr(component, 'ipAddress'));\n setIf(details, 'OsName', getStr(component, 'osName'));\n if (Object.keys(details).length > 0) {\n res.Details = {Other: details};\n }\n }\n return [res];\n}\n\nfunction productFields(baselineName: string, controlID: string, converterVersion: string): Obj {\n const pf: Obj = {};\n setIf(pf, 'hdf/baseline', baselineName);\n setIf(pf, 'hdf/control_id', controlID);\n setIf(pf, 'hdf/exporter_version', converterVersion);\n return pf;\n}\n\nfunction remediation(req: Obj): Obj | undefined {\n let fix = '';\n for (const dRaw of asArr(req.descriptions) ?? []) {\n const d = asMap(dRaw);\n if (d && getStr(d, 'label') === 'fix') {\n fix = getStr(d, 'data');\n break;\n }\n }\n const url = firstRefURL(req);\n if (fix === '' && url === '') return undefined;\n const rec: Obj = {};\n setIf(rec, 'Text', truncate(fix, MAX_DESCRIPTION));\n setIf(rec, 'Url', url);\n return {Recommendation: rec};\n}\n\n// canonicalTime passes an already-canonical HDF timestamp through unchanged\n// (byte-identical with the Go side, which also passes through); an unparseable/\n// absent time falls back to the epoch sentinel so the required field stays valid.\nfunction canonicalTime(s: string): string {\n return parseTimestamp(s) ? s : EPOCH_SENTINEL;\n}\n\n// truncate caps s at max Unicode code points (matching Go's []rune slice).\nfunction truncate(s: string, max: number): string {\n const r = [...s];\n return r.length <= max ? s : r.slice(0, max).join('');\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildHdfResults, deriveControlTypeFromTags, inputChecksum, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n Component,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n Integrity,\n RequirementGroup,\n Statistics,\n} from '@mitre/hdf-schema';\nimport {\n HashAlgorithm,\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * Splunk event metadata. Each event emitted by the HDF-to-Splunk pipeline\n * carries a `meta` object that describes the event's role.\n */\ninterface SplunkMeta {\n guid: string;\n subtype: 'header' | 'profile' | 'control';\n hdf_splunk_schema: string;\n filetype: string;\n filename: string;\n profile_sha256?: string;\n status?: string;\n is_baseline?: boolean;\n is_waived?: boolean;\n overlay_depth?: number;\n}\n\ninterface SplunkEvent {\n meta: SplunkMeta;\n [key: string]: unknown;\n}\n\ninterface SplunkHeader extends SplunkEvent {\n profiles: unknown[];\n platform: { name: string; release: string };\n statistics: Record<string, unknown>;\n version: string;\n}\n\ninterface SplunkProfile extends SplunkEvent {\n name: string;\n title: string;\n sha256: string;\n version: string;\n summary?: string;\n copyright?: string;\n maintainer?: string;\n license?: string;\n supports: unknown[];\n groups: Array<{ id: string; controls: string[] }>;\n attributes: unknown[];\n controls: unknown[];\n}\n\ninterface SplunkControl extends SplunkEvent {\n id: string;\n title: string;\n desc: string;\n descriptions: Record<string, string>;\n impact: number;\n code: string;\n tags: Record<string, unknown>;\n results: SplunkResult[];\n refs: unknown[];\n source_location?: { ref: string; line: number };\n}\n\ninterface SplunkResult {\n status: string;\n code_desc: string;\n message?: string;\n start_time: string;\n run_time?: number;\n skip_message?: string;\n exception?: string;\n backtrace?: string[];\n resource?: string;\n}\n\n/**\n * Map a Splunk result status string to the HDF ResultStatus enum.\n */\nfunction mapStatus(status: string): ResultStatus {\n switch (status.toLowerCase()) {\n case 'passed':\n return ResultStatus.Passed;\n case 'failed':\n return ResultStatus.Failed;\n case 'skipped':\n return ResultStatus.NotReviewed;\n case 'error':\n return ResultStatus.Error;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Convert a Splunk descriptions object (`{ key: value }`) to an array of\n * HDF Description objects. Labels are sorted: Go decodes the same object into\n * a map, so sorting is the only ordering both languages can agree on.\n */\nfunction convertDescriptions(\n descriptions: Record<string, string> | undefined,\n): Description[] {\n if (!descriptions || typeof descriptions !== 'object') {\n return [];\n }\n return Object.entries(descriptions)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))\n .map(([label, data]) => createDescription(label, data));\n}\n\n/**\n * Convert Splunk profile groups (which use `controls`) to HDF\n * RequirementGroups (which use `requirements`).\n */\nfunction convertGroups(\n groups: Array<{ id: string; controls: string[] }> | undefined,\n): RequirementGroup[] {\n if (!groups || !Array.isArray(groups)) {\n return [];\n }\n return groups.map((g) => ({\n id: g.id,\n requirements: g.controls,\n }));\n}\n\n/**\n * Convert a Splunk JSON event array back into an HDF Results document.\n *\n * Input is a JSON string containing an array of Splunk events previously\n * produced by the HDF-to-Splunk pipeline. Each event carries a `meta.subtype`\n * of \"header\", \"profile\", or \"control\" and a shared `meta.guid` that ties\n * them together.\n *\n * @param input - JSON string of a SplunkEvent array\n * @returns HDF Results JSON string\n */\nexport async function convertSplunkToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'splunk');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const events = parseJSON<SplunkEvent[]>(input);\n\n if (!Array.isArray(events) || events.length === 0) {\n throw new Error('No Splunk events found in input');\n }\n\n // Group events by GUID (each GUID represents one original HDF execution)\n const eventsByGuid = new Map<string, SplunkEvent[]>();\n for (const event of events) {\n const guid = event.meta.guid;\n if (!eventsByGuid.has(guid)) {\n eventsByGuid.set(guid, []);\n }\n eventsByGuid.get(guid)!.push(event);\n }\n\n // Process each GUID group into baselines + components. GUIDs are visited in\n // sorted order because Go groups them in a map and can only agree on that.\n const allBaselines: EvaluatedBaseline[] = [];\n const components: Component[] = [];\n let statistics: Statistics | undefined;\n\n for (const guid of [...eventsByGuid.keys()].sort()) {\n const guidEvents = eventsByGuid.get(guid)!;\n const headers: SplunkHeader[] = [];\n const profiles: SplunkProfile[] = [];\n const controls: SplunkControl[] = [];\n\n for (const event of guidEvents) {\n switch (event.meta.subtype) {\n case 'header':\n headers.push(event as SplunkHeader);\n break;\n case 'profile':\n profiles.push(event as SplunkProfile);\n break;\n case 'control':\n controls.push(event as SplunkControl);\n break;\n }\n }\n\n if (headers.length !== 1) {\n throw new Error(\n `Expected 1 header event, got ${headers.length}`,\n );\n }\n\n const header = headers[0]!;\n const component: Component = {\n name: header.platform.name,\n type: TargetType.Host,\n };\n if (header.platform.release) {\n component.osVersion = header.platform.release;\n }\n components.push(component);\n statistics = convertStatistics(header.statistics);\n\n // Group controls by their profile_sha256\n const controlsByProfile = new Map<string, SplunkControl[]>();\n for (const control of controls) {\n const sha = control.meta.profile_sha256 ?? '';\n if (!controlsByProfile.has(sha)) {\n controlsByProfile.set(sha, []);\n }\n controlsByProfile.get(sha)!.push(control);\n }\n\n // Build a baseline for each profile event\n for (const profile of profiles) {\n const profileControls = controlsByProfile.get(profile.sha256) ?? [];\n\n const requirements: EvaluatedRequirement[] = profileControls.map(\n (control) => {\n const descriptions = convertDescriptions(control.descriptions);\n if (descriptions.length === 0) {\n descriptions.push(createDescription('default', control.desc ?? ''));\n }\n\n const results: RequirementResult[] = Array.isArray(control.results)\n ? control.results.map((result) => {\n const res = createResult(\n mapStatus(result.status),\n result.skip_message || result.message,\n {\n codeDesc: result.code_desc,\n startTime: parseTimestamp(result.start_time) ?? new Date('0001-01-01T00:00:00Z'),\n runTime: result.run_time,\n exception: result.exception,\n backtrace: result.backtrace,\n },\n );\n if (!res.message) delete res.message;\n if (result.resource) res.resource = result.resource;\n return res;\n })\n : [];\n\n const options: {\n tags: Record<string, unknown>;\n sourceLocation?: { ref: string; line: number };\n } = {\n tags: control.tags ?? {},\n };\n\n if (control.source_location) {\n options.sourceLocation = control.source_location;\n }\n\n const req = createRequirement(\n control.id,\n control.title,\n descriptions,\n control.impact,\n results,\n options,\n ) as EvaluatedRequirement;\n\n if (!req.title) delete req.title;\n if (control.code) req.code = control.code;\n\n const nistTagsRaw = (control.tags as Record<string, unknown> | undefined)?.['nist'];\n const nistTags = Array.isArray(nistTagsRaw)\n ? nistTagsRaw.filter((t): t is string => typeof t === 'string')\n : [];\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n },\n );\n\n const groups = convertGroups(profile.groups);\n\n const baselineOptions: {\n title?: string;\n version?: string;\n summary?: string;\n groups?: RequirementGroup[];\n integrity?: Integrity;\n resultsChecksum: Checksum;\n } = {\n resultsChecksum,\n };\n\n if (profile.title) {\n baselineOptions.title = profile.title;\n }\n if (profile.version) {\n baselineOptions.version = profile.version;\n }\n if (profile.summary) {\n baselineOptions.summary = profile.summary;\n }\n if (groups.length > 0) {\n baselineOptions.groups = groups;\n }\n if (profile.sha256) {\n baselineOptions.integrity = {\n algorithm: HashAlgorithm.Sha256,\n checksum: profile.sha256,\n };\n }\n\n const baseline = createMinimalBaseline(profile.name, requirements, baselineOptions);\n if (profile.copyright) baseline.copyright = profile.copyright;\n if (profile.maintainer) baseline.maintainer = profile.maintainer;\n if (profile.license) baseline.license = profile.license;\n\n allBaselines.push(baseline);\n }\n }\n\n return buildHdfResults({\n generatorName: 'splunk-to-hdf',\n converterVersion,\n toolName: 'Splunk',\n baselines: allBaselines,\n components,\n statistics,\n timestamp: new Date(),\n });\n}\n\n/** Extract the assessment duration from a Splunk header's statistics blob. */\nfunction convertStatistics(stats: Record<string, unknown> | undefined): Statistics | undefined {\n if (!stats || typeof stats !== 'object') return undefined;\n const out: Statistics = {};\n if (typeof stats['duration'] === 'number') {\n out.duration = stats['duration'];\n }\n return out;\n}\n","import { buildXml } from '@mitre/hdf-utilities';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Component, Description, RequirementResult } from '@mitre/hdf-schema';\nimport { validateInputSize, parseHdf } from '../../../shared/typescript/converterutil.js';\n\n/**\n * Convert HDF JSON to XML format\n * @param input HDF JSON string\n * @returns XML string with proper HDF structure\n */\nexport function convertHdfToXml(input: string): string {\n validateInputSize(input, 'hdf-to-xml');\n const hdf = parseHdf<HDFResults>(input);\n\n if (!hdf || typeof hdf !== 'object' || !('baselines' in hdf)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdf.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n // Transform HDF structure to XML-friendly format\n const xmlObj = {\n HdfResults: transformHdfToXmlObject(hdf)\n };\n\n return buildXml(xmlObj);\n}\n\n/**\n * Wrap primitive values to force them as nested elements instead of attributes\n */\nfunction wrap(value: string | number | boolean): { '#text': string | number | boolean } {\n return { '#text': value };\n}\n\n/**\n * Transform a polymorphic Reference ({url} | {uri} | {ref: string}) into an\n * XML-friendly object. Array-form `ref` values are skipped.\n */\nfunction transformReference(r: unknown): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (r && typeof r === 'object') {\n const o = r as { url?: unknown; uri?: unknown; ref?: unknown };\n if (typeof o.url === 'string') out.url = wrap(o.url);\n else if (typeof o.uri === 'string') out.uri = wrap(o.uri);\n else if (typeof o.ref === 'string') out.ref = wrap(o.ref);\n }\n return out;\n}\n\n/**\n * Transform HDF object to XML-compatible structure\n * Converts arrays to repeated singular elements\n */\nfunction transformHdfToXmlObject(hdf: HDFResults): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n // Transform baselines array\n if (hdf.baselines && hdf.baselines.length > 0) {\n result.baselines = {\n baseline: hdf.baselines.map((baseline: EvaluatedBaseline) => ({\n name: wrap(baseline.name),\n ...(baseline.version && { version: wrap(baseline.version) }),\n ...(baseline.title && { title: wrap(baseline.title) }),\n ...(baseline.summary && { summary: wrap(baseline.summary) }),\n ...(baseline.status && { status: wrap(baseline.status) }),\n ...(baseline.resultsChecksum && {\n resultsChecksum: {\n algorithm: wrap(baseline.resultsChecksum.algorithm),\n value: wrap(baseline.resultsChecksum.value)\n }\n }),\n ...(baseline.originalChecksum && {\n originalChecksum: {\n algorithm: wrap(baseline.originalChecksum.algorithm),\n value: wrap(baseline.originalChecksum.value)\n }\n }),\n ...(baseline.integrity && {\n integrity: {\n ...(baseline.integrity.algorithm && { algorithm: wrap(baseline.integrity.algorithm) }),\n ...(baseline.integrity.checksum && { checksum: wrap(baseline.integrity.checksum) })\n }\n }),\n ...(baseline.requirements && baseline.requirements.length > 0 && {\n requirements: {\n requirement: baseline.requirements.map((req: EvaluatedRequirement) => transformRequirement(req))\n }\n }),\n ...(baseline.requirements && baseline.requirements.length === 0 && {\n requirements: {}\n })\n }))\n };\n } else {\n result.baselines = {};\n }\n\n // Transform components array\n if (hdf.components && hdf.components.length > 0) {\n result.components = {\n target: hdf.components.map((target: Component) => ({\n ...(target.componentId && { componentId: wrap(target.componentId) }),\n name: wrap(target.name),\n type: wrap(target.type),\n ...(target.hostname && { hostname: wrap(target.hostname) }),\n ...(target.fqdn && { fqdn: wrap(target.fqdn) }),\n ...(target.domain && { domain: wrap(target.domain) }),\n ...(target.ipAddress && { ipAddress: wrap(target.ipAddress) })\n }))\n };\n }\n\n // Transform statistics\n if (hdf.statistics) {\n result.statistics = {};\n if (hdf.statistics.duration !== undefined) {\n (result.statistics as Record<string, unknown>).duration = wrap(hdf.statistics.duration);\n }\n if (hdf.statistics.requirements) {\n (result.statistics as Record<string, unknown>).requirements = hdf.statistics.requirements;\n }\n }\n\n // Add other optional fields\n if (hdf.timestamp) {\n result.timestamp = wrap(typeof hdf.timestamp === 'string' ? hdf.timestamp : hdf.timestamp.toISOString());\n }\n if (hdf.generator) {\n result.generator = {\n name: wrap(hdf.generator.name),\n ...(hdf.generator.version && { version: wrap(hdf.generator.version) })\n };\n }\n\n return result;\n}\n\n/**\n * Transform a requirement object for XML output\n */\nfunction transformRequirement(req: EvaluatedRequirement): Record<string, unknown> {\n const result: Record<string, unknown> = {\n id: wrap(req.id),\n ...(req.title && { title: wrap(req.title) }),\n ...(req.descriptions && req.descriptions.length > 0 && {\n descriptions: {\n description: req.descriptions.map((d: Description) => ({\n label: wrap(d.label),\n data: wrap(d.data)\n }))\n }\n }),\n ...(req.code && { code: wrap(req.code) }),\n ...(req.sourceLocation && {\n sourceLocation: {\n ...(req.sourceLocation.ref !== undefined && { ref: wrap(req.sourceLocation.ref) }),\n ...(req.sourceLocation.line !== undefined && { line: wrap(req.sourceLocation.line) })\n }\n }),\n ...(req.controlType && { controlType: wrap(req.controlType) }),\n ...(req.verificationMethod && { verificationMethod: wrap(req.verificationMethod) }),\n ...(req.applicability && { applicability: wrap(req.applicability) }),\n ...(req.refs && req.refs.length > 0 && {\n refs: { ref: req.refs.map(transformReference) }\n }),\n impact: wrap(req.impact)\n };\n\n // Transform tags (handle arrays within tags object). Keys are sorted so the\n // element order is deterministic and matches the Go converter (whose source\n // tag map is unordered) — guarantees TS/Go output parity.\n if (req.tags && Object.keys(req.tags).length > 0) {\n const transformedTags: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(req.tags).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))) {\n if (Array.isArray(value) && value.length > 0) {\n // Repeat the tag name for each array element (wrapped)\n transformedTags[key] = value.map((v: string | number | boolean) => wrap(v));\n } else if (!Array.isArray(value)) {\n transformedTags[key] = wrap(value);\n }\n }\n if (Object.keys(transformedTags).length > 0) {\n result.tags = transformedTags;\n }\n }\n\n // Transform results array\n if (req.results && req.results.length > 0) {\n result.results = {\n result: req.results.map((r: RequirementResult) => ({\n status: wrap(r.status),\n codeDesc: wrap(r.codeDesc),\n startTime: wrap(typeof r.startTime === 'string' ? r.startTime : r.startTime.toISOString()),\n ...(r.message && { message: wrap(r.message) }),\n ...(r.runTime !== undefined && { runTime: wrap(r.runTime) })\n }))\n };\n }\n\n return result;\n}\n","import {\n type Checksum,\n createMinimalBaseline,\n TargetType,\n type Tool,\n type EvaluatedBaseline,\n type EvaluatedRequirement,\n type RequirementResult,\n type HDFResults,\n type Component,\n ResultStatus,\n VerificationMethodEnum,\n severityToImpact,\n} from '@mitre/hdf-schema';\nimport {\n getCweNistControl,\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {parseJSON, parseTimestamp} from '@mitre/hdf-utilities';\nimport {buildNoFindingsRequirement, inputChecksum, buildNistCciTags, deriveControlTypeFromTags, limitArray, validateInputSize, serializeHdf} from '../../../shared/typescript/converterutil.js';\n\n// --- GitLab Security Report input types ---\n\ninterface GitLabReport {\n version?: string;\n scan?: GitLabScan;\n vulnerabilities?: GitLabVulnerability[];\n remediations?: GitLabRemediation[];\n}\n\ninterface GitLabScan {\n analyzer?: GitLabTool;\n scanner?: GitLabTool;\n start_time?: string;\n end_time?: string;\n status?: string;\n type?: string;\n}\n\ninterface GitLabTool {\n id?: string;\n name?: string;\n version?: string;\n}\n\ninterface GitLabVulnerability {\n id: string;\n name?: string;\n description?: string;\n severity?: string;\n solution?: string;\n identifiers?: GitLabIdentifier[];\n location?: GitLabLocation;\n links?: Array<{url?: string}>;\n}\n\ninterface GitLabIdentifier {\n type?: string;\n name?: string;\n value?: string;\n url?: string;\n}\n\ninterface GitLabLocation {\n file?: string;\n start_line?: number;\n end_line?: number;\n class?: string;\n method?: string;\n hostname?: string;\n path?: string;\n param?: string;\n image?: string;\n operating_system?: string;\n dependency?: {\n package?: {name?: string};\n version?: string;\n };\n}\n\ninterface GitLabRemediation {\n fixes?: Array<{id?: string}>;\n summary?: string;\n diff?: string;\n}\n\n// --- Severity to impact ---\n\nfunction gitlabSeverityToImpact(severity: string): number {\n return severityToImpact(severity.toLowerCase());\n}\n\n// --- Scan type to target type ---\n\nfunction scanTypeToTargetType(scanType: string): TargetType {\n switch (scanType) {\n case 'dast':\n return TargetType.Application;\n case 'container_scanning':\n return TargetType.ContainerImage;\n default:\n return TargetType.Repository;\n }\n}\n\n// --- Scan type label ---\n\nfunction scanTypeLabel(scanType: string): string {\n const labels: Record<string, string> = {\n sast: 'SAST',\n dast: 'DAST',\n dependency_scanning: 'Dependency Scanning',\n container_scanning: 'Container Scanning',\n secret_detection: 'Secret Detection',\n api_fuzzing: 'API Fuzzing',\n };\n return labels[scanType] ?? scanType.toUpperCase();\n}\n\n// --- NIST tag building ---\n\nfunction buildNistTags(identifiers: GitLabIdentifier[]): string[] {\n const seen = new Set<string>();\n const controls: string[] = [];\n for (const id of identifiers) {\n if (id.type === 'cwe' && id.value) {\n const cweNum = parseInt(id.value, 10);\n if (!isNaN(cweNum)) {\n const control = getCweNistControl(cweNum);\n if (control && !seen.has(control)) {\n seen.add(control);\n controls.push(control);\n }\n }\n }\n }\n if (controls.length > 0) {\n return controls;\n }\n return [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n// --- Collect identifier tags ---\n\nfunction collectIdentifierTags(identifiers: GitLabIdentifier[]): Record<string, string[]> {\n const result: Record<string, string[]> = {};\n for (const id of identifiers) {\n if (id.type && id.value) {\n const key = id.type.toLowerCase();\n if (!result[key]) {\n result[key] = [];\n }\n result[key].push(id.value);\n }\n }\n return result;\n}\n\n// --- Build code description by scan type ---\n\nfunction buildCodeDesc(scanType: string, location?: GitLabLocation): string {\n if (!location) return '';\n\n switch (scanType) {\n case 'sast':\n case 'secret_detection': {\n const parts: string[] = [];\n if (location.file) {\n parts.push(`File: ${location.file}`);\n }\n if (location.start_line != null) {\n const line = location.end_line != null && location.end_line !== location.start_line\n ? `${location.start_line}-${location.end_line}`\n : `${location.start_line}`;\n parts.push(`Line: ${line}`);\n }\n if (location.class) {\n parts.push(`Class: ${location.class}`);\n }\n if (location.method) {\n parts.push(`Method: ${location.method}`);\n }\n return parts.join(' | ');\n }\n case 'dast': {\n const parts: string[] = [];\n if (location.hostname) {\n const url = location.path ? `${location.hostname}${location.path}` : location.hostname;\n parts.push(`URL: ${url}`);\n }\n if (location.method) {\n parts.push(`Method: ${location.method}`);\n }\n if (location.param) {\n parts.push(`Param: ${location.param}`);\n }\n return parts.join(' | ');\n }\n case 'dependency_scanning': {\n const parts: string[] = [];\n if (location.file) {\n parts.push(`File: ${location.file}`);\n }\n if (location.dependency?.package?.name) {\n const pkg = location.dependency.version\n ? `${location.dependency.package.name}@${location.dependency.version}`\n : location.dependency.package.name;\n parts.push(`Package: ${pkg}`);\n }\n return parts.join(' | ');\n }\n case 'container_scanning': {\n const parts: string[] = [];\n if (location.image) {\n parts.push(`Image: ${location.image}`);\n }\n if (location.dependency?.package?.name) {\n const pkg = location.dependency.version\n ? `${location.dependency.package.name}@${location.dependency.version}`\n : location.dependency.package.name;\n parts.push(`Package: ${pkg}`);\n }\n return parts.join(' | ');\n }\n default:\n return `Location: ${JSON.stringify(location)}`;\n }\n}\n\n// --- Main converter ---\n\nexport async function convertGitlabToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'gitlab');\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const report = parseJSON<GitLabReport>(input);\n\n const scanType = report.scan?.type ?? 'sast';\n const scannerName = report.scan?.scanner?.name ?? 'GitLab Security Scanner';\n const scannerVersion = report.scan?.scanner?.version;\n const startTime = report.scan?.start_time;\n\n const vulns = report.vulnerabilities ?? [];\n const {items: limitedVulns, truncated} = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerabilities (original: ${vulns.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = [];\n\n for (const vuln of limitedVulns) {\n const identifiers = vuln.identifiers ?? [];\n\n // Build NIST tags\n const nistTags = buildNistTags(identifiers);\n const cciTags = nistToCci(nistTags);\n\n // Build extra tags from identifiers\n const idTags = collectIdentifierTags(identifiers);\n const extras: Record<string, unknown> = {};\n for (const [key, values] of Object.entries(idTags)) {\n extras[key] = values;\n }\n const tags = buildNistCciTags(nistTags, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build descriptions\n const descriptions: Array<{label: string; data: string}> = [];\n if (vuln.description) {\n descriptions.push({label: 'default', data: vuln.description});\n }\n if (vuln.solution) {\n descriptions.push({label: 'check', data: vuln.solution});\n }\n\n // Build result\n const result: RequirementResult = {\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(scanType, vuln.location),\n startTime: startTime ? (parseTimestamp(startTime) ?? new Date('0001-01-01T00:00:00Z')) : new Date('0001-01-01T00:00:00Z'),\n };\n\n const impact = gitlabSeverityToImpact(vuln.severity ?? 'Unknown');\n\n const req: EvaluatedRequirement = {\n id: vuln.id,\n title: vuln.name ?? vuln.id,\n impact,\n results: [result],\n tags,\n descriptions,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n requirements.push(req);\n }\n\n const label = scanTypeLabel(scanType);\n\n if (requirements.length === 0) {\n const ts = startTime ? (parseTimestamp(startTime) ?? new Date()) : new Date();\n requirements.push(buildNoFindingsRequirement(\n 'gitlab-no-findings',\n `GitLab ${label} scan via ${scannerName} reported zero findings.`,\n ts,\n ));\n }\n\n const baselineTitle = `GitLab ${label} Security Scan`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline('GitLab Security Scan', requirements, {\n resultsChecksum,\n title: baselineTitle,\n summary: `Scanner: ${scannerName}${scannerVersion ? ` v${scannerVersion}` : ''}`,\n }) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: scannerName,\n format: 'JSON',\n };\n if (scannerVersion) {\n tool.version = scannerVersion;\n }\n\n // Build components based on scan type\n const components: Component[] = [];\n const targetType = scanTypeToTargetType(scanType);\n components.push({name: scannerName, type: targetType});\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components,\n generator: {\n name: 'gitlab-to-hdf',\n version: converterVersion,\n },\n tool,\n };\n\n if (report.scan?.end_time) {\n const endTime = parseTimestamp(report.scan.end_time);\n if (endTime) {\n hdf.timestamp = endTime;\n }\n }\n\n return serializeHdf(hdf);\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArrayWithWarning, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n/**\n * TruffleHog finding structure.\n */\ninterface TrufflehogFinding {\n SourceMetadata?: SourceMetadata;\n SourceID?: number;\n SourceType?: number;\n SourceName?: string;\n DetectorType: number;\n DetectorName: string;\n DetectorDescription?: string;\n DecoderName: string;\n Verified: boolean;\n VerificationError?: string;\n Raw: string;\n RawV2?: string;\n Redacted: string;\n ExtraData?: Record<string, unknown> | null;\n StructuredData?: unknown;\n}\n\ninterface SourceMetadata {\n Data: SourceData;\n}\n\ninterface SourceData {\n Git?: GitSource;\n Filesystem?: FilesystemSource;\n Docker?: DockerSource;\n}\n\ninterface GitSource {\n commit: string;\n file: string;\n email: string;\n repository: string;\n timestamp: string;\n line: number;\n}\n\ninterface FilesystemSource {\n file: string;\n line: number;\n}\n\ninterface DockerSource {\n image: string;\n file: string;\n line: number;\n}\n\n/** Hardcoded NIST/CCI constants for credential exposure findings. */\nconst TRUFFLEHOG_NIST = ['IA-5 (7)'];\nconst TRUFFLEHOG_CCI = ['CCI-000202', 'CCI-000203', 'CCI-002367'];\n\n/**\n * Parse TruffleHog input as JSON array, single object, or NDJSON.\n */\nfunction parseFindings(input: string): TrufflehogFinding[] {\n const trimmed = input.trim();\n\n // Try JSON array first\n try {\n const parsed = parseJSON<unknown>(trimmed);\n if (Array.isArray(parsed)) {\n return parsed as TrufflehogFinding[];\n }\n // Single JSON object\n if (typeof parsed === 'object' && parsed !== null && 'DetectorName' in parsed) {\n return [parsed as TrufflehogFinding];\n }\n } catch {\n // Not valid JSON — try NDJSON\n }\n\n // Try NDJSON: split on newlines, parse each line\n const lines = trimmed.split('\\n').filter(line => line.trim().length > 0);\n const findings: TrufflehogFinding[] = [];\n for (const line of lines) {\n try {\n findings.push(parseJSON<TrufflehogFinding>(line.trim()));\n } catch {\n throw new Error(`trufflehog: failed to parse NDJSON line: ${line.substring(0, 80)}`);\n }\n }\n if (findings.length > 0) {\n return findings;\n }\n\n throw new Error('trufflehog: unable to parse input as JSON array, single object, or NDJSON');\n}\n\n/**\n * Group findings by DetectorName + DecoderName, preserving insertion order.\n */\nfunction groupFindings(findings: TrufflehogFinding[]): Map<string, TrufflehogFinding[]> {\n const groups = new Map<string, TrufflehogFinding[]>();\n for (const f of findings) {\n const key = `${f.DetectorName} ${f.DecoderName}`;\n const existing = groups.get(key);\n if (existing) {\n existing.push(f);\n } else {\n groups.set(key, [f]);\n }\n }\n return groups;\n}\n\n/**\n * Order ExtraData keys the way Go's map marshalling does (lexicographic), so the\n * embedded message string is byte-identical in both languages.\n */\nfunction canonicalize(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(canonicalize);\n if (value !== null && typeof value === 'object') {\n const entries = Object.entries(value as Record<string, unknown>)\n .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));\n return Object.fromEntries(entries.map(([k, v]) => [k, canonicalize(v)]));\n }\n return value;\n}\n\n/**\n * Build the Result.Message JSON from selected finding fields.\n */\nfunction buildMessage(f: TrufflehogFinding): string {\n const msg: Record<string, unknown> = {\n Verified: f.Verified,\n Redacted: f.Redacted,\n };\n if (f.VerificationError) {\n msg.VerificationError = f.VerificationError;\n }\n if (f.ExtraData && Object.keys(f.ExtraData).length > 0) {\n msg.ExtraData = canonicalize(f.ExtraData);\n }\n return JSON.stringify(msg);\n}\n\n/**\n * Build the Result.CodeDesc as JSON of SourceMetadata.\n */\nfunction buildCodeDesc(f: TrufflehogFinding): string {\n return JSON.stringify(f.SourceMetadata ?? {});\n}\n\n/**\n * Extract a timestamp from a finding's Git source metadata.\n */\nfunction getTimestamp(f: TrufflehogFinding): Date {\n if (f.SourceMetadata?.Data?.Git?.timestamp) {\n const ts = parseTimestamp(f.SourceMetadata.Data.Git.timestamp);\n if (ts) {\n return ts;\n }\n }\n return new Date();\n}\n\n/**\n * Get the source file path from any source type.\n */\nfunction getSourceFile(f: TrufflehogFinding): string | undefined {\n return f.SourceMetadata?.Data?.Git?.file\n ?? f.SourceMetadata?.Data?.Filesystem?.file\n ?? f.SourceMetadata?.Data?.Docker?.file;\n}\n\n/**\n * Get the source line number from any source type.\n */\nfunction getSourceLine(f: TrufflehogFinding): number | undefined {\n return f.SourceMetadata?.Data?.Git?.line\n ?? f.SourceMetadata?.Data?.Filesystem?.line\n ?? f.SourceMetadata?.Data?.Docker?.line;\n}\n\n/**\n * Find the first Git repository URL from findings.\n */\nfunction findGitRepoURL(findings: TrufflehogFinding[]): string | undefined {\n for (const f of findings) {\n if (f.SourceMetadata?.Data?.Git?.repository) {\n return f.SourceMetadata.Data.Git.repository;\n }\n }\n return undefined;\n}\n\n/**\n * Build an EvaluatedRequirement from a group of findings sharing a detector.\n */\nfunction buildRequirement(reqID: string, findings: TrufflehogFinding[]): EvaluatedRequirement {\n const rep = findings[0]!;\n const tags = buildNistCciTags(TRUFFLEHOG_NIST, TRUFFLEHOG_CCI);\n\n const title = `Found ${rep.DetectorName} secret using ${rep.DecoderName} decoder`;\n\n const descData = rep.DetectorDescription\n ?? `${rep.DetectorName} secret detected by ${rep.DecoderName} decoder`;\n const descriptions: Description[] = [\n { label: 'default', data: descData },\n ];\n\n const results = findings.map(f =>\n createResult(ResultStatus.Failed, buildMessage(f), {\n codeDesc: buildCodeDesc(f),\n startTime: getTimestamp(f),\n })\n );\n\n const sourceFile = getSourceFile(rep);\n const sourceLine = getSourceLine(rep);\n\n const req = createRequirement(\n reqID,\n title,\n descriptions,\n 0.5,\n results,\n {\n tags,\n sourceLocation: sourceFile ? { ref: sourceFile, line: sourceLine } : undefined,\n }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(TRUFFLEHOG_NIST);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts TruffleHog output to HDF format.\n * Accepts JSON array, single JSON object, or NDJSON input.\n *\n * @param input - TruffleHog JSON/NDJSON string\n * @returns HDF JSON string\n */\nexport async function convertTrufflehogToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('trufflehog: empty input');\n }\n validateInputSize(input, 'trufflehog');\n\n const findings = parseFindings(input);\n\n const resultsChecksum = await inputChecksum(input);\n const limitedFindings = limitArrayWithWarning(findings, 'finding');\n\n const groups = groupFindings(limitedFindings);\n const requirements: EvaluatedRequirement[] = [];\n for (const [reqID, group] of groups) {\n requirements.push(buildRequirement(reqID, group));\n }\n\n if (requirements.length === 0) {\n const target = findGitRepoURL(limitedFindings)\n ?? limitedFindings[0]?.SourceName\n ?? 'the target source';\n requirements.push(buildNoFindingsRequirement(\n 'trufflehog-no-findings',\n `TruffleHog scanned ${target} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const sourceName = limitedFindings[0]?.SourceName ?? 'trufflehog';\n const baselineTitle = `TruffleHog Scan (${sourceName})`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'TruffleHog Scan',\n requirements,\n {\n resultsChecksum,\n title: baselineTitle,\n }\n ) as EvaluatedBaseline;\n\n const tool: Tool = { name: 'TruffleHog', format: 'JSON' };\n\n const hdf: HDFResults = {\n baselines: [baseline],\n generator: {\n name: 'trufflehog-to-hdf',\n version: converterVersion,\n },\n tool,\n timestamp: new Date(),\n };\n\n // Add target only if a Git repository URL is available\n const repoURL = findGitRepoURL(limitedFindings);\n if (repoURL) {\n hdf.components = [{ name: repoURL, type: TargetType.Repository }];\n }\n\n return serializeHdf(hdf);\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {\n buildNoFindingsRequirement,\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n mapCWEToNIST,\n extractCWEIDs,\n validateInputSize,\n serializeHdf,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// --- BurpSuite XML input types ---\n\ninterface BurpIssuesXml {\n issues: {\n burpVersion?: string;\n exportTime?: string;\n issue?: BurpIssueXml[];\n };\n}\n\ninterface BurpIssueXml {\n serialNumber?: string;\n type?: string;\n name?: string;\n host?: BurpHostXml;\n path?: string;\n location?: string;\n severity?: string;\n confidence?: string;\n issueBackground?: string;\n remediationBackground?: string;\n references?: string;\n vulnerabilityClassifications?: string;\n issueDetail?: string;\n}\n\ninterface BurpHostXml {\n ip?: string;\n '#text'?: string;\n}\n\n// --- Impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n 'high': 0.7,\n 'medium': 0.5,\n 'low': 0.3,\n 'information': 0.3,\n};\n\nfunction getImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.3;\n}\n\n// --- CWE parsing ---\n\n/**\n * Extract CWE identifiers from HTML text.\n * Returns CWE-prefixed IDs (e.g., [\"CWE-79\"]) for use in tags and mapCWEToNIST.\n */\nfunction parseCWEIDs(html: string): string[] {\n if (!html) return [];\n return extractCWEIDs(html).map(id => `CWE-${id}`);\n}\n\n// --- Format code desc ---\n\nfunction formatCodeDesc(\n hostIP: string,\n hostURL: string,\n location: string,\n issueDetail: string,\n confidence: string,\n): string {\n const parts: string[] = [];\n parts.push(`Host: ip: ${hostIP}, url: ${hostURL}`);\n parts.push(`Location: ${stripHTML(location)}`);\n if (issueDetail) {\n parts.push(`issueDetail: ${stripHTML(issueDetail)}`);\n }\n parts.push(`confidence: ${confidence}`);\n return parts.join('\\n') + '\\n';\n}\n\n// --- Main converter ---\n\n/**\n * Converts BurpSuite Pro XML export to HDF format.\n *\n * Issues are grouped by `<type>` — each unique type becomes one requirement,\n * with one result per individual issue instance.\n *\n * @param input - BurpSuite XML string\n * @returns HDF JSON string\n */\nexport async function convertBurpsuiteToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('burpsuite: empty input');\n }\n validateInputSize(input, 'burpsuite');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse XML — ensure issue is always treated as array\n const parsed = parseXmlWithArrays(input, ['issue']) as unknown as BurpIssuesXml;\n\n if (!parsed.issues) {\n throw new Error('burpsuite: invalid XML — missing <issues> root element');\n }\n\n const issues = parsed.issues.issue ?? [];\n const burpVersion = parsed.issues.burpVersion ?? '';\n const exportTime = parsed.issues.exportTime ?? '';\n\n const { items: limitedIssues, truncated } = limitArray(issues);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedIssues.length} issue items (original: ${issues.length})`);\n }\n\n // Group issues by type (preserving insertion order)\n const groups = new Map<string, BurpIssueXml[]>();\n for (const issue of limitedIssues) {\n const issueType = issue.type ?? 'unknown';\n const existing = groups.get(issueType);\n if (existing) {\n existing.push(issue);\n } else {\n groups.set(issueType, [issue]);\n }\n }\n\n // Build requirements from grouped issues\n const requirements: EvaluatedRequirement[] = [];\n for (const [issueType, groupIssues] of groups) {\n requirements.push(buildRequirement(issueType, groupIssues));\n }\n\n // Determine target from the first issue's host\n const targetName = limitedIssues.length > 0\n ? (limitedIssues[0]!.host?.['#text'] ?? 'Unknown').trim()\n : 'Unknown';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'burpsuite-no-findings',\n `Burp Suite scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const title = `BurpSuite Scan: ${targetName}`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'BurpSuite Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'BurpSuite',\n format: 'XML',\n };\n if (burpVersion) {\n tool.version = burpVersion;\n }\n\n const hdf: HDFResults = {\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Application,\n },\n ],\n generator: {\n name: 'burpsuite-to-hdf',\n version: converterVersion,\n },\n tool,\n };\n\n if (exportTime) {\n hdf.timestamp = parseTimestamp(exportTime) ?? undefined;\n }\n\n return serializeHdf(hdf);\n}\n\n// --- Build requirement ---\n\nfunction buildRequirement(\n issueType: string,\n issues: BurpIssueXml[],\n): EvaluatedRequirement {\n const rep = issues[0]!;\n\n // Parse CWE IDs from vulnerabilityClassifications HTML\n const cweIDs = parseCWEIDs(rep.vulnerabilityClassifications ?? '');\n\n // Map CWE to NIST\n const nist = mapCWEToNIST(cweIDs, [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS]);\n const cciTags = nistToCci(nist);\n\n // Build extra tags\n const extras: Record<string, unknown> = {};\n if (cweIDs.length > 0) {\n extras.cweid = cweIDs.join(', ');\n }\n if (rep.confidence) {\n extras.confidence = rep.confidence;\n }\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Build descriptions\n const descriptions: Description[] = [];\n\n // Default description (required minimum 1 with \"default\" label)\n const defaultData = rep.issueBackground\n ? stripHTML(rep.issueBackground)\n : (rep.name ?? issueType);\n descriptions.push({ label: 'default', data: defaultData });\n\n // Check description from issueBackground\n if (rep.issueBackground) {\n descriptions.push({ label: 'check', data: stripHTML(rep.issueBackground) });\n }\n\n // Fix description from remediationBackground\n if (rep.remediationBackground) {\n descriptions.push({ label: 'fix', data: stripHTML(rep.remediationBackground) });\n }\n\n // Build results — one per issue in the group\n const results: RequirementResult[] = issues.map(issue => {\n const codeDesc = formatCodeDesc(\n issue.host?.ip ?? '',\n (issue.host?.['#text'] ?? '').trim(),\n issue.location ?? '',\n issue.issueDetail ?? '',\n issue.confidence ?? '',\n );\n return {\n status: ResultStatus.Failed,\n codeDesc,\n startTime: new Date('0001-01-01T00:00:00Z'),\n };\n });\n\n const impact = getImpact(rep.severity ?? 'information');\n\n const req: EvaluatedRequirement = {\n id: issueType,\n title: rep.name ?? undefined,\n impact,\n tags,\n descriptions,\n results,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n} from '@mitre/hdf-schema';\n\n/** Impact mapping from heimdall2 DBProtect mapper */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n informational: 0.0,\n};\n\n/** Parsed DBProtect XML dataset structure */\ninterface DatasetXml {\n dataset: {\n metadata: {\n item: MetadataItem[];\n };\n data: {\n row: DataRow[];\n };\n };\n}\n\ninterface MetadataItem {\n name: string;\n type: string;\n}\n\ninterface DataRow {\n value: Array<string | { nil: string } | null>;\n}\n\n/** A single compiled finding, mapping column names to string values */\ntype Finding = Record<string, string>;\n\nconst NAMED_ENTITIES: Record<string, string> = {\n amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\",\n};\n\n/**\n * Decodes XML character references. The shared parser runs with\n * processEntities disabled to block entity-expansion attacks, which also leaves\n * the five predefined references undecoded — Go's encoding/xml decodes them, so\n * the raw text would otherwise differ between the two converters.\n */\nfunction decodeXmlEntities(s: string): string {\n return s.replace(/&(#\\d+|#x[0-9a-fA-F]+|amp|lt|gt|quot|apos);/g, (match, ref: string) => {\n if (ref.startsWith('#x') || ref.startsWith('#X')) {\n return String.fromCodePoint(parseInt(ref.slice(2), 16));\n }\n if (ref.startsWith('#')) {\n return String.fromCodePoint(parseInt(ref.slice(1), 10));\n }\n return NAMED_ENTITIES[ref] ?? match;\n });\n}\n\n/**\n * Maps metadata column names to row values by position index.\n * Mirrors the heimdall2 compileFindings function.\n */\nfunction compileFindings(parsed: DatasetXml): Finding[] {\n const items = parsed.dataset.metadata.item;\n const rows = parsed.dataset.data.row;\n\n const colNames = items.map((item: MetadataItem) => item['name']);\n\n return rows.map((row: DataRow) => {\n const finding: Finding = {};\n const values = row.value;\n colNames.forEach((name: string, i: number) => {\n const val = values[i];\n if (val === null || val === undefined || typeof val === 'object') {\n finding[name] = '';\n } else {\n finding[name] = decodeXmlEntities(String(val));\n }\n });\n return finding;\n });\n}\n\n/** Check if the dataset has a \"Result Status\" column */\nfunction hasResultStatusColumn(parsed: DatasetXml): boolean {\n return parsed.dataset.metadata.item.some(\n (item: MetadataItem) => item['name'] === 'Result Status',\n );\n}\n\n/** Maps DBProtect result status strings to HDF ResultStatus */\nfunction getStatus(status: string): ResultStatus {\n switch (status) {\n case 'Fact':\n return ResultStatus.NotReviewed;\n case 'Failed':\n return ResultStatus.Failed;\n case 'Finding':\n return ResultStatus.Failed;\n case 'Not A Finding':\n return ResultStatus.Passed;\n default:\n // Includes \"Skipped\" and any unknown status\n return ResultStatus.NotReviewed;\n }\n}\n\n/** Maps DBProtect risk level to HDF impact value */\nfunction getImpact(riskDV: string): number {\n const impact = IMPACT_MAPPING[riskDV.toLowerCase()];\n return impact !== undefined ? impact : 0.5;\n}\n\n/** Creates a description string from a finding's task and check category */\nfunction formatDesc(f: Finding): string {\n return `Task : ${f['Task'] ?? ''}; Check Category : ${f['Check Category'] ?? ''}`;\n}\n\n/** Creates a summary string from a finding's metadata */\nfunction formatSummary(f: Finding): string {\n return [\n `Organization : ${f['Organization'] ?? ''}`,\n `Asset : ${f['Asset'] ?? ''}`,\n `Asset Type : ${f['Asset Type'] ?? ''}`,\n `IP Address, Port, Instance : ${f['IP Address, Port, Instance'] ?? ''}`,\n ].join('\\n');\n}\n\nconst MONTH_ABBR: Record<string, string> = {\n Jan: '01', Feb: '02', Mar: '03', Apr: '04', May: '05', Jun: '06',\n Jul: '07', Aug: '08', Sep: '09', Oct: '10', Nov: '11', Dec: '12',\n};\n\n/**\n * Parses DBProtect date formats (\"Feb 18 2021 15:57\" or \"2021-02-18 15:55\").\n * Month-name values are normalized to ISO so parseTimestamp interprets them as\n * UTC, matching the Go peer and keeping output host-timezone-independent.\n */\nfunction parseDate(dateStr: string): Date {\n const trimmed = dateStr.trim();\n // Go's parseDate returns the zero time.Time (serializes as 0001-01-01T00:00:00Z)\n // for an empty or unparseable Date column; mirror that for byte-parity instead\n // of a non-deterministic conversion-time fallback.\n const ZERO = new Date('0001-01-01T00:00:00Z');\n if (!trimmed) {\n return ZERO;\n }\n const month = /^([A-Z][a-z]{2}) (\\d{1,2}) (\\d{4}) (\\d{2}:\\d{2})$/.exec(trimmed);\n const normalized = month\n ? `${month[3]}-${MONTH_ABBR[month[1]!] ?? '00'}-${month[2]!.padStart(2, '0')} ${month[4]}`\n : trimmed;\n return parseTimestamp(normalized) ?? ZERO;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of findings sharing a Check ID.\n */\nfunction buildRequirement(\n checkID: string,\n findings: Finding[],\n hasStatus: boolean,\n): EvaluatedRequirement {\n const rep = findings[0]!;\n\n const nist = DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n const descriptions: Description[] = [\n { label: 'default', data: formatDesc(rep) },\n ];\n\n const results = findings.map((f) => {\n const status = hasStatus\n ? getStatus(f['Result Status'] ?? '')\n : ResultStatus.Failed;\n\n // DBProtect carries no per-result explanation, so results carry no message key.\n return createResult(status, undefined, {\n codeDesc: f['Details'] ?? '',\n startTime: parseDate(f['Date'] ?? ''),\n });\n });\n\n const req = createRequirement(\n checkID,\n rep['Check'] ?? '',\n descriptions,\n getImpact(rep['Risk DV'] ?? ''),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...nist]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Converts DBProtect Cognos XML output to HDF format.\n * Supports both \"Check Results Details\" (has Result Status) and \"Findings Detail\"\n * (no Result Status; all rows are findings) report formats.\n *\n * @param input - DBProtect XML string\n * @returns HDF JSON string\n */\nexport async function convertDbprotectToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('dbprotect: empty input');\n }\n validateInputSize(input, 'dbprotect');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseXmlWithArrays(input, ['item', 'row', 'value']) as unknown as DatasetXml;\n\n if (!parsed?.dataset?.data?.row || parsed.dataset.data.row.length === 0) {\n throw new Error('dbprotect: no data rows found');\n }\n\n const findings = compileFindings(parsed);\n const { items: limitedFindings, truncated } = limitArray(findings);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Input truncated at ${limitedFindings.length} finding items (original: ${findings.length})`,\n );\n }\n\n const hasStatus = hasResultStatusColumn(parsed);\n\n // Group findings by Check ID, preserving insertion order\n const groups = new Map<string, Finding[]>();\n for (const f of limitedFindings) {\n const checkID = (f['Check ID'] ?? '').trim();\n const existing = groups.get(checkID);\n if (existing) {\n existing.push(f);\n } else {\n groups.set(checkID, [f]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [checkID, findingGroup] of groups) {\n requirements.push(buildRequirement(checkID, findingGroup, hasStatus));\n }\n\n // Use first finding for metadata\n const firstFinding = limitedFindings[0]!;\n const title = firstFinding['Job Name'] ?? '';\n const summary = formatSummary(firstFinding);\n const targetName = firstFinding['Asset'] ?? '';\n\n const baseline = createMinimalBaseline('DBProtect Scan', requirements, {\n resultsChecksum,\n title,\n summary,\n }) as EvaluatedBaseline;\n\n const policy = firstFinding['Policy'] ?? '';\n if (policy) {\n baseline.version = policy;\n }\n\n return buildHdfResults({\n generatorName: 'dbprotect-to-hdf',\n converterVersion,\n toolName: 'DBProtect',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Host }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, cvssScoreToSeverity, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_REMEDIATION_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Cvss,\n AffectedPackage,\n RequirementResult,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n VerificationMethodEnum,\n CVSSSeverity,\n Ecosystem,\n Version as CvssVersion,\n createMinimalBaseline,\n createRequirement,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Twistlock/Prisma Cloud scan output structures.\n *\n * Container image scans produce a top-level \"results\" array.\n * Code repository scans omit the wrapper and return a single result object.\n */\ninterface TwistlockReport {\n results?: TwistlockResult[];\n consoleURL?: string;\n}\n\ninterface TwistlockResult {\n id?: string;\n name?: string;\n repository?: string;\n distro?: string;\n distroRelease?: string;\n collections?: string[];\n packages?: TwistlockPackage[];\n vulnerabilities?: TwistlockVuln[] | null;\n vulnerabilityDistribution?: TwistlockDistribution;\n complianceDistribution?: TwistlockDistribution;\n}\n\ninterface TwistlockPackage {\n type?: string;\n name?: string;\n version?: string;\n}\n\ninterface TwistlockVuln {\n id: string;\n cve?: string;\n status?: string;\n cvss?: number;\n vector?: string;\n description: string;\n severity: string;\n packageName?: string;\n packageVersion?: string;\n packageType?: string;\n cwe?: string;\n link?: string;\n fixedBy?: string;\n riskFactors?: string[];\n impactedVersions?: string[];\n publishedDate?: string;\n discoveredDate?: string;\n fixDate?: string;\n layerTime?: string;\n}\n\ninterface TwistlockDistribution {\n critical: number;\n high: number;\n medium: number;\n low: number;\n total: number;\n}\n\n/**\n * Maps Twistlock severity strings to HDF impact values.\n * Includes \"important\" (alias for critical) and \"moderate\" (alias for medium)\n * which appear in some Twistlock outputs.\n */\nfunction twistlockSeverityToImpact(severity: string): number {\n switch (severity.toLowerCase()) {\n case 'critical':\n case 'important':\n return 0.9;\n case 'high':\n return 0.7;\n case 'medium':\n case 'moderate':\n return 0.5;\n case 'low':\n return 0.3;\n default:\n return 0.5;\n }\n}\n\n/**\n * Builds the baseline title from scan result data.\n */\nfunction buildTitle(result: TwistlockResult): string {\n let projectName: string;\n if (result.repository) {\n projectName = result.repository;\n } else if (result.collections && result.collections.length > 0) {\n projectName = result.collections.join(' / ');\n } else {\n projectName = 'N/A';\n }\n return `Twistlock Project: ${projectName}`;\n}\n\n/**\n * Builds the baseline summary from distribution data.\n */\nfunction buildSummary(result: TwistlockResult): string {\n const vulnTotal = result.vulnerabilityDistribution\n ? String(result.vulnerabilityDistribution.total)\n : 'N/A';\n const complianceTotal = result.complianceDistribution\n ? String(result.complianceDistribution.total)\n : 'N/A';\n return `Package Vulnerability Summary: ${vulnTotal} Application Compliance Issue Total: ${complianceTotal}`;\n}\n\n/**\n * Detects CVSS schema version enum from the vector prefix. Defaults to 3.1\n * since modern Twistlock exclusively emits 3.x output.\n */\nexport function cvssVersionFromVector(vector: string | undefined): CvssVersion {\n if (!vector) return CvssVersion.The31;\n if (vector.startsWith('CVSS:2.0/')) return CvssVersion.The20;\n if (vector.startsWith('CVSS:3.0/')) return CvssVersion.The30;\n if (vector.startsWith('CVSS:4.0/')) return CvssVersion.The40;\n return CvssVersion.The31;\n}\n\n/**\n * Maps cvssScoreToSeverity('low'|'medium'|...) into the CVSSSeverity enum.\n */\nexport function cvssSeverityFromScore(score: number): CVSSSeverity | undefined {\n const band = cvssScoreToSeverity(score);\n switch (band) {\n case 'none': return CVSSSeverity.None;\n case 'low': return CVSSSeverity.Low;\n case 'medium': return CVSSSeverity.Medium;\n case 'high': return CVSSSeverity.High;\n case 'critical': return CVSSSeverity.Critical;\n default: return undefined;\n }\n}\n\n/**\n * Builds a Cvss entry from a Twistlock vulnerability. Returns undefined only\n * when neither a score nor a vector is available. When the vendor emits a\n * score but no vector (common in Twistlock/Prisma Cloud output), the Cvss\n * entry is still emitted — the schema makes baseVector optional precisely\n * so vendor-final-score data isn't dropped.\n */\nexport function buildCvss(vuln: TwistlockVuln): Cvss | undefined {\n // 0.0 is a valid CVSS score (\"none\"); only treat a non-numeric/non-finite\n // value as \"no score\". A missing score is omitted, never coerced to 0.\n const hasScore = typeof vuln.cvss === 'number' && Number.isFinite(vuln.cvss);\n const hasVector = !!vuln.vector;\n if (!hasScore && !hasVector) return undefined;\n\n const cv: Cvss = {version: cvssVersionFromVector(vuln.vector)};\n if (hasScore) {\n cv.baseScore = vuln.cvss as number;\n const sev = cvssSeverityFromScore(vuln.cvss as number);\n if (sev !== undefined) cv.baseSeverity = sev;\n }\n if (hasVector) {\n cv.baseVector = vuln.vector as string;\n }\n const source = vuln.cve ?? vuln.id;\n if (source) cv.source = source;\n return cv;\n}\n\nconst CWE_REGEX = /cwe[-_]?(\\d+)/gi;\n\n/**\n * Extracts canonical CWE-N identifiers from a free-form string.\n */\nexport function parseCwes(raw: string | undefined): string[] {\n if (!raw) return [];\n const out: string[] = [];\n const seen = new Set<string>();\n for (const m of raw.matchAll(CWE_REGEX)) {\n const id = `CWE-${m[1]}`;\n if (seen.has(id)) continue;\n seen.add(id);\n out.push(id);\n }\n return out;\n}\n\nfunction rhelDistro(distro: string): boolean {\n const low = distro.toLowerCase();\n return ['red hat', 'rhel', 'centos', 'fedora', 'amazon linux', 'oracle linux', 'rocky', 'alma']\n .some(m => low.includes(m));\n}\n\nfunction debDistro(distro: string): boolean {\n const low = distro.toLowerCase();\n return ['debian', 'ubuntu'].some(m => low.includes(m));\n}\n\n/**\n * Maps a Twistlock package type plus the result's distro string to a schema\n * Ecosystem value. Defaults to 'generic' for unknown types.\n */\nexport function resolveEcosystem(packageType: string | undefined, distro: string | undefined): Ecosystem {\n const t = (packageType ?? '').toLowerCase();\n const d = distro ?? '';\n switch (t) {\n case 'os':\n if (rhelDistro(d)) return Ecosystem.RPM;\n if (debDistro(d)) return Ecosystem.Deb;\n return Ecosystem.Generic;\n case 'rpm': return Ecosystem.RPM;\n case 'deb': return Ecosystem.Deb;\n case 'jar':\n case 'maven': return Ecosystem.Maven;\n case 'python':\n case 'pypi': return Ecosystem.Pypi;\n case 'nodejs':\n case 'npm': return Ecosystem.Npm;\n case 'gem': return Ecosystem.Gem;\n case 'nuget': return Ecosystem.Nuget;\n case 'go': return Ecosystem.Go;\n case 'cargo': return Ecosystem.Cargo;\n default: return Ecosystem.Generic;\n }\n}\n\nconst FIX_VERSION_REGEX = /\\d+(?:\\.\\d+)+[A-Za-z0-9._+\\-]*/;\n\n/**\n * Extracts the first version-looking token from fixedBy or a \"fixed in X\"\n * status string. Returns empty string when no fix info is present.\n */\nexport function extractFixedInVersion(vuln: TwistlockVuln): string {\n if (vuln.fixedBy) return vuln.fixedBy;\n const status = (vuln.status ?? '').toLowerCase();\n if (!status.includes('fixed')) return '';\n const m = (vuln.status ?? '').match(FIX_VERSION_REGEX);\n return m ? m[0] : '';\n}\n\n/**\n * Builds an AffectedPackage entry from per-vulnerability fields. Returns\n * undefined when packageName or packageVersion are missing (both required).\n */\nexport function buildAffectedPackage(\n vuln: TwistlockVuln,\n packageTypes: Map<string, string>,\n distro: string | undefined,\n): AffectedPackage | undefined {\n if (!vuln.packageName || !vuln.packageVersion) return undefined;\n const pkgType = vuln.packageType ?? packageTypes.get(vuln.packageName);\n const pkg: AffectedPackage = {\n name: vuln.packageName,\n version: vuln.packageVersion,\n ecosystem: resolveEcosystem(pkgType, distro),\n };\n const fixed = extractFixedInVersion(vuln);\n if (fixed) pkg.fixedInVersion = fixed;\n return pkg;\n}\n\n/**\n * Indexes packageName → packageType from the result-level packages array.\n */\nfunction buildPackageTypeIndex(pkgs: TwistlockPackage[] | undefined): Map<string, string> {\n const idx = new Map<string, string>();\n if (!pkgs) return idx;\n for (const p of pkgs) {\n if (p.name && p.type) idx.set(p.name, p.type);\n }\n return idx;\n}\n\n/**\n * Builds the code_desc string for a vulnerability result.\n */\nfunction formatCodeDesc(vuln: TwistlockVuln): string {\n const packageName = vuln.packageName ?? 'N/A';\n const impactedVersions = vuln.impactedVersions && vuln.impactedVersions.length > 0\n ? `[${vuln.impactedVersions.join(' ')}]`\n : 'N/A';\n return `Package ${JSON.stringify(packageName)} should be updated to latest version above impacted versions ${impactedVersions}`;\n}\n\n/**\n * Converts a single vulnerability into an EvaluatedRequirement.\n *\n * @param vuln - The Twistlock vulnerability object\n * @param packageTypes - name→type lookup built from the enclosing result's packages array\n * @param distro - the enclosing result's distro string, used to disambiguate \"os\" packages\n */\nfunction buildRequirement(\n vuln: TwistlockVuln,\n packageTypes: Map<string, string>,\n distro: string | undefined,\n): EvaluatedRequirement {\n const nist = DEFAULT_REMEDIATION_NIST_TAGS;\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = { cveid: [vuln.id] };\n // Legacy: retain the cvss_base_score tag for one release so existing\n // downstream queries keep working. Marked for removal in v3.4.0 (see\n // CHANGELOG note in epic hdf-libs-8zn0).\n if (typeof vuln.cvss === 'number' && vuln.cvss > 0) {\n extras['cvss_base_score'] = vuln.cvss;\n }\n\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n const descriptions: Description[] = [\n { label: 'default', data: vuln.description },\n ];\n\n const startTime = (vuln.discoveredDate ? parseTimestamp(vuln.discoveredDate) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n const results: RequirementResult[] = [\n createResult(ResultStatus.Failed, undefined, {\n codeDesc: formatCodeDesc(vuln),\n startTime,\n }),\n ];\n\n const req = createRequirement(\n vuln.id,\n vuln.id,\n descriptions,\n twistlockSeverityToImpact(vuln.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const cv = buildCvss(vuln);\n if (cv) req.cvss = [cv];\n const cwes = parseCwes(vuln.cwe);\n if (cwes.length > 0) req.cwe = cwes;\n const pkg = buildAffectedPackage(vuln, packageTypes, distro);\n if (pkg) req.affectedPackages = [pkg];\n\n return req;\n}\n\n/**\n * Converts a single TwistlockResult to an EvaluatedBaseline.\n */\nfunction convertSingleResult(\n result: TwistlockResult,\n resultsChecksum: Checksum\n): EvaluatedBaseline {\n const vulns = result.vulnerabilities ?? [];\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const packageTypes = buildPackageTypeIndex(result.packages);\n const requirements: EvaluatedRequirement[] = limitedVulns.map(vuln =>\n buildRequirement(vuln, packageTypes, result.distro)\n );\n\n if (requirements.length === 0) {\n const target = result.name ?? result.repository ?? result.id ?? 'scan target';\n requirements.push(buildNoFindingsRequirement(\n 'twistlock-no-findings',\n `Twistlock scanned ${target} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n const title = buildTitle(result);\n const summary = buildSummary(result);\n\n return createMinimalBaseline(\n 'Twistlock Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary,\n }\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Twistlock/Prisma Cloud scan output to HDF format.\n *\n * Handles both container image scans (with \"results\" wrapper) and code\n * repository scans (single result object without wrapper).\n *\n * @param input - Twistlock JSON string\n * @returns HDF JSON string\n */\nexport async function convertTwistlockToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('twistlock: empty input');\n }\n validateInputSize(input, 'twistlock');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<TwistlockReport & TwistlockResult>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('twistlock: invalid JSON');\n }\n\n let results: TwistlockResult[];\n\n if (Array.isArray((parsed as TwistlockReport).results)) {\n // Container scan with \"results\" wrapper\n results = (parsed as TwistlockReport).results!;\n } else {\n // Code repo scan — single result object, wrap it\n results = [parsed as TwistlockResult];\n }\n\n if (results.length === 0) {\n throw new Error('twistlock: no scan results found');\n }\n\n const baselines = results.map(result =>\n convertSingleResult(result, resultsChecksum)\n );\n\n // Use the first result's name or repository as target name\n const targetName = results[0]!.name ?? results[0]!.repository ?? '';\n\n // Code-repo scans carry no image id, so there is no image label to attach.\n const component: Component = { name: targetName, type: TargetType.ContainerImage };\n const imageID = results[0]!.id;\n if (imageID) {\n component.labels = { image: imageID };\n }\n\n return buildHdfResults({\n generatorName: 'twistlock-to-hdf',\n converterVersion,\n toolName: 'Twistlock',\n toolFormat: 'JSON',\n baselines,\n components: [component],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, parsePurl, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, ecosystemFromPurlType, inputChecksum, mapCWEToNIST, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Dependency-Track Finding Packaging Format (FPF) structures.\n */\ninterface DeptrackReport {\n version?: string;\n meta: DeptrackMeta;\n project: DeptrackProject;\n findings: DeptrackFinding[];\n}\n\ninterface DeptrackMeta {\n application?: string;\n version?: string;\n timestamp?: string;\n baseUrl?: string;\n}\n\ninterface DeptrackProject {\n uuid: string;\n name: string;\n version?: string;\n description?: string;\n}\n\ninterface DeptrackFinding {\n component: DeptrackComponent;\n vulnerability: DeptrackVulnerability;\n analysis?: DeptrackAnalysis;\n attribution?: DeptrackAttribution;\n matrix: string;\n}\n\ninterface DeptrackComponent {\n uuid?: string;\n name: string;\n version?: string;\n purl?: string;\n latestVersion?: string;\n group?: string;\n project?: string;\n cpe?: string;\n}\n\ninterface DeptrackVulnerability {\n uuid?: string;\n source?: string;\n vulnId?: string;\n title?: string;\n subtitle?: string;\n severity: string;\n severityRank?: number;\n cweId?: number;\n cweName?: string;\n cwes?: DeptrackCwe[];\n description?: string;\n recommendation?: string;\n aliases?: unknown[];\n cvssV2BaseScore?: number;\n cvssV3BaseScore?: number;\n epssScore?: number;\n epssPercentile?: number;\n}\n\ninterface DeptrackCwe {\n cweId: number;\n name: string;\n}\n\ninterface DeptrackAnalysis {\n state?: string;\n isSuppressed?: boolean;\n}\n\ninterface DeptrackAttribution {\n analyzerIdentity?: string;\n attributedOn?: string;\n alternateIdentifier?: string;\n referenceUrl?: string;\n}\n\n/**\n * Maps Dependency-Track severity strings to HDF impact values.\n * Uses the same mapping as the heimdall2 dependency-track-mapper:\n * critical=0.9, high=0.7, medium=0.5, low=0.3, info=0, unassigned=0.5\n */\nfunction getImpact(severity: string): number {\n switch (severity.toLowerCase()) {\n case 'critical':\n return 0.9;\n case 'high':\n return 0.7;\n case 'medium':\n return 0.5;\n case 'low':\n return 0.3;\n case 'info':\n return 0.0;\n default:\n return 0.5;\n }\n}\n\n/**\n * Builds the requirement title from component purl and vulnerability title.\n * Matches the heimdall2 pattern: \"{purl} - {title}\" or just \"{purl}\".\n */\nfunction getTitle(finding: DeptrackFinding): string {\n const purl = finding.component.purl ?? finding.component.name;\n const title = finding.vulnerability.title;\n if (title) {\n return `${purl} - ${title}`;\n }\n return purl;\n}\n\n/**\n * Extracts CWE IDs as \"CWE-NNN\" strings from the cwes array.\n */\nfunction getCweIDs(cwes: DeptrackCwe[] | undefined): string[] {\n if (!cwes || cwes.length === 0) {\n return [];\n }\n return cwes.map(cwe => `CWE-${cwe.cweId}`);\n}\n\n/**\n * Builds a single EvaluatedRequirement from a Dependency-Track finding.\n */\nfunction buildRequirement(finding: DeptrackFinding, timestamp: string | undefined): EvaluatedRequirement {\n const cweIDs = getCweIDs(finding.vulnerability.cwes);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweIds'] = cweIDs;\n }\n\n // Build descriptions: default, check, fix\n const descriptions: Description[] = [\n { label: 'default', data: finding.vulnerability.description ?? '' },\n ];\n\n if (finding.vulnerability.description) {\n descriptions.push({ label: 'check', data: finding.vulnerability.description });\n }\n if (finding.vulnerability.recommendation) {\n descriptions.push({ label: 'fix', data: finding.vulnerability.recommendation });\n }\n\n // Build result: all findings are Failed\n const codeDesc = finding.vulnerability.recommendation ?? 'No recommendation available';\n\n const results: RequirementResult[] = [\n createResult(ResultStatus.Failed, undefined, {\n codeDesc,\n startTime: (timestamp ? parseTimestamp(timestamp) : null) ?? new Date('0001-01-01T00:00:00Z'),\n }),\n ];\n\n const req = createRequirement(\n finding.matrix,\n getTitle(finding),\n descriptions,\n getImpact(finding.vulnerability.severity),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n const pkg = buildAffectedPackageFromComponent(finding.component);\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n\n return req;\n}\n\n/**\n * Builds an Affected_Package from a Dependency-Track component. Prefers\n * the rich identifiers Dependency-Track already exposes (purl, cpe) and\n * augments with name/version/ecosystem when available. Returns undefined\n * when the component carries no schema-acceptable identifier.\n */\nfunction buildAffectedPackageFromComponent(c: DeptrackComponent): ReturnType<typeof buildAffectedPackage> {\n // Derive ecosystem from the purl scheme when possible; falls back to\n // generic so the name+version+ecosystem branch stays valid for\n // components Dependency-Track left without a purl.\n let ecosystem;\n if (c.purl) {\n const parsed = parsePurl(c.purl);\n ecosystem = ecosystemFromPurlType(parsed?.type);\n } else if (c.name && c.version) {\n ecosystem = ecosystemFromPurlType(undefined);\n }\n return buildAffectedPackage({\n name: c.name,\n version: c.version,\n ecosystem,\n purl: c.purl,\n cpe: c.cpe,\n fixedInVersion: c.latestVersion,\n });\n}\n\n/**\n * Converts Dependency-Track FPF JSON output to HDF format.\n *\n * @param input - Dependency-Track FPF JSON string\n * @returns HDF JSON string\n */\nexport async function convertDeptrackToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('deptrack: empty input');\n }\n validateInputSize(input, 'deptrack');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<DeptrackReport>(input);\n\n if (!parsed || typeof parsed !== 'object') {\n throw new Error('deptrack: invalid JSON');\n }\n\n // Validate it looks like a Dependency-Track report\n if (!parsed.findings && !parsed.project && !parsed.meta) {\n throw new Error('deptrack: input does not appear to be a Dependency-Track report');\n }\n\n const findings = parsed.findings ?? [];\n const requirements: EvaluatedRequirement[] = findings.map(\n finding => buildRequirement(finding, parsed.meta?.timestamp),\n );\n\n if (requirements.length === 0) {\n const projectName = parsed.project?.name ?? parsed.project?.uuid ?? '';\n requirements.push(buildNoFindingsRequirement(\n 'deptrack-no-findings',\n `Dependency-Track analyzed ${projectName} and reported zero vulnerable components.`,\n new Date(),\n ));\n }\n\n const title = `Dependency-Track: ${parsed.project?.name ?? ''} ${parsed.project?.version ?? ''}`;\n\n const baseline = createMinimalBaseline(\n 'Dependency-Track Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: parsed.project?.description,\n },\n ) as EvaluatedBaseline;\n\n const targetName = parsed.project?.name ?? parsed.project?.uuid ?? '';\n\n return buildHdfResults({\n generatorName: 'deptrack-to-hdf',\n converterVersion,\n toolName: 'Dependency-Track',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON, sha256 } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, ecosystemFromPurlType, inputChecksum, limitArray, mapCWEToNIST, validateInputSize, buildHdfResults, deriveControlTypeFromTags } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n severityToImpact,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * JFrog Xray JSON output structures.\n */\ninterface XrayReport {\n total_count: number;\n data: XrayEntry[];\n}\n\ninterface XrayEntry {\n id: string;\n severity: string;\n summary: string;\n issue_type?: string;\n provider?: string;\n component?: string;\n source_id?: string;\n source_comp_id?: string;\n component_versions?: ComponentVersions;\n edited?: string;\n}\n\ninterface ComponentVersions {\n id?: string;\n vulnerable_versions?: string[];\n fixed_versions?: string[];\n more_details?: MoreDetails;\n}\n\ninterface MoreDetails {\n cves?: CVEEntry[];\n description?: string;\n provider?: string;\n}\n\ninterface CVEEntry {\n cve?: string;\n cwe?: string[];\n cvss_v2?: string;\n cvss_v3?: string;\n}\n\n/**\n * Generate a truncated SHA-256 hash of a string for use as an ID.\n * Truncated to 32 hex chars for compatibility with original hash length.\n */\nasync function hashID(summary: string): Promise<string> {\n const full = await sha256(summary);\n return full.substring(0, 32);\n}\n\n/**\n * Extract CWE identifiers from the first CVE entry.\n */\nfunction extractCWEs(entry: XrayEntry): string[] {\n const cves = entry.component_versions?.more_details?.cves;\n if (!cves || cves.length === 0) {\n return [];\n }\n return cves[0]?.cwe ?? [];\n}\n\n/**\n * Build description from more_details, including CVE data.\n * Matches heimdall2 formatDesc behavior.\n */\nfunction formatDescription(entry: XrayEntry): string {\n const parts: string[] = [];\n const desc = entry.component_versions?.more_details?.description;\n if (desc) {\n parts.push(desc);\n }\n const cves = entry.component_versions?.more_details?.cves;\n if (cves && cves.length > 0) {\n let cveStr = JSON.stringify(cves);\n cveStr = cveStr.replace(/\":/g, '\"=>');\n cveStr = cveStr.replace(/,/g, ', ');\n parts.push(`cves: ${cveStr}`);\n }\n if (parts.length === 0) {\n return entry.summary;\n }\n return parts.join('\\n');\n}\n\n/**\n * Build code_desc from component version metadata.\n * Matches heimdall2 formatCodeDesc behavior.\n */\nfunction formatCodeDesc(entry: XrayEntry): string {\n const parts: string[] = [];\n\n parts.push(`source_comp_id : ${entry.source_comp_id ?? ''}`);\n\n const vulnVersions = entry.component_versions?.vulnerable_versions;\n if (vulnVersions && vulnVersions.length > 0) {\n parts.push(`vulnerable_versions : ${JSON.stringify(vulnVersions)}`);\n } else {\n parts.push('vulnerable_versions : ');\n }\n\n const fixedVersions = entry.component_versions?.fixed_versions;\n if (fixedVersions && fixedVersions.length > 0) {\n parts.push(`fixed_versions : ${JSON.stringify(fixedVersions)}`);\n } else {\n parts.push('fixed_versions : ');\n }\n\n parts.push(`issue_type : ${entry.issue_type ?? ''}`);\n parts.push(`provider : ${entry.provider ?? ''}`);\n\n return parts.join('\\n').replace(/,/g, ', ');\n}\n\n/**\n * Builds a single EvaluatedRequirement from a group of entries sharing an ID.\n */\nfunction buildRequirement(entryID: string, entries: XrayEntry[], scanTime: Date): EvaluatedRequirement {\n const rep = entries[0]!;\n const cweIDs = extractCWEs(rep);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_STATIC_ANALYSIS_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cweid'] = cweIDs;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: formatDescription(rep) },\n ];\n\n // Xray carries no per-result explanation, so `message` stays absent rather\n // than an empty string (createResult would default it to '').\n const results: RequirementResult[] = entries.map(entry => ({\n status: ResultStatus.Failed,\n codeDesc: formatCodeDesc(entry),\n startTime: scanTime,\n }));\n\n const req = createRequirement(\n entryID,\n rep.summary,\n descriptions,\n severityToImpact(rep.severity),\n results,\n { tags }\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const pkg = buildAffectedPackageFromEntry(rep);\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n return req;\n}\n\n// Xray source-id scheme to AffectedPackage ecosystem.\n// `gav://` is Maven (group:artifact); other schemes match purl types\n// directly (npm, pypi, etc.).\nfunction ecosystemFromXraySource(scheme: string): Ecosystem {\n if (scheme === 'gav') return Ecosystem.Maven;\n return ecosystemFromPurlType(scheme);\n}\n\n// Parse `<scheme>://<name>:<version>` (source_comp_id) or\n// `<scheme>://<name>` (source_id). Returns undefined when no scheme is\n// present.\nfunction parseSourceCompID(s: string | undefined):\n | { scheme: string; name: string; version?: string }\n | undefined {\n if (!s) return undefined;\n const m = /^([a-zA-Z0-9]+):\\/\\/(.+)$/.exec(s);\n if (!m) return undefined;\n const scheme = m[1]!.toLowerCase();\n const rest = m[2]!;\n const colonIdx = rest.lastIndexOf(':');\n if (colonIdx > 0) {\n return { scheme, name: rest.slice(0, colonIdx), version: rest.slice(colonIdx + 1) };\n }\n return { scheme, name: rest };\n}\n\nfunction buildAffectedPackageFromEntry(entry: XrayEntry): ReturnType<typeof buildAffectedPackage> {\n const parsed = parseSourceCompID(entry.source_comp_id ?? entry.source_id);\n let name = entry.component ?? '';\n let version: string | undefined;\n let ecosystem: Ecosystem | undefined;\n if (parsed) {\n if (parsed.name) name = parsed.name;\n version = parsed.version;\n ecosystem = ecosystemFromXraySource(parsed.scheme);\n }\n // Fall back to component_versions.fixed_versions[0] for the fixed-in\n // marker; vulnerable_versions are range expressions and don't fit\n // AffectedPackage.fixedInVersion (which mirrors `version` syntax).\n const fixed = entry.component_versions?.fixed_versions?.[0];\n // Without a concrete version we still emit the package — the schema\n // accepts name+version+ecosystem OR purl-only; here we ensure at\n // least name+ecosystem are populated, version optional.\n return buildAffectedPackage({\n name,\n version,\n ecosystem: ecosystem ?? (name ? Ecosystem.Generic : undefined),\n fixedInVersion: fixed,\n });\n}\n\n/**\n * Converts JFrog Xray JSON output to HDF format.\n *\n * @param input - JFrog Xray JSON string\n * @returns HDF JSON string\n */\nexport async function convertJfrogXrayToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('jfrog-xray: empty input');\n }\n validateInputSize(input, 'jfrog-xray');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const parsed = parseJSON<XrayReport>(input);\n\n if (!parsed || typeof parsed !== 'object' || !Array.isArray(parsed.data)) {\n throw new Error('jfrog-xray: invalid JSON structure');\n }\n\n // JFrog Xray output carries no scan-level timestamp (only per-entry `edited`\n // dates, which mark when each vuln-DB record was last edited, not when the\n // scan ran). Use a single conversion timestamp for all results, the doc\n // timestamp, and the no-findings placeholder.\n const scanTime = new Date();\n\n const { items: limitedEntries, truncated } = limitArray(parsed.data);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedEntries.length} entries (original: ${parsed.data.length})`);\n }\n\n // Pre-compute entry IDs (hashID is async due to Web Crypto sha256)\n const entryIDs = await Promise.all(\n limitedEntries.map(async (entry) => {\n if (entry.id && entry.id.length > 0) return entry.id;\n return hashID(entry.summary);\n })\n );\n\n // Group entries by effective ID, preserving insertion order\n const groups = new Map<string, XrayEntry[]>();\n for (let i = 0; i < limitedEntries.length; i++) {\n const id = entryIDs[i]!;\n const entry = limitedEntries[i]!;\n const existing = groups.get(id);\n if (existing) {\n existing.push(entry);\n } else {\n groups.set(id, [entry]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [entryID, entries] of groups) {\n requirements.push(buildRequirement(entryID, entries, scanTime));\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'jfrog-xray-no-findings',\n 'JFrog Xray scanned the target artifact and reported zero vulnerable components.',\n scanTime,\n ));\n }\n\n const baseline = createMinimalBaseline(\n 'JFrog Xray Scan',\n requirements,\n { resultsChecksum }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'jfrog-xray-to-hdf',\n converterVersion,\n toolName: 'JFrog Xray',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [{ name: 'JFrog Xray Scan', type: TargetType.Application }],\n timestamp: scanTime,\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_REMEDIATION_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, mapCWEToNIST, extractCWEIDs, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * NeuVector scan JSON output structures.\n *\n * Top-level object has \"error_message\" and \"report\" fields.\n * The report contains image metadata and a vulnerabilities array.\n */\ninterface NeuVectorScan {\n error_message: string;\n report: NeuVectorScanReport;\n}\n\ninterface NeuVectorScanReport {\n image_id: string;\n registry: string;\n repository: string;\n tag: string;\n digest: string;\n size: number;\n author: string;\n base_os: string;\n created_at: string;\n cvedb_version: string;\n cvedb_create_time: string;\n layers: unknown[];\n vulnerabilities: NeuVectorVuln[];\n modules?: NeuVectorScanModule[];\n}\n\ninterface NeuVectorVuln {\n name: string;\n score: number;\n severity: string;\n vectors: string;\n description: string;\n file_name: string;\n package_name: string;\n package_version: string;\n fixed_version: string;\n link: string;\n score_v3: number;\n vectors_v3: string;\n published_timestamp: number;\n last_modified_timestamp: number;\n cpes?: string[];\n cves?: string[];\n feed_rating: string;\n in_base_image?: boolean;\n tags?: string[];\n}\n\ninterface NeuVectorScanModule {\n name: string;\n file: string;\n version: string;\n source: string;\n}\n\n/**\n * Extracts CWE identifiers from a vulnerability description string.\n * Returns CWE-prefixed IDs (e.g., [\"CWE-444\"]) for use in tags and mapCWEToNIST.\n */\nfunction extractCWEs(description: string): string[] {\n return extractCWEIDs(description).map(id => `CWE-${id}`);\n}\n\n/**\n * Computes the HDF impact from NeuVector CVSS scores.\n * Prefers CVSS v3 score; falls back to CVSS v2 if v3 is 0.\n * Impact is normalized to 0.0-1.0 by dividing by 10.\n */\nfunction getImpact(vuln: NeuVectorVuln): number {\n if (vuln.score_v3 > 0) {\n return vuln.score_v3 / 10;\n }\n if (vuln.score > 0) {\n return vuln.score / 10;\n }\n return 0.5; // default when no score available\n}\n\n/**\n * Constructs the unique ID for a NeuVector vulnerability.\n */\nfunction vulnID(vuln: NeuVectorVuln): string {\n return `${vuln.name}/${vuln.package_name}/${vuln.package_version}`;\n}\n\n/**\n * Generates a human-readable title for the vulnerability.\n */\nfunction vulnTitle(vuln: NeuVectorVuln): string {\n return `NeuVector found a vulnerability to ${vuln.name} in ${vuln.package_name}/${vuln.package_version}.`;\n}\n\n/**\n * Generates the result message describing the fix action.\n */\nfunction vulnMessage(vuln: NeuVectorVuln): string {\n if (!vuln.fixed_version) {\n return `Vulnerable package ${vuln.package_name} is at version ${vuln.package_version}. No fixed version available.`;\n }\n return `Vulnerable package ${vuln.package_name} is at version ${vuln.package_version}. Update to fixed version ${vuln.fixed_version}.`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a NeuVector vulnerability.\n */\nfunction buildRequirement(vuln: NeuVectorVuln, scanTime: Date): EvaluatedRequirement {\n const cweIDs = extractCWEs(vuln.description);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_REMEDIATION_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n const tags: Record<string, unknown> = {\n nist,\n cci: cciTags,\n };\n\n if (cweIDs.length > 0) {\n tags['cwe'] = cweIDs;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: vuln.description },\n ];\n\n const results = [\n createResult(ResultStatus.Failed, vulnMessage(vuln), {\n codeDesc: '',\n startTime: scanTime,\n }),\n ];\n\n const req = createRequirement(\n vulnID(vuln),\n vulnTitle(vuln),\n descriptions,\n getImpact(vuln),\n results,\n { tags }\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n // NeuVector scans container images; the package ecosystem isn't\n // disambiguated by the source format (could be rpm/deb/python/etc.\n // depending on the base image), so we record `generic`. NeuVector\n // emits CPE 2.2 URIs (`cpe:/...`); the schema requires CPE 2.3, so\n // only the first 2.3-shaped entry is carried through.\n const cpe23 = (vuln.cpes ?? []).find((c) => /^cpe:2\\.3:[aho]:/.test(c));\n const pkg = buildAffectedPackage({\n name: vuln.package_name,\n version: vuln.package_version,\n ecosystem: vuln.package_name && vuln.package_version ? Ecosystem.Generic : undefined,\n cpe: cpe23,\n fixedInVersion: vuln.fixed_version,\n });\n if (pkg) {\n req.affectedPackages = [pkg];\n }\n return req;\n}\n\n/**\n * Constructs the baseline title from the image metadata.\n */\nfunction imageTitle(report: NeuVectorScanReport): string {\n return `${report.registry}/${report.repository}:${report.tag} - Digest: ${report.digest} - Image ID: ${report.image_id}`;\n}\n\n/**\n * Constructs the target name from the image metadata.\n */\nfunction targetNameFromReport(report: NeuVectorScanReport): string {\n return `${report.registry}/${report.repository}:${report.tag}`;\n}\n\n/**\n * Converts NeuVector container vulnerability scan JSON output to HDF format.\n *\n * Each vulnerability becomes a separate requirement with a unique\n * ID of name/package_name/package_version. Impact is derived from the\n * CVSS v3 score (preferred) or CVSS v2 score as fallback, normalized to 0-1.\n *\n * CWE identifiers are extracted from vulnerability descriptions via regex\n * and mapped to NIST 800-53 controls. When no CWE is found, default\n * remediation NIST tags (SI-2, RA-5) are used.\n *\n * @param input - NeuVector scan JSON string\n * @returns HDF JSON string\n */\nexport async function convertNeuvectorToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('neuvector: empty input');\n }\n validateInputSize(input, 'neuvector');\n\n const scan = parseJSON<NeuVectorScan>(input);\n\n if (!scan || typeof scan !== 'object' || !('report' in scan)) {\n throw new Error('neuvector: invalid JSON structure');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const { items: limitedVulns, truncated } = limitArray(\n scan.report.vulnerabilities ?? []\n );\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${scan.report.vulnerabilities.length})`\n );\n }\n\n // NeuVector reports carry image build time (created_at) and CVE-DB version\n // time (cvedb_create_time), but neither is the scan time, so use conversion\n // time as the single timestamp shared by every result.\n const scanTime = new Date();\n\n // Deduplicate by composite ID (name/package_name/package_version)\n const seen = new Set<string>();\n const requirements: EvaluatedRequirement[] = [];\n for (const vuln of limitedVulns) {\n const id = vulnID(vuln);\n if (seen.has(id)) {\n continue;\n }\n seen.add(id);\n requirements.push(buildRequirement(vuln, scanTime));\n }\n\n const target = targetNameFromReport(scan.report);\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'neuvector-no-findings',\n `NeuVector scanned ${target} and reported zero vulnerable components.`,\n scanTime,\n ));\n }\n\n const title = imageTitle(scan.report);\n\n const baseline = createMinimalBaseline(\n 'NeuVector Scan',\n requirements,\n {\n resultsChecksum,\n title,\n }\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'neuvector-to-hdf',\n converterVersion,\n toolName: 'NeuVector',\n toolFormat: 'JSON',\n baselines: [baseline],\n components: [\n {\n name: targetNameFromReport(scan.report),\n type: TargetType.ContainerImage,\n labels: {\n image: `${scan.report.registry}/${scan.report.repository}:${scan.report.tag}`,\n registry: scan.report.registry,\n },\n },\n ],\n timestamp: scanTime,\n });\n}\n","import { parseXml, parseTimestamp } from '@mitre/hdf-utilities';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport {\n buildNoFindingsRequirement,\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n ensureArray,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n validateInputSize,\n serializeHdf,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Tool,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// NIST 800-53 reference name used by Fortify in Description.References\nconst NIST_REFERENCE_NAME =\n 'Standards Mapping - NIST Special Publication 800-53 Revision 4';\n\n\n// Regex to match NIST control identifiers like SI-10, AC-2\nconst NIST_PATTERN = /[a-zA-Z]{2}-\\d+/g;\n\n// --- FVDL XML types ---\n\ninterface FVDLParsed {\n FVDL: {\n CreatedTS?: { date?: string; time?: string };\n UUID?: string;\n Build?: {\n BuildID?: string;\n NumberFiles?: string;\n SourceBasePath?: string;\n };\n Vulnerabilities?: {\n Vulnerability?: FVDLVulnerability | FVDLVulnerability[];\n };\n Description?: FVDLDescription | FVDLDescription[];\n Snippets?: {\n Snippet?: FVDLSnippet | FVDLSnippet[];\n };\n EngineData?: {\n EngineVersion?: string;\n };\n };\n}\n\ninterface FVDLVulnerability {\n ClassInfo?: {\n ClassID?: string;\n Kingdom?: string;\n Type?: string;\n Subtype?: string;\n AnalyzerName?: string;\n DefaultSeverity?: string;\n };\n InstanceInfo?: {\n InstanceID?: string;\n InstanceSeverity?: string;\n Confidence?: string;\n };\n AnalysisInfo?: {\n Unified?: {\n Trace?: {\n Primary?: {\n Entry?: FVDLEntry | FVDLEntry[];\n };\n };\n };\n };\n}\n\ninterface FVDLEntry {\n NodeRef?: { id?: string };\n Node?: {\n isDefault?: string;\n SourceLocation?: {\n path?: string;\n line?: string;\n lineEnd?: string;\n colStart?: string;\n colEnd?: string;\n contextId?: string;\n snippet?: string;\n };\n };\n}\n\ninterface FVDLDescription {\n classID?: string;\n contentType?: string;\n Abstract?: string;\n Explanation?: string;\n Recommendations?: string;\n References?: {\n Reference?: FVDLReference | FVDLReference[];\n };\n}\n\ninterface FVDLReference {\n Title?: string;\n Author?: string;\n Publisher?: string;\n Source?: string;\n}\n\ninterface FVDLSnippet {\n id?: string;\n File?: string;\n StartLine?: string;\n EndLine?: string;\n Text?: string;\n}\n\n// --- Helpers ---\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n amp: '&',\n};\n\n// FVDL stores its description markup entity-escaped, and the shared XML parser\n// leaves entities encoded (processEntities is off as XXE defense-in-depth), so the\n// markup must be decoded before stripHTML can see it — this is what Go's XML\n// decoder does for free. Only the predefined and numeric character references are\n// decoded; document-defined entities stay untouched.\nfunction decodeXmlEntities(s: string): string {\n return s.replace(\n /&(?:#(\\d+)|#[xX]([0-9a-fA-F]+)|(lt|gt|quot|apos|amp));/g,\n (match, dec: string | undefined, hex: string | undefined, name: string | undefined) => {\n if (dec !== undefined) return String.fromCodePoint(Number.parseInt(dec, 10));\n if (hex !== undefined) return String.fromCodePoint(Number.parseInt(hex, 16));\n return name !== undefined ? NAMED_ENTITIES[name] ?? match : match;\n },\n );\n}\n\nfunction stripFvdlMarkup(s: string): string {\n return stripHTML(decodeXmlEntities(s));\n}\n\nfunction buildSnippetMap(snippets: FVDLSnippet[]): Map<string, FVDLSnippet> {\n const map = new Map<string, FVDLSnippet>();\n for (const s of snippets) {\n if (s.id) {\n map.set(s.id, s);\n }\n }\n return map;\n}\n\nfunction groupVulnsByClassID(vulns: FVDLVulnerability[]): Map<string, FVDLVulnerability[]> {\n const groups = new Map<string, FVDLVulnerability[]>();\n for (const vuln of vulns) {\n const classID = vuln.ClassInfo?.ClassID ?? 'unknown';\n const existing = groups.get(classID);\n if (existing) {\n existing.push(vuln);\n } else {\n groups.set(classID, [vuln]);\n }\n }\n return groups;\n}\n\nfunction extractNISTFromReferences(refs: FVDLReference[]): string[] {\n for (const ref of refs) {\n if (ref.Author === NIST_REFERENCE_NAME) {\n const matches = ref.Title?.match(NIST_PATTERN);\n if (matches && matches.length > 0) {\n return matches;\n }\n }\n }\n return [];\n}\n\nfunction formatSnippet(snippet: FVDLSnippet): string {\n const text = (snippet.Text ?? '').trim();\n return `Path: ${snippet.File ?? ''}\\nStartLine: ${snippet.StartLine ?? ''}, EndLine: ${snippet.EndLine ?? ''}\\nCode:\\n${text}`;\n}\n\nfunction buildCodeDesc(\n vuln: FVDLVulnerability,\n snippetMap: Map<string, FVDLSnippet>,\n): string {\n const parts: string[] = [];\n const entries = ensureArray(vuln.AnalysisInfo?.Unified?.Trace?.Primary?.Entry);\n\n for (const entry of entries) {\n if (!entry.Node) continue;\n\n const snippetID = entry.Node.SourceLocation?.snippet;\n if (!snippetID) {\n const path = entry.Node.SourceLocation?.path;\n const line = entry.Node.SourceLocation?.line;\n if (path) {\n parts.push(`Path: ${path}\\nLine: ${line ?? ''}`);\n }\n continue;\n }\n\n const snippet = snippetMap.get(snippetID);\n if (snippet) {\n parts.push(formatSnippet(snippet));\n }\n }\n\n if (parts.length === 0) {\n return `ClassID: ${vuln.ClassInfo?.ClassID ?? ''}, InstanceID: ${vuln.InstanceInfo?.InstanceID ?? ''}`;\n }\n\n return parts.join('\\n');\n}\n\nfunction buildRequirement(\n desc: FVDLDescription,\n vulns: FVDLVulnerability[],\n snippetMap: Map<string, FVDLSnippet>,\n startTimeStr: string,\n): EvaluatedRequirement {\n // Extract NIST tags from Description References\n const refs = ensureArray(desc.References?.Reference);\n let nistTags = extractNISTFromReferences(refs);\n if (nistTags.length === 0) {\n nistTags = [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n }\n const cciTags = nistToCci(nistTags);\n const tags = buildNistCciTags(nistTags, cciTags);\n\n // Title from Abstract (HTML stripped)\n const title = stripFvdlMarkup(desc.Abstract ?? '');\n\n // Default description from Explanation (HTML stripped)\n let explanationText = stripFvdlMarkup(desc.Explanation ?? '');\n if (!explanationText) {\n explanationText = title;\n }\n const descriptions: Description[] = [\n { label: 'default', data: explanationText },\n ];\n\n // Fix description from Recommendations\n if (desc.Recommendations) {\n descriptions.push({\n label: 'fix',\n data: stripFvdlMarkup(desc.Recommendations),\n });\n }\n\n // Impact from the first vulnerability's DefaultSeverity / 5\n let impact = 0;\n if (vulns.length > 0) {\n const severity = parseFloat(vulns[0]!.ClassInfo?.DefaultSeverity ?? '0');\n impact = severity / 5.0;\n }\n\n // Build results — one per vulnerability instance\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const results: RequirementResult[] = limitedVulns.map(vuln => ({\n status: ResultStatus.Failed,\n codeDesc: buildCodeDesc(vuln, snippetMap),\n startTime: parseTimestamp(startTimeStr) ?? new Date(),\n }));\n\n const req: EvaluatedRequirement = {\n id: desc.classID ?? 'unknown',\n title,\n impact,\n tags,\n descriptions,\n results,\n verificationMethod: VerificationMethodEnum.Automated,\n };\n\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n// --- Main converter ---\n\n/**\n * Converts Fortify FVDL XML to HDF format.\n *\n * Descriptions are used as requirements (one per unique classID).\n * Vulnerabilities are mapped to results under their corresponding Description.\n * Snippets provide code context for result code descriptions.\n *\n * @param input - Fortify FVDL XML string\n * @returns HDF JSON string\n */\nexport async function convertFortifyToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('fortify: empty input');\n }\n validateInputSize(input, 'fortify');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse FVDL XML — use stopNodes to preserve embedded HTML in Abstract/Explanation\n const parsed = parseXml(input, {\n stopNodes: ['FVDL.Description.Abstract', 'FVDL.Description.Explanation'],\n }) as unknown as FVDLParsed;\n\n if (!parsed.FVDL) {\n throw new Error('fortify: invalid FVDL — missing <FVDL> root element');\n }\n\n const fvdl = parsed.FVDL;\n\n // Build snippet map\n const snippets = ensureArray(fvdl.Snippets?.Snippet);\n const snippetMap = buildSnippetMap(snippets);\n\n // Get vulnerabilities grouped by ClassID\n const vulns = ensureArray(fvdl.Vulnerabilities?.Vulnerability);\n const vulnGroups = groupVulnsByClassID(vulns);\n\n // Get descriptions\n const descriptions = ensureArray(fvdl.Description);\n const { items: limitedDescs, truncated: truncatedDescs } = limitArray(descriptions);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncatedDescs) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedDescs.length} Description items (original: ${descriptions.length})`);\n }\n\n // Build timestamp string from CreatedTS\n const createdDate = fvdl.CreatedTS?.date ?? '';\n const createdTime = fvdl.CreatedTS?.time ?? '';\n const startTimeStr = `${createdDate}T${createdTime}`;\n\n // Build requirements — one per Description classID\n const requirements: EvaluatedRequirement[] = limitedDescs.map(desc => {\n const classVulns = vulnGroups.get(desc.classID ?? '') ?? [];\n return buildRequirement(desc, classVulns, snippetMap, startTimeStr);\n });\n\n const targetName = fvdl.Build?.SourceBasePath ?? fvdl.Build?.BuildID ?? 'Unknown';\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'fortify-no-findings',\n `Fortify scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n // Build baseline\n const title = 'Fortify Static Analyzer Scan';\n const summary = `Fortify Static Analyzer Scan of UUID: ${fvdl.UUID ?? ''}`;\n const version = fvdl.EngineData?.EngineVersion ?? '';\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Fortify Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary,\n version,\n status: 'loaded',\n },\n ) as EvaluatedBaseline;\n\n const tool: Tool = {\n name: 'Fortify',\n format: 'FVDL',\n };\n\n const hdfResult: HDFResults = {\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Repository,\n },\n ],\n generator: {\n name: 'fortify-to-hdf',\n version: converterVersion,\n },\n tool,\n };\n\n // Set timestamp from CreatedTS\n if (createdDate) {\n hdfResult.timestamp = parseTimestamp(startTimeStr) ?? new Date();\n }\n\n return serializeHdf(hdfResult);\n}\n","/**\n * Prisma Cloud CSV to HDF converter.\n *\n * Prisma Cloud exports compliance scan results as CSV with one row per finding.\n * Findings are grouped by Hostname, producing one baseline per host.\n * Each finding maps to a single requirement with a single failed result.\n */\n\nimport { parseCsv, severityToImpact } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { buildAffectedPackage, buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, limitArrayWithWarning, DEFAULT_REMEDIATION_NIST_TAGS, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport { Ecosystem } from '@mitre/hdf-schema';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n} from '@mitre/hdf-schema';\n\n\n/** Required CSV columns that must be present */\nconst REQUIRED_COLUMNS = ['Hostname', 'Compliance ID', 'Severity', 'Type', 'Description'];\n\n/**\n * A single row from the Prisma Cloud CSV export.\n */\ninterface PrismaRecord {\n Hostname: string;\n Distro: string;\n 'CVE ID': string;\n 'Compliance ID': string;\n Type: string;\n Severity: string;\n Packages: string;\n /** Some Prisma exports include a separate Source Package column;\n * optional because older exports collapse it into `Packages`. */\n 'Source Package'?: string;\n /** Concrete vulnerable version of the affected package. */\n 'Package Version'?: string;\n Description: string;\n Cause: string;\n 'Fix Status': string;\n Published: string;\n 'Vulnerability Link': string;\n}\n\n/**\n * Prisma uses non-standard severity names: \"important\" and \"moderate\"\n * in addition to the standard critical/high/medium/low.\n */\nconst PRISMA_SEVERITY_ALIASES: Record<string, number> = {\n important: 0.9,\n moderate: 0.5,\n};\n\nfunction getImpact(severity: string): number {\n return PRISMA_SEVERITY_ALIASES[severity.toLowerCase()] ?? severityToImpact(severity);\n}\n\n/**\n * Returns NIST tags based on whether the finding has a CVE.\n * CVE findings get remediation tags; non-CVE compliance findings get static analysis tags.\n */\nfunction getNistTags(cveID: string): string[] {\n if (cveID) {\n return DEFAULT_REMEDIATION_NIST_TAGS;\n }\n return DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n}\n\n/**\n * Constructs the requirement ID following the heimdall2 pattern:\n * - CVE findings: \"{ComplianceID}-{CVEID}\"\n * - Non-CVE compliance: \"{ComplianceID}-{Distro}-{Severity}\"\n */\nfunction makeRequirementID(rec: PrismaRecord): string {\n if (rec['CVE ID']) {\n return `${rec['Compliance ID']}-${rec['CVE ID']}`;\n }\n return `${rec['Compliance ID']}-${rec.Distro}-${rec.Severity}`;\n}\n\n/**\n * Builds the code description following the heimdall2 pattern.\n */\nfunction makeCodeDesc(rec: PrismaRecord): string {\n let result = '';\n if (rec.Type === 'image') {\n if (rec.Packages !== '') {\n result += `Version check of package: ${rec.Packages}`;\n }\n } else if (rec.Type === 'linux') {\n if (rec.Distro !== '') {\n result += `Configuration check for ${rec.Distro}`;\n }\n } else {\n result += `${rec.Type} check for ${rec.Hostname}`;\n }\n if (rec.Description) {\n result += `\\n\\n${rec.Description}`;\n }\n return result;\n}\n\n/**\n * Builds the result message from Fix Status and Cause fields.\n */\nfunction makeMessage(rec: PrismaRecord): string {\n const hasFixStatus = rec['Fix Status'] !== '';\n const hasCause = rec.Cause !== '';\n\n if (hasFixStatus && hasCause) {\n return `Fix Status: ${rec['Fix Status']}\\n\\n${rec.Cause}`;\n } else if (hasFixStatus) {\n return `Fix Status: ${rec['Fix Status']}`;\n } else if (hasCause) {\n return `Cause: ${rec.Cause}`;\n }\n return 'Unknown';\n}\n\n/**\n * Builds the requirement title following the heimdall2 pattern.\n */\nfunction makeTitle(rec: PrismaRecord): string {\n return `${rec.Hostname}-${rec.Distro}-${rec.Type}`;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a Prisma record.\n */\nfunction buildRequirement(rec: PrismaRecord, scanTime: Date): EvaluatedRequirement {\n const id = makeRequirementID(rec);\n const title = makeTitle(rec);\n const codeDesc = makeCodeDesc(rec);\n const message = makeMessage(rec);\n\n const nist = getNistTags(rec['CVE ID']);\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {};\n if (rec['CVE ID']) {\n extras['cve'] = [rec['CVE ID']];\n }\n\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n const descriptions: Description[] = [\n { label: 'default', data: rec.Description },\n ];\n\n const results = [\n createResult(ResultStatus.Failed, message, {\n codeDesc,\n startTime: scanTime,\n }),\n ];\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n getImpact(rec.Severity),\n results,\n { tags },\n );\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n if (rec['CVE ID']) {\n const pkg = buildAffectedPackageFromRecord(rec);\n if (pkg) {\n (req as EvaluatedRequirement).affectedPackages = [pkg];\n }\n }\n return req as EvaluatedRequirement;\n}\n\n/**\n * Distro slugs in Prisma look like `redhat-RHEL7`, `debian-buster`,\n * `alpine-3.14`, `ubuntu-20.04`. Only the leading vendor segment is\n * mapped — unknown vendors fall back to `generic` rather than guessing.\n */\nfunction ecosystemFromDistro(distro: string | undefined): Ecosystem {\n if (!distro) return Ecosystem.Generic;\n const head = distro.split('-')[0]?.toLowerCase();\n switch (head) {\n case 'redhat':\n case 'rhel':\n case 'centos':\n case 'rocky':\n case 'alma':\n case 'fedora':\n case 'amazon':\n case 'amazonlinux':\n case 'suse':\n case 'sles':\n case 'opensuse':\n return Ecosystem.RPM;\n case 'debian':\n case 'ubuntu':\n return Ecosystem.Deb;\n default:\n return Ecosystem.Generic;\n }\n}\n\nconst FIX_VERSION_PATTERN = /fixed in\\s+([^\\s,;]+)/i;\n\nfunction buildAffectedPackageFromRecord(rec: PrismaRecord): ReturnType<typeof buildAffectedPackage> {\n const name = rec['Source Package'] || rec.Packages;\n const version = rec['Package Version'];\n if (!name || !version) return undefined;\n const fixMatch = rec['Fix Status'] ? FIX_VERSION_PATTERN.exec(rec['Fix Status']) : null;\n return buildAffectedPackage({\n name,\n version,\n ecosystem: ecosystemFromDistro(rec.Distro),\n fixedInVersion: fixMatch ? fixMatch[1] : undefined,\n });\n}\n\n/**\n * Groups records by hostname, preserving insertion order.\n */\nfunction groupByHostname(records: PrismaRecord[]): Map<string, PrismaRecord[]> {\n const groups = new Map<string, PrismaRecord[]>();\n for (const rec of records) {\n const existing = groups.get(rec.Hostname);\n if (existing) {\n existing.push(rec);\n } else {\n groups.set(rec.Hostname, [rec]);\n }\n }\n return groups;\n}\n\n/**\n * Builds an HDF baseline from all records for a single host.\n */\nfunction buildBaseline(\n hostname: string,\n records: PrismaRecord[],\n resultsChecksum: Checksum,\n scanTime: Date,\n): EvaluatedBaseline {\n const limitedRecords = limitArrayWithWarning(records, 'finding');\n\n const requirements = limitedRecords.map(rec => buildRequirement(rec, scanTime));\n\n const title = `Prisma Cloud Scan (${hostname})`;\n\n return createMinimalBaseline(\n 'Prisma Cloud Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Prisma Cloud CSV compliance scan output to HDF format.\n * Records are grouped by hostname, producing one baseline per host.\n *\n * @param input - Prisma Cloud CSV string\n * @returns HDF JSON string\n */\nexport async function convertPrismaToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('prisma: empty input');\n }\n validateInputSize(input, 'prisma');\n\n // Validate required columns are present in the CSV header before any\n // data-row parsing so a headers-only Prisma export is still accepted.\n const headerLine = input.split(/\\r?\\n/, 1)[0] ?? '';\n const headers = headerLine.split(',').map(h => h.trim());\n for (const col of REQUIRED_COLUMNS) {\n if (!headers.includes(col)) {\n throw new Error(`prisma: missing required CSV column \"${col}\"`);\n }\n }\n\n const records = parseCsv<PrismaRecord>(input);\n const resultsChecksum = await inputChecksum(input);\n // Prisma Cloud CSV exports carry no scan-level timestamp (the `Published`\n // column is a per-finding CVE publish date), so use conversion time for\n // every result, the doc timestamp, and any no-findings placeholder.\n const scanTime = new Date();\n const baselines: EvaluatedBaseline[] = [];\n const components: HDFResults['components'] = [];\n\n if (records.length === 0) {\n baselines.push(createMinimalBaseline(\n 'Prisma Cloud Scan',\n [buildNoFindingsRequirement(\n 'prisma-no-findings',\n 'Prisma Cloud scanned the workload and reported zero vulnerable components.',\n scanTime,\n )],\n {\n resultsChecksum,\n title: 'Prisma Cloud Scan',\n },\n ) as EvaluatedBaseline);\n } else {\n const hostGroups = groupByHostname(records);\n for (const [hostname, hostRecords] of hostGroups) {\n baselines.push(buildBaseline(hostname, hostRecords, resultsChecksum, scanTime));\n components.push({ name: hostname, type: TargetType.Host });\n }\n }\n\n return buildHdfResults({\n generatorName: 'prisma-to-hdf',\n converterVersion,\n toolName: 'Prisma Cloud',\n toolFormat: 'CSV',\n baselines,\n components,\n timestamp: scanTime,\n });\n}\n","import { parseXmlWithArrays, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n nistToCci,\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n getOwaspNistControl,\n getCweNistControl,\n} from '@mitre/hdf-mappings';\nimport {\n deriveControlTypeFromTags,\n inputChecksum,\n buildNistCciTags,\n limitArray,\n stripHTML,\n validateInputSize,\n buildHdfResults,\n buildNoFindingsRequirement,\n} from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Description,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n} from '@mitre/hdf-schema';\n\n// --- Netsparker/Invicti XML input types ---\n\ninterface NetsparkerXml {\n 'netsparker-enterprise'?: NetsparkerEnterprise;\n 'invicti-enterprise'?: NetsparkerEnterprise;\n}\n\ninterface NetsparkerEnterprise {\n generated?: string;\n target?: NetsparkerTarget;\n vulnerabilities?: {\n vulnerability?: NetsparkerVuln[];\n };\n}\n\ninterface NetsparkerTarget {\n 'scan-id'?: string;\n url?: string;\n initiated?: string;\n duration?: string;\n}\n\ninterface NetsparkerVuln {\n LookupId?: string;\n url?: string;\n type?: string;\n name?: string;\n severity?: string;\n certainty?: string;\n confirmed?: string;\n state?: string;\n FirstSeenDate?: string;\n LastSeenDate?: string;\n classification?: NetsparkerClassification;\n 'http-request'?: NetsparkerHttpRequest;\n 'http-response'?: NetsparkerHttpResponse;\n description?: string;\n impact?: string;\n 'remedial-actions'?: string;\n 'exploitation-skills'?: string;\n 'remedial-procedure'?: string;\n 'remedy-references'?: string;\n 'external-references'?: string;\n 'proof-of-concept'?: string;\n}\n\ninterface NetsparkerClassification {\n owasp?: string;\n wasc?: string;\n cwe?: string;\n capec?: string;\n iso27001?: string;\n}\n\ninterface NetsparkerHttpRequest {\n method?: string;\n content?: string;\n}\n\ninterface NetsparkerHttpResponse {\n 'status-code'?: string;\n duration?: string;\n content?: string;\n}\n\n// --- Severity to impact mapping ---\n\nconst IMPACT_MAPPING: Record<string, number> = {\n 'critical': 1.0,\n 'high': 0.7,\n 'medium': 0.5,\n 'low': 0.3,\n 'best_practice': 0.0,\n 'information': 0.0,\n};\n\nfunction getImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.5;\n}\n\n// Netsparker <initiated> uses the US format \"MM/DD/YYYY hh:mm AM/PM\"\n// (e.g. \"05/05/2023 04:57 PM\"), which the shared parseTimestamp does not\n// recognize — so it would fall to host-local `new Date()`. Parse it explicitly\n// as UTC (mirroring the Go converter's parseNetsparkerTimestamp + UTC\n// normalization); fall back to the shared parser for any other shape.\nconst NETSPARKER_US_DATETIME = /^\\d{2}\\/\\d{2}\\/\\d{4} \\d{1,2}:\\d{2} (AM|PM)$/;\n\nfunction parseNetsparkerTimestamp(s: string): Date | null {\n const trimmed = s.trim();\n if (NETSPARKER_US_DATETIME.test(trimmed)) {\n // Appending GMT forces UTC interpretation (the whole point of this parser),\n // so this new Date() is host-independent and safe — unlike a bare value.\n // eslint-disable-next-line no-restricted-syntax\n const d = new Date(`${trimmed} GMT`);\n if (!isNaN(d.getTime())) return d;\n }\n return parseTimestamp(s);\n}\n\n// --- Format helpers ---\n\nfunction formatCodeDesc(request: NetsparkerHttpRequest | undefined): string {\n const parts: string[] = [];\n parts.push(`http-request : ${request?.content ?? ''}`);\n parts.push(`method : ${request?.method ?? ''}`);\n return parts.join('\\n');\n}\n\nfunction formatMessage(response: NetsparkerHttpResponse | undefined): string {\n const parts: string[] = [];\n parts.push(`http-response : ${response?.content ?? ''}`);\n parts.push(`duration : ${response?.duration ?? ''}`);\n parts.push(`status-code : ${response?.['status-code'] ?? ''}`);\n return parts.join('\\n');\n}\n\nfunction formatControlDesc(vuln: NetsparkerVuln): string {\n const parts: string[] = [];\n if (vuln.description) {\n parts.push(stripHTML(vuln.description));\n }\n if (vuln['exploitation-skills']) {\n parts.push(`Exploitation-skills: ${vuln['exploitation-skills']}`);\n }\n const cweVal = vuln.classification?.cwe ?? '';\n const owaspVal = vuln.classification?.owasp ?? '';\n if (cweVal || owaspVal) {\n parts.push(`Classification: cwe=>${cweVal}, owasp=>${owaspVal}`);\n }\n if (vuln.impact) {\n parts.push(`Impact: ${stripHTML(vuln.impact)}`);\n }\n if (vuln.FirstSeenDate) {\n parts.push(`FirstSeenDate: ${vuln.FirstSeenDate}`);\n }\n if (vuln.LastSeenDate) {\n parts.push(`LastSeenDate: ${vuln.LastSeenDate}`);\n }\n if (vuln.certainty) {\n parts.push(`Certainty: ${vuln.certainty}`);\n }\n if (vuln.type) {\n parts.push(`Type: ${vuln.type}`);\n }\n if (vuln.confirmed) {\n parts.push(`Confirmed: ${vuln.confirmed}`);\n }\n return parts.join('\\n');\n}\n\n/**\n * Performs dual NIST mapping from both CWE and OWASP IDs.\n * Returns a deduplicated sorted list of NIST controls, falling back to\n * DEFAULT_STATIC_ANALYSIS_NIST_TAGS if no mappings are found.\n */\nfunction mapNISTFromCWEAndOWASP(cweID: string, owaspID: string): string[] {\n const controls = new Set<string>();\n\n // CWE -> NIST\n if (cweID) {\n const numericId = parseInt(cweID, 10);\n if (!isNaN(numericId)) {\n const nistControl = getCweNistControl(numericId);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n }\n\n // OWASP -> NIST\n if (owaspID) {\n const nistControl = getOwaspNistControl(owaspID);\n if (nistControl) {\n controls.add(nistControl);\n }\n }\n\n return controls.size > 0\n ? [...controls].sort()\n : [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n}\n\n/**\n * Builds a single EvaluatedRequirement from a vulnerability.\n */\nfunction buildRequirement(\n vuln: NetsparkerVuln,\n initiated: string,\n): EvaluatedRequirement {\n const cweID = vuln.classification?.cwe ?? '';\n const owaspID = vuln.classification?.owasp ?? '';\n\n const nist = mapNISTFromCWEAndOWASP(cweID, owaspID);\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {};\n if (cweID) {\n extras.cweid = cweID;\n }\n if (owaspID) {\n extras.owasp = owaspID;\n }\n\n const tags = buildNistCciTags(nist, cciTags, Object.keys(extras).length > 0 ? extras : undefined);\n\n // Default description\n const defaultDesc = formatControlDesc(vuln);\n const descriptions: Description[] = [\n { label: 'default', data: defaultDesc || vuln.name || '' },\n ];\n\n // Check description\n const checkParts: string[] = [];\n if (vuln['exploitation-skills']) {\n checkParts.push(`Exploitation-skills: ${vuln['exploitation-skills']}`);\n }\n if (vuln['proof-of-concept']) {\n checkParts.push(`Proof-of-concept: ${stripHTML(vuln['proof-of-concept'])}`);\n }\n if (checkParts.length > 0) {\n descriptions.push({ label: 'check', data: stripHTML(checkParts.join('\\n')) });\n }\n\n // Fix description\n const fixParts: string[] = [];\n if (vuln['remedial-actions']) {\n fixParts.push(`Remedial-actions: ${stripHTML(vuln['remedial-actions'])}`);\n }\n if (vuln['remedial-procedure']) {\n fixParts.push(`Remedial-procedure: ${stripHTML(vuln['remedial-procedure'])}`);\n }\n if (vuln['remedy-references']) {\n fixParts.push(`Remedy-references: ${stripHTML(vuln['remedy-references'])}`);\n }\n if (fixParts.length > 0) {\n descriptions.push({ label: 'fix', data: fixParts.join('\\n') });\n }\n\n // Result\n const codeDesc = formatCodeDesc(vuln['http-request']);\n const message = formatMessage(vuln['http-response']);\n\n const startTime = (initiated ? parseNetsparkerTimestamp(initiated) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n const results: RequirementResult[] = [{\n status: ResultStatus.Failed,\n codeDesc,\n message,\n startTime,\n }];\n\n const impact = getImpact(vuln.severity ?? '');\n\n const req: EvaluatedRequirement = {\n id: vuln.LookupId ?? '',\n title: vuln.name ?? undefined,\n impact,\n tags,\n descriptions,\n results,\n };\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Netsparker/Invicti XML scan results to HDF format.\n * Handles both <netsparker-enterprise> and <invicti-enterprise> root elements.\n *\n * @param input - Netsparker/Invicti XML string\n * @returns HDF JSON string\n */\nexport async function convertNetsparkerToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('netsparker: empty input');\n }\n validateInputSize(input, 'netsparker');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Parse XML — ensure vulnerability is always treated as array\n const parsed = parseXmlWithArrays(input, ['vulnerability']) as unknown as NetsparkerXml;\n\n // Detect root element\n const isInvicti = !!parsed['invicti-enterprise'];\n const data: NetsparkerEnterprise = parsed['invicti-enterprise'] ?? parsed['netsparker-enterprise'] ?? {};\n\n if (!data.vulnerabilities && !data.target) {\n throw new Error('netsparker: invalid XML — missing expected root element');\n }\n\n const toolName = isInvicti ? 'Invicti' : 'Netsparker';\n const vulns = data.vulnerabilities?.vulnerability ?? [];\n const target = data.target ?? {};\n const initiated = target.initiated ?? '';\n\n const { items: limitedVulns, truncated } = limitArray(vulns);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedVulns.length} vulnerability items (original: ${vulns.length})`);\n }\n\n const targetName = target.url ?? 'Unknown';\n\n // Build one requirement per vulnerability\n const requirements: EvaluatedRequirement[] = limitedVulns.map(\n vuln => buildRequirement(vuln, initiated),\n );\n\n if (requirements.length === 0) {\n const startTime = (initiated ? parseNetsparkerTimestamp(initiated) : null) ?? new Date();\n requirements.push(buildNoFindingsRequirement(\n 'netsparker-no-findings',\n `${toolName} scanned ${targetName} and reported zero findings.`,\n startTime,\n ));\n }\n\n const title = `${toolName} Enterprise Scan ID: ${target['scan-id'] ?? ''} URL: ${target.url ?? ''}`;\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Netsparker Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'netsparker-to-hdf',\n converterVersion,\n toolName,\n toolFormat: 'XML',\n baselines: [baseline],\n components: [\n {\n name: targetName,\n type: TargetType.Application,\n },\n ],\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n getScoutsuiteNistControl,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { inputChecksum, buildNistCciTags, deriveControlTypeFromTags, limitArrayWithWarning, validateInputSize, buildHdfResults, buildNoFindingsRequirement } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * ScoutSuite JSON output structures\n */\ninterface ScoutSuiteReport {\n account_id: string;\n environment?: string;\n last_run: LastRun;\n partition?: string;\n provider_code?: string;\n provider_name: string;\n services: Record<string, ServiceData>;\n}\n\ninterface LastRun {\n ruleset_about?: string;\n ruleset_name: string;\n time: string;\n version: string;\n}\n\ninterface ServiceData {\n findings?: Record<string, ScoutSuiteFinding>;\n [key: string]: unknown;\n}\n\ninterface ScoutSuiteFinding {\n checked_items: number;\n compliance?: ComplianceItem[] | null;\n description: string;\n flagged_items: number;\n id_suffix?: string;\n items: string[];\n level: string;\n path?: string;\n rationale: string;\n references?: string[] | null;\n remediation?: string | null;\n service?: string;\n}\n\ninterface ComplianceItem {\n name: string;\n reference: string;\n version: string;\n}\n\n/**\n * Maps ScoutSuite level strings to HDF impact values.\n */\nfunction getImpact(level: string): number {\n switch (level.toLowerCase()) {\n case 'danger':\n return 0.7;\n case 'warning':\n return 0.5;\n default:\n return 0.3;\n }\n}\n\n/**\n * Determines the HDF result status based on checked and flagged item counts.\n */\nfunction getStatus(checkedItems: number, flaggedItems: number): ResultStatus {\n if (checkedItems === 0) {\n return ResultStatus.NotReviewed;\n }\n if (flaggedItems === 0) {\n return ResultStatus.Passed;\n }\n return ResultStatus.Failed;\n}\n\n/**\n * Builds the result message based on checked/flagged item counts.\n */\nfunction getMessage(checkedItems: number, flaggedItems: number, items: string[]): string {\n if (checkedItems === 0) {\n return 'Skipped because no items were checked';\n }\n if (flaggedItems === 0) {\n return `0 flagged items out of ${checkedItems} checked items`;\n }\n let msg = `${flaggedItems} flagged items out of ${checkedItems} checked items`;\n if (items.length > 0) {\n msg += ':\\n' + items.join('\\n');\n }\n return msg;\n}\n\n/** Known ScoutSuite JS variable assignment prefixes. */\nconst SCOUTSUITE_JS_PREFIX = /^\\s*(scoutsuite_results)\\s*=\\s*$/i;\n\n/**\n * Strips the \"scoutsuite_results = \" JS variable prefix from input.\n * ScoutSuite outputs results as a JS file with this prefix on the first line.\n * Only strips prefixes matching known ScoutSuite patterns; unrecognized prefixes\n * are left intact so JSON parsing produces a descriptive error.\n */\nfunction stripJSPrefix(input: string): string {\n const idx = input.indexOf('{');\n if (idx < 0) {\n return input;\n }\n if (idx === 0) {\n return input; // Already valid JSON\n }\n const prefix = input.substring(0, idx).trim();\n if (SCOUTSUITE_JS_PREFIX.test(prefix)) {\n return input.substring(idx);\n }\n // Unknown prefix — don't strip, let JSON parser report the error\n return input;\n}\n\n/**\n * Gets NIST controls for a ScoutSuite rule, splitting pipe-delimited values.\n */\nfunction getNistControls(ruleID: string): string[] {\n const ctrl = getScoutsuiteNistControl(ruleID);\n if (!ctrl) {\n return ['SA-11', 'RA-5']; // fallback\n }\n return ctrl.split('|');\n}\n\n/**\n * Collapses all service findings into a flat list of (ruleID, finding) pairs.\n */\nfunction collapseFindings(report: ScoutSuiteReport): Array<[string, ScoutSuiteFinding]> {\n const result: Array<[string, ScoutSuiteFinding]> = [];\n\n const serviceNames = Object.keys(report.services).sort();\n for (const serviceName of serviceNames) {\n const svcRaw = report.services[serviceName];\n if (!svcRaw) continue;\n\n // The service object may have properties beyond \"findings\" (filters, regions, etc.)\n // We only care about findings\n const svc = svcRaw as ServiceData;\n if (!svc.findings) continue;\n\n const ruleNames = Object.keys(svc.findings).sort();\n for (const ruleName of ruleNames) {\n const finding = svc.findings[ruleName];\n if (finding) {\n result.push([ruleName, finding]);\n }\n }\n }\n\n return result;\n}\n\n/**\n * Builds a single EvaluatedRequirement from a ScoutSuite finding.\n */\nfunction buildRequirement(\n ruleID: string,\n finding: ScoutSuiteFinding,\n startTime: string,\n): EvaluatedRequirement {\n const nist = getNistControls(ruleID);\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n const descriptions: Description[] = [\n { label: 'default', data: finding.rationale },\n ];\n if (finding.remediation) {\n descriptions.push({ label: 'fix', data: finding.remediation });\n }\n\n const status = getStatus(finding.checked_items, finding.flagged_items);\n const message = getMessage(finding.checked_items, finding.flagged_items, finding.items);\n\n const resultObj = createResult(status, message, {\n codeDesc: finding.description,\n startTime: (startTime ? parseTimestamp(startTime) : null) ?? new Date('0001-01-01T00:00:00Z'),\n });\n\n const req = createRequirement(\n ruleID,\n finding.description,\n descriptions,\n getImpact(finding.level),\n [resultObj],\n { tags },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/**\n * Converts ScoutSuite output to HDF format.\n * Input may be a JS file with \"scoutsuite_results = \" prefix or pure JSON.\n *\n * @param input - ScoutSuite JS/JSON string\n * @returns HDF JSON string\n */\nexport async function convertScoutsuiteToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('scoutsuite: empty input');\n }\n validateInputSize(input, 'scoutsuite');\n\n // Strip JS variable prefix if present\n const jsonStr = stripJSPrefix(input);\n\n const resultsChecksum: Checksum = await inputChecksum(jsonStr);\n\n const report = parseJSON<ScoutSuiteReport>(jsonStr);\n\n if (!report || typeof report !== 'object') {\n throw new Error('scoutsuite: invalid JSON');\n }\n\n // Collapse all service findings\n const findingPairs = collapseFindings(report);\n const limitedPairs = limitArrayWithWarning(findingPairs, 'finding');\n\n const requirements: EvaluatedRequirement[] = limitedPairs.map(\n ([ruleID, finding]) => buildRequirement(ruleID, finding, report.last_run.time),\n );\n\n const targetName = `${report.last_run.ruleset_name} ruleset:${report.provider_name}:${report.account_id}`;\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'scoutsuite-no-findings',\n `ScoutSuite scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n const title = `Scout Suite Report using ${report.last_run.ruleset_name} ruleset on ${report.provider_name} with account ${report.account_id}`;\n\n const baseline = createMinimalBaseline(\n 'ScoutSuite Scan',\n requirements,\n {\n resultsChecksum,\n title,\n summary: report.last_run.ruleset_about,\n },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'scoutsuite-to-hdf',\n converterVersion,\n toolName: 'ScoutSuite',\n toolFormat: 'JSON',\n toolVersion: report.last_run.version,\n baselines: [baseline],\n components: [{\n name: targetName,\n type: TargetType.CloudAccount,\n labels: {\n account: report.account_id,\n provider: report.provider_code ?? report.provider_name,\n },\n }],\n timestamp: report.last_run.time ? (parseTimestamp(report.last_run.time) ?? new Date()) : new Date(),\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n nistToCci,\n} from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n type Description,\n} from '@mitre/hdf-schema';\n\n/** Maximum Conveyor score (used for normalization). */\nconst CONVEYOR_MAX_SCORE = 1000;\n\n/** Top-level Conveyor JSON output structure. */\ninterface ConveyorData {\n api_error_message?: string;\n api_response?: ConveyorAPIResp;\n api_server_version?: string;\n}\n\ninterface ConveyorAPIResp {\n file_tree?: Record<string, FileTreeNode>;\n results?: Record<string, ConveyorResult>;\n params?: Record<string, unknown>;\n max_score?: number;\n}\n\ninterface FileTreeNode {\n name?: string[];\n sha256?: string;\n children?: Record<string, FileTreeNode>;\n score?: number;\n size?: number;\n type?: string;\n}\n\ninterface ConveyorResult {\n sha256: string;\n classification?: string;\n created?: string;\n response: ConveyorResp;\n result: ConveyorScore;\n size?: number | null;\n type?: string | null;\n}\n\ninterface ConveyorResp {\n service_name: string;\n service_version?: string;\n service_context?: unknown;\n service_debug_info?: unknown;\n service_tool_version?: unknown;\n supplementary?: unknown;\n milestones?: ConveyorMilestone;\n}\n\ninterface ConveyorMilestone {\n service_started?: string;\n service_completed?: string;\n}\n\ninterface ConveyorScore {\n score: number;\n sections: ConveyorSection[];\n}\n\ninterface ConveyorSection {\n title_text?: string;\n body?: unknown;\n body_format?: string;\n classification?: string;\n depth?: number;\n heuristic?: Heuristic | null;\n}\n\ninterface Heuristic {\n heur_id?: string;\n name?: string;\n score?: number;\n}\n\n/**\n * Recursively walks the file tree, collecting sha256 -> filename mappings.\n */\nfunction collateSHAAndFilenames(tree: Record<string, FileTreeNode>): Map<string, string> {\n const result = new Map<string, string>();\n for (const [sha, node] of Object.entries(tree)) {\n if (node.name && node.name.length > 0) {\n result.set(sha, node.name[0]!);\n }\n if (node.children && Object.keys(node.children).length > 0) {\n for (const [childSha, childName] of collateSHAAndFilenames(node.children)) {\n result.set(childSha, childName);\n }\n }\n }\n return result;\n}\n\n/**\n * Maps a Conveyor score to an HDF result status.\n * Score 0 = Passed, non-zero = Failed.\n */\nfunction determineStatus(score: number): ResultStatus {\n return score === 0 ? ResultStatus.Passed : ResultStatus.Failed;\n}\n\n/**\n * Normalizes a Conveyor score (0-1000) to HDF impact (0.0-1.0).\n */\nfunction scoreToImpact(score: number): number {\n if (score <= 0) return 0.0;\n if (score >= CONVEYOR_MAX_SCORE) return 1.0;\n return score / CONVEYOR_MAX_SCORE;\n}\n\n/**\n * Extracts a string from a body field that may be null or a string.\n */\nfunction bodyToString(body: unknown): string {\n if (body === null || body === undefined) return '';\n if (typeof body === 'string') return body;\n return String(body);\n}\n\n/**\n * Creates the code_desc field content from a Conveyor section.\n */\nfunction buildCodeDesc(section: ConveyorSection, scannerName: string): string {\n const parts: string[] = [];\n\n if (scannerName === 'Moldy' || scannerName === 'Stigma' || scannerName === 'Clamav') {\n parts.push(`title_text:${section.title_text ?? ''}`);\n parts.push(`body:${bodyToString(section.body)}`);\n parts.push(`body_format:${section.body_format ?? ''}`);\n parts.push(`classification:${section.classification ?? ''}`);\n parts.push(`depth:${section.depth ?? 0}`);\n if (section.heuristic) {\n parts.push(`heuristic_heur_id:${section.heuristic.heur_id ?? ''}`);\n parts.push(`heuristic_score:${section.heuristic.score ?? 0}`);\n parts.push(`heuristic_name:${section.heuristic.name ?? ''}`);\n }\n } else if (scannerName === 'CodeQuality') {\n parts.push(`body:${bodyToString(section.body)}`);\n parts.push(`body_format:${section.body_format ?? ''}`);\n parts.push(`classification:${section.classification ?? ''}`);\n parts.push(`depth:${section.depth ?? 0}`);\n parts.push(`title_text:${section.title_text ?? ''}`);\n } else {\n return JSON.stringify(section);\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Groups Conveyor results by their service (scanner) name.\n */\nfunction groupResultsByScanner(\n results: Record<string, ConveyorResult>,\n): { scanners: string[]; groups: Map<string, ConveyorResult[]> } {\n const groups = new Map<string, ConveyorResult[]>();\n for (const result of Object.values(results)) {\n const name = result.response.service_name;\n const existing = groups.get(name);\n if (existing) {\n existing.push(result);\n } else {\n groups.set(name, [result]);\n }\n }\n const scanners = [...groups.keys()].sort();\n return { scanners, groups };\n}\n\n/**\n * Builds an HDF requirement from a single Conveyor result.\n */\nfunction buildRequirementFromResult(\n result: ConveyorResult,\n filename: string,\n): EvaluatedRequirement {\n const nist = DEFAULT_STATIC_ANALYSIS_NIST_TAGS;\n const cciTags = nistToCci(nist);\n const tags = buildNistCciTags(nist, cciTags);\n\n // Build description from sections\n let descText = '';\n if (result.result.sections.length > 0) {\n descText = result.result.sections\n .map(s => s.title_text ?? '')\n .filter(t => t.length > 0)\n .join('; ');\n }\n if (!descText) {\n descText = `Conveyor scan result for ${result.sha256}`;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: descText },\n ];\n\n const scannerName = result.response.service_name;\n const startTimeStr = result.response.milestones?.service_started ?? '';\n const startTime = (startTimeStr ? parseTimestamp(startTimeStr) : null) ?? new Date('0001-01-01T00:00:00Z');\n const score = result.result.score;\n const status = determineStatus(score);\n\n // Conveyor carries no per-section explanation, so results carry no message key.\n const toResult = (codeDesc: string): RequirementResult => createResult(status, undefined, { codeDesc, startTime });\n\n const results = result.result.sections.length > 0\n ? result.result.sections.map(section => toResult(buildCodeDesc(section, scannerName)))\n : [toResult(`No sections reported by ${scannerName}`)];\n\n const req = createRequirement(\n result.sha256,\n filename,\n descriptions,\n scoreToImpact(score),\n results,\n { tags },\n ) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n const controlType = deriveControlTypeFromTags([...nist]);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n\n return req;\n}\n\n/**\n * Builds an HDF baseline for a single scanner's results.\n */\nfunction buildScannerBaseline(\n scannerName: string,\n results: ConveyorResult[],\n shaMap: Map<string, string>,\n resultsChecksum: Checksum,\n): EvaluatedBaseline {\n const requirements: EvaluatedRequirement[] = results.map(result => {\n const filename = shaMap.get(result.sha256) ?? '';\n return buildRequirementFromResult(result, filename);\n });\n\n const title = `Conveyor Scan (${scannerName})`;\n\n return createMinimalBaseline(\n 'Conveyor Scan',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n}\n\n/**\n * Converts Conveyor scan results to HDF format.\n * Results are grouped by scanner name, producing one baseline per scanner.\n *\n * @param input - Conveyor JSON string\n * @returns HDF JSON string\n */\nexport async function convertConveyorToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('conveyor: empty input');\n }\n validateInputSize(input, 'conveyor');\n\n const data = parseJSON<ConveyorData>(input);\n\n if (!data || typeof data !== 'object') {\n throw new Error('conveyor: invalid JSON');\n }\n\n if (!data.api_response) {\n throw new Error('conveyor: missing api_response field');\n }\n\n if (!data.api_response.results) {\n throw new Error('conveyor: missing api_response.results field');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n // Build SHA -> filename mapping from file tree\n const shaMap = data.api_response.file_tree\n ? collateSHAAndFilenames(data.api_response.file_tree)\n : new Map<string, string>();\n\n // Group results by scanner\n const { scanners, groups } = groupResultsByScanner(data.api_response.results);\n\n const baselines: EvaluatedBaseline[] = scanners.map(scannerName =>\n buildScannerBaseline(\n scannerName,\n groups.get(scannerName)!,\n shaMap,\n resultsChecksum,\n ),\n );\n\n // Build target name from params.description\n let targetName = 'Conveyor Scan';\n if (data.api_response.params) {\n const desc = data.api_response.params['description'];\n if (typeof desc === 'string' && desc.length > 0) {\n targetName = desc;\n }\n }\n\n if (baselines.length === 0) {\n baselines.push(createMinimalBaseline(\n 'Conveyor Scan',\n [\n buildNoFindingsRequirement(\n 'conveyor-no-findings',\n `Conveyor scanned ${targetName} and reported zero findings.`,\n new Date(),\n ),\n ],\n {\n resultsChecksum,\n title: 'Conveyor Scan (no findings)',\n },\n ) as EvaluatedBaseline);\n }\n\n return buildHdfResults({\n generatorName: 'conveyor-to-hdf',\n converterVersion,\n toolName: 'Conveyor',\n toolFormat: 'JSON',\n baselines,\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp: new Date(),\n });\n}\n","/**\n * Veracode DetailedReport XML to HDF converter.\n *\n * Converts Veracode static analysis and SCA findings into HDF format.\n * Produces two types of controls:\n * - CWE-based: From severity categories (static analysis findings)\n * - CVE-based: From SCA vulnerable components\n *\n * Uses attributeNamePrefix '@_' to disambiguate XML attributes from child\n * elements (critical for the `vulnerabilities` attr/element collision on\n * `<component>`).\n */\n\nimport { parseXml, parseTimestamp } from '@mitre/hdf-utilities';\nimport { nistToCci } from '@mitre/hdf-mappings';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, mapCWEToNIST, buildNistCciTags, ensureArray, DEFAULT_REMEDIATION_NIST_TAGS, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n Checksum,\n Description,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createResult,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n} from '@mitre/hdf-schema';\n\n/** Attribute prefix used by fast-xml-parser — all XML attributes are accessed via `@_name`. */\nconst A = '@_';\n\n\n/** Veracode severity level (0-5) to HDF impact mapping. */\nconst IMPACT_MAPPING: Map<string, number> = new Map([\n ['5', 0.9],\n ['4', 0.7],\n ['3', 0.5],\n ['2', 0.3],\n ['1', 0.1],\n ['0', 0.0],\n]);\n\nfunction veracodeSeverityToImpact(severity: string): number {\n return IMPACT_MAPPING.get(severity) ?? 0.1;\n}\n\n// ---- Utility functions ----\n\n/** Get an attribute from a parsed XML node, entity-decoded. */\nfunction attr(node: Record<string, unknown>, name: string): string {\n const raw = node[`${A}${name}`] as string | undefined;\n return raw === undefined ? '' : decodeXmlEntities(raw);\n}\n\nconst NAMED_ENTITIES: Record<string, string> = {\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n amp: '&',\n};\n\n// Veracode escapes nearly every punctuation character in its attributes\n// (&#x28; &#xd; &#x2f; …), and the shared XML parser runs with processEntities\n// off as XXE defense-in-depth, so the references arrive undecoded. Go's\n// encoding/xml decodes them for free. Only predefined and numeric character\n// references are decoded; document-defined entities stay untouched.\nfunction decodeXmlEntities(s: string): string {\n return s.replace(\n /&(?:#(\\d+)|#[xX]([0-9a-fA-F]+)|(lt|gt|quot|apos|amp));/g,\n (match, dec: string | undefined, hex: string | undefined, name: string | undefined) => {\n if (dec !== undefined) return String.fromCodePoint(Number.parseInt(dec, 10));\n if (hex !== undefined) return String.fromCodePoint(Number.parseInt(hex, 16));\n return name !== undefined ? NAMED_ENTITIES[name] ?? match : match;\n },\n );\n}\n\n/** Parse Veracode timestamp format (\"2021-12-29 22:16:36 UTC\") to Date. */\nfunction parseVeracodeTimestamp(ts: string): Date | undefined {\n if (!ts) return undefined;\n const normalized = ts.replace(' UTC', 'Z').replace(' ', 'T');\n return parseTimestamp(normalized) ?? undefined;\n}\n\n/** Format description paragraphs into text. */\nfunction formatDesc(desc: Record<string, unknown> | undefined): string {\n if (!desc) return '';\n const paras = ensureArray(desc.para as Record<string, unknown> | Record<string, unknown>[]);\n return paras.map(p => attr(p, 'text')).filter(Boolean).join('\\n');\n}\n\n/** Format recommendations into text. */\nfunction formatRecommendations(rec: Record<string, unknown> | undefined): string {\n if (!rec) return '';\n const paras = ensureArray(rec.para as Record<string, unknown> | Record<string, unknown>[]);\n const parts: string[] = [];\n for (const p of paras) {\n const text = attr(p, 'text');\n if (text) parts.push(text);\n const bullets = ensureArray(p.bulletitem as Record<string, unknown> | Record<string, unknown>[]);\n for (const b of bullets) {\n const btext = attr(b, 'text');\n if (btext) parts.push(btext);\n }\n }\n return parts.join('\\n');\n}\n\n/** Format CWE data for the cweid tag. */\nfunction formatCWEData(cwes: Record<string, unknown>[]): string {\n return cwes.map(c => {\n let entry = `CWE-${attr(c, 'cweid')}: ${attr(c, 'cwename')}`;\n const categories: [string, string][] = [\n ['pcrirelated', attr(c, 'pcirelated')],\n ['owasp', attr(c, 'owasp')],\n ['sans', attr(c, 'sans')],\n ['certc', attr(c, 'certc')],\n ['certcpp', attr(c, 'certcpp')],\n ['certjava', attr(c, 'certjava')],\n ['owaspmobile', attr(c, 'owaspmobile')],\n ];\n for (const [name, val] of categories) {\n if (val) entry += `${name}: ${val}\\n`;\n }\n return entry;\n }).join('\\n');\n}\n\n/** Format CWE descriptions for the cweDescription tag. */\nfunction formatCWEDesc(cwes: Record<string, unknown>[]): string {\n return cwes.map(c => {\n const desc = c.description as Record<string, unknown> | undefined;\n const text = desc?.text as Record<string, unknown> | undefined;\n const descText = text ? attr(text, 'text') : '';\n return `CWE-${attr(c, 'cweid')}: ${attr(c, 'cwename')} Description: ${descText}; `;\n }).join('\\n');\n}\n\n/** Format a static flaw as a code description. */\nfunction formatFlawCodeDesc(flaw: Record<string, unknown>): string {\n const sourcefilepath = attr(flaw, 'sourcefilepath');\n if (!sourcefilepath) {\n return `Issue ID: ${attr(flaw, 'issueid')}`;\n }\n\n const parts: string[] = [`Sourcefile Path: ${sourcefilepath}`];\n const fields: [string, string][] = [\n ['Line Number', attr(flaw, 'line')],\n ['Affect Policy Compliance', attr(flaw, 'affects_policy_compliance')],\n ['Remediation Effort', attr(flaw, 'remediationeffort')],\n ['Exploit level', attr(flaw, 'exploitLevel')],\n ['Issue ID', attr(flaw, 'issueid')],\n ['Module', attr(flaw, 'module')],\n ['Type', attr(flaw, 'type')],\n ['CWE ID', attr(flaw, 'cweid')],\n ['Date First Occurence', attr(flaw, 'date_first_occurrence')],\n ['CIA Impact', attr(flaw, 'cia_impact')],\n ['Description', attr(flaw, 'description')],\n ['Source File', attr(flaw, 'sourcefile')],\n ['Scope', attr(flaw, 'scope')],\n ['PCI Related', attr(flaw, 'pcirelated')],\n ['Function Prototype', attr(flaw, 'functionprototype')],\n ['Function Relative Location', attr(flaw, 'functionrelativelocation')],\n ];\n\n for (const [title, value] of fields) {\n if (value) parts.push(`${title}: ${value}`);\n }\n\n return parts.join('\\n');\n}\n\n/** Format an SCA component as a code description. */\nfunction formatSCACodeDesc(comp: Record<string, unknown>): string {\n const parts: string[] = [`component_id: ${attr(comp, 'component_id')}`];\n const fields: [string, string][] = [\n ['sha1', attr(comp, 'sha1')],\n ['file_name', attr(comp, 'file_name')],\n ['max_cvss_score', attr(comp, 'max_cvss_score')],\n ['version', attr(comp, 'version')],\n ['library', attr(comp, 'library')],\n ['library_id', attr(comp, 'library_id')],\n ['vendor', attr(comp, 'vendor')],\n ['description', attr(comp, 'description')],\n ['added_date', attr(comp, 'added_date')],\n ['component_affects_policy_compliance', attr(comp, 'component_affects_policy_compliance')],\n ];\n\n for (const [title, value] of fields) {\n if (value) parts.push(`${title}: ${value}`);\n }\n\n // File paths\n const filePaths = comp.file_paths as Record<string, unknown> | undefined;\n if (filePaths) {\n const fps = ensureArray(filePaths.file_path as Record<string, unknown> | Record<string, unknown>[]);\n for (const fp of fps) {\n const val = attr(fp, 'value');\n if (val) parts.push(`file_path: ${val}`);\n }\n }\n\n return parts.join('\\n');\n}\n\n// ---- Requirement builders ----\n\n/** Build CWE-based requirements from severity categories. */\nfunction buildCWERequirements(severities: Record<string, unknown>[], firstBuildDate: string): EvaluatedRequirement[] {\n const requirements: EvaluatedRequirement[] = [];\n\n for (const sev of severities) {\n const impact = veracodeSeverityToImpact(attr(sev, 'level'));\n const categories = ensureArray(sev.category as Record<string, unknown> | Record<string, unknown>[]);\n\n for (const cat of categories) {\n requirements.push(buildCWERequirement(cat, impact, firstBuildDate));\n }\n }\n\n return requirements;\n}\n\n/** Build a single CWE-based requirement from a category. */\nfunction buildCWERequirement(cat: Record<string, unknown>, impact: number, firstBuildDate: string): EvaluatedRequirement {\n const cwes = ensureArray(cat.cwe as Record<string, unknown> | Record<string, unknown>[]);\n\n // Collect CWE IDs for NIST mapping\n const cweIDs = cwes.map(c => attr(c, 'cweid')).filter(Boolean);\n const nist = mapCWEToNIST(cweIDs, DEFAULT_REMEDIATION_NIST_TAGS);\n const cciTags = nistToCci(nist);\n\n // Build tags\n const extras: Record<string, unknown> = {};\n const cweData = formatCWEData(cwes);\n if (cweData) extras.cweid = cweData;\n const cweDescStr = formatCWEDesc(cwes);\n if (cweDescStr) extras.cweDescription = cweDescStr;\n\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n // Build descriptions\n const descriptions: Description[] = [\n { label: 'default', data: formatDesc(cat.desc as Record<string, unknown> | undefined) },\n ];\n const recText = formatRecommendations(cat.recommendations as Record<string, unknown> | undefined);\n if (recText) {\n descriptions.push({ label: 'fix', data: recText });\n }\n\n // Collect all flaws from all CWEs in this category\n const startTime = parseVeracodeTimestamp(firstBuildDate) ?? new Date();\n const results = cwes.flatMap(c => {\n const staticflaws = c.staticflaws as Record<string, unknown> | undefined;\n const flaws = ensureArray(staticflaws?.flaw as Record<string, unknown> | Record<string, unknown>[]);\n return flaws.map((flaw): RequirementResult =>\n createResult(ResultStatus.Failed, undefined, { codeDesc: formatFlawCodeDesc(flaw), startTime }));\n });\n\n const sourceRef = cwes.flatMap(c => {\n const staticflaws = c.staticflaws as Record<string, unknown> | undefined;\n const flaws = ensureArray(staticflaws?.flaw as Record<string, unknown> | Record<string, unknown>[]);\n return flaws.map(flaw => attr(flaw, 'sourcefile')).filter(Boolean);\n }).join('\\n');\n\n const req = createRequirement(\n attr(cat, 'categoryid'),\n attr(cat, 'categoryname'),\n descriptions,\n impact,\n results,\n { tags, sourceLocation: sourceRef ? { ref: sourceRef } : undefined },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n/** Build CVE-based requirements from SCA components. */\nfunction buildCVERequirements(\n sca: Record<string, unknown> | undefined,\n firstBuildDate: string,\n): EvaluatedRequirement[] {\n if (!sca) return [];\n const vulnComps = sca.vulnerable_components as Record<string, unknown> | undefined;\n if (!vulnComps?.component) return [];\n\n const components = ensureArray(vulnComps.component as Record<string, unknown> | Record<string, unknown>[]);\n\n // Group vulnerabilities by CVE ID across all components\n interface CVEEntry {\n vuln: Record<string, unknown>;\n components: Record<string, unknown>[];\n }\n\n const cveOrder: string[] = [];\n const cveMap = new Map<string, CVEEntry>();\n\n for (const comp of components) {\n const vulnCountAttr = attr(comp, 'vulnerabilities');\n if (vulnCountAttr === '0') continue;\n\n // With @_ prefix, child element <vulnerabilities> is at key 'vulnerabilities',\n // and the attribute is at '@_vulnerabilities'\n const vulnsElem = comp.vulnerabilities as Record<string, unknown> | undefined;\n if (!vulnsElem?.vulnerability) continue;\n const vulns = ensureArray(vulnsElem.vulnerability as Record<string, unknown> | Record<string, unknown>[]);\n\n for (const vuln of vulns) {\n const cveID = attr(vuln, 'cve_id');\n if (!cveID) continue;\n\n const existing = cveMap.get(cveID);\n if (existing) {\n existing.components.push(comp);\n } else {\n cveOrder.push(cveID);\n cveMap.set(cveID, { vuln, components: [comp] });\n }\n }\n }\n\n return cveOrder.map(cveID => {\n const entry = cveMap.get(cveID)!;\n return buildCVERequirement(entry.vuln, entry.components, firstBuildDate);\n });\n}\n\n/** Build a single CVE-based requirement. */\nfunction buildCVERequirement(\n vuln: Record<string, unknown>,\n components: Record<string, unknown>[],\n firstBuildDate: string,\n): EvaluatedRequirement {\n const impact = veracodeSeverityToImpact(attr(vuln, 'severity'));\n\n // Map CWE to NIST\n const cweID = attr(vuln, 'cwe_id');\n let nist: string[];\n if (cweID) {\n nist = mapCWEToNIST([cweID.replace(/^CWE-/, '')], DEFAULT_REMEDIATION_NIST_TAGS);\n } else {\n nist = DEFAULT_REMEDIATION_NIST_TAGS;\n }\n const cciTags = nistToCci(nist);\n const extras: Record<string, unknown> = {};\n if (cweID) extras.cwe = cweID;\n const tags = buildNistCciTags(nist, cciTags, extras);\n\n // One result per affected component\n const startTime = parseVeracodeTimestamp(firstBuildDate) ?? new Date();\n\n const results = components.map((comp): RequirementResult =>\n createResult(ResultStatus.Failed, undefined, { codeDesc: formatSCACodeDesc(comp), startTime }));\n\n const cveSummary = attr(vuln, 'cve_summary');\n const cveId = attr(vuln, 'cve_id');\n const descriptions: Description[] = [\n { label: 'default', data: cveSummary || '' },\n ];\n\n const sourceRef = components.flatMap(comp => {\n const filePaths = comp.file_paths as Record<string, unknown> | undefined;\n if (!filePaths) return [];\n const fps = ensureArray(filePaths.file_path as Record<string, unknown> | Record<string, unknown>[]);\n return fps.map(fp => attr(fp, 'value')).filter(Boolean);\n }).join('\\n');\n\n const req = createRequirement(\n cveId,\n cveId,\n descriptions,\n impact,\n results,\n { tags, sourceLocation: sourceRef ? { ref: sourceRef } : undefined },\n ) as EvaluatedRequirement;\n\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n\n return req;\n}\n\n// ---- Main converter ----\n\n/**\n * Convert Veracode DetailedReport XML to HDF JSON string.\n *\n * @param input - Veracode DetailedReport XML string\n * @returns HDF JSON string\n */\nexport async function convertVeracodeToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('veracode: empty input');\n }\n validateInputSize(input, 'veracode');\n\n // Parse XML with @_ attribute prefix to disambiguate attributes from child elements.\n // This is critical for the <component> element where both `vulnerabilities` attribute\n // (count) and child `<vulnerabilities>` element (list) exist.\n // trimValues stays off: Veracode ships attribute text with significant leading\n // and trailing whitespace, and Go's decoder preserves it.\n const parsed = parseXml(input, {\n attributeNamePrefix: '@_',\n trimValues: false,\n }) as Record<string, unknown>;\n\n // Check for summary report\n if ('summaryreport' in parsed) {\n throw new Error('veracode: summary reports are not supported; use a detailed report');\n }\n\n const report = parsed.detailedreport as Record<string, unknown> | undefined;\n if (!report) {\n throw new Error('veracode: invalid XML - no <detailedreport> root element');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const firstBuildDate = attr(report, 'first_build_submitted_date');\n\n // Ensure severities is an array\n const severities = ensureArray(report.severity as Record<string, unknown> | Record<string, unknown>[]);\n\n // Build CWE-based requirements\n const cweRequirements = buildCWERequirements(severities, firstBuildDate);\n\n // Build CVE-based requirements from SCA\n const cveRequirements = buildCVERequirements(\n report.software_composition_analysis as Record<string, unknown> | undefined,\n firstBuildDate,\n );\n\n // Merge\n const allRequirements = [...cweRequirements, ...cveRequirements];\n\n const targetName = attr(report, 'app_name') || 'Veracode Application';\n\n if (allRequirements.length === 0) {\n allRequirements.push(buildNoFindingsRequirement(\n 'veracode-no-findings',\n `Veracode scanned ${targetName} and reported zero findings.`,\n new Date(),\n ));\n }\n\n // Get module name for title\n let title: string | undefined;\n const staticAnalysis = report['static-analysis'] as Record<string, unknown> | undefined;\n if (staticAnalysis) {\n const modules = staticAnalysis.modules as Record<string, unknown> | undefined;\n if (modules?.module) {\n const moduleList = ensureArray(modules.module as Record<string, unknown> | Record<string, unknown>[]);\n if (moduleList.length > 0) {\n title = attr(moduleList[0]!, 'name');\n }\n }\n }\n\n const baseline = createMinimalBaseline('Veracode Scan', allRequirements, {\n resultsChecksum,\n title,\n version: attr(report, 'policy_version'),\n summary: attr(report, 'policy_name'),\n }) as EvaluatedBaseline;\n\n const timestamp = parseVeracodeTimestamp(firstBuildDate);\n\n return buildHdfResults({\n generatorName: 'veracode-to-hdf',\n converterVersion,\n toolName: 'Veracode',\n toolFormat: 'XML',\n baselines: [baseline],\n components: [{ name: targetName, type: TargetType.Application }],\n timestamp,\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n DEFAULT_STATIC_ANALYSIS_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport { deriveControlTypeFromTags, inputChecksum, limitArray, stripHTML, buildNistCciTags, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n Component,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Graph Secure Score structures.\n * Defined locally to avoid external dependency on @microsoft/microsoft-graph-types.\n */\ninterface CombinedResponse {\n secureScore: SecureScoreResponse;\n profiles: ProfileResponse;\n}\n\ninterface SecureScoreResponse {\n '@odata.context'?: string;\n value: SecureScore[];\n}\n\ninterface SecureScore {\n id: string;\n azureTenantId: string;\n activeUserCount?: number;\n createdDateTime: string;\n currentScore?: number;\n enabledServices?: string[];\n licensedUserCount?: number;\n maxScore?: number;\n controlScores: ControlScore[];\n averageComparativeScores?: unknown[];\n}\n\ninterface ControlScore {\n controlCategory: string;\n controlName: string;\n description: string;\n score: number;\n lastSynced?: string;\n implementationStatus: string;\n on?: string;\n scoreInPercentage: number;\n}\n\ninterface ProfileResponse {\n '@odata.context'?: string;\n '@odata.nextLink'?: string;\n value: SecureScoreControlProfile[];\n}\n\ninterface SecureScoreControlProfile {\n id: string;\n azureTenantId?: string;\n controlCategory?: string;\n title?: string;\n maxScore?: number;\n rank?: unknown;\n remediation?: string;\n remediationImpact?: string;\n service?: string;\n threats?: unknown;\n tier?: string;\n userImpact?: string;\n}\n\n/**\n * Returns all profiles matching a given control name.\n */\nfunction getMatchingProfiles(\n profiles: SecureScoreControlProfile[],\n controlName: string,\n): SecureScoreControlProfile[] {\n return profiles.filter(p => p.id === controlName);\n}\n\n/**\n * Gets the title from matching profiles, or falls back to category:name.\n */\nfunction getTitle(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): string {\n const matched = getMatchingProfiles(profiles, cs.controlName);\n const titles = matched\n .map(p => p.title)\n .filter((t): t is string => t !== undefined && t !== '');\n\n if (titles.length > 0) {\n return titles[0]!;\n }\n\n // Fallback\n return [cs.controlCategory, cs.controlName].filter(Boolean).join(':');\n}\n\n/**\n * Computes impact from profile maxScore (maxScore / 10.0).\n * Falls back to 0.5 when no matching profile exists.\n * Capped at 1.0.\n */\nfunction getImpact(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): number {\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length === 0) {\n return 0.5;\n }\n\n const maxScore = Math.max(...matched.map(p => p.maxScore ?? 0));\n const impact = maxScore / 10.0;\n return Math.min(Math.round(impact * 100) / 100, 1.0);\n}\n\n/**\n * Determines the result status based on scoreInPercentage and profile maxScore.\n */\nfunction getStatus(\n profiles: SecureScoreControlProfile[],\n cs: ControlScore,\n): ResultStatus {\n if (cs.scoreInPercentage === 100) {\n return ResultStatus.Passed;\n }\n\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length === 0) {\n return ResultStatus.Failed;\n }\n\n const maxScore = Math.max(...matched.map(p => p.maxScore ?? 0));\n if (cs.score === maxScore) {\n return ResultStatus.Passed;\n }\n\n return ResultStatus.Failed;\n}\n\n/**\n * Builds an EvaluatedRequirement from a ControlScore.\n */\nfunction buildRequirement(\n cs: ControlScore,\n profiles: SecureScoreControlProfile[],\n createdDateTime: string,\n): EvaluatedRequirement {\n const id = `${cs.controlCategory}:${cs.controlName}`;\n const title = getTitle(profiles, cs);\n const impact = getImpact(profiles, cs);\n const status = getStatus(profiles, cs);\n\n // NIST tags: use default static analysis tags\n const nist = [...DEFAULT_STATIC_ANALYSIS_NIST_TAGS];\n const tags = buildNistCciTags(nist, []);\n\n // Descriptions\n const descriptions: Description[] = [\n { label: 'default', data: stripHTML(cs.description) },\n ];\n\n // Add fix description from profile remediation\n const matched = getMatchingProfiles(profiles, cs.controlName);\n if (matched.length > 0) {\n const remediations = matched\n .map(p => p.remediation)\n .filter((r): r is string => r !== undefined && r !== '');\n if (remediations.length > 0) {\n descriptions.push({ label: 'fix', data: stripHTML(remediations[0]!) });\n }\n\n const impacts = matched\n .map(p => p.remediationImpact)\n .filter((r): r is string => r !== undefined && r !== '');\n if (impacts.length > 0) {\n descriptions.push({ label: 'rationale', data: stripHTML(impacts[0]!) });\n }\n }\n\n // CodeDesc from implementationStatus\n const codeDesc = cs.implementationStatus || 'No implementation status provided';\n\n // StartTime from createdDateTime\n const startTime = (createdDateTime ? parseTimestamp(createdDateTime) : null) ?? new Date('0001-01-01T00:00:00Z');\n\n // Secure Score has no per-result explanation beyond codeDesc, so `message`\n // stays absent rather than an empty string (createResult would default it to '').\n const results: RequirementResult[] = [\n { status, codeDesc, startTime },\n ];\n\n const req = createRequirement(\n id,\n title,\n descriptions,\n impact,\n results,\n { tags },\n ) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags(nist);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Microsoft Secure Score combined JSON to HDF format.\n *\n * Input is the combined JSON containing both secureScore and profiles data\n * from the Microsoft Graph API.\n *\n * @param input - Combined JSON string with secureScore and profiles\n * @returns HDF JSON string\n */\nexport async function convertMsftSecureScoreToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input || input.trim().length === 0) {\n throw new Error('msft-secure-score: empty input');\n }\n validateInputSize(input, 'msft-secure-score');\n\n const combined = parseJSON<CombinedResponse>(input);\n\n if (!combined || typeof combined !== 'object') {\n throw new Error('msft-secure-score: invalid JSON');\n }\n\n if (!combined.secureScore?.value) {\n throw new Error('msft-secure-score: missing secureScore.value');\n }\n if (!combined.profiles?.value) {\n throw new Error('msft-secure-score: missing profiles.value');\n }\n if (combined.secureScore.value.length === 0) {\n throw new Error('msft-secure-score: secureScore.value is empty');\n }\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const profiles = combined.profiles.value;\n let tenantId = '';\n\n const baselines: EvaluatedBaseline[] = combined.secureScore.value.map(ss => {\n if (!tenantId) {\n tenantId = ss.azureTenantId;\n }\n\n const { items: limitedControlScores, truncated } = limitArray(ss.controlScores);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedControlScores.length} controlScore items (original: ${ss.controlScores.length})`);\n }\n\n const requirements = limitedControlScores.map(cs =>\n buildRequirement(cs, profiles, ss.createdDateTime),\n );\n\n const title = `Azure Secure Score report - Tenant ID: ${ss.azureTenantId} - Run ID: ${ss.id}`;\n\n return createMinimalBaseline(\n 'Microsoft Secure Score',\n requirements,\n {\n resultsChecksum,\n title,\n },\n ) as EvaluatedBaseline;\n });\n\n return buildHdfResults({\n generatorName: 'msft-secure-score-to-hdf',\n converterVersion,\n toolName: 'Microsoft Secure Score',\n toolFormat: 'JSON',\n baselines,\n components: [{\n name: `Azure Tenant: ${tenantId}`,\n type: TargetType.CloudAccount,\n provider: 'azure' as Component['provider'],\n labels: { account: tenantId, provider: 'azure' },\n }],\n timestamp: new Date(),\n });\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { convertSarifToHdf } from '../../sarif-to-hdf/typescript/converter.js';\nimport { buildNoFindingsRequirement, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFResults, Component } from '@mitre/hdf-schema';\nimport { TargetType } from '@mitre/hdf-schema';\n\n// --- MSDO-specific SARIF type definitions ---\n// These capture fields that the generic SARIF converter ignores.\n\ninterface MsdoSarif {\n runs: MsdoRun[];\n}\n\ninterface MsdoRun {\n tool: {\n driver: MsdoDriver;\n };\n versionControlProvenance?: VersionControlProvenance[];\n policies?: MsdoPolicy[];\n results?: MsdoResult[];\n}\n\ninterface MsdoDriver {\n name?: string;\n organization?: string;\n product?: string;\n fullName?: string;\n properties?: Record<string, unknown>;\n}\n\ninterface VersionControlProvenance {\n repositoryUri: string;\n revisionId?: string;\n branch?: string;\n}\n\ninterface MsdoPolicy {\n name: string;\n version: string;\n}\n\ninterface MsdoResult {\n ruleId: string;\n properties?: Record<string, unknown>;\n}\n\ninterface RunEnrichment {\n toolTags: Record<string, unknown>;\n policyTag: string;\n resultProps: Map<string, Record<string, unknown>[]>;\n}\n\n/**\n * Converts Microsoft Defender for DevOps SARIF output to HDF format.\n * Delegates base conversion to the generic SARIF converter and enriches\n * the output with MSDO-specific metadata.\n */\nexport async function convertMsftDefenderDevopsToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'msft-defender-devops');\n\n // 1. Parse raw SARIF to extract MSDO-specific fields\n const raw = parseJSON<MsdoSarif>(input);\n if (!raw || !Array.isArray(raw.runs)) {\n throw new Error('Invalid MSDO SARIF structure: missing or invalid runs field');\n }\n const { components, runEnrichments } = extractEnrichments(raw);\n\n // 2. Delegate to the generic SARIF converter for base HDF\n const hdfJson = await convertSarifToHdf(input, converterVersion);\n const result = JSON.parse(hdfJson) as HDFResults;\n\n // Run before applyEnrichments so synthesized reqs get the same run-level tags.\n synthesizeNoFindingsPlaceholders(result);\n applyEnrichments(result, components, runEnrichments);\n\n // 4. Override generator name and data source\n if (result.generator) {\n result.generator.name = 'msft-defender-devops-to-hdf';\n }\n if (result.tool) {\n result.tool.name = 'Microsoft Defender for DevOps';\n }\n\n return JSON.stringify(result, null, 2);\n}\n\nfunction extractEnrichments(raw: MsdoSarif): {\n components: Component[];\n runEnrichments: RunEnrichment[];\n} {\n const components: Component[] = [];\n const seenRepos = new Set<string>();\n const runEnrichments: RunEnrichment[] = [];\n\n for (const run of raw.runs) {\n // Extract repository components from versionControlProvenance\n for (const vcp of run.versionControlProvenance ?? []) {\n if (vcp.repositoryUri && !seenRepos.has(vcp.repositoryUri)) {\n seenRepos.add(vcp.repositoryUri);\n const target: Component = {\n name: repoNameFromURI(vcp.repositoryUri),\n type: TargetType.Repository,\n url: vcp.repositoryUri,\n };\n if (vcp.branch) {\n target.branch = vcp.branch;\n }\n if (vcp.revisionId) {\n target.commit = vcp.revisionId;\n }\n components.push(target);\n }\n }\n\n // Extract tool metadata tags\n const toolTags: Record<string, unknown> = {};\n const driver = run.tool.driver;\n if (driver.organization) {\n toolTags.msdo_organization = driver.organization;\n }\n if (driver.product) {\n toolTags.msdo_product = driver.product;\n }\n if (driver.fullName) {\n toolTags.msdo_fullName = driver.fullName;\n }\n if (driver.properties?.RawName) {\n toolTags.msdo_rawName = driver.properties.RawName;\n }\n if (driver.properties?.IsPreview !== undefined) {\n toolTags.msdo_isPreview = driver.properties.IsPreview;\n }\n\n // Extract policy tags\n let policyTag = '';\n if (run.policies && run.policies.length > 0) {\n policyTag = run.policies.map(p => `${p.name} ${p.version}`).join(', ');\n }\n\n // Extract result-level properties keyed by ruleId\n const resultProps = new Map<string, Record<string, unknown>[]>();\n for (const res of run.results ?? []) {\n if (res.properties && Object.keys(res.properties).length > 0) {\n const existing = resultProps.get(res.ruleId) ?? [];\n existing.push(res.properties);\n resultProps.set(res.ruleId, existing);\n }\n }\n\n runEnrichments.push({ toolTags, policyTag, resultProps });\n }\n\n return { components, runEnrichments };\n}\n\nfunction applyEnrichments(\n result: HDFResults,\n components: Component[],\n runEnrichments: RunEnrichment[],\n): void {\n // Add components\n if (components.length > 0) {\n result.components = components;\n }\n\n // Apply per-baseline (per-run) enrichments\n const baselines = result.baselines ?? [];\n for (let i = 0; i < baselines.length && i < runEnrichments.length; i++) {\n const re = runEnrichments[i]!;\n const requirements = baselines[i]!.requirements ?? [];\n\n for (const req of requirements) {\n const tags = (req.tags ?? {}) as Record<string, unknown>;\n\n // Add tool metadata tags\n for (const [k, v] of Object.entries(re.toolTags)) {\n tags[k] = v;\n }\n\n // Add policy tag\n if (re.policyTag) {\n tags.msdo_policy = re.policyTag;\n }\n\n // Add result-level properties for this requirement's ruleId\n const props = re.resultProps.get(req.id);\n if (props && props.length > 0) {\n tags.msdo_properties = props[0];\n }\n\n req.tags = tags;\n }\n }\n}\n\n// HDF requires requirements.minItems=1; SARIF's empty results[] means the\n// scan ran clean (§3.7.2), so synthesize one passed placeholder per baseline.\nfunction synthesizeNoFindingsPlaceholders(result: HDFResults): void {\n const startTime = result.timestamp ?? new Date();\n for (const baseline of result.baselines ?? []) {\n if (baseline.requirements && baseline.requirements.length > 0) continue;\n const tool = baseline.name;\n baseline.requirements = [\n buildNoFindingsRequirement(\n `${tool}-no-findings`,\n `Microsoft Defender for DevOps scanner \"${tool}\" ran and reported zero findings.`,\n startTime,\n ),\n ];\n }\n}\n\nfunction repoNameFromURI(uri: string): string {\n const parts = uri.split('/');\n const name = parts[parts.length - 1];\n return name || uri;\n}\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport { inputChecksum, limitArray, validateInputSize, buildHdfResults, buildNoFindingsRequirement } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Defender for Cloud assessment structures.\n * Derived from Azure REST API: /providers/Microsoft.Security/assessments\n * See: https://learn.microsoft.com/en-us/rest/api/defenderforcloud/assessments/list\n */\ninterface DefenderCloudInput {\n value: Assessment[];\n}\n\ninterface Assessment {\n id: string;\n name: string;\n type: string;\n properties: AssessmentProperties;\n}\n\ninterface AssessmentProperties {\n displayName: string;\n resourceDetails: ResourceDetails;\n status: StatusBlock;\n metadata: Metadata;\n}\n\ninterface ResourceDetails {\n source: string;\n id: string;\n}\n\ninterface StatusBlock {\n code: string;\n cause: string;\n description: string;\n}\n\ninterface Metadata {\n displayName: string;\n assessmentType: string;\n policyDefinitionId: string;\n description: string;\n remediationDescription: string;\n categories: string[];\n severity: string;\n userImpact: string;\n implementationEffort: string;\n threats: string[];\n tactics: string[];\n techniques: string[];\n}\n\n/**\n * Severity to HDF impact mapping.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n};\n\n/**\n * Maps Azure status code to HDF ResultStatus.\n */\nfunction mapStatus(code: string): ResultStatus {\n switch (code.toLowerCase()) {\n case 'healthy':\n return ResultStatus.Passed;\n case 'unhealthy':\n return ResultStatus.Failed;\n case 'notapplicable':\n return ResultStatus.NotApplicable;\n default:\n return ResultStatus.NotReviewed;\n }\n}\n\n/**\n * Extracts subscription ID from an Azure resource path.\n */\nfunction extractSubscriptionID(resourcePath: string): string {\n const lower = resourcePath.toLowerCase();\n const idx = lower.indexOf('/subscriptions/');\n if (idx === -1) {\n return '';\n }\n const rest = resourcePath.substring(idx + '/subscriptions/'.length);\n const slashIdx = rest.indexOf('/');\n if (slashIdx !== -1) {\n return rest.substring(0, slashIdx);\n }\n return rest;\n}\n\n/**\n * Converts a group of assessments sharing an assessment ID into one EvaluatedRequirement.\n */\nfunction buildRequirement(assessmentID: string, assessments: Assessment[], scanTime: Date): EvaluatedRequirement {\n const rep = assessments[0]!;\n const meta = rep.properties.metadata;\n\n const impact = IMPACT_MAPPING[meta.severity.toLowerCase()] ?? 0.5;\n\n const tags: Record<string, unknown> = {};\n\n if (meta.categories.length > 0) {\n tags['categories'] = meta.categories;\n }\n if (meta.tactics.length > 0) {\n tags['tactics'] = meta.tactics;\n }\n if (meta.techniques.length > 0) {\n tags['techniques'] = meta.techniques;\n }\n if (meta.threats.length > 0) {\n tags['threats'] = meta.threats;\n }\n\n tags['severity'] = meta.severity;\n if (meta.userImpact) {\n tags['userImpact'] = meta.userImpact;\n }\n if (meta.implementationEffort) {\n tags['implementationEffort'] = meta.implementationEffort;\n }\n if (meta.assessmentType) {\n tags['assessmentType'] = meta.assessmentType;\n }\n\n const descriptions: Description[] = [\n { label: 'default', data: meta.description },\n ];\n if (meta.remediationDescription) {\n descriptions.push({ label: 'fix', data: meta.remediationDescription });\n }\n\n const results = assessments.map((a) => buildResultFromAssessment(a, scanTime));\n\n const req = createRequirement(assessmentID, rep.properties.displayName, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts a single assessment into an HDF RequirementResult.\n */\nfunction buildResultFromAssessment(a: Assessment, scanTime: Date): RequirementResult {\n const status = mapStatus(a.properties.status.code);\n const codeDesc = `Resource: ${a.properties.resourceDetails.id}`;\n const message = a.properties.status.description || a.properties.status.cause || undefined;\n\n // Healthy assessments carry no explanation, so `message` stays absent rather\n // than an empty string (createResult would default it to '').\n const result: RequirementResult = { status, codeDesc, startTime: scanTime };\n if (message !== undefined) {\n result.message = message;\n }\n return result;\n}\n\n/**\n * Converts Microsoft Defender for Cloud assessment output to HDF format.\n *\n * @param input - JSON string containing Azure Security Assessments API response\n * @returns HDF JSON string\n */\nexport async function convertMsftDefenderCloudToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'msft-defender-cloud');\n\n const scanTime = new Date();\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const raw = parseJSON<DefenderCloudInput>(input);\n\n if (!raw || typeof raw !== 'object') {\n throw new Error('Invalid Defender for Cloud structure: not a valid JSON object');\n }\n\n if (!Array.isArray(raw.value)) {\n throw new Error('Invalid Defender for Cloud structure: missing or invalid value array');\n }\n\n const { items: limitedAssessments, truncated } = limitArray(raw.value);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAssessments.length} assessment items (original: ${raw.value.length})`);\n }\n\n // Group assessments by name (GUID), preserving insertion order.\n const groups = new Map<string, Assessment[]>();\n for (const a of limitedAssessments) {\n const existing = groups.get(a.name);\n if (existing) {\n existing.push(a);\n } else {\n groups.set(a.name, [a]);\n }\n }\n\n const requirements: EvaluatedRequirement[] = [];\n for (const [assessmentID, assessments] of groups) {\n requirements.push(buildRequirement(assessmentID, assessments, scanTime));\n }\n\n const subscriptionID = limitedAssessments.length > 0\n ? extractSubscriptionID(limitedAssessments[0]!.id)\n : '';\n\n if (requirements.length === 0) {\n const targetName = subscriptionID || 'Unknown';\n requirements.push(buildNoFindingsRequirement(\n 'msft-defender-cloud-no-findings',\n `Microsoft Defender for Cloud scanned ${targetName} and reported zero findings.`,\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Microsoft Defender for Cloud Assessments',\n requirements,\n { resultsChecksum },\n ) as EvaluatedBaseline;\n\n const components: Component[] = [];\n if (subscriptionID) {\n components.push({\n name: `Azure Subscription ${subscriptionID}`,\n type: TargetType.CloudAccount,\n accountId: subscriptionID,\n provider: 'azure' as Component['provider'],\n labels: { account: subscriptionID, provider: 'azure' },\n });\n }\n\n return buildHdfResults({\n generatorName: 'msft-defender-cloud-to-hdf',\n converterVersion,\n toolName: 'Microsoft Defender for Cloud',\n toolFormat: 'JSON',\n baselines: [baseline],\n components,\n timestamp: scanTime,\n });\n}\n","import { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { buildNoFindingsRequirement, deriveControlTypeFromTags, inputChecksum, limitArray, validateInputSize, buildHdfResults } from '../../../shared/typescript/converterutil.js';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n Component,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n TargetType,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\n\n/**\n * Microsoft Graph Security API v2 alert response structure.\n * Derived from official Microsoft documentation:\n * https://learn.microsoft.com/en-us/graph/api/resources/security-alert\n */\ninterface MdeAlertResponse {\n '@odata.context'?: string;\n value: MdeAlert[];\n}\n\ninterface MdeAlert {\n id: string;\n incidentId?: string;\n status: string;\n severity: string;\n classification?: string | null;\n determination?: string | null;\n serviceSource?: string;\n detectionSource?: string;\n category: string;\n title: string;\n description: string;\n alertWebUrl?: string;\n createdDateTime?: string;\n firstActivityDateTime?: string;\n lastActivityDateTime?: string;\n lastUpdateDateTime?: string;\n resolvedDateTime?: string | null;\n assignedTo?: string | null;\n tenantId?: string;\n actorDisplayName?: string | null;\n threatDisplayName?: string | null;\n threatFamilyName?: string | null;\n mitreTechniques?: string[];\n recommendedActions?: string;\n comments?: unknown[];\n evidence?: MdeEvidence[];\n}\n\ninterface MdeEvidence {\n '@odata.type'?: string;\n deviceDnsName?: string;\n osPlatform?: string;\n mdeDeviceId?: string;\n healthStatus?: string;\n onboardingStatus?: string;\n rbacGroupName?: string;\n processId?: number;\n processCommandLine?: string;\n imageFile?: MdeImageFile;\n detectionStatus?: string;\n parentProcess?: MdeParentProcess;\n fileName?: string;\n filePath?: string;\n sha256?: string;\n}\n\ninterface MdeImageFile {\n fileName?: string;\n filePath?: string;\n sha256?: string;\n}\n\ninterface MdeParentProcess {\n processId?: number;\n imageFile?: MdeImageFile;\n}\n\n/**\n * Severity to HDF impact mapping.\n */\nconst IMPACT_MAPPING: Record<string, number> = {\n high: 0.7,\n medium: 0.5,\n low: 0.3,\n informational: 0.0,\n};\n\n/**\n * Maps MDE severity to HDF impact value.\n */\nfunction severityToImpact(severity: string): number {\n return IMPACT_MAPPING[severity.toLowerCase()] ?? 0.5;\n}\n\n/**\n * Maps MDE alert status + classification to HDF result status.\n * new/inProgress → Failed, resolved with falsePositive → Passed, otherwise → Failed.\n */\nfunction statusToResultStatus(status: string, classification?: string | null): ResultStatus {\n if (status.toLowerCase() === 'resolved') {\n if (classification && classification.toLowerCase() === 'falsepositive') {\n return ResultStatus.Passed;\n }\n return ResultStatus.Failed;\n }\n return ResultStatus.Failed;\n}\n\n/**\n * Formats evidence items into a human-readable code_desc string.\n */\nfunction formatEvidence(evidence: MdeEvidence[]): string {\n if (!evidence || evidence.length === 0) {\n return 'No evidence available';\n }\n\n const parts: string[] = [];\n for (const ev of evidence) {\n const odataType = ev['@odata.type'] ?? '';\n if (odataType.includes('deviceEvidence')) {\n parts.push(`Device: ${ev.deviceDnsName ?? 'unknown'} (OS: ${ev.osPlatform ?? 'unknown'})`);\n } else if (odataType.includes('processEvidence')) {\n if (ev.imageFile) {\n parts.push(`Process: ${ev.imageFile.filePath ?? ''}\\\\${ev.imageFile.fileName ?? ''} (Command: ${ev.processCommandLine ?? ''})`);\n } else {\n parts.push(`Process: (Command: ${ev.processCommandLine ?? ''})`);\n }\n } else if (odataType.includes('fileEvidence')) {\n parts.push(`File: ${ev.filePath ?? ''}\\\\${ev.fileName ?? ''}`);\n } else {\n parts.push(`Evidence type: ${odataType}`);\n }\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Formats the message string for a result.\n */\nfunction formatMessage(alert: MdeAlert): string {\n const parts: string[] = [];\n parts.push(`Alert: ${alert.title}`);\n parts.push(`Status: ${alert.status}`);\n parts.push(`Severity: ${alert.severity}`);\n if (alert.threatDisplayName) {\n parts.push(`Threat: ${alert.threatDisplayName}`);\n }\n if (alert.alertWebUrl) {\n parts.push(`URL: ${alert.alertWebUrl}`);\n }\n return parts.join('\\n');\n}\n\n/**\n * Extracts a Host target from device evidence, or falls back to tenant as cloud account.\n */\nfunction extractDeviceTarget(alert: MdeAlert): Component {\n if (alert.evidence) {\n for (const ev of alert.evidence) {\n const odataType = ev['@odata.type'] ?? '';\n if (odataType.includes('deviceEvidence') && ev.deviceDnsName) {\n const target: Component = {\n name: ev.deviceDnsName,\n type: TargetType.Host,\n labels: { provider: 'azure' },\n };\n if (ev.deviceDnsName) {\n target.fqdn = ev.deviceDnsName;\n }\n if (ev.osPlatform) {\n target.osName = ev.osPlatform;\n }\n return target;\n }\n }\n }\n // No device evidence — use tenant as cloud account\n return {\n name: alert.tenantId ?? 'unknown',\n type: TargetType.CloudAccount,\n accountId: alert.tenantId,\n labels: { account: alert.tenantId ?? '', provider: 'azure' },\n };\n}\n\n/**\n * Builds tags map for a requirement.\n */\nfunction buildTags(alert: MdeAlert): Record<string, unknown> {\n const tags: Record<string, unknown> = {\n nist: ['SA-11', 'RA-5'],\n };\n\n if (alert.category) {\n tags['category'] = alert.category;\n }\n\n if (alert.mitreTechniques && alert.mitreTechniques.length > 0) {\n tags['mitre'] = alert.mitreTechniques;\n }\n\n if (alert.classification) {\n tags['classification'] = alert.classification;\n }\n if (alert.determination) {\n tags['determination'] = alert.determination;\n }\n\n return tags;\n}\n\n/**\n * Resolves a clean per-finding source timestamp, falling back to the conversion time.\n */\nfunction resolveStartTime(alert: MdeAlert, scanTime: Date): Date {\n // Resolve each candidate independently (matching the Go converter): a\n // present-but-unparseable firstActivityDateTime must still fall through to\n // createdDateTime, not skip straight to the conversion time.\n const first = alert.firstActivityDateTime ? parseTimestamp(alert.firstActivityDateTime) : null;\n if (first) {\n return first;\n }\n const created = alert.createdDateTime ? parseTimestamp(alert.createdDateTime) : null;\n if (created) {\n return created;\n }\n return scanTime;\n}\n\n/**\n * Converts a single MDE alert to an HDF EvaluatedRequirement.\n */\nfunction alertToRequirement(alert: MdeAlert, scanTime: Date): EvaluatedRequirement {\n const impact = severityToImpact(alert.severity);\n const status = statusToResultStatus(alert.status, alert.classification);\n\n const codeDesc = formatEvidence(alert.evidence ?? []);\n const message = formatMessage(alert);\n const startTime = resolveStartTime(alert, scanTime);\n\n const results: RequirementResult[] = [\n createResult(status, message, { codeDesc, startTime }),\n ];\n\n const descriptions: Description[] = [\n { label: 'default', data: alert.description },\n ];\n if (alert.recommendedActions) {\n descriptions.push({ label: 'fix', data: alert.recommendedActions });\n }\n\n const tags = buildTags(alert);\n\n const req = createRequirement(alert.id, alert.title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const nistTags = tags.nist as string[];\n const controlType = deriveControlTypeFromTags(nistTags);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n}\n\n/**\n * Converts Microsoft Defender for Endpoint alerts (Microsoft Graph Security API v2 format) to HDF.\n * Each alert becomes one requirement with one result.\n *\n * @param input - JSON string of MDE alert response\n * @returns HDF JSON string\n */\nexport async function convertMsftDefenderEndpointToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n validateInputSize(input, 'msft-defender-endpoint');\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const response = parseJSON<MdeAlertResponse>(input);\n\n if (!response || typeof response !== 'object') {\n throw new Error('Invalid Microsoft Defender for Endpoint structure: not a valid JSON object');\n }\n\n if (!Array.isArray(response.value)) {\n throw new Error('Invalid Microsoft Defender for Endpoint structure: missing or invalid value array');\n }\n\n const scanTime = new Date();\n\n const { items: limitedAlerts, truncated } = limitArray(response.value);\n /* v8 ignore next -- truncation only triggers with >100K items */\n if (truncated) {\n // eslint-disable-next-line no-console\n console.warn(`WARNING: Input truncated at ${limitedAlerts.length} alert items (original: ${response.value.length})`);\n }\n\n const requirements: EvaluatedRequirement[] = limitedAlerts.map((alert) => alertToRequirement(alert, scanTime));\n\n const seenTargets = new Set<string>();\n const components: Component[] = [];\n for (const alert of limitedAlerts) {\n const target = extractDeviceTarget(alert);\n if (!seenTargets.has(target.name)) {\n seenTargets.add(target.name);\n components.push(target);\n }\n }\n\n if (requirements.length === 0) {\n requirements.push(buildNoFindingsRequirement(\n 'msft-defender-endpoint-no-findings',\n 'Microsoft Defender for Endpoint scanned the tenant and reported zero findings.',\n scanTime,\n ));\n }\n\n const baseline: EvaluatedBaseline = createMinimalBaseline(\n 'Microsoft Defender for Endpoint Scan',\n requirements,\n { resultsChecksum },\n ) as EvaluatedBaseline;\n\n return buildHdfResults({\n generatorName: 'msft-defender-endpoint-to-hdf',\n converterVersion,\n toolName: 'Microsoft Defender for Endpoint',\n baselines: [baseline],\n components,\n timestamp: scanTime,\n });\n}\n","import { buildXml } from '@mitre/hdf-utilities';\nimport type {\n HDFResults,\n EvaluatedRequirement,\n Description,\n} from '@mitre/hdf-schema';\nimport { validateInputSize, parseHdf } from '../../../shared/typescript/converterutil.js';\n\n/** Attribute prefix used by fast-xml-parser to distinguish attrs from elements. */\nconst ATTR = '@_';\n\n/** XML build options that enable attribute rendering via @_ prefix. */\nconst BUILD_OPTIONS = {\n attributeNamePrefix: ATTR,\n textNodeName: '#text',\n ignoreAttributes: false,\n format: true,\n indentBy: ' ',\n suppressEmptyNode: false,\n // Without this, fast-xml-parser renders selected=\"true\" as a bare `selected`,\n // which is not valid XML — and diverges from the Go serializer.\n suppressBooleanAttributes: false,\n};\n\n/**\n * Convert HDF Results JSON to XCCDF 1.2 Benchmark XML.\n *\n * @param input - HDF Results JSON string\n * @returns XCCDF 1.2 XML string\n */\nexport function convertHdfToXccdf(input: string): string {\n validateInputSize(input, 'hdf-to-xccdf');\n\n const hdfData = parseHdf<HDFResults>(input);\n\n if (!hdfData || typeof hdfData !== 'object' || !('baselines' in hdfData)) {\n throw new Error('Invalid HDF structure: missing baselines field');\n }\n\n if (!Array.isArray(hdfData.baselines)) {\n throw new Error('Invalid HDF structure: baselines must be an array');\n }\n\n const xmlObj = { Benchmark: buildBenchmarkObj(hdfData) };\n\n const xmlBody = buildXml(xmlObj, BUILD_OPTIONS);\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\\n${xmlBody}`;\n}\n\n/** Wrap a primitive value to force it as a text node in XML output. */\nfunction wrap(\n value: string | number | boolean,\n): { '#text': string | number | boolean } {\n return { '#text': value };\n}\n\n/** Map HDF impact (0.0-1.0) to XCCDF severity string. */\nfunction impactToSeverity(impact: number): string {\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'medium';\n if (impact >= 0.1) return 'low';\n return 'info';\n}\n\n/** Map HDF result status to XCCDF result value. */\nfunction hdfStatusToXccdf(status: string): string {\n const statusMap: Record<string, string> = {\n passed: 'pass',\n failed: 'fail',\n error: 'error',\n notReviewed: 'notchecked',\n notApplicable: 'notapplicable',\n };\n return statusMap[status] ?? 'unknown';\n}\n\n/** Find a description by label. */\nfunction findDescription(\n descriptions: Description[] | undefined,\n label: string,\n): string | undefined {\n return descriptions?.find((d) => d.label === label)?.data;\n}\n\n/** Replace characters not valid in XCCDF IDs with underscores. */\nfunction sanitizeXccdfId(id: string): string {\n return id.replace(/[^a-zA-Z0-9_.\\-]/g, '_');\n}\n\n/** Build the Benchmark XML object from HDF data. */\nfunction buildBenchmarkObj(hdfData: HDFResults): Record<string, unknown> {\n const empty = !hdfData.baselines || hdfData.baselines.length === 0;\n\n // Attribute order (id before resolved) and element order mirror the Go\n // serializer's struct field order — the two assert the same golden.\n const benchmark: Record<string, unknown> = {\n [`${ATTR}xmlns`]: 'http://checklists.nist.gov/xccdf/1.2',\n [`${ATTR}id`]: empty\n ? 'xccdf_hdf_benchmark_exported'\n : sanitizeXccdfId('xccdf_hdf_benchmark_' + hdfData.baselines[0]!.name),\n [`${ATTR}resolved`]: '1',\n status: wrap('incomplete'),\n };\n\n if (empty) {\n benchmark.title = wrap('HDF Export');\n benchmark.version = wrap('1.0');\n return benchmark;\n }\n\n const baseline = hdfData.baselines[0]!;\n\n benchmark.title = wrap(baseline.title ?? baseline.name);\n benchmark.version = wrap(baseline.version ?? '1.0');\n\n // Profile\n benchmark.Profile = {\n [`${ATTR}id`]: sanitizeXccdfId('xccdf_hdf_profile_' + baseline.name),\n title: wrap(baseline.title ?? baseline.name),\n };\n\n // Rules\n if (baseline.requirements && baseline.requirements.length > 0) {\n benchmark.Rule = baseline.requirements.map((req: EvaluatedRequirement) => buildRuleObj(req));\n }\n\n // TestResult\n benchmark.TestResult = buildTestResultObj(hdfData, baseline);\n\n return benchmark;\n}\n\n/** Build an XCCDF Rule object from an HDF EvaluatedRequirement. */\nfunction buildRuleObj(req: EvaluatedRequirement): Record<string, unknown> {\n const ruleId = sanitizeXccdfId('xccdf_hdf_rule_' + req.id + '_rule');\n\n const rule: Record<string, unknown> = {\n [`${ATTR}id`]: ruleId,\n [`${ATTR}severity`]: impactToSeverity(req.impact),\n [`${ATTR}selected`]: 'true',\n title: wrap(req.title ?? req.id),\n };\n\n const description = findDescription(req.descriptions, 'default');\n if (description) {\n rule.description = wrap(description);\n }\n\n // References: url/uri -> <reference href>, plain string -> <reference>text\n if (Array.isArray(req.refs) && req.refs.length > 0) {\n const refs = req.refs\n .map((r): Record<string, unknown> | undefined => {\n const o = r as { url?: unknown; uri?: unknown; ref?: unknown };\n if (typeof o.url === 'string') return { [`${ATTR}href`]: o.url };\n if (typeof o.uri === 'string') return { [`${ATTR}href`]: o.uri };\n if (typeof o.ref === 'string') return { '#text': o.ref };\n return undefined;\n })\n .filter((x): x is Record<string, unknown> => x !== undefined);\n if (refs.length > 0) {\n rule.reference = refs;\n }\n }\n\n const rationale = findDescription(req.descriptions, 'rationale');\n if (rationale) {\n rule.rationale = wrap(rationale);\n }\n\n const fixtext = findDescription(req.descriptions, 'fix');\n if (fixtext) {\n rule.fixtext = wrap(fixtext);\n }\n\n // Idents: CCI and NIST 800-53 controls\n const idents: Record<string, unknown>[] = [];\n if (req.tags && Array.isArray(req.tags['cci'])) {\n for (const cci of req.tags['cci'] as string[]) {\n idents.push({ [`${ATTR}system`]: 'http://cyber.mil/cci', '#text': cci });\n }\n }\n if (req.tags && Array.isArray(req.tags['nist'])) {\n for (const n of req.tags['nist'] as string[]) {\n idents.push({ [`${ATTR}system`]: 'https://csrc.nist.gov/projects/risk-management/sp800-53-controls', '#text': n });\n }\n }\n if (idents.length > 0) {\n rule.ident = idents;\n }\n\n // Checks: the check-description (OVAL) and the InSpec source code, each its own <check>.\n const checks: Record<string, unknown>[] = [];\n const checkContent = findDescription(req.descriptions, 'check');\n if (checkContent) {\n checks.push({\n [`${ATTR}system`]: 'http://oval.mitre.org/XMLSchema/oval-definitions-5',\n 'check-content': wrap(checkContent),\n });\n }\n if (req.code) {\n checks.push({\n [`${ATTR}system`]: 'http://inspec.io/',\n 'check-content': wrap(req.code),\n });\n }\n if (checks.length > 0) {\n rule.check = checks;\n }\n\n return rule;\n}\n\n/** Build the XCCDF TestResult object. */\nfunction buildTestResultObj(\n hdfData: HDFResults,\n baseline: HDFResults['baselines'][0],\n): Record<string, unknown> {\n const testResult: Record<string, unknown> = {\n [`${ATTR}id`]: 'xccdf_hdf_testresult_1',\n title: wrap('HDF Assessment Results'),\n };\n\n // Timestamps\n if (hdfData.timestamp) {\n const ts =\n typeof hdfData.timestamp === 'string'\n ? hdfData.timestamp\n : (hdfData.timestamp as Date).toISOString();\n testResult[`${ATTR}start-time`] = ts;\n testResult[`${ATTR}end-time`] = ts;\n }\n\n // Component\n if (hdfData.components && hdfData.components.length > 0) {\n const target = hdfData.components[0]!;\n testResult.target = wrap(target.name);\n if (target.ipAddress) {\n testResult['target-address'] = wrap(target.ipAddress);\n }\n } else {\n testResult.target = wrap('unknown');\n }\n\n // Rule results\n const ruleResults: Record<string, unknown>[] = [];\n for (const req of baseline.requirements) {\n const ruleIdRef = sanitizeXccdfId('xccdf_hdf_rule_' + req.id + '_rule');\n\n for (const result of req.results) {\n const rr: Record<string, unknown> = {\n [`${ATTR}idref`]: ruleIdRef,\n result: wrap(hdfStatusToXccdf(result.status)),\n };\n\n const startTime =\n typeof result.startTime === 'string'\n ? result.startTime\n : (result.startTime as Date).toISOString();\n rr[`${ATTR}time`] = startTime;\n\n if (result.message) {\n rr.message = wrap(result.message);\n }\n\n if (result.codeDesc) {\n rr.check = {\n [`${ATTR}system`]:\n 'http://oval.mitre.org/XMLSchema/oval-definitions-5',\n 'check-content': wrap(result.codeDesc),\n };\n }\n\n ruleResults.push(rr);\n }\n }\n\n testResult['rule-result'] = ruleResults;\n\n return testResult;\n}\n","/**\n * Shared helper functions for OSCAL-to-HDF converters.\n *\n * Mirrors the Go helpers in converters/oscal-to-hdf/go/shared.go.\n */\n\nimport type { Property, Part, Characterization, DocumentMetadata, Oscal } from './types.js';\n\nconst controlEnhancementRe = /^([a-z]{2}-\\d+)\\.(\\d+)$/;\nconst objectiveIDRe = /^([a-z]{2}-\\d+(?:\\.\\d+)?)/;\n\n/**\n * Converts an OSCAL control ID to NIST 800-53 notation.\n * \"ac-1\" -> \"AC-1\", \"ac-2.3\" -> \"AC-2 (3)\"\n */\nexport function controlIdToNistTag(id: string): string {\n const m = controlEnhancementRe.exec(id);\n if (m) {\n return `${m[1]!.toUpperCase()} (${m[2]!})`;\n }\n return id.toUpperCase();\n}\n\n/**\n * Converts a list of OSCAL control IDs to NIST tags, deduplicating.\n */\nexport function controlIdsToNistTags(ids: string[]): string[] {\n const tags: string[] = [];\n const seen = new Set<string>();\n for (const id of ids) {\n const tag = controlIdToNistTag(id);\n if (!seen.has(tag)) {\n seen.add(tag);\n tags.push(tag);\n }\n }\n return tags;\n}\n\n/**\n * Extracts the base control ID from a SAR objective ID.\n * \"ac-1.a.1_obj.1\" -> \"ac-1\"\n */\nexport function extractControlIdFromObjectiveId(objectiveId: string): string {\n const m = objectiveIDRe.exec(objectiveId);\n if (m) {\n return m[1]!;\n }\n return objectiveId;\n}\n\n/**\n * Maps OSCAL finding/risk status strings to HDF-compatible status strings.\n * \"satisfied\"/\"closed\" -> \"passed\", \"not-satisfied\"/\"open\" -> \"failed\"\n */\nexport function oscalStatusToHdf(state: string): string | undefined {\n switch (state.toLowerCase().trim()) {\n case 'satisfied':\n case 'closed':\n return 'passed';\n case 'not-satisfied':\n case 'open':\n return 'failed';\n default:\n return undefined;\n }\n}\n\n/**\n * Finds the first property with the given name and returns its value.\n * If ns is non-empty, the property must also match that namespace.\n */\nexport function extractPropValue(\n props: Property[] | undefined,\n name: string,\n ns?: string,\n): string | undefined {\n if (!props) return undefined;\n for (const p of props) {\n if (p.name === name && (!ns || p.ns === ns)) {\n return p.value;\n }\n }\n return undefined;\n}\n\n/**\n * Returns all property values matching the given name.\n */\nexport function extractAllPropValues(\n props: Property[] | undefined,\n name: string,\n ns?: string,\n): string[] {\n if (!props) return [];\n const values: string[] = [];\n for (const p of props) {\n if (p.name === name && (!ns || p.ns === ns)) {\n values.push(p.value);\n }\n }\n return values;\n}\n\n/**\n * Recursively concatenates prose from a Part tree, joining with newlines.\n */\nexport function flattenParts(parts: Part[] | undefined): string {\n if (!parts) return '';\n const pieces: string[] = [];\n flattenPartsRecursive(parts, pieces);\n return pieces.join('\\n').trim();\n}\n\nfunction flattenPartsRecursive(parts: Part[], pieces: string[]): void {\n for (const p of parts) {\n if (p.prose) {\n pieces.push(p.prose);\n }\n if (p.parts && p.parts.length > 0) {\n flattenPartsRecursive(p.parts, pieces);\n }\n }\n}\n\n/**\n * Like flattenParts but only includes top-level parts matching the given name.\n * Nested parts are included regardless of their name.\n */\nexport function flattenPartsByName(\n parts: Part[] | undefined,\n name: string,\n): string {\n if (!parts) return '';\n const pieces: string[] = [];\n for (const p of parts) {\n if (p.name === name) {\n if (p.prose) {\n pieces.push(p.prose);\n }\n if (p.parts && p.parts.length > 0) {\n flattenPartsRecursive(p.parts, pieces);\n }\n }\n }\n return pieces.join('\\n').trim();\n}\n\n/**\n * Extracts impact/severity from risk characterization facets.\n * Returns a normalized 0.0-1.0 impact value. Falls back to defaultImpact.\n */\nexport function extractRiskSeverity(\n characterizations: Characterization[] | undefined,\n defaultImpact: number,\n): number {\n if (!characterizations) return defaultImpact;\n for (const c of characterizations) {\n if (!c.facets) continue;\n for (const f of c.facets) {\n if (f.name === 'impact' || f.name === 'risk' || f.name === 'likelihood') {\n switch (f.value.toLowerCase()) {\n case 'critical':\n return 0.9;\n case 'high':\n return 0.7;\n case 'moderate':\n case 'medium':\n return 0.5;\n case 'low':\n return 0.3;\n case 'info':\n case 'informational':\n case 'none':\n return 0.0;\n }\n }\n }\n }\n return defaultImpact;\n}\n\n/** Holds extracted metadata common to all OSCAL documents. */\nexport interface MetadataInfo {\n title: string;\n version: string;\n oscalVersion: string;\n lastModified: string;\n}\n\n/** Pulls common fields from OSCAL metadata. */\nexport function extractMetadata(m: DocumentMetadata): MetadataInfo {\n return {\n title: m.title,\n version: m.version,\n oscalVersion: m['oscal-version'],\n lastModified: String(m['last-modified']),\n };\n}\n\n/** Matches NIST 800-53 tags with enhancements like \"AC-2 (3)\". */\nconst nistEnhancementReverseRe = /^([A-Z]{2}-\\d+)\\s*\\((\\d+)\\)$/;\n\n/**\n * Converts NIST 800-53 notation back to OSCAL control ID.\n * \"AC-1\" -> \"ac-1\", \"AC-2 (3)\" -> \"ac-2.3\", \"SI-7 (1)\" -> \"si-7.1\"\n */\nexport function nistTagToControlId(tag: string): string {\n tag = tag.trim();\n const m = nistEnhancementReverseRe.exec(tag);\n if (m) {\n return `${m[1]!.toLowerCase()}.${m[2]!}`;\n }\n return tag.toLowerCase();\n}\n\n/**\n * Converts a 0.0-1.0 impact value to an OSCAL severity string.\n * This is the reverse of extractRiskSeverity.\n */\nexport function impactToSeverity(impact: number): string {\n if (impact >= 0.9) return 'critical';\n if (impact >= 0.7) return 'high';\n if (impact >= 0.4) return 'moderate';\n if (impact >= 0.1) return 'low';\n return 'info';\n}\n\n/**\n * Maps an HDF status string to an OSCAL risk status string.\n * \"passed\"/\"notApplicable\" -> \"closed\", everything else -> \"open\".\n */\nexport function hdfStatusToOscalRiskStatus(status: string): string {\n if (status === 'passed' || status === 'notApplicable') {\n return 'closed';\n }\n return 'open';\n}\n\n/** OSCAL specification version used in reverse converter output documents. */\nexport const OSCAL_VERSION = '1.1.2';\n\n/**\n * Parses an OSCAL document from JSON input, validates the document type.\n * Throws if input is empty, invalid JSON, or not the expected type.\n */\nexport function parseOscalDocument<T extends keyof Oscal>(\n input: string,\n expectedKey: T,\n converterName: string,\n): NonNullable<Oscal[T]> {\n if (!input || input.trim().length === 0) {\n throw new Error(`${converterName}: empty input`);\n }\n\n let doc: Oscal;\n try {\n doc = JSON.parse(input) as Oscal;\n } catch {\n throw new Error(`${converterName}: failed to parse JSON`);\n }\n\n const value = doc[expectedKey];\n if (!value) {\n throw new Error(`${converterName}: expected ${String(expectedKey)} document`);\n }\n\n return value as NonNullable<Oscal[T]>;\n}\n\n/**\n * Converts a title to kebab-case, truncated to 80 characters.\n * Shared utility used by multiple converters for deriving names.\n */\nexport function toKebabCase(title: string, fallback: string): string {\n if (!title) return fallback;\n let name = title.toLowerCase();\n name = name.replace(/[^a-z0-9]/g, '-');\n // Collapse consecutive dashes\n while (name.includes('--')) {\n name = name.replace(/--/g, '-');\n }\n name = name.replace(/^-+|-+$/g, '');\n if (name.length > 80) {\n name = name.slice(0, 80);\n }\n return name;\n}\n","/**\n * Converts HDF Results to OSCAL Assessment Results (SAR) format.\n *\n * This is the reverse direction of the oscal-to-hdf SAR converter. It takes HDF\n * Results JSON and produces an OSCAL 1.1.2 assessment-results JSON document.\n */\n\nimport { formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize, parseHdf, hdfTime } from '../../../shared/typescript/converterutil.js';\nimport type { HDFResults, EvaluatedBaseline, EvaluatedRequirement, Description, RequirementResult } from '@mitre/hdf-schema';\nimport type {\n SecurityAssessmentResultsSAR,\n DocumentMetadata,\n ImportAssessmentPlan,\n AssessmentResult,\n Finding,\n TargetClass,\n StatusClass,\n Observation,\n IdentifiedRisk,\n Property,\n Link,\n} from '../../oscal-to-hdf/typescript/types.js';\nimport {\n nistTagToControlId,\n impactToSeverity,\n OSCAL_VERSION,\n} from '../../oscal-to-hdf/typescript/shared.js';\n\n/** Root wrapper for the output JSON. */\ninterface OscalSARDocument {\n 'assessment-results': SecurityAssessmentResultsSAR;\n}\n\n/**\n * Convert HDF Results JSON to OSCAL Assessment Results (SAR) JSON.\n *\n * @param input - HDF Results JSON string\n * @returns OSCAL SAR JSON string\n */\nexport async function convertHdfToOscalSar(input: string): Promise<string> {\n validateInputSize(input, 'hdf-to-oscal-sar');\n\n if (!input || input.trim().length === 0) {\n throw new Error('hdf-to-oscal-sar: empty input');\n }\n\n let hdfResults: HDFResults;\n try {\n hdfResults = parseHdf<HDFResults>(input);\n } catch {\n throw new Error('hdf-to-oscal-sar: failed to parse HDF JSON');\n }\n\n if (!hdfResults || typeof hdfResults !== 'object' || !('baselines' in hdfResults)) {\n throw new Error('hdf-to-oscal-sar: invalid HDF structure: missing baselines field');\n }\n\n const doc = buildOSCALDocument(hdfResults);\n return JSON.stringify(doc, null, 2);\n}\n\n/**\n * Constructs the full OSCAL assessment-results document from HDF results.\n */\nfunction buildOSCALDocument(hdfResults: HDFResults): OscalSARDocument {\n // Whole-second RFC3339 in UTC, matching what the Go converter emits.\n let timestamp = formatTimestampSeconds(new Date());\n const documentTime = hdfTime(hdfResults.timestamp);\n if (documentTime) {\n timestamp = formatTimestampSeconds(documentTime);\n }\n\n const metadata = {\n title: 'HDF Assessment Results Export',\n 'last-modified': timestamp,\n version: '1.0.0',\n 'oscal-version': OSCAL_VERSION,\n } as unknown as DocumentMetadata;\n\n let importAP: ImportAssessmentPlan;\n if (hdfResults.planRef && hdfResults.planRef !== '') {\n importAP = { href: hdfResults.planRef };\n } else {\n importAP = { href: '#' };\n }\n\n const results: AssessmentResult[] = [];\n for (const baseline of hdfResults.baselines) {\n results.push(baselineToResult(baseline, timestamp));\n }\n\n return {\n 'assessment-results': {\n uuid: crypto.randomUUID(),\n metadata,\n 'import-ap': importAP,\n results,\n },\n };\n}\n\n// Assessment-time helpers. OSCAL result.start (when the assessment ran) and\n// observation.collected (when the evidence was gathered) both describe the scan,\n// which HDF carries on each requirement result — not the document timestamp,\n// which is merely when the file was written.\n\n/** Earliest startTime across the results, or undefined if none carry one. */\nfunction earliestResultTime(results: RequirementResult[] | undefined): Date | undefined {\n let earliest: Date | undefined;\n\n for (const result of results ?? []) {\n const parsed = hdfTime(result.startTime);\n if (!parsed) continue;\n\n if (earliest === undefined || parsed < earliest) {\n earliest = parsed;\n }\n }\n\n return earliest;\n}\n\n/**\n * Render an assessment time. OSCAL requires result.start and\n * observation.collected, so a fallback is needed when HDF carries no result time\n * — but it must never win over a real one.\n */\nfunction formatAssessmentTime(time: Date | undefined, fallback: string): string {\n return time === undefined ? fallback : formatTimestampSeconds(time);\n}\n\n/** When the assessment ran: the earliest result time anywhere in the baseline. */\nfunction assessmentStart(baseline: EvaluatedBaseline, fallback: string): string {\n let earliest: Date | undefined;\n\n for (const req of baseline.requirements) {\n const reqEarliest = earliestResultTime(req.results);\n if (reqEarliest === undefined) continue;\n\n if (earliest === undefined || reqEarliest < earliest) {\n earliest = reqEarliest;\n }\n }\n\n return formatAssessmentTime(earliest, fallback);\n}\n\n/**\n * Converts a single EvaluatedBaseline to an OSCAL Result.\n */\nfunction baselineToResult(baseline: EvaluatedBaseline, timestamp: string): AssessmentResult {\n let title = baseline.name;\n if (baseline.title && baseline.title !== '') {\n title = baseline.title;\n }\n\n let description: string | undefined = 'Converted from HDF results';\n if (baseline.description && baseline.description !== '') {\n description = baseline.description;\n }\n\n const findings: Finding[] = [];\n const observations: Observation[] = [];\n const risks: IdentifiedRisk[] = [];\n\n for (const req of baseline.requirements) {\n const { finding, observation, risk } = requirementToFindingSet(req, timestamp);\n findings.push(finding);\n if (observation) {\n observations.push(observation);\n }\n if (risk) {\n risks.push(risk);\n }\n }\n\n const result = {\n uuid: crypto.randomUUID(),\n title,\n description,\n start: assessmentStart(baseline, timestamp),\n findings,\n observations,\n risks,\n } as unknown as AssessmentResult;\n\n return result;\n}\n\n/**\n * Converts an EvaluatedRequirement into a Finding, optional Observation, and optional Risk.\n */\nfunction requirementToFindingSet(\n req: EvaluatedRequirement,\n timestamp: string,\n): { finding: Finding; observation: Observation | undefined; risk: IdentifiedRisk | undefined } {\n const controlID = nistTagToControlId(req.id);\n const { state, reason } = aggregateStatus(req.results);\n const findingDesc = extractDefaultDescription(req.descriptions);\n\n // Build props from control mappings (nist/cci), source code, non-default\n // descriptions (check/fix/rationale), and v3.2 classification fields.\n const props: Property[] = [];\n const pushTagValues = (key: string): void => {\n const raw = req.tags?.[key];\n if (Array.isArray(raw)) {\n for (const v of raw) if (typeof v === 'string') props.push({ name: key, value: v });\n }\n };\n pushTagValues('nist');\n pushTagValues('cci');\n if (req.code) props.push({ name: 'code', value: req.code });\n for (const label of ['check', 'fix', 'rationale']) {\n const d = req.descriptions.find((x) => x.label === label);\n if (d) props.push({ name: label, value: d.data });\n }\n if (req.controlType) props.push({ name: 'control-type', value: req.controlType });\n if (req.verificationMethod) props.push({ name: 'verification-method', value: req.verificationMethod });\n if (req.applicability) props.push({ name: 'applicability', value: req.applicability });\n\n // refs: url/uri become OSCAL links; a plain string ref becomes a prop (not a valid href).\n const links: Link[] = [];\n if (Array.isArray(req.refs)) {\n for (const r of req.refs) {\n const o = r as { url?: unknown; uri?: unknown; ref?: unknown };\n if (typeof o.url === 'string') links.push({ href: o.url, rel: 'reference' });\n else if (typeof o.uri === 'string') links.push({ href: o.uri, rel: 'reference' });\n else if (typeof o.ref === 'string') props.push({ name: 'reference', value: o.ref });\n }\n }\n\n let title = req.id;\n if (req.title && req.title !== '') {\n title = req.title;\n }\n\n const targetStatus: StatusClass = { state } as unknown as StatusClass;\n if (reason) {\n targetStatus.reason = reason;\n }\n\n const target = {\n type: 'objective-id',\n 'target-id': controlID,\n status: targetStatus,\n } as unknown as TargetClass;\n\n const finding = {\n uuid: crypto.randomUUID(),\n title,\n description: findingDesc || '',\n props: props.length > 0 ? props : undefined,\n links: links.length > 0 ? links : undefined,\n target,\n } as Finding;\n\n // Build observation from requirement results\n let observation: Observation | undefined;\n if (req.results.length > 0) {\n const obsUUID = crypto.randomUUID();\n const obsDesc = buildObservationDescription(req.results);\n observation = {\n uuid: obsUUID,\n description: obsDesc,\n methods: ['TEST'],\n // When the evidence was gathered — the scan time for this requirement, not\n // when the file was converted.\n collected: formatAssessmentTime(earliestResultTime(req.results), timestamp),\n } as unknown as Observation;\n finding['related-observations'] = [{ 'observation-uuid': obsUUID }];\n }\n\n // Build risk from impact\n let risk: IdentifiedRisk | undefined;\n if (req.impact > 0) {\n const riskUUID = crypto.randomUUID();\n const severity = impactToSeverity(req.impact);\n risk = {\n uuid: riskUUID,\n title: `Risk for ${req.id}`,\n description: `Impact: ${req.impact.toFixed(1)} (${severity})`,\n statement: `Impact: ${req.impact.toFixed(1)} (${severity})`,\n status: riskStatusFromState(state),\n characterizations: [\n {\n facets: [\n {\n name: 'impact',\n system: 'https://fedramp.gov',\n value: severity,\n },\n ],\n },\n ],\n } as unknown as IdentifiedRisk;\n finding['related-risks'] = [{ 'risk-uuid': riskUUID }];\n }\n\n return { finding, observation, risk };\n}\n\n\n/**\n * Determines the overall finding status from requirement results.\n */\nexport function aggregateStatus(results: RequirementResult[]): { state: string; reason: string } {\n if (results.length === 0) {\n return { state: 'not-satisfied', reason: 'other' };\n }\n\n let hasFailed = false;\n let hasError = false;\n let hasNotReviewed = false;\n let hasNotApplicable = false;\n let allPassed = true;\n\n for (const r of results) {\n switch (r.status) {\n case 'passed':\n break;\n case 'failed':\n hasFailed = true;\n allPassed = false;\n break;\n case 'error':\n hasError = true;\n allPassed = false;\n break;\n case 'notReviewed':\n hasNotReviewed = true;\n allPassed = false;\n break;\n case 'notApplicable':\n hasNotApplicable = true;\n allPassed = false;\n break;\n default:\n allPassed = false;\n break;\n }\n }\n\n if (allPassed) {\n return { state: 'satisfied', reason: '' };\n }\n if (hasFailed || hasError) {\n return { state: 'not-satisfied', reason: '' };\n }\n if (hasNotReviewed) {\n return { state: 'not-satisfied', reason: 'other' };\n }\n if (hasNotApplicable) {\n return { state: 'not-satisfied', reason: 'not-applicable' };\n }\n return { state: 'not-satisfied', reason: '' };\n}\n\n/**\n * Finds the \"default\" labeled description.\n */\nfunction extractDefaultDescription(descriptions: Description[]): string {\n for (const d of descriptions) {\n if (d.label === 'default') {\n return d.data;\n }\n }\n if (descriptions.length > 0) {\n return descriptions[0]!.data;\n }\n return '';\n}\n\n/**\n * Concatenates result code descriptions and messages.\n */\nfunction buildObservationDescription(results: RequirementResult[]): string {\n const parts: string[] = [];\n for (const r of results) {\n let desc = `[${r.status}] ${r.codeDesc}`;\n if (r.message && r.message !== '') {\n desc += ': ' + r.message;\n }\n parts.push(desc);\n }\n if (parts.length === 0) {\n return 'No observations recorded';\n }\n return parts.join('\\n');\n}\n\n\n/**\n * Maps OSCAL finding state to risk status.\n */\nfunction riskStatusFromState(state: string): string {\n if (state === 'satisfied') {\n return 'closed';\n }\n return 'open';\n}\n","/**\n * Converts HDF Amendments to OSCAL Plan of Action and Milestones (POA&M) format.\n *\n * This is the reverse direction of the oscal-poam to HDF converter.\n */\n\nimport { parseTimestamp, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize, parseHdf } from '../../../shared/typescript/converterutil.js';\nimport type { HDFAmendments, StandaloneOverride } from '@mitre/hdf-schema';\nimport type {\n Oscal,\n DocumentMetadata,\n ImportSystemSecurityPlan,\n PlanOfActionAndMilestonesPOAM,\n POAMItem,\n IdentifiedRisk,\n Property,\n RiskResponse,\n RiskLog,\n} from '../../oscal-to-hdf/typescript/types.js';\nimport {\n nistTagToControlId,\n hdfStatusToOscalRiskStatus,\n OSCAL_VERSION,\n} from '../../oscal-to-hdf/typescript/shared.js';\n\n/**\n * Convert HDF Amendments JSON to OSCAL POA&M JSON.\n *\n * @param input - HDF Amendments JSON string\n * @returns OSCAL POA&M JSON string\n */\nexport async function convertHdfToOscalPoam(input: string): Promise<string> {\n validateInputSize(input, 'hdf-to-oscal-poam');\n\n if (!input || input.trim().length === 0) {\n throw new Error('hdf-to-oscal-poam: empty input');\n }\n\n let amendments: HDFAmendments;\n try {\n amendments = parseHdf<HDFAmendments>(input);\n } catch {\n throw new Error('hdf-to-oscal-poam: failed to parse JSON');\n }\n\n const poam = amendmentsToPOAM(amendments);\n\n const doc: Oscal = {\n 'plan-of-action-and-milestones': poam,\n };\n\n return JSON.stringify(doc, null, 2);\n}\n\n/** HDF dates arrive as strings from JSON.parse but are typed as Date. */\nfunction toDate(value: string | Date): Date | undefined {\n const d = typeof value === 'string' ? parseTimestamp(value) : value;\n if (!d || isNaN(d.getTime())) return undefined;\n return d;\n}\n\n/**\n * Converts parsed HDFAmendments to an OSCAL PlanOfActionAndMilestones.\n */\nfunction amendmentsToPOAM(amendments: HDFAmendments): PlanOfActionAndMilestonesPOAM {\n const now = formatTimestampSeconds(new Date());\n\n const metadata = {\n title: amendments.name,\n 'last-modified': now,\n version: '1.0.0',\n 'oscal-version': OSCAL_VERSION,\n } as unknown as DocumentMetadata;\n\n // Add responsible parties from appliedBy\n if (amendments.appliedBy) {\n const partyUUID = crypto.randomUUID();\n metadata.parties = [\n {\n uuid: partyUUID,\n type: 'person' as unknown,\n name: amendments.appliedBy.identifier,\n },\n ] as unknown as DocumentMetadata['parties'];\n metadata['responsible-parties'] = [\n {\n 'role-id': 'prepared-by',\n 'party-uuids': [partyUUID],\n },\n ];\n metadata.roles = [\n {\n id: 'prepared-by',\n title: 'Prepared By',\n },\n ];\n }\n\n // Build import-ssp\n let importSSP: ImportSystemSecurityPlan;\n if (amendments.systemRef && amendments.systemRef !== '') {\n importSSP = { href: amendments.systemRef } as ImportSystemSecurityPlan;\n } else {\n importSSP = { href: '#' } as ImportSystemSecurityPlan;\n }\n\n // Convert overrides to poam-items and collect risks\n const poamItems: POAMItem[] = [];\n const risks: IdentifiedRisk[] = [];\n\n for (const override of amendments.overrides) {\n const { item, itemRisks } = overrideToPOAMItem(override);\n poamItems.push(item);\n risks.push(...itemRisks);\n }\n\n return {\n uuid: crypto.randomUUID(),\n metadata,\n 'import-ssp': importSSP,\n risks,\n 'poam-items': poamItems,\n };\n}\n\n/**\n * Converts a single StandaloneOverride to a POAMItem and its associated Risk(s).\n */\nfunction overrideToPOAMItem(override: StandaloneOverride): { item: POAMItem; itemRisks: IdentifiedRisk[] } {\n const riskUUID = crypto.randomUUID();\n\n // Map HDF status to OSCAL risk status\n const riskStatus = hdfStatusToOscalRiskStatus(String(override.status));\n\n // Convert requirement ID from NIST notation to OSCAL control ID\n const controlID = nistTagToControlId(override.requirementId);\n\n // Build risk props: impacted control, plus the override type (disposition)\n // and any impact override.\n const riskProps: Property[] = [\n {\n name: 'impacted-control-id',\n value: controlID,\n },\n ];\n if (override.type) {\n riskProps.push({ name: 'override-type', value: String(override.type) });\n }\n if (override.impact && typeof override.impact.value === 'number') {\n riskProps.push({ name: 'impact-override', value: String(override.impact.value) });\n }\n\n // Build remediations from milestones. Each milestone becomes a planned\n // remediation task whose within-date-range end carries the estimated\n // completion — the structure the forward converter reads back.\n const remediations: RiskResponse[] = [];\n if (override.milestones) {\n for (const ms of override.milestones) {\n const msProps: Property[] = [];\n if (ms.status) {\n msProps.push({ name: 'milestone-status', value: String(ms.status) });\n }\n let tasks: RiskResponse['tasks'];\n const d = ms.estimatedCompletion ? toDate(ms.estimatedCompletion) : undefined;\n if (d) {\n const eta = formatTimestampSeconds(d);\n tasks = [{\n uuid: crypto.randomUUID(),\n type: 'milestone',\n title: ms.description,\n timing: { 'within-date-range': { start: eta, end: eta } },\n } as unknown as NonNullable<RiskResponse['tasks']>[number]];\n }\n remediations.push({\n uuid: crypto.randomUUID(),\n lifecycle: 'planned',\n title: ms.description,\n description: ms.description,\n props: msProps.length > 0 ? msProps : undefined,\n tasks,\n });\n }\n }\n\n // Build risk log entry for expiration tracking\n let riskLog: RiskLog | undefined;\n const expiresDate = override.expiresAt ? toDate(override.expiresAt) : undefined;\n if (expiresDate && expiresDate.getTime() > 0) {\n riskLog = {\n entries: [\n {\n uuid: crypto.randomUUID(),\n title: 'Scheduled review',\n description: 'Amendment expiration date',\n start: formatTimestampSeconds(expiresDate),\n 'status-change': riskStatus,\n },\n ],\n } as unknown as RiskLog;\n }\n\n // The override's enforceable expiry maps to the risk deadline — the field the\n // forward converter reads to reconstruct expiresAt.\n const deadline = expiresDate && expiresDate.getTime() > 0 ? formatTimestampSeconds(expiresDate) : undefined;\n\n const risk = {\n uuid: riskUUID,\n title: override.requirementId,\n description: override.reason,\n statement: override.reason,\n status: riskStatus,\n deadline,\n props: riskProps,\n remediations: remediations.length > 0 ? remediations : undefined,\n 'risk-log': riskLog,\n } as unknown as IdentifiedRisk;\n\n const item: POAMItem = {\n uuid: crypto.randomUUID(),\n title: override.requirementId,\n description: override.reason,\n 'related-risks': [{ 'risk-uuid': riskUUID }],\n };\n\n return { item, itemRisks: [risk] };\n}\n\n","import { parseJSON } from '@mitre/hdf-utilities';\nimport type {\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n Checksum,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n VerificationMethodEnum,\n createMinimalBaseline,\n createRequirement,\n createDescription,\n} from '@mitre/hdf-schema';\nimport {\n nistToCci,\n DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS,\n} from '@mitre/hdf-mappings';\nimport {\n inputChecksum,\n buildNistCciTags,\n deriveControlTypeFromTags,\n validateInputSize,\n buildHdfResults,\n} from '../../../shared/typescript/converterutil.js';\n\n// ---- Input types ----\n\ninterface IonChannelAnalysis {\n id: string;\n analysis_id: string;\n team_id: string;\n project_id: string;\n name: string;\n text: string;\n type: string;\n source: string;\n branch: string;\n description: string;\n risk: string;\n summary: string;\n passed: boolean;\n ruleset_id: string;\n ruleset_name: string;\n status: string;\n created_at: string;\n updated_at: string;\n duration: number;\n trigger_hash: string;\n trigger_text: string;\n trigger_author: string;\n trigger: string;\n public: boolean;\n scan_summaries: ScanSummary[];\n}\n\ninterface ScanSummary {\n id: string;\n team_id: string;\n project_id: string;\n analysis_id: string;\n summary: string;\n results: ScanResults;\n created_at: string;\n updated_at: string;\n duration: number;\n name: string;\n description: string;\n}\n\ninterface ScanResults {\n type: string;\n data: ScanData;\n}\n\ninterface ScanData {\n dependencies?: Dependency[];\n}\n\ninterface Dependency {\n latest_version: string;\n org: string;\n name: string;\n type: string;\n package: string;\n version: string;\n scope: string;\n requirement: string;\n file: string;\n outdated_version: OutdatedVersion;\n dependencies: Dependency[];\n}\n\ninterface OutdatedVersion {\n major_behind: number;\n minor_behind: number;\n patch_behind: number;\n}\n\ninterface ContextualizedDependency extends Dependency {\n parentDependencies: string[];\n}\n\n// ---- Helpers ----\n\nfunction extractAllDependencies(dep: Dependency): ContextualizedDependency[] {\n const result: ContextualizedDependency[] = [\n { ...dep, parentDependencies: [] },\n ];\n if (Array.isArray(dep.dependencies)) {\n for (const sub of dep.dependencies) {\n result.push(...extractAllDependencies(sub));\n }\n }\n return result;\n}\n\nfunction buildDependencyGraph(deps: Dependency[]): ContextualizedDependency[] {\n const graph = new Map<string, ContextualizedDependency>();\n\n // Flatten all dependencies\n for (const topLevel of deps) {\n for (const flat of extractAllDependencies(topLevel)) {\n const key = `${flat.org}/${flat.name}`;\n if (!graph.has(key)) {\n graph.set(key, flat);\n }\n }\n }\n\n // Associate parent relationships\n for (const dep of graph.values()) {\n if (Array.isArray(dep.dependencies)) {\n for (const sub of dep.dependencies) {\n const subKey = `${sub.org}/${sub.name}`;\n const child = graph.get(subKey);\n if (child) {\n const parentKey = `${dep.org}/${dep.name}`;\n child.parentDependencies.push(parentKey);\n }\n }\n }\n }\n\n return Array.from(graph.values());\n}\n\nfunction buildTitle(dep: Dependency): string {\n // Python editable install special case\n if (dep.type === 'pypi' && dep.package === 'egg' && dep.name === '-e') {\n return `Python requirements file ${dep.file}`;\n }\n\n let title = `Dependency ${dep.name} `;\n if (dep.org && dep.org.toLowerCase() !== 'n/a') {\n title += `from ${dep.org} `;\n }\n if (dep.version && dep.version.toLowerCase() !== 'n/a') {\n title += `@ ${dep.version} `;\n }\n if (dep.requirement && dep.requirement.toLowerCase() !== 'n/a') {\n title += `(Required ${dep.requirement}) `;\n }\n return title.trim();\n}\n\nfunction buildTags(\n dep: ContextualizedDependency,\n): Record<string, unknown> {\n const nist = DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS;\n const cciTags = nistToCci(nist);\n\n const extras: Record<string, unknown> = {\n org: dep.org,\n name: dep.name,\n type: dep.type,\n version: dep.version,\n latest_version: dep.latest_version,\n scope: dep.scope,\n requirement: dep.requirement,\n file: dep.file,\n };\n\n if (Array.isArray(dep.dependencies) && dep.dependencies.length > 0) {\n extras.dependencies = dep.dependencies.map((sub) => sub.name);\n }\n\n if (dep.parentDependencies.length > 0) {\n extras.parentDependencies = dep.parentDependencies;\n }\n\n return buildNistCciTags(nist, cciTags, extras);\n}\n\n// ---- Main converter ----\n\nexport async function convertIonchannelToHdf(input: string, converterVersion = '1.0.0'): Promise<string> {\n if (!input?.trim()) {\n throw new Error('Empty input');\n }\n\n validateInputSize(input, 'ionchannel');\n\n const analysis = parseJSON<IonChannelAnalysis>(input);\n\n if (!Array.isArray(analysis.scan_summaries)) {\n throw new Error(\n `Ion Channel scan_summaries invalid summary data (expecting array, got ${typeof analysis.scan_summaries})`,\n );\n }\n\n // Extract dependencies from dependency scan\n let allDeps: Dependency[] = [];\n for (const scan of analysis.scan_summaries) {\n if (scan.name === 'dependency') {\n allDeps = scan.results?.data?.dependencies ?? [];\n break;\n }\n }\n\n // Flatten and contextualize\n const contextDeps = buildDependencyGraph(allDeps);\n\n // Build requirements\n const requirements: EvaluatedRequirement[] = contextDeps.map((dep) => {\n const depId = `dependency-${dep.org}/${dep.name}`;\n const title = buildTitle(dep);\n const tags = buildTags(dep);\n const code = JSON.stringify(\n {\n latest_version: dep.latest_version,\n org: dep.org,\n name: dep.name,\n type: dep.type,\n package: dep.package,\n version: dep.version,\n scope: dep.scope,\n requirement: dep.requirement,\n file: dep.file,\n outdated_version: dep.outdated_version,\n dependencies: dep.dependencies,\n } as Dependency,\n null,\n 2,\n );\n\n const descriptions = [\n createDescription('default', `Dependency ${dep.org}/${dep.name}`),\n ];\n const results: RequirementResult[] = [\n {\n status: ResultStatus.NotReviewed,\n codeDesc: 'Dependency inventory item',\n startTime: new Date('0001-01-01T00:00:00Z'),\n },\n ];\n\n const req = createRequirement(depId, title, descriptions, 0.0, results, {\n tags,\n }) as EvaluatedRequirement;\n req.code = code;\n const controlType = deriveControlTypeFromTags(DEFAULT_COMPONENT_MANAGEMENT_NIST_TAGS);\n if (controlType !== undefined) {\n req.controlType = controlType;\n }\n req.verificationMethod = VerificationMethodEnum.Automated;\n return req;\n });\n\n const resultsChecksum: Checksum = await inputChecksum(input);\n\n const baseline = createMinimalBaseline(\n 'Ion Channel SBOM Analysis',\n requirements,\n {\n title: `Ion Channel Analysis of ${analysis.source}`,\n summary: analysis.summary,\n integrity: { algorithm: resultsChecksum.algorithm, checksum: resultsChecksum.value },\n status: 'loaded',\n },\n ) as EvaluatedBaseline;\n baseline.maintainer = 'saf@groups.mitre.org';\n\n return buildHdfResults({\n generatorName: 'ionchannel-to-hdf',\n converterVersion,\n toolName: 'Ion Channel',\n toolFormat: 'JSON',\n baselines: [baseline],\n timestamp: new Date(),\n });\n}\n","/**\n * Shared mapping between VEX (OpenVEX, CSAF VEX, CycloneDX VEX) and HDF\n * Amendments. Importers normalize ecosystem-specific statuses + justifications\n * to the canonical forms here; exporters render HDF override state back to\n * the canonical VEX shape.\n *\n * Synthesis happens only where the consumer has explicitly acted. The\n * helper never invents amendments from raw findings, and never claims a\n * real system is patched without a closure amendment chained on top of an\n * open POA&M (real-system vs abstract-vuln distinction).\n */\n\nimport type { AffectedPackage, Evidence, StandaloneOverride } from '@mitre/hdf-schema';\nimport {\n Ecosystem,\n EvidenceType,\n Justification,\n OverrideType,\n ResultStatus,\n} from '@mitre/hdf-schema';\nimport { parsePurl } from '@mitre/hdf-utilities';\n\n/** Canonical VEX status across OpenVEX / CSAF / CycloneDX. */\nexport const VexStatus = {\n NotAffected: 'not_affected',\n Affected: 'affected',\n Fixed: 'fixed',\n UnderInvestigation: 'under_investigation',\n} as const;\n\nexport type VexStatus = (typeof VexStatus)[keyof typeof VexStatus];\n\n/**\n * Map an ecosystem-specific status string to the canonical VexStatus.\n * Returns undefined for values without a clean mapping — caller should warn\n * and skip, not guess.\n */\nexport function normalizeStatus(raw: string): VexStatus | undefined {\n switch (raw.trim().toLowerCase()) {\n case 'not_affected':\n case 'known_not_affected':\n case 'false_positive':\n return VexStatus.NotAffected;\n case 'affected':\n case 'known_affected':\n case 'exploitable':\n return VexStatus.Affected;\n case 'fixed':\n case 'first_fixed':\n case 'resolved':\n case 'resolved_with_pedigree':\n return VexStatus.Fixed;\n case 'under_investigation':\n case 'in_triage':\n return VexStatus.UnderInvestigation;\n default:\n return undefined;\n }\n}\n\n/**\n * Map an ecosystem-specific justification string to the canonical HDF\n * Justification enum. Returns undefined for unknown values; callers SHOULD\n * log unknown values rather than silently dropping (the schema spec wants\n * pass-through, but practically we expect the enum to be extended when a\n * new vocabulary is integrated rather than carrying raw labels\n * indefinitely).\n *\n * The HDF Justification enum (v3.2.x) covers:\n * - the original OpenVEX / CSAF VEX five values\n * - CycloneDX-specific reachability values (requires_*, protected_*)\n * that describe why a vulnerable code path is unreachable in the\n * deployed configuration.\n */\nexport function normalizeJustification(raw: string): Justification | undefined {\n switch (raw.trim().toLowerCase()) {\n case 'component_not_present':\n case 'code_not_present':\n return Justification.ComponentNotPresent;\n case 'vulnerable_code_not_present':\n return Justification.VulnerableCodeNotPresent;\n case 'vulnerable_code_not_in_execute_path':\n case 'code_not_reachable':\n return Justification.VulnerableCodeNotInExecutePath;\n case 'vulnerable_code_cannot_be_controlled_by_adversary':\n return Justification.VulnerableCodeCannotBeControlledByAdversary;\n case 'inline_mitigations_already_exist':\n case 'protected_by_mitigating_control':\n return Justification.InlineMitigationsAlreadyExist;\n case 'requires_configuration':\n return Justification.RequiresConfiguration;\n case 'requires_dependency':\n return Justification.RequiresDependency;\n case 'requires_environment':\n return Justification.RequiresEnvironment;\n case 'protected_by_compiler':\n return Justification.ProtectedByCompiler;\n case 'protected_at_runtime':\n return Justification.ProtectedAtRuntime;\n case 'protected_at_perimeter':\n return Justification.ProtectedAtPerimeter;\n default:\n return undefined;\n }\n}\n\n/**\n * Render an HDF Justification value as the CycloneDX-native vocabulary.\n * CycloneDX uses short-form names (code_not_present, code_not_reachable,\n * protected_by_mitigating_control) for the three justifications shared\n * with OpenVEX/CSAF, and shares the six CycloneDX-specific reachability\n * values verbatim.\n *\n * Returns undefined when the HDF value has no equivalent in CycloneDX's\n * enum (vulnerable_code_not_present and\n * vulnerable_code_cannot_be_controlled_by_adversary). Callers should\n * omit the justification field in that case.\n */\nexport function justificationForCycloneDX(j: Justification): string | undefined {\n switch (j) {\n case Justification.ComponentNotPresent:\n return 'code_not_present';\n case Justification.VulnerableCodeNotInExecutePath:\n return 'code_not_reachable';\n case Justification.InlineMitigationsAlreadyExist:\n return 'protected_by_mitigating_control';\n case Justification.RequiresConfiguration:\n case Justification.RequiresDependency:\n case Justification.RequiresEnvironment:\n case Justification.ProtectedByCompiler:\n case Justification.ProtectedAtRuntime:\n case Justification.ProtectedAtPerimeter:\n return String(j);\n default:\n return undefined;\n }\n}\n\nexport interface ImportTarget {\n overrideType: OverrideType;\n status?: ResultStatus;\n /** True when the canonical VEX status implies the importer should\n * populate justification on the synthesized override (not_affected). */\n setJustification: boolean;\n /** POAM action_statement template for the \"fixed\" path. Empty otherwise. */\n poamActionTemplate: string;\n}\n\n/**\n * Return the amendment shape an importer should produce for a canonical VEX\n * status. Returns undefined for \"affected\" and \"under_investigation\" — those\n * are informational; the consumer creates an amendment later if they act.\n */\nexport function importTargetFor(status: VexStatus): ImportTarget | undefined {\n switch (status) {\n case VexStatus.NotAffected:\n return {\n overrideType: OverrideType.FalsePositive,\n status: ResultStatus.Passed,\n setJustification: true,\n poamActionTemplate: '',\n };\n case VexStatus.Fixed:\n return {\n overrideType: OverrideType.Poam,\n // Status stays 'failed' on the open POA&M: VEX 'fixed' is an\n // abstract supplier claim about a product version, not evidence\n // the assessed system has the patch. Re-scan is required to change\n // the effective status.\n status: ResultStatus.Failed,\n setJustification: false,\n poamActionTemplate:\n 'vendor reports fix; apply and re-scan to verify',\n };\n case VexStatus.Affected:\n case VexStatus.UnderInvestigation:\n return undefined;\n /* c8 ignore next 2 — every VexStatus has a case above */\n default:\n return undefined;\n }\n}\n\n/**\n * Return the canonical VEX status an exporter should emit for an HDF\n * override. Returns undefined when no VEX statement should be emitted —\n * the consumer has not acted, and VEX requires a deliberate statement.\n *\n * `allMilestonesCompleted` and `closureChained` are consulted only for\n * POA&M overrides. Closure is signalled by BOTH flags being true; either\n * alone is insufficient.\n */\nexport function exportStatusFor(\n override: StandaloneOverride | undefined,\n allMilestonesCompleted: boolean,\n closureChained: boolean,\n): VexStatus | undefined {\n if (!override) {\n return undefined;\n }\n if (override.justification) {\n return VexStatus.NotAffected;\n }\n switch (override.type) {\n case OverrideType.FalsePositive:\n case OverrideType.Attestation:\n case OverrideType.Inherited:\n return VexStatus.NotAffected;\n case OverrideType.Waiver:\n case OverrideType.RiskAdjustment:\n case OverrideType.OperationalRequirement:\n return VexStatus.Affected;\n case OverrideType.Poam:\n return allMilestonesCompleted && closureChained\n ? VexStatus.Fixed\n : VexStatus.Affected;\n /* c8 ignore next 2 — every OverrideType has a case above */\n default:\n return undefined;\n }\n}\n\n// Maps PURL `type` segment → AffectedPackage.ecosystem. Unknown types fall\n// back to `generic`, which the schema enum permits as a catch-all.\nconst ECOSYSTEM_FROM_PURL_TYPE: Record<string, Ecosystem> = {\n npm: Ecosystem.Npm,\n pypi: Ecosystem.Pypi,\n rpm: Ecosystem.RPM,\n deb: Ecosystem.Deb,\n maven: Ecosystem.Maven,\n gem: Ecosystem.Gem,\n nuget: Ecosystem.Nuget,\n golang: Ecosystem.Go,\n go: Ecosystem.Go,\n cargo: Ecosystem.Cargo,\n};\n\n/**\n * Build an AffectedPackage from a single product identifier string emitted\n * by a VEX format. Recognizes PURLs and CPE 2.3 strings; returns undefined\n * for opaque identifiers (importer should drop the entry — schema additions\n * forbid fabricating name+version).\n */\nexport function affectedPackageFromIdentifier(\n identifier: string,\n): AffectedPackage | undefined {\n if (!identifier) return undefined;\n if (identifier.startsWith('pkg:')) {\n const parsed = parsePurl(identifier);\n if (parsed) {\n const pkg: AffectedPackage = { purl: identifier };\n /* c8 ignore next 2 — parsePurl populates name/version when the\n identifier was a well-formed purl; the absent branches require a\n malformed-but-prefixed input that loses these fields without\n triggering the outer null return. Defensive. */\n if (parsed.name) pkg.name = parsed.name;\n if (parsed.version) pkg.version = parsed.version;\n pkg.ecosystem = ECOSYSTEM_FROM_PURL_TYPE[parsed.type] ?? Ecosystem.Generic;\n return pkg;\n }\n // Malformed purl with the prefix — preserve as purl-only.\n return { purl: identifier };\n }\n if (identifier.startsWith('cpe:2.3:')) {\n return { cpe: identifier };\n }\n return undefined;\n}\n\n/**\n * Build a unique list of AffectedPackage entries from a sequence of product\n * identifier strings. Empty / unresolvable identifiers are dropped; duplicate\n * purls/cpes/names are collapsed.\n */\nexport function affectedPackagesFromIdentifiers(\n identifiers: readonly string[],\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seen = new Set<string>();\n for (const id of identifiers) {\n const pkg = affectedPackageFromIdentifier(id);\n if (!pkg) continue;\n /* c8 ignore next — affectedPackageFromIdentifier always emits either\n purl or cpe, so the name fallback branch isn't reachable through\n this caller. Kept for safety if a hand-built AffectedPackage flows\n through a future caller. */\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seen.has(key)) continue;\n seen.add(key);\n out.push(pkg);\n }\n return out;\n}\n\n/**\n * Render an AffectedPackage as a single identifier string suitable for\n * round-tripping into a VEX format. Prefers purl > cpe > name@version.\n * Returns undefined when nothing identifying is set.\n */\nexport function affectedPackageToIdentifier(\n pkg: AffectedPackage,\n): string | undefined {\n if (pkg.purl) return pkg.purl;\n if (pkg.cpe) return pkg.cpe;\n if (pkg.name && pkg.version) return `${pkg.name}@${pkg.version}`;\n if (pkg.name) return pkg.name;\n return undefined;\n}\n\n/** Replace the `@version` segment of a purl (between `@` and `?`/`#`), inserting one if absent. */\nexport function swapPurlVersion(purl: string, version: string): string {\n const at = purl.indexOf('@');\n if (at >= 0) {\n const rest = purl.slice(at + 1);\n const end = rest.search(/[?#]/);\n const tail = end >= 0 ? rest.slice(end) : '';\n return `${purl.slice(0, at)}@${version}${tail}`;\n }\n const end = purl.search(/[?#]/);\n return end >= 0 ? `${purl.slice(0, end)}@${version}${purl.slice(end)}` : `${purl}@${version}`;\n}\n\n/**\n * Identifier for the FIXED version of a package (purl with the version swapped\n * to fixedInVersion, or name@fixedInVersion). Undefined when there is no\n * fixedInVersion or no purl/name to anchor it (a bare cpe cannot be swapped).\n */\nexport function fixedPackageIdentifier(pkg: AffectedPackage): string | undefined {\n if (!pkg.fixedInVersion) return undefined;\n if (pkg.purl) return swapPurlVersion(pkg.purl, pkg.fixedInVersion);\n if (pkg.name) return `${pkg.name}@${pkg.fixedInVersion}`;\n return undefined;\n}\n\n/**\n * `vers` (Package URL version-range) type for a package, from its ecosystem or\n * the purl type. Returns undefined when neither is known (so callers avoid\n * emitting an invalid range).\n */\nexport function versTypeFor(pkg: AffectedPackage): string | undefined {\n if (pkg.ecosystem) return String(pkg.ecosystem).toLowerCase();\n if (pkg.purl) {\n const m = /^pkg:([^/]+)\\//.exec(pkg.purl);\n if (m?.[1]) return m[1].toLowerCase();\n }\n return undefined;\n}\n\n/**\n * Build an HDF Evidence entry pointing at the upstream VEX document. Used by\n * importers to preserve provenance even though we lose the structured\n * statement_id. Returns undefined when sourceURI is empty — don't fabricate.\n */\nexport function supplierEvidence(\n sourceURI: string,\n description?: string,\n): Evidence | undefined {\n if (!sourceURI.trim()) {\n return undefined;\n }\n return {\n type: EvidenceType.URL,\n data: sourceURI,\n description: description?.trim() ? description : 'Upstream VEX statement',\n };\n}\n","/**\n * OpenVEX to HDF Amendments converter.\n *\n * VEX statements are consumer-attached context for CVE findings. The act of\n * attaching IS the amendment, so this converter emits HDF Amendments rather\n * than HDF Results.\n *\n * VEX 'fixed' is an abstract supplier claim; the assessed system has not\n * been verified to carry the fix. Imports therefore become open POA&M\n * overrides (status pinned to failed pending re-scan), not status flips.\n *\n * Spec: https://github.com/openvex/spec\n */\n\nimport {\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackagesFromIdentifiers,\n importTargetFor,\n normalizeJustification,\n normalizeStatus,\n supplierEvidence,\n} from '../../../shared/typescript/vex/mapping.js';\n\n/** One year in milliseconds. VEX statements are re-evaluated as new info\n * arrives; one year is a defensive default consistent with the\n * no-permanent-amendment rule on Standalone_Override. */\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface OpenVexVulnerability {\n '@id'?: string;\n name?: string;\n description?: string;\n aliases?: string[];\n}\n\ninterface OpenVexProduct {\n '@id'?: string;\n identifiers?: Record<string, string>;\n hashes?: Record<string, string>;\n}\n\ninterface OpenVexStatement {\n vulnerability?: OpenVexVulnerability;\n products?: OpenVexProduct[];\n status?: string;\n justification?: string;\n impact_statement?: string;\n action_statement?: string;\n timestamp?: string;\n author?: string;\n}\n\ninterface OpenVexDocument {\n '@context'?: string;\n '@id'?: string;\n author?: string;\n role?: string;\n timestamp?: string;\n version?: number;\n statements?: OpenVexStatement[];\n}\n\nexport async function convertOpenVexToHdf(\n input: string,\n converterVersion = '1.0.0',\n): Promise<HDFAmendments> {\n validateInputSize(input, 'openvex-to-hdf');\n const doc = parseJSON<OpenVexDocument>(input);\n const docTime = (doc.timestamp ? parseTimestamp(doc.timestamp) : null) ?? new Date();\n\n const overrides: StandaloneOverride[] = [];\n for (const stmt of doc.statements ?? []) {\n const override = statementToOverride(stmt, doc, docTime);\n if (override) {\n overrides.push(override);\n }\n }\n\n // HDF Amendments requires overrides.minItems=1. A VEX document with only\n // 'affected' or 'under_investigation' statements has no consumer-action\n // payload, so we refuse to write an empty amendments document.\n if (overrides.length === 0) {\n throw new Error(\n \"openvex-to-hdf: VEX document contains no actionable statements (all 'affected' or 'under_investigation'); no amendment to write\",\n );\n }\n\n const name = doc.author\n ? `OpenVEX statements from ${doc.author}`\n : 'OpenVEX statements';\n\n return {\n name,\n description: `Imported VEX statements from ${truncateId(doc['@id'] ?? '')}`,\n overrides,\n appliedBy: identityFor(doc.author, doc.role),\n generator: {\n name: 'openvex-to-hdf',\n version: converterVersion,\n },\n integrity: await inputIntegrity(input),\n } as HDFAmendments;\n}\n\nfunction statementToOverride(\n stmt: OpenVexStatement,\n doc: OpenVexDocument,\n docTime: Date,\n): StandaloneOverride | undefined {\n const canonical = normalizeStatus(stmt.status ?? '');\n if (!canonical) return undefined;\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const requirementId = stmt.vulnerability?.name ?? stmt.vulnerability?.['@id'] ?? '';\n if (!requirementId) return undefined;\n\n const stmtTime = (stmt.timestamp ? parseTimestamp(stmt.timestamp) : null) ?? docTime;\n const author = stmt.author ?? doc.author ?? '';\n\n const expiresAt = new Date(stmtTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId,\n appliedAt: stmtTime,\n expiresAt,\n appliedBy: identityFor(author, doc.role),\n reason: buildReason(stmt, target.poamActionTemplate),\n } as StandaloneOverride;\n\n const productIds = (stmt.products ?? [])\n .map((p) => p['@id'])\n .filter((id): id is string => Boolean(id));\n const affectedPackages = affectedPackagesFromIdentifiers(productIds);\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) {\n override.status = target.status;\n }\n\n if (target.setJustification && stmt.justification) {\n const j = normalizeJustification(stmt.justification);\n if (j) {\n override.justification = j;\n }\n }\n\n const ev = supplierEvidence(doc['@id'] ?? '', 'OpenVEX document');\n if (ev) {\n override.evidence = [ev as Evidence];\n }\n\n if (target.overrideType === OverrideType.Poam) {\n const milestone: Milestone = {\n description: target.poamActionTemplate,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction buildReason(stmt: OpenVexStatement, poamTemplate: string): string {\n const parts: string[] = [];\n if (stmt.impact_statement) parts.push(stmt.impact_statement);\n if (stmt.action_statement) parts.push(stmt.action_statement);\n // Justification and product list are fully structured fields now\n // (Justification enum + Standalone_Override.affectedPackages); neither\n // is mirrored into reason.\n if (parts.length === 0) {\n return poamTemplate || `Imported from OpenVEX status \"${stmt.status ?? ''}\"`;\n }\n return parts.join('\\n');\n}\n\nfunction identityFor(author: string | undefined, role: string | undefined): Identity {\n if (!author) {\n return {\n type: IdentityType.System,\n identifier: 'openvex-import',\n } as Identity;\n }\n const id: Identity = {\n type: author.includes('@') ? IdentityType.Email : IdentityType.Simple,\n identifier: author,\n } as Identity;\n if (role) {\n id.description = role;\n }\n return id;\n}\n\nfunction truncateId(id: string): string {\n const MAX = 80;\n return id.length <= MAX ? id : `${id.slice(0, MAX)}...`;\n}\n\n","/**\n * CSAF VEX to HDF Amendments converter.\n *\n * CSAF (OASIS Common Security Advisory Framework) VEX profile is the\n * vendor-advisory format. Per the amendment-output pattern (Step 4f),\n * 'fixed' becomes an open POA&M, not a status flip — supplier claim is\n * not assessed-system evidence.\n *\n * Spec: https://docs.oasis-open.org/csaf/csaf/v2.0/csaf-v2.0.html\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n Ecosystem,\n IdentityType,\n Justification,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageFromIdentifier,\n importTargetFor,\n normalizeJustification,\n supplierEvidence,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface CsafPublisher {\n category?: string;\n name?: string;\n namespace?: string;\n}\n\ninterface CsafTracking {\n id?: string;\n status?: string;\n version?: string;\n current_release_date?: string;\n initial_release_date?: string;\n}\n\ninterface CsafReference {\n category?: string;\n summary?: string;\n url?: string;\n}\n\ninterface CsafNote {\n category?: string;\n text?: string;\n title?: string;\n}\n\ninterface CsafDocumentMeta {\n category?: string;\n csaf_version?: string;\n title?: string;\n publisher?: CsafPublisher;\n tracking?: CsafTracking;\n notes?: CsafNote[];\n references?: CsafReference[];\n}\n\ninterface CsafProductStatus {\n first_affected?: string[];\n first_fixed?: string[];\n fixed?: string[];\n known_affected?: string[];\n known_not_affected?: string[];\n last_affected?: string[];\n recommended?: string[];\n under_investigation?: string[];\n}\n\ninterface CsafThreat {\n category?: string;\n details?: string;\n product_ids?: string[];\n}\n\ninterface CsafRemediation {\n category?: string;\n details?: string;\n product_ids?: string[];\n url?: string;\n}\n\ninterface CsafFlag {\n date?: string;\n label?: string;\n product_ids?: string[];\n}\n\ninterface CsafVulnerability {\n cve?: string;\n notes?: CsafNote[];\n product_status?: CsafProductStatus;\n threats?: CsafThreat[];\n remediations?: CsafRemediation[];\n flags?: CsafFlag[];\n references?: CsafReference[];\n}\n\ninterface CsafProductIdentificationHelper {\n purl?: string;\n cpe?: string;\n}\n\ninterface CsafFullProductName {\n name?: string;\n product_id?: string;\n product_identification_helper?: CsafProductIdentificationHelper;\n}\n\ninterface CsafBranch {\n category?: string;\n name?: string;\n product?: CsafFullProductName;\n branches?: CsafBranch[];\n}\n\ninterface CsafProductTree {\n branches?: CsafBranch[];\n full_product_names?: CsafFullProductName[];\n}\n\ninterface CsafDocument {\n document?: CsafDocumentMeta;\n product_tree?: CsafProductTree;\n vulnerabilities?: CsafVulnerability[];\n}\n\nexport async function convertCsafVexToHdf(\n input: string,\n converterVersion = '1.0.0',\n): Promise<HDFAmendments> {\n validateInputSize(input, 'csaf-vex-to-hdf');\n const doc = parseJSON<CsafDocument>(input);\n // CSAF schema requires document + document.category + document.tracking +\n // document.publisher. After this check passes we treat them as present\n // — defensive optional-chaining everywhere bloats the branch surface\n // without buying real safety against a malformed input we've already\n // rejected.\n if (doc.document?.category !== 'csaf_vex') {\n throw new Error(\n `csaf-vex-to-hdf: document.category is ${JSON.stringify(doc.document?.category)}; only 'csaf_vex' is supported`,\n );\n }\n const dm = doc.document;\n const tracking = dm.tracking ?? {};\n const publisher = dm.publisher ?? {};\n\n const docTime =\n (tracking.current_release_date ? parseTimestamp(tracking.current_release_date) : null) ??\n new Date();\n\n const productLookup = buildProductLookup(doc.product_tree);\n\n const overrides: StandaloneOverride[] = [];\n for (const v of doc.vulnerabilities ?? []) {\n overrides.push(...vulnerabilityToOverrides(v, publisher, tracking, docTime, productLookup));\n }\n\n if (overrides.length === 0) {\n throw new Error(\n 'csaf-vex-to-hdf: CSAF VEX document contains no actionable statements (only affected/under_investigation/recommended); no amendment to write',\n );\n }\n\n const publisherName = publisher.name ?? '';\n return {\n name: publisherName ? `CSAF VEX statements from ${publisherName}` : 'CSAF VEX statements',\n description: `Imported VEX advisory ${tracking.id ?? ''}`,\n overrides,\n appliedBy: identityFor(publisher),\n generator: { name: 'csaf-vex-to-hdf', version: converterVersion },\n integrity: await inputIntegrity(input),\n version: tracking.version,\n } as HDFAmendments;\n}\n\nfunction vulnerabilityToOverrides(\n vuln: CsafVulnerability,\n publisher: CsafPublisher,\n tracking: CsafTracking,\n docTime: Date,\n productLookup: Map<string, AffectedPackage>,\n): StandaloneOverride[] {\n if (!vuln.cve) return [];\n const ps = vuln.product_status;\n if (!ps) return [];\n\n const out: StandaloneOverride[] = [];\n if (ps.known_not_affected?.length) {\n const o = buildOverride(vuln, publisher, tracking, docTime, VexStatus.NotAffected, ps.known_not_affected, productLookup);\n if (o) out.push(o);\n }\n const fixedProducts = [...(ps.fixed ?? []), ...(ps.first_fixed ?? [])];\n if (fixedProducts.length > 0) {\n const o = buildOverride(vuln, publisher, tracking, docTime, VexStatus.Fixed, fixedProducts, productLookup);\n if (o) out.push(o);\n }\n // known_affected / first_affected / last_affected / under_investigation /\n // recommended produce no override (informational only).\n return out;\n}\n\nfunction buildOverride(\n vuln: CsafVulnerability,\n publisher: CsafPublisher,\n tracking: CsafTracking,\n docTime: Date,\n canonical: VexStatus,\n products: string[],\n productLookup: Map<string, AffectedPackage>,\n): StandaloneOverride | undefined {\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const expiresAt = new Date(docTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId: vuln.cve!,\n appliedAt: docTime,\n expiresAt,\n appliedBy: identityFor(publisher),\n reason: buildReason(vuln, products),\n } as StandaloneOverride;\n\n const affectedPackages = resolveAffectedPackages(products, productLookup);\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) override.status = target.status;\n\n if (target.setJustification) {\n const j = pickJustification(vuln, products);\n if (j) override.justification = j;\n }\n\n const evidence: Evidence[] = [];\n const advisoryEv = supplierEvidence(advisoryURI(publisher, tracking), 'CSAF VEX advisory');\n if (advisoryEv) evidence.push(advisoryEv as Evidence);\n for (const r of vuln.references ?? []) {\n if (!r.url) continue;\n const ev = supplierEvidence(r.url, r.summary ?? r.category ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n if (evidence.length > 0) override.evidence = evidence;\n\n if (target.overrideType === OverrideType.Poam) {\n const action = firstActionRemediation(vuln, products) || target.poamActionTemplate;\n const milestone: Milestone = {\n description: action,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction pickJustification(\n vuln: CsafVulnerability,\n products: string[],\n): Justification | undefined {\n const scope = new Set(products);\n for (const f of vuln.flags ?? []) {\n const ids = f.product_ids ?? [];\n if (!overlap(ids, scope)) continue;\n if (!f.label) continue;\n const j = normalizeJustification(f.label);\n if (j) return j;\n }\n return undefined;\n}\n\nfunction firstActionRemediation(vuln: CsafVulnerability, products: string[]): string {\n const scope = new Set(products);\n for (const r of vuln.remediations ?? []) {\n const ids = r.product_ids;\n if (ids && ids.length > 0 && !overlap(ids, scope)) continue;\n if (\n (r.category === 'vendor_fix' || r.category === 'mitigation' || r.category === 'workaround') &&\n r.details\n ) {\n return r.details;\n }\n }\n return '';\n}\n\n// buildReason composes the override reason from CSAF prose (description\n// note + product-scoped threat details). Justification and product list\n// are fully structured fields now (Justification enum +\n// Standalone_Override.affectedPackages); neither is mirrored into reason.\n// Falls back to a status synopsis when CSAF carries no prose, so the\n// schema's required `reason` string is never empty.\nfunction buildReason(vuln: CsafVulnerability, products: string[]): string {\n const parts: string[] = [];\n const scope = new Set(products);\n for (const n of vuln.notes ?? []) {\n if (n.category === 'description' && n.text) parts.push(n.text);\n }\n for (const t of vuln.threats ?? []) {\n if (!t.details) continue;\n const ids = t.product_ids;\n if (ids && ids.length > 0 && !overlap(ids, scope)) continue;\n parts.push(t.details);\n }\n if (parts.length === 0) {\n return `Imported from CSAF VEX (${vuln.cve ?? 'unknown CVE'})`;\n }\n return parts.join('\\n');\n}\n\n/**\n * Walk a CSAF product_tree and build a lookup from product_id to a\n * structured AffectedPackage. Prefers product_identification_helper.purl,\n * then .cpe, then the full_product_name's `name` (used for matching only\n * — name+version is hard to derive from CSAF reliably, so we drop entries\n * with no purl and no cpe).\n */\nexport function buildProductLookup(\n tree: CsafProductTree | undefined,\n): Map<string, AffectedPackage> {\n const lookup = new Map<string, AffectedPackage>();\n if (!tree) return lookup;\n if (tree.full_product_names) {\n for (const fp of tree.full_product_names) {\n registerProduct(fp, lookup);\n }\n }\n if (tree.branches) {\n walkBranches(tree.branches, lookup);\n }\n return lookup;\n}\n\ninterface BranchContext {\n productName?: string;\n version?: string;\n}\n\nfunction walkBranches(\n branches: CsafBranch[],\n lookup: Map<string, AffectedPackage>,\n ctx: BranchContext = {},\n): void {\n for (const b of branches) {\n // Track product_name and product_version branches so leaf products can\n // recover name+version even when no product_identification_helper is set.\n const next: BranchContext = { ...ctx };\n /* c8 ignore next 2 — falsy branches require a malformed CSAF branch\n node (category set but name empty) which we don't fixture. */\n if (b.category === 'product_name' && b.name) next.productName = b.name;\n if (b.category === 'product_version' && b.name) next.version = b.name;\n if (b.product) registerProduct(b.product, lookup, next);\n if (b.branches) walkBranches(b.branches, lookup, next);\n }\n}\n\nfunction registerProduct(\n fp: CsafFullProductName,\n lookup: Map<string, AffectedPackage>,\n ctx: BranchContext = {},\n): void {\n /* c8 ignore next — defensive against a malformed CSAF full_product_name\n missing its required product_id field; not fixtured. */\n if (!fp.product_id) return;\n const helper = fp.product_identification_helper;\n if (helper?.purl) {\n const pkg = affectedPackageFromIdentifier(helper.purl);\n /* c8 ignore next 4 — affectedPackageFromIdentifier always returns a\n non-null value for an input that starts with 'pkg:' (preserves\n malformed input as purl-only). The null branch is unreachable from\n this callsite. */\n if (pkg) {\n lookup.set(fp.product_id, pkg);\n return;\n }\n }\n if (helper?.cpe) {\n const pkg = affectedPackageFromIdentifier(helper.cpe);\n /* c8 ignore next 4 — same as above; identifiers starting with\n 'cpe:2.3:' always produce a cpe-only AffectedPackage. */\n if (pkg) {\n lookup.set(fp.product_id, pkg);\n return;\n }\n }\n // No portable identifier — fall back to ancestor product_name +\n // product_version branches if both are present. Ecosystem stays generic\n // since CSAF doesn't disambiguate package managers; the structured triple\n // is still useful for downstream matching.\n if (ctx.productName && ctx.version) {\n lookup.set(fp.product_id, {\n name: ctx.productName,\n version: ctx.version,\n ecosystem: Ecosystem.Generic,\n });\n }\n // Otherwise drop the entry — schema requires name+version+ecosystem OR\n // purl OR cpe; fabricating identity is the anti-pattern Step 1b forbids.\n}\n\nfunction resolveAffectedPackages(\n productIds: string[],\n lookup: Map<string, AffectedPackage>,\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seenKeys = new Set<string>();\n for (const id of productIds) {\n const pkg = lookup.get(id);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n out.push(pkg);\n }\n return out;\n}\n\nfunction identityFor(p: CsafPublisher): Identity {\n if (!p.name) {\n return { type: IdentityType.System, identifier: 'csaf-vex-import' } as Identity;\n }\n const id: Identity = { type: IdentityType.Simple, identifier: p.name } as Identity;\n if (p.category) id.description = p.category;\n return id;\n}\n\nfunction advisoryURI(publisher: CsafPublisher, tracking: CsafTracking): string {\n // tracking.id is required by the CSAF schema; we've already validated\n // document.category so the read is safe. `?? ''` is a paranoid guard\n // against a malformed file that already failed the category check above.\n /* c8 ignore next */\n const id = tracking.id ?? '';\n const ns = publisher.namespace;\n if (ns && id) return `${ns.replace(/\\/+$/, '')}/${id}`;\n return id;\n}\n\n// overlap is only called with non-empty product scopes (we construct the\n// scope from a status bucket that we already checked is non-empty), so\n// the empty-set guard is not needed.\nfunction overlap(ids: string[], scope: Set<string>): boolean {\n return ids.some((id) => scope.has(id));\n}\n","/**\n * CycloneDX VEX to HDF Amendments converter.\n *\n * CycloneDX VEX is not a separate format — it's a CycloneDX BOM whose\n * vulnerabilities[] carry an `analysis` object. CycloneDX-specific\n * justifications without an HDF equivalent (requires_configuration,\n * protected_by_compiler, etc.) are preserved verbatim in the reason\n * field via the shared helper's unknown-value passthrough.\n *\n * Spec: https://cyclonedx.org/use-cases/#vulnerability-exploitability\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport {\n Ecosystem,\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type Evidence,\n type HDFAmendments,\n type Identity,\n type Milestone,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport {\n inputIntegrity,\n validateInputSize,\n} from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageFromIdentifier,\n importTargetFor,\n normalizeJustification,\n normalizeStatus,\n supplierEvidence,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst DEFAULT_EXPIRY_HORIZON_MS = 365 * 24 * 60 * 60 * 1000;\n\ninterface Source {\n name?: string;\n url?: string;\n}\n\ninterface Author {\n name?: string;\n email?: string;\n}\n\ninterface Tool {\n vendor?: string;\n name?: string;\n version?: string;\n}\n\ninterface Component {\n name?: string;\n version?: string;\n type?: string;\n 'bom-ref'?: string;\n purl?: string;\n}\n\ninterface Reference {\n id?: string;\n source?: Source;\n}\n\ninterface Analysis {\n state?: string;\n justification?: string;\n response?: string[];\n detail?: string;\n}\n\ninterface AffectedRef {\n ref?: string;\n}\n\ninterface Vulnerability {\n id?: string;\n source?: Source;\n references?: Reference[];\n description?: string;\n detail?: string;\n analysis?: Analysis;\n affects?: AffectedRef[];\n}\n\ninterface Metadata {\n timestamp?: string;\n component?: Component;\n authors?: Author[];\n tools?: Tool[];\n}\n\ninterface BOM {\n bomFormat?: string;\n specVersion?: string;\n serialNumber?: string;\n metadata?: Metadata;\n vulnerabilities?: Vulnerability[];\n components?: Component[];\n}\n\nexport async function convertCyclonedxVexToHdf(\n input: string,\n converterVersion = '1.0.0',\n): Promise<HDFAmendments> {\n validateInputSize(input, 'cyclonedx-vex-to-hdf');\n const bom = parseJSON<BOM>(input);\n if (bom.bomFormat !== 'CycloneDX') {\n throw new Error(\n `cyclonedx-vex-to-hdf: bomFormat is ${JSON.stringify(bom.bomFormat)}; only 'CycloneDX' is supported`,\n );\n }\n\n const docTime =\n (bom.metadata?.timestamp ? parseTimestamp(bom.metadata.timestamp) : null) ?? new Date();\n const productLookup = buildProductLookup(bom);\n const publisher = publisherIdentityOrDefault(bom);\n\n const overrides: StandaloneOverride[] = [];\n for (const v of bom.vulnerabilities ?? []) {\n const o = vulnerabilityToOverride(v, productLookup, docTime, publisher);\n if (o) overrides.push(o);\n }\n\n if (overrides.length === 0) {\n throw new Error(\n 'cyclonedx-vex-to-hdf: BOM contains no actionable VEX statements (only exploitable/in_triage or no analysis); no amendment to write',\n );\n }\n\n const publisherName = publisher.identifier;\n const name =\n publisherName && publisherName !== 'cyclonedx-vex-import'\n ? `CycloneDX VEX statements from ${publisherName}`\n : 'CycloneDX VEX statements';\n const description = bom.serialNumber\n ? `Imported CycloneDX VEX ${bom.serialNumber}`\n : 'Imported CycloneDX VEX';\n\n return {\n name,\n description,\n overrides,\n appliedBy: publisher,\n generator: { name: 'cyclonedx-vex-to-hdf', version: converterVersion },\n integrity: await inputIntegrity(input),\n } as HDFAmendments;\n}\n\nfunction vulnerabilityToOverride(\n v: Vulnerability,\n productLookup: Map<string, Component>,\n docTime: Date,\n publisher: Identity,\n): StandaloneOverride | undefined {\n if (!v.id || !v.analysis?.state) return undefined;\n const canonical = normalizeStatus(v.analysis.state);\n if (!canonical) return undefined;\n const target = importTargetFor(canonical);\n if (!target) return undefined;\n\n const affectedPackages = affectedPackagesForVuln(v, productLookup);\n const expiresAt = new Date(docTime.getTime() + DEFAULT_EXPIRY_HORIZON_MS);\n\n // componentRef is UUID-constrained on the HDF schema (it identifies an\n // HDF component by id, not a foreign-format identifier). Multi-product\n // VEX scoping lands in affectedPackages[] (structured) rather than in\n // the reason free-text field.\n const override: StandaloneOverride = {\n type: target.overrideType,\n requirementId: v.id,\n appliedAt: docTime,\n expiresAt,\n appliedBy: publisher,\n reason: buildReason(v),\n } as StandaloneOverride;\n\n if (affectedPackages.length > 0) {\n override.affectedPackages = affectedPackages;\n }\n\n if (target.status !== undefined) override.status = target.status;\n\n if (target.setJustification && v.analysis.justification) {\n const j = normalizeJustification(v.analysis.justification);\n if (j) override.justification = j;\n }\n\n const evidence: Evidence[] = [];\n if (v.source?.url) {\n const ev = supplierEvidence(v.source.url, v.source.name ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n for (const r of v.references ?? []) {\n if (!r.source?.url) continue;\n const ev = supplierEvidence(r.source.url, r.source.name ?? '');\n if (ev) evidence.push(ev as Evidence);\n }\n if (evidence.length > 0) override.evidence = evidence;\n\n if (target.overrideType === OverrideType.Poam) {\n const action = firstActionFromResponse(v.analysis.response ?? []) || target.poamActionTemplate;\n const milestone: Milestone = {\n description: action,\n status: MilestoneStatus.Pending,\n estimatedCompletion: expiresAt,\n } as Milestone;\n override.milestones = [milestone];\n }\n\n return override;\n}\n\nfunction buildReason(v: Vulnerability): string {\n const parts: string[] = [];\n if (v.description) parts.push(v.description);\n if (v.analysis?.detail) parts.push(v.analysis.detail);\n // Justification and product list are fully structured fields now\n // (Justification enum + Standalone_Override.affectedPackages); neither\n // is mirrored into reason. Response[] hints are not echoed either —\n // POA&M overrides carry remediation context via milestones.\n return parts.join('\\n');\n}\n\n/**\n * Resolve CycloneDX affects[].ref entries to structured AffectedPackage\n * entries. Looks up the bom-ref in the component table to recover purl,\n * name/version. Opaque bom-refs with no component-table match are dropped\n * (the schema forbids fabricating name+version, and bom-refs aren't\n * portable identifiers outside their source BOM).\n */\nexport function affectedPackagesForVuln(\n v: Vulnerability,\n lookup: Map<string, Component>,\n): AffectedPackage[] {\n const out: AffectedPackage[] = [];\n const seenKeys = new Set<string>();\n for (const a of v.affects ?? []) {\n if (!a.ref) continue;\n const comp = lookup.get(a.ref);\n const pkg = comp ? affectedPackageFromComponent(comp) : affectedPackageFromIdentifier(a.ref);\n if (!pkg) continue;\n const key = pkg.purl ?? pkg.cpe ?? `${pkg.name ?? ''}@${pkg.version ?? ''}`;\n if (seenKeys.has(key)) continue;\n seenKeys.add(key);\n out.push(pkg);\n }\n return out;\n}\n\n/**\n * Build an AffectedPackage from a CycloneDX Component. Prefers structured\n * purl decomposition via the shared helper (so name/version/ecosystem are\n * also populated when the purl is parseable); falls back to the component's\n * name+version when no purl is set. Returns undefined when the component\n * carries neither a purl nor a name+version pair (schema requires at least\n * name+version+ecosystem, purl, or cpe).\n */\nexport function affectedPackageFromComponent(c: Component): AffectedPackage | undefined {\n if (c.purl) return affectedPackageFromIdentifier(c.purl);\n if (c.name && c.version) {\n return {\n name: c.name,\n version: c.version,\n ecosystem: Ecosystem.Generic,\n };\n }\n return undefined;\n}\n\nfunction buildProductLookup(bom: BOM): Map<string, Component> {\n const lookup = new Map<string, Component>();\n const root = bom.metadata?.component;\n if (root?.['bom-ref']) lookup.set(root['bom-ref'], root);\n for (const c of bom.components ?? []) {\n if (c['bom-ref']) lookup.set(c['bom-ref'], c);\n }\n return lookup;\n}\n\nexport function firstActionFromResponse(resp: string[]): string {\n for (const r of resp) {\n switch (r.trim().toLowerCase()) {\n case 'update':\n return 'Apply vendor update and re-scan to verify.';\n case 'rollback':\n return 'Roll back to the unaffected version and re-scan to verify.';\n case 'workaround_available':\n return 'Apply the documented workaround.';\n }\n }\n return '';\n}\n\nfunction publisherIdentityOrDefault(bom: BOM): Identity {\n for (const a of bom.metadata?.authors ?? []) {\n if (a.email) return { type: IdentityType.Email, identifier: a.email } as Identity;\n if (a.name) return { type: IdentityType.Simple, identifier: a.name } as Identity;\n }\n for (const t of bom.metadata?.tools ?? []) {\n const ident = [t.vendor, t.name].filter(Boolean).join(' ').trim();\n if (ident) return { type: IdentityType.System, identifier: ident } as Identity;\n }\n return { type: IdentityType.System, identifier: 'cyclonedx-vex-import' } as Identity;\n}\n","/**\n * HDF Amendments to CSAF VEX (csaf_vex profile) converter.\n *\n * Reverse direction of csaf-vex-to-hdf. Intentionally partial-fidelity:\n * fields the shared VEX mapping considers consumer-action-bearing survive\n * round-trip; the rest collapse into the available CSAF fields.\n */\n\nimport {\n Justification,\n MilestoneStatus,\n OverrideType,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize, parseHdf, hdfTime } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n fixedPackageIdentifier,\n exportStatusFor,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\n// Go's zero time.Time, which the Go converter emits when appliedAt is absent.\n// TypeScript would otherwise build an Invalid Date here and throw on format.\nconst GO_ZERO_TIME = new Date('0001-01-01T00:00:00Z');\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface CSAFVexDocument {\n document: {\n category: 'csaf_vex';\n csaf_version: '2.0';\n title?: string;\n notes?: { category: string; text: string; title?: string }[];\n publisher: { category: string; name: string; namespace?: string };\n tracking: {\n id: string;\n status: 'final';\n version: string;\n current_release_date: string;\n initial_release_date: string;\n revision_history: { date: string; number: string; summary: string }[];\n generator?: { engine: { name: string; version: string }; date: string };\n };\n };\n product_tree: { full_product_names: { name: string; product_id: string }[] };\n vulnerabilities: Vulnerability[];\n}\n\ninterface Vulnerability {\n cve: string;\n notes?: { category: string; text: string }[];\n product_status?: {\n fixed?: string[];\n first_fixed?: string[];\n known_affected?: string[];\n known_not_affected?: string[];\n };\n flags?: { label: string; date?: string; product_ids: string[] }[];\n threats?: { category: string; details: string; product_ids?: string[] }[];\n remediations?: { category: string; details: string; product_ids?: string[] }[];\n references?: { category?: string; summary?: string; url: string }[];\n scores?: CsafScore[];\n}\n\ninterface CsafCvss {\n version: string;\n vectorString?: string;\n baseScore?: number;\n baseSeverity?: string;\n}\n\ninterface CsafScore {\n products: string[];\n cvss_v2?: CsafCvss;\n cvss_v3?: CsafCvss;\n cvss_v4?: CsafCvss;\n}\n\n/** Map an HDF Cvss block to a CSAF score entry (cvss_v2/v3/v4 by version). */\nfunction buildCsafScore(cvss: NonNullable<StandaloneOverride['cvss']>, products: string[]): CsafScore | undefined {\n const inner: CsafCvss = {\n version: cvss.version,\n ...(cvss.baseVector && { vectorString: cvss.baseVector }),\n ...(typeof cvss.baseScore === 'number' && { baseScore: cvss.baseScore }),\n ...(cvss.baseSeverity && { baseSeverity: cvss.baseSeverity }),\n };\n if (inner.vectorString === undefined && inner.baseScore === undefined) {\n return undefined;\n }\n const key = cvss.version.startsWith('4') ? 'cvss_v4' : cvss.version.startsWith('2') ? 'cvss_v2' : 'cvss_v3';\n return { [key]: inner, products };\n}\n\nexport function convertHdfToCsafVex(input: string, converterVersion: string): string {\n validateInputSize(input, 'hdf-to-csaf-vex');\n const amendments = parseHdf<HDFAmendments>(input);\n const groups = groupByCVE(amendments.overrides ?? []);\n const productSet = new Map<string, true>();\n const vulnerabilities: Vulnerability[] = [];\n\n for (const group of groups) {\n const v = buildVulnerability(group);\n if (!v) continue;\n vulnerabilities.push(v);\n for (const p of productIDsForGroup(group)) productSet.set(p, true);\n for (const p of fixedProductIDsForGroup(group)) productSet.set(p, true);\n }\n\n if (vulnerabilities.length === 0) {\n throw new Error(\n 'hdf-to-csaf-vex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n const products = [...productSet.keys()].sort();\n const doc = buildDocument(amendments, converterVersion);\n doc.vulnerabilities = vulnerabilities;\n doc.product_tree.full_product_names =\n products.length > 0\n ? products.map((p) => ({ name: p, product_id: p }))\n : [{ name: DEFAULT_PRODUCT_ID, product_id: DEFAULT_PRODUCT_ID }];\n\n return JSON.stringify(doc, null, 2);\n}\n\ninterface CveGroup {\n cve: string;\n overrides: StandaloneOverride[];\n}\n\nfunction groupByCVE(overrides: StandaloneOverride[]): CveGroup[] {\n const groups = new Map<string, CveGroup>();\n for (const o of overrides) {\n if (!CVE_ID_PATTERN.test(o.requirementId)) continue;\n let g = groups.get(o.requirementId);\n if (!g) {\n g = { cve: o.requirementId, overrides: [] };\n groups.set(o.requirementId, g);\n }\n g.overrides.push(o);\n }\n return [...groups.values()].sort((a, b) => a.cve.localeCompare(b.cve));\n}\n\nfunction productIDsForGroup(group: CveGroup): string[] {\n const seen = new Set<string>();\n for (const o of group.overrides) {\n for (const p of productIDsFor(o)) seen.add(p);\n }\n return [...seen].sort();\n}\n\n/** Synthesized fixed-version product ids across a group's affectedPackages. */\nfunction fixedProductIDsForGroup(group: CveGroup): string[] {\n const ids: string[] = [];\n for (const o of group.overrides) {\n for (const p of o.affectedPackages ?? []) {\n const f = fixedPackageIdentifier(p);\n if (f) ids.push(f);\n }\n }\n return ids;\n}\n\nexport function productIDsFor(o: StandaloneOverride): string[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids;\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs.\n if (o.componentRef) return [o.componentRef];\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n const parts = m[1]\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean);\n if (parts.length > 0) return parts;\n }\n return [DEFAULT_PRODUCT_ID];\n}\n\nexport function stripProductsLine(reason: string): string {\n return reason.replace(PRODUCTS_LINE, '').replace(/\\n+$/, '');\n}\n\nfunction allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nfunction buildVulnerability(group: CveGroup): Vulnerability | undefined {\n const v: Vulnerability = { cve: group.cve };\n const status: NonNullable<Vulnerability['product_status']> = {};\n let emitted = false;\n\n for (const o of group.overrides) {\n const pids = productIDsFor(o);\n\n // Emit consumer-supplied CVSS enrichment as a CSAF score entry.\n if (o.cvss) {\n const score = buildCsafScore(o.cvss, pids);\n if (score) {\n v.scores = (v.scores ?? []).concat(score);\n emitted = true;\n }\n }\n\n // Map each affectedPackages[].fixedInVersion to a distinct fixed-version\n // product referenced in product_status.first_fixed + a vendor_fix remediation.\n for (const p of o.affectedPackages ?? []) {\n const fixedId = fixedPackageIdentifier(p);\n if (!fixedId) continue;\n status.first_fixed = (status.first_fixed ?? []).concat(fixedId);\n status.fixed = (status.fixed ?? []).concat(fixedId);\n v.remediations = (v.remediations ?? []).concat({\n category: 'vendor_fix',\n details: `Fixed in ${p.fixedInVersion}`,\n product_ids: [fixedId],\n });\n emitted = true;\n }\n\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) continue;\n\n // exportStatusFor returns Fixed only when closureChained is true,\n // which a one-shot export doesn't know. Promote poam-with-all-complete\n // to Fixed here so the obvious case round-trips.\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n if (canonical === VexStatus.NotAffected) {\n status.known_not_affected = (status.known_not_affected ?? []).concat(pids);\n if (o.justification) {\n v.flags = v.flags ?? [];\n v.flags.push({\n label: String(o.justification as Justification),\n date: formatTimestampSeconds(hdfTime(o.appliedAt) ?? GO_ZERO_TIME),\n product_ids: pids,\n });\n }\n emitted = true;\n } else if (canonical === VexStatus.Fixed) {\n status.fixed = (status.fixed ?? []).concat(pids);\n for (const m of o.milestones ?? []) {\n if (!m.description) continue;\n v.remediations = v.remediations ?? [];\n v.remediations.push({ category: 'vendor_fix', details: m.description, product_ids: pids });\n }\n emitted = true;\n } else if (canonical === VexStatus.Affected) {\n status.known_affected = (status.known_affected ?? []).concat(pids);\n if (o.reason) {\n v.threats = v.threats ?? [];\n v.threats.push({\n category: 'impact',\n details: stripProductsLine(o.reason),\n product_ids: pids,\n });\n }\n if (o.type === OverrideType.Poam) {\n for (const m of o.milestones ?? []) {\n if (!m.description) continue;\n v.remediations = v.remediations ?? [];\n v.remediations.push({\n category: 'workaround',\n details: m.description,\n product_ids: pids,\n });\n }\n }\n emitted = true;\n }\n\n for (const e of o.evidence ?? []) {\n if (e.type !== 'url' || !e.data) continue;\n v.references = v.references ?? [];\n v.references.push({ category: 'external', summary: e.description ?? '', url: e.data });\n }\n }\n\n // emitted is false only if every override in the group returned an\n // unmappable canonical status — defensive guard, not reachable from the\n // current shared mapping (which handles every override type).\n /* c8 ignore next */\n if (!emitted) return undefined;\n\n if (status.fixed) status.fixed = [...new Set(status.fixed)];\n if (status.first_fixed) status.first_fixed = [...new Set(status.first_fixed)];\n if (status.known_affected) status.known_affected = [...new Set(status.known_affected)];\n if (status.known_not_affected) status.known_not_affected = [...new Set(status.known_not_affected)];\n\n if (v.references) {\n const seen = new Set<string>();\n v.references = v.references.filter((r) => {\n if (seen.has(r.url)) return false;\n seen.add(r.url);\n return true;\n });\n }\n\n // Key order mirrors the Go Vulnerability struct so both languages emit\n // identical bytes.\n return {\n cve: v.cve,\n ...(v.notes && { notes: v.notes }),\n product_status: status,\n ...(v.flags && { flags: v.flags }),\n ...(v.threats && { threats: v.threats }),\n ...(v.remediations && { remediations: v.remediations }),\n ...(v.references && { references: v.references }),\n ...(v.scores && { scores: v.scores }),\n };\n}\n\n/** Stable document time: the earliest override appliedAt, falling back to now. */\nfunction earliestAppliedAt(amendments: HDFAmendments): Date {\n let earliest: Date | undefined;\n for (const o of amendments.overrides ?? []) {\n if (!o.appliedAt) continue;\n const t = hdfTime(o.appliedAt);\n if (!t) continue;\n if (!earliest || t < earliest) earliest = t;\n }\n return earliest ?? new Date();\n}\n\nfunction buildDocument(\n amendments: HDFAmendments,\n converterVersion: string,\n): CSAFVexDocument {\n const now = formatTimestampSeconds(earliestAppliedAt(amendments));\n const publisherName = amendments.appliedBy?.identifier || 'HDF Amendments Export';\n const trackingId = amendments.amendmentId || 'HDF-VEX-EXPORT';\n const docVersion = amendments.version || '1';\n const title = amendments.name || 'HDF Amendments exported as CSAF VEX';\n const notes: { category: string; text: string; title?: string }[] = [];\n if (amendments.description) {\n notes.push({ category: 'summary', text: amendments.description, title: 'Description' });\n }\n return {\n document: {\n category: 'csaf_vex',\n csaf_version: '2.0',\n title,\n ...(notes.length > 0 && { notes }),\n publisher: { category: 'other', name: publisherName },\n tracking: {\n id: trackingId,\n status: 'final',\n version: docVersion,\n current_release_date: now,\n initial_release_date: now,\n revision_history: [\n { date: now, number: docVersion, summary: 'Generated by hdf-to-csaf-vex from HDF Amendments.' },\n ],\n generator: { engine: { name: 'hdf-to-csaf-vex', version: converterVersion }, date: now },\n },\n },\n product_tree: { full_product_names: [] },\n vulnerabilities: [],\n };\n}\n","/**\n * HDF Amendments to OpenVEX converter.\n *\n * Reverse direction of openvex-to-hdf. Step 4f amendment-output pattern,\n * partial-fidelity by design — consumer-action-bearing fields (CVE id,\n * status, justification) survive round-trip; the rest collapse.\n */\n\nimport { sha256, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport {\n MilestoneStatus,\n OverrideType,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { validateInputSize, parseHdf, hdfTime } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n exportStatusFor,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\n// Go's zero time.Time, which the Go converter emits when appliedAt is absent.\n// TypeScript would otherwise build an Invalid Date here and throw on format.\nconst GO_ZERO_TIME = new Date('0001-01-01T00:00:00Z');\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst OPENVEX_CONTEXT = 'https://openvex.dev/ns/v0.2.0';\nconst OPENVEX_NAMESPACE = 'https://openvex.dev/docs/public/';\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface Document {\n '@context': string;\n '@id': string;\n author: string;\n role?: string;\n timestamp: string;\n version: number;\n statements: Statement[];\n}\n\ninterface Statement {\n vulnerability: { '@id'?: string; name: string };\n products?: { '@id': string }[];\n status: string;\n justification?: string;\n impact_statement?: string;\n action_statement?: string;\n timestamp?: string;\n}\n\nexport async function convertHdfToOpenVex(\n input: string,\n converterVersion: string,\n): Promise<string> {\n validateInputSize(input, 'hdf-to-openvex');\n const amendments = parseHdf<HDFAmendments>(input);\n\n const statements: Statement[] = [];\n let earliest: Date | undefined;\n for (const o of amendments.overrides ?? []) {\n const s = overrideToStatement(o);\n if (!s) continue;\n statements.push(s);\n const t = hdfTime(o.appliedAt);\n if (!t) continue;\n if (!earliest || t < earliest) earliest = t;\n }\n\n if (statements.length === 0) {\n throw new Error(\n 'hdf-to-openvex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n statements.sort((a, b) => a.vulnerability.name.localeCompare(b.vulnerability.name));\n\n const author = amendments.appliedBy?.identifier || 'HDF Amendments Export';\n const role = amendments.appliedBy?.description;\n\n const doc: Document = {\n '@context': OPENVEX_CONTEXT,\n '@id': await buildDocumentID(input, amendments),\n author,\n role,\n timestamp: formatTimestampSeconds(earliest ?? new Date()),\n version: 1,\n statements,\n };\n\n void converterVersion; // OpenVEX has no generator field; version is unused here\n return JSON.stringify(doc, null, 2);\n}\n\nfunction overrideToStatement(o: StandaloneOverride): Statement | undefined {\n if (!CVE_ID_PATTERN.test(o.requirementId)) return undefined;\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) return undefined;\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n const notAffected = canonical === VexStatus.NotAffected;\n const justification = notAffected && o.justification ? String(o.justification) : '';\n const impact = notAffected ? stripProductsLine(o.reason ?? '') : '';\n let action = '';\n if (canonical === VexStatus.Fixed) {\n action = firstMilestoneAction(o) || 'Fix applied; consumer re-scan confirmed clean.';\n } else if (canonical === VexStatus.Affected) {\n action = firstMilestoneAction(o) || stripProductsLine(o.reason ?? '');\n }\n\n // Key order mirrors the Go Statement struct so both languages emit identical bytes.\n return {\n vulnerability: {\n '@id': `https://nvd.nist.gov/vuln/detail/${o.requirementId}`,\n name: o.requirementId,\n },\n products: productsFor(o),\n status: String(canonical),\n ...(justification && { justification }),\n ...(impact && { impact_statement: impact }),\n ...(action && { action_statement: action }),\n timestamp: formatTimestampSeconds(hdfTime(o.appliedAt) ?? GO_ZERO_TIME),\n };\n}\n\nexport function productsFor(o: StandaloneOverride): { '@id': string }[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids.map((id) => ({ '@id': id }));\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs:\n // 1. componentRef (HDF-internal UUID — emit verbatim)\n // 2. legacy 'Products:' reason-line annotation\n let ids: string[] = [];\n if (o.componentRef) {\n ids = [o.componentRef];\n } else {\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n ids = m[1].split(',').map((s) => s.trim()).filter(Boolean);\n }\n }\n if (ids.length === 0) ids = [DEFAULT_PRODUCT_ID];\n return ids.map((id) => ({ '@id': id }));\n}\n\nfunction firstMilestoneAction(o: StandaloneOverride): string {\n for (const m of o.milestones ?? []) {\n if (m.description) return m.description;\n }\n return '';\n}\n\nfunction allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nexport function stripProductsLine(reason: string): string {\n return reason.replace(PRODUCTS_LINE, '').replace(/\\n+$/, '');\n}\n\nasync function buildDocumentID(input: string, a: HDFAmendments): Promise<string> {\n if (a.amendmentId) return `${OPENVEX_NAMESPACE}vex-${a.amendmentId}`;\n const digest = await sha256(input);\n return `${OPENVEX_NAMESPACE}vex-${digest}`;\n}\n","/**\n * HDF Amendments to CycloneDX VEX converter (export side).\n *\n * Reverse direction of cyclonedx-vex-to-hdf. Step 4f amendment-output\n * pattern, partial-fidelity by design — consumer-action-bearing fields\n * (CVE id, status, justification) survive round-trip; the rest collapse\n * into the available CycloneDX VEX fields.\n */\n\nimport {\n IdentityType,\n MilestoneStatus,\n OverrideType,\n type AffectedPackage,\n type HDFAmendments,\n type StandaloneOverride,\n} from '@mitre/hdf-schema';\nimport { sha256, formatTimestampSeconds } from '@mitre/hdf-utilities';\nimport { validateInputSize, parseHdf, hdfTime } from '../../../shared/typescript/converterutil.js';\nimport {\n affectedPackageToIdentifier,\n versTypeFor,\n exportStatusFor,\n justificationForCycloneDX,\n VexStatus,\n} from '../../../shared/typescript/vex/mapping.js';\n\nconst CVE_ID_PATTERN = /^CVE-\\d{4}-\\d{4,}$/;\nconst PRODUCTS_LINE = /^Products:\\s*(.+)$/m;\nconst RAW_JUST_LINE = /^VEX justification:\\s*(.+)$/m;\nconst RESPONSE_LINE = /^Response:.*$/gm;\nconst DEFAULT_PRODUCT_ID = 'HDFPID-0001';\n\ninterface Component {\n type: string;\n name: string;\n 'bom-ref': string;\n version?: string;\n purl?: string;\n cpe?: string;\n}\n\ninterface BOM {\n bomFormat: 'CycloneDX';\n specVersion: '1.4';\n serialNumber: string;\n version: number;\n metadata: {\n timestamp: string;\n tools?: { vendor?: string; name?: string; version?: string }[];\n authors?: { name?: string; email?: string }[];\n };\n components?: Component[];\n vulnerabilities: Vulnerability[];\n}\n\ninterface Rating {\n source?: { name?: string };\n score?: number;\n severity?: string;\n method?: string;\n vector?: string;\n}\n\ninterface Vulnerability {\n id: string;\n source?: { name?: string; url: string };\n references?: { id: string; source: { name?: string; url: string } }[];\n ratings?: Rating[];\n recommendation?: string;\n analysis: {\n state: string;\n justification?: string;\n response?: string[];\n detail?: string;\n };\n affects: { ref: string; versions?: CdxVersion[] }[];\n}\n\ninterface CdxVersion {\n version?: string;\n range?: string;\n status: string;\n}\n\n/**\n * Build CycloneDX affects[].versions[] for a package with a fixedInVersion:\n * the current version is `affected`, and `>= fixedInVersion` is `unaffected`,\n * expressed as a `vers` range. Undefined when there is no vers type to key the\n * range (caller falls back to a free-text recommendation).\n */\nfunction buildCdxAffectsVersions(pkg?: AffectedPackage): CdxVersion[] | undefined {\n if (!pkg?.fixedInVersion) return undefined;\n const t = versTypeFor(pkg);\n if (!t) return undefined;\n const versions: CdxVersion[] = [];\n if (pkg.version) versions.push({ version: pkg.version, status: 'affected' });\n versions.push({ range: `vers:${t}/>=${pkg.fixedInVersion}`, status: 'unaffected' });\n return versions;\n}\n\n/** Map an HDF Cvss block to a CycloneDX rating. */\nfunction buildCdxRating(cvss: NonNullable<StandaloneOverride['cvss']>): Rating | undefined {\n const rating: Rating = {};\n if (typeof cvss.baseScore === 'number') rating.score = cvss.baseScore;\n if (cvss.baseSeverity) rating.severity = cvss.baseSeverity;\n if (cvss.baseVector) rating.vector = cvss.baseVector;\n const v = cvss.version;\n rating.method = v === '4.0' ? 'CVSSv4' : v === '3.1' ? 'CVSSv31' : v === '3.0' ? 'CVSSv3' : v === '2.0' ? 'CVSSv2' : 'other';\n if (rating.score === undefined && rating.vector === undefined) return undefined;\n return rating;\n}\n\nexport async function convertHdfToCyclonedxVex(\n input: string,\n converterVersion: string,\n): Promise<string> {\n validateInputSize(input, 'hdf-to-cyclonedx-vex');\n const amendments = parseHdf<HDFAmendments>(input);\n\n const componentRegistry = new Map<string, Component>();\n const vulnerabilities: Vulnerability[] = [];\n let earliest: Date | undefined;\n\n for (const o of amendments.overrides ?? []) {\n if (!CVE_ID_PATTERN.test(o.requirementId)) continue;\n const v = overrideToVulnerability(o, componentRegistry);\n if (!v) continue;\n vulnerabilities.push(v);\n const t = hdfTime(o.appliedAt);\n if (!t) continue;\n if (!earliest || t < earliest) earliest = t;\n }\n\n if (vulnerabilities.length === 0) {\n throw new Error(\n 'hdf-to-cyclonedx-vex: no overrides with CVE-shaped requirementIds; nothing to emit',\n );\n }\n\n vulnerabilities.sort((a, b) => a.id.localeCompare(b.id));\n const components = [...componentRegistry.values()].sort((a, b) =>\n a['bom-ref'].localeCompare(b['bom-ref']),\n );\n\n const bom: BOM = {\n bomFormat: 'CycloneDX',\n specVersion: '1.4',\n serialNumber: await buildSerialNumber(input, amendments),\n version: 1,\n metadata: buildMetadata(amendments, earliest ?? new Date(), converterVersion),\n components,\n vulnerabilities,\n };\n\n return JSON.stringify(bom, null, 2);\n}\n\nfunction overrideToVulnerability(\n o: StandaloneOverride,\n componentRegistry: Map<string, Component>,\n): Vulnerability | undefined {\n let canonical = exportStatusFor(o, allMilestonesCompleted(o), false);\n if (!canonical) return undefined;\n if (\n o.type === OverrideType.Poam &&\n canonical === VexStatus.Affected &&\n allMilestonesCompleted(o)\n ) {\n canonical = VexStatus.Fixed;\n }\n\n // Pair each emitted product id back to the AffectedPackage it came from\n // so we can preserve name/version/purl/cpe in the CycloneDX component.\n // Falls back to a pid-only component for legacy paths (componentRef or\n // 'Products:' reason annotation) where no structured entry exists.\n const pids = productIDsFor(o);\n const pkgById = new Map<string, AffectedPackage>();\n for (const p of o.affectedPackages ?? []) {\n const id = affectedPackageToIdentifier(p);\n if (id) pkgById.set(id, p);\n }\n for (const pid of pids) {\n componentRegistry.set(pid, componentFor(pid, pkgById.get(pid)));\n }\n\n const analysis: Vulnerability['analysis'] = { state: canonicalToCycloneDXState(canonical) };\n // HDF Justification uses long-form names from OpenVEX/CSAF; CycloneDX\n // uses short-form names for the same concepts. Translate via the\n // shared helper.\n if (o.justification) {\n const cdxJust = justificationForCycloneDX(o.justification);\n if (cdxJust) analysis.justification = cdxJust;\n }\n if (canonical === VexStatus.Fixed) {\n analysis.response = ['update'];\n } else if (canonical === VexStatus.Affected && o.type === OverrideType.Poam) {\n analysis.response = ['workaround_available'];\n }\n const detail = stripReasonAnnotations(o.reason ?? '');\n if (detail) analysis.detail = detail;\n\n const references: NonNullable<Vulnerability['references']> = [];\n for (const e of o.evidence ?? []) {\n if (e.type !== 'url' || !e.data) continue;\n references.push({\n id: o.requirementId,\n source: { name: e.description ?? '', url: e.data },\n });\n }\n\n // Emit consumer-supplied CVSS enrichment as a CycloneDX rating.\n const rating = o.cvss ? buildCdxRating(o.cvss) : undefined;\n\n // A fixedInVersion we could not express as a vers range (no ecosystem/purl to\n // key the range) becomes a free-text recommendation instead of an invalid range.\n const unranged = (o.affectedPackages ?? []).find((p) => p.fixedInVersion && !versTypeFor(p));\n\n // Key order mirrors the Go BOM structs so both languages emit identical bytes.\n return {\n id: o.requirementId,\n source: { name: 'NVD', url: `https://nvd.nist.gov/vuln/detail/${o.requirementId}` },\n ...(references.length > 0 && { references }),\n ...(rating && { ratings: [rating] }),\n ...(unranged && { recommendation: `Upgrade to ${unranged.fixedInVersion}` }),\n analysis,\n affects: pids.map((pid) => {\n const versions = buildCdxAffectsVersions(pkgById.get(pid));\n return versions ? { ref: pid, versions } : { ref: pid };\n }),\n };\n}\n\nfunction canonicalToCycloneDXState(canonical: VexStatus): string {\n switch (canonical) {\n case VexStatus.NotAffected:\n return 'not_affected';\n case VexStatus.Fixed:\n return 'resolved';\n case VexStatus.Affected:\n return 'exploitable';\n /* c8 ignore next 2 — defensive: every VexStatus has a case above */\n default:\n return canonical;\n }\n}\n\nfunction componentFor(pid: string, pkg?: AffectedPackage): Component {\n const c: Component = {\n type: 'application',\n name: pkg?.name ?? pid,\n 'bom-ref': pid,\n };\n if (pkg?.version) c.version = pkg.version;\n if (pkg?.purl ?? (pid.startsWith('pkg:') ? pid : undefined)) {\n c.purl = pkg?.purl ?? pid;\n }\n if (pkg?.cpe ?? (pid.startsWith('cpe:2.3:') ? pid : undefined)) {\n c.cpe = pkg?.cpe ?? pid;\n }\n return c;\n}\n\nexport function productIDsFor(o: StandaloneOverride): string[] {\n // Structured affectedPackages is the source of truth (v3.2.x and later).\n if (o.affectedPackages && o.affectedPackages.length > 0) {\n const ids = o.affectedPackages\n .map((p) => affectedPackageToIdentifier(p))\n .filter((id): id is string => Boolean(id));\n if (ids.length > 0) return ids;\n }\n // Backward-compat fallbacks for pre-affectedPackages HDF inputs.\n if (o.componentRef) return [o.componentRef];\n const m = PRODUCTS_LINE.exec(o.reason ?? '');\n if (m && m[1]) {\n const parts = m[1].split(',').map((s) => s.trim()).filter(Boolean);\n if (parts.length > 0) return parts;\n }\n return [DEFAULT_PRODUCT_ID];\n}\n\n// stripReasonAnnotations removes the 'Products: …' tail line that\n// import-side converters append, so analysis.detail carries only the\n// prose. (The 'VEX justification:' and 'Response:' annotations were\n// removed when the Justification enum was extended to cover the full\n// CycloneDX vocabulary; this stripper also handles any legacy reason\n// strings that still carry them.)\nexport function stripReasonAnnotations(reason: string): string {\n return reason\n .replace(PRODUCTS_LINE, '')\n .replace(RAW_JUST_LINE, '')\n .replace(RESPONSE_LINE, '')\n .trim();\n}\n\nexport function allMilestonesCompleted(o: StandaloneOverride): boolean {\n if (!o.milestones || o.milestones.length === 0) return false;\n return o.milestones.every((m) => m.status === MilestoneStatus.Completed);\n}\n\nfunction buildMetadata(\n a: HDFAmendments,\n docTime: Date,\n converterVersion: string,\n): BOM['metadata'] {\n const metadata: BOM['metadata'] = {\n timestamp: formatTimestampSeconds(docTime),\n tools: [{ vendor: 'mitre', name: 'hdf-to-cyclonedx-vex', version: converterVersion }],\n };\n if (a.appliedBy?.identifier) {\n const author: { name?: string; email?: string } = {};\n if (a.appliedBy.type === IdentityType.Email) {\n author.email = a.appliedBy.identifier;\n } else {\n author.name = a.appliedBy.identifier;\n }\n metadata.authors = [author];\n }\n return metadata;\n}\n\n// The serial number is the first 16 bytes of the input's SHA-256, matching the\n// Go exporter byte-for-byte.\nasync function buildSerialNumber(input: string, a: HDFAmendments): Promise<string> {\n if (a.amendmentId) return `urn:uuid:${a.amendmentId}`;\n return `urn:uuid:${(await sha256(input)).slice(0, 32)}`;\n}\n\n","/**\n * OSCAL document type detection.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/detect.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport type { Oscal } from './types.js';\n\n/** The 7 valid OSCAL document type strings. */\nexport type OscalDocumentType =\n | 'catalog'\n | 'profile'\n | 'component-definition'\n | 'system-security-plan'\n | 'assessment-plan'\n | 'assessment-results'\n | 'plan-of-action-and-milestones';\n\n/**\n * Parses the input JSON just enough to determine which OSCAL document type\n * it contains. Returns one of the 7 OSCAL root key strings.\n *\n * @throws Error if the input is not valid OSCAL\n */\nexport function detectOscalDocumentType(input: string): OscalDocumentType {\n const doc = parseJSON<Oscal>(input);\n\n if (doc.catalog) return 'catalog';\n if (doc.profile) return 'profile';\n if (doc['component-definition']) return 'component-definition';\n if (doc['system-security-plan']) return 'system-security-plan';\n if (doc['assessment-plan']) return 'assessment-plan';\n if (doc['assessment-results']) return 'assessment-results';\n if (doc['plan-of-action-and-milestones']) return 'plan-of-action-and-milestones';\n\n throw new Error(\n 'unrecognized OSCAL document: expected one of catalog, profile, ' +\n 'component-definition, system-security-plan, assessment-plan, ' +\n 'assessment-results, plan-of-action-and-milestones as root key',\n );\n}\n","/**\n * OSCAL Catalog to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_catalog.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFBaseline, BaselineRequirement } from '@mitre/hdf-schema';\nimport type { Description, RequirementGroup } from '@mitre/hdf-schema';\nimport { Applicability } from '@mitre/hdf-schema';\nimport type { Oscal, Catalog, Control } from './types.js';\nimport {\n controlIdToNistTag,\n extractPropValue,\n flattenPartsByName,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Catalog document to HDF Baseline JSON.\n *\n * @param input - Raw JSON string containing an OSCAL catalog\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalCatalogToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-catalog');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc.catalog) {\n throw new Error(\n \"oscal-catalog: input is not a catalog document (root key is not 'catalog')\",\n );\n }\n\n const baseline = await catalogToBaseline(doc.catalog, input);\n return JSON.stringify(baseline, null, 2);\n}\n\n/**\n * Shared logic: converts a parsed Catalog to HDFBaseline.\n * Also used by the profile converter after resolving.\n */\nexport async function catalogToBaseline(\n catalog: Catalog,\n rawInput: string,\n): Promise<HDFBaseline> {\n const integrity = await inputIntegrity(rawInput);\n const meta = extractMetadata(catalog.metadata);\n\n const requirements: BaselineRequirement[] = [];\n const groups: RequirementGroup[] = [];\n\n for (const group of catalog.groups ?? []) {\n const reqIDs: string[] = [];\n\n for (const ctrl of group.controls ?? []) {\n const req = controlToBaselineRequirement(ctrl);\n requirements.push(req);\n reqIDs.push(req.id);\n\n // Include control enhancements\n for (const enh of ctrl.controls ?? []) {\n const enhReq = controlToBaselineRequirement(enh);\n requirements.push(enhReq);\n reqIDs.push(enhReq.id);\n }\n }\n\n if (reqIDs.length > 0) {\n groups.push({\n id: group.id ?? '',\n title: group.title,\n requirements: reqIDs,\n });\n }\n }\n\n // Top-level controls (outside groups)\n for (const ctrl of catalog.controls ?? []) {\n const req = controlToBaselineRequirement(ctrl);\n requirements.push(req);\n\n for (const enh of ctrl.controls ?? []) {\n const enhReq = controlToBaselineRequirement(enh);\n requirements.push(enhReq);\n }\n }\n\n const baseline: HDFBaseline = {\n name: catalogBaselineName(catalog),\n title: meta.title,\n version: meta.version,\n status: 'loaded',\n integrity,\n requirements,\n groups,\n generator: {\n name: 'oscal-catalog-to-hdf',\n version: '1.0.0',\n },\n };\n\n return baseline;\n}\n\n/** Converts a single OSCAL Control to an HDF BaselineRequirement. */\nfunction controlToBaselineRequirement(ctrl: Control): BaselineRequirement {\n const nistTag = controlIdToNistTag(ctrl.id);\n const descriptions = buildCatalogDescriptions(ctrl);\n const tags = buildCatalogTags(ctrl);\n\n const req: BaselineRequirement = {\n id: nistTag,\n title: ctrl.title,\n impact: 0.5, // default for catalog controls\n descriptions,\n tags,\n };\n\n const controlType = deriveControlTypeFromTags([nistTag]);\n if (controlType !== undefined) req.controlType = controlType;\n\n // FedRAMP rev5 marks mandatory controls in a baseline with prop[name=CORE,value=true].\n // Catalogs typically don't carry CORE props, but resolved profiles (distributed\n // by FedRAMP as catalogs) do. When present, map CORE=true to applicability=required.\n // Absence is intentionally left undefined; consumers may interpret omitted as required\n // by convention. We do NOT map non-CORE to \"optional\" because catalog-only inputs\n // omit the prop entirely on all controls, which would be misleading.\n const coreProp = extractPropValue(ctrl.props, 'CORE');\n if (coreProp === 'true') {\n req.applicability = Applicability.Required;\n }\n\n return req;\n}\n\n/** Creates HDF Description entries from control parts. */\nfunction buildCatalogDescriptions(ctrl: Control): Description[] {\n const descriptions: Description[] = [];\n\n // Statement -> default description\n const statement = flattenPartsByName(ctrl.parts, 'statement');\n descriptions.push({\n label: 'default',\n data: statement || '',\n });\n\n // Guidance -> rationale\n const guidance = flattenPartsByName(ctrl.parts, 'guidance');\n if (guidance) {\n descriptions.push({ label: 'rationale', data: guidance });\n }\n\n // Assessment objective -> check\n const check = flattenPartsByName(ctrl.parts, 'assessment-objective');\n if (check) {\n descriptions.push({ label: 'check', data: check });\n }\n\n return descriptions;\n}\n\n/** Builds the tags map for an OSCAL catalog control. */\nfunction buildCatalogTags(ctrl: Control): Record<string, unknown> {\n const tags: Record<string, unknown> = {};\n\n const nistTag = controlIdToNistTag(ctrl.id);\n tags['nist'] = [nistTag];\n\n const label = extractPropValue(ctrl.props, 'label');\n if (label !== undefined) {\n tags['label'] = label;\n }\n\n const sortId = extractPropValue(ctrl.props, 'sort-id');\n if (sortId !== undefined) {\n tags['sort-id'] = sortId;\n }\n\n return tags;\n}\n\n/** Derives a baseline name from catalog metadata. */\nfunction catalogBaselineName(catalog: Catalog): string {\n return toKebabCase(catalog.metadata.title, 'oscal-catalog');\n}\n","/**\n * OSCAL Component Definition to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_component.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFBaseline, BaselineRequirement } from '@mitre/hdf-schema';\nimport type { Description } from '@mitre/hdf-schema';\nimport type { Oscal, ImplementedRequirementElement, ComponentDefinitionComponent, ComponentDefinition } from './types.js';\nimport { controlIdToNistTag, extractMetadata, toKebabCase } from './shared.js';\n\n/**\n * Converts an OSCAL Component Definition document to HDF Baseline JSON.\n *\n * @param input - Raw JSON string containing an OSCAL component-definition\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalComponentToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-component-definition');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['component-definition']) {\n throw new Error(\n \"oscal-component-definition: input is not a component-definition document (root key is not 'component-definition')\",\n );\n }\n\n const compDef = doc['component-definition'];\n\n if (!compDef.components || compDef.components.length === 0) {\n throw new Error('oscal-component-definition: document contains no components');\n }\n\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(compDef.metadata);\n\n // Use the first component to build the baseline\n const comp = compDef.components[0]!;\n\n const requirements: BaselineRequirement[] = [];\n for (const ci of comp['control-implementations'] ?? []) {\n for (const ir of ci['implemented-requirements'] ?? []) {\n requirements.push(implementedRequirementToBaselineRequirement(ir));\n }\n }\n\n const baseline: HDFBaseline = {\n name: componentBaselineName(comp, compDef),\n title: meta.title,\n version: meta.version,\n status: 'loaded',\n integrity,\n requirements,\n generator: {\n name: 'oscal-component-to-hdf',\n version: '1.0.0',\n },\n };\n\n return JSON.stringify(baseline, null, 2);\n}\n\n/** Converts a single ImplementedRequirement to a BaselineRequirement. */\nfunction implementedRequirementToBaselineRequirement(\n ir: ImplementedRequirementElement,\n): BaselineRequirement {\n const nistTag = controlIdToNistTag(ir['control-id']);\n\n const descriptions: Description[] = [];\n\n // Primary description\n descriptions.push({\n label: 'default',\n data: ir.description ?? '',\n });\n\n // Add statement prose as additional descriptions\n for (const stmt of ir.statements ?? []) {\n if (stmt.description) {\n descriptions.push({\n label: stmt['statement-id'],\n data: stmt.description,\n });\n }\n if (stmt.remarks) {\n descriptions.push({\n label: stmt['statement-id'] + '-remarks',\n data: stmt.remarks,\n });\n }\n }\n\n const tags: Record<string, unknown> = {\n nist: [nistTag],\n };\n\n return {\n id: nistTag,\n title: nistTag,\n impact: 0.5,\n descriptions,\n tags,\n };\n}\n\n/** Derives a baseline name from the component or component-definition metadata. */\nfunction componentBaselineName(\n comp: ComponentDefinitionComponent,\n compDef: ComponentDefinition,\n): string {\n const name = comp.title || compDef.metadata.title;\n return toKebabCase(name, 'oscal-component-definition');\n}\n","/**\n * OSCAL Plan of Action and Milestones (POA&M) to HDF Amendments converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_poam.go.\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { inputIntegrity, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFAmendments,\n StandaloneOverride,\n Milestone as HdfMilestone,\n} from '@mitre/hdf-schema';\nimport {\n OverrideType,\n} from '@mitre/hdf-schema';\n\n// The hdf-amendments schema defines its own ResultStatus, AppliedByType, and\n// milestone Status enums that conflict with hdf-results enums of the same name.\n// They aren't re-exported from the @mitre/hdf-schema barrel to avoid collisions.\n// We use string literals with type casts for these fields.\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type {\n Oscal,\n PlanOfActionAndMilestonesPOAM,\n POAMItem,\n IdentifiedRisk,\n DocumentMetadata,\n} from './types.js';\nimport {\n controlIdToNistTag,\n extractPropValue,\n oscalStatusToHdf,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL POA&M document to HDF Amendments JSON.\n *\n * @param input - Raw JSON string containing an OSCAL POA&M\n * @returns HDF Amendments JSON string\n */\nexport async function convertOscalPoamToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-poam');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['plan-of-action-and-milestones']) {\n throw new Error(\n \"oscal-poam: input is not a plan-of-action-and-milestones document (root key is not 'plan-of-action-and-milestones')\",\n );\n }\n\n const poam = doc['plan-of-action-and-milestones'];\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(poam.metadata);\n\n // Build risk lookup map\n const riskMap = buildRiskMap(poam.risks ?? []);\n\n // Convert poam-items to StandaloneOverrides\n const overrides: StandaloneOverride[] = [];\n for (const item of poam['poam-items']) {\n overrides.push(poamItemToOverride(item, riskMap, poam));\n }\n\n // Extract systemRef from import-ssp\n const systemRef = poam['import-ssp']?.href || undefined;\n\n // Build appliedBy from metadata responsible-parties\n const appliedBy = extractAppliedBy(poam.metadata);\n\n const amendments: HDFAmendments = {\n name: toKebabCase(poam.metadata.title, 'oscal-poam'),\n overrides,\n integrity,\n systemRef,\n version: meta.version,\n appliedBy,\n generator: {\n name: 'oscal-poam-to-hdf',\n version: '1.0.0',\n },\n };\n\n return serializeHdf(amendments);\n}\n\nfunction buildRiskMap(risks: IdentifiedRisk[]): Map<string, IdentifiedRisk> {\n const m = new Map<string, IdentifiedRisk>();\n for (const risk of risks) {\n m.set(risk.uuid, risk);\n }\n return m;\n}\n\nfunction poamItemToOverride(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n poam: PlanOfActionAndMilestonesPOAM,\n): StandaloneOverride {\n const requirementId = extractRequirementIdFromPOAMItem(item, riskMap);\n return {\n type: OverrideType.Poam,\n requirementId,\n reason: poamItemReason(item),\n status: poamItemStatus(item, riskMap),\n appliedBy: poamItemAppliedBy(poam),\n appliedAt: poamItemAppliedAt(poam, requirementId),\n expiresAt: poamItemExpiresAt(item, riskMap, requirementId),\n milestones: extractMilestones(item, riskMap) as any,\n };\n}\n\nfunction extractRequirementIdFromPOAMItem(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): string {\n // Check related risks for impacted-control-id\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (riskUuid) {\n const risk = riskMap.get(riskUuid);\n if (risk) {\n const controlId = extractPropValue(risk.props, 'impacted-control-id');\n if (controlId) {\n return controlIdToNistTag(controlId);\n }\n }\n }\n }\n\n // Check poam-item props for POAM-ID\n const poamId = extractPropValue(item.props, 'POAM-ID');\n if (poamId) return poamId;\n\n // Fall back to the title\n if (item.title) return item.title;\n\n return 'unknown';\n}\n\nfunction poamItemReason(item: POAMItem): string {\n if (item.description) return item.description;\n if (item.title) return item.title;\n return 'POA&M item';\n}\n\nfunction poamItemStatus(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): any {\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (riskUuid) {\n const risk = riskMap.get(riskUuid);\n if (risk) {\n const status = oscalStatusToHdf(risk.status);\n if (status === 'passed') return 'passed' as any;\n if (status === 'failed') return 'failed' as any;\n }\n }\n }\n\n // Default: POA&M items typically represent open/failed findings\n return 'failed' as any;\n}\n\nfunction poamItemAppliedBy(\n poam: PlanOfActionAndMilestonesPOAM,\n): StandaloneOverride['appliedBy'] {\n // Look for prepared-by in responsible-parties\n const rps = poam.metadata['responsible-parties'];\n if (rps) {\n for (const rp of rps) {\n if (rp['role-id'] === 'prepared-by' && rp['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rp['party-uuids'][0]!,\n };\n }\n }\n\n // Fall back to any responsible party\n if (rps.length > 0 && rps[0]!['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rps[0]!['party-uuids'][0]!,\n };\n }\n }\n\n return {\n type: 'system' as any,\n identifier: 'oscal-poam-converter',\n };\n}\n\n// Returns appliedAt from the document's metadata.last-modified. OSCAL requires\n// last-modified, so its absence is a malformed document — fail loud rather than\n// stamp a wall-clock time. (Types say Date, but it is a string at runtime.)\nfunction poamItemAppliedAt(poam: PlanOfActionAndMilestonesPOAM, requirementId: string): Date {\n const t = poam.metadata['last-modified'] && parseTimestamp(String(poam.metadata['last-modified']));\n if (t) return t;\n throw new Error(`poam-item \"${requirementId}\": no usable metadata.last-modified for appliedAt`);\n}\n\n// Returns the override deadline from the related risk's `deadline` — the\n// enforceable time commitment of the POA&M. Fails loud when no related risk\n// carries a usable deadline rather than inventing one.\nfunction poamItemExpiresAt(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n requirementId: string,\n): Date {\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk?.deadline) continue;\n const t = parseTimestamp(String(risk.deadline));\n if (t) return t;\n }\n throw new Error(\n `poam-item \"${requirementId}\": no related risk carries a usable deadline; a POA&M requires a time commitment`,\n );\n}\n\n// Builds milestones from the planned remediation tasks of the item's related\n// risks. Each task's within-date-range end is its estimated completion; tasks\n// without a usable end date are skipped (the array is optional) — never\n// fabricated — since estimatedCompletion is required and must reflect real data.\nfunction extractMilestones(\n item: POAMItem,\n riskMap: Map<string, IdentifiedRisk>,\n): HdfMilestone[] {\n const milestones: HdfMilestone[] = [];\n\n for (const rr of item['related-risks'] ?? []) {\n const riskUuid = rr['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n\n for (const rem of risk.remediations ?? []) {\n if (rem.lifecycle !== 'planned') continue;\n\n for (const task of rem.tasks ?? []) {\n const end = task.timing?.['within-date-range']?.end;\n const estimatedCompletion = end && parseTimestamp(String(end));\n if (!estimatedCompletion) continue;\n\n milestones.push({\n description: task.description ? `${task.title}: ${task.description}` : task.title,\n estimatedCompletion,\n status: 'pending' as any,\n });\n }\n }\n }\n\n return milestones;\n}\n\nfunction extractAppliedBy(\n meta: DocumentMetadata,\n): HDFAmendments['appliedBy'] {\n const rps = meta['responsible-parties'];\n if (rps) {\n for (const rp of rps) {\n if (rp['role-id'] === 'prepared-by' && rp['party-uuids'].length > 0) {\n return {\n type: 'simple' as any,\n identifier: rp['party-uuids'][0]!,\n };\n }\n }\n }\n return undefined;\n}\n","/**\n * OSCAL Assessment Plan (SAP) to HDF Plan converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_sap.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFPlan,\n Assessment,\n RunnerConfig,\n} from '@mitre/hdf-schema';\nimport { PlanType } from '@mitre/hdf-schema';\nimport type {\n Oscal,\n SecurityAssessmentPlanSAP,\n AssessedControls,\n ReferencedControlObjectives,\n} from './types.js';\nimport {\n controlIdToNistTag,\n controlIdsToNistTags,\n extractControlIdFromObjectiveId,\n extractPropValue,\n flattenParts,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Assessment Plan document to HDF Plan JSON.\n *\n * @param input - Raw JSON string containing an OSCAL assessment-plan\n * @returns HDF Plan JSON string\n */\nexport async function convertOscalSapToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-assessment-plan');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['assessment-plan']) {\n throw new Error(\n \"oscal-assessment-plan: input is not an assessment-plan document (root key is not 'assessment-plan')\",\n );\n }\n\n const ap = doc['assessment-plan'];\n const integrity = await inputIntegrity(input);\n const meta = extractMetadata(ap.metadata);\n\n // Build assessments from reviewed-controls\n const assessments = buildAssessments(ap);\n\n // Extract systemRef from import-ssp\n const systemRef = ap['import-ssp']?.href || undefined;\n\n // Determine plan type from assessment-assets/tasks\n const planType = determinePlanType(ap);\n\n // Build description from metadata remarks and terms-and-conditions\n const description = buildPlanDescription(ap);\n\n const plan: HDFPlan = {\n name: toKebabCase(ap.metadata.title, 'oscal-assessment-plan'),\n assessments,\n integrity,\n systemRef,\n version: meta.version,\n type: planType,\n description,\n generator: {\n name: 'oscal-sap-to-hdf',\n version: '1.0.0',\n },\n };\n\n return JSON.stringify(plan, null, 2);\n}\n\nfunction buildAssessments(ap: SecurityAssessmentPlanSAP): Assessment[] {\n if (!ap['reviewed-controls']) {\n return [{ baselineRef: 'oscal-assessment-plan' }];\n }\n\n const assessments: Assessment[] = [];\n\n for (const cs of ap['reviewed-controls']['control-selections'] ?? []) {\n const assessment: Assessment = {\n baselineRef: deriveBaselineRef(ap, cs),\n };\n\n if (cs.description) {\n assessment.description = cs.description;\n }\n\n assessment.runner = extractRunnerConfig(ap) ?? undefined;\n assessment.targetSelector = buildTargetSelector(ap) ?? undefined;\n\n assessments.push(assessment);\n }\n\n // If no control selections but there are control-objective-selections\n if (assessments.length === 0 && (ap['reviewed-controls']['control-objective-selections']?.length ?? 0) > 0) {\n for (const co of ap['reviewed-controls']['control-objective-selections']!) {\n const assessment: Assessment = {\n baselineRef: deriveBaselineRefFromObjectives(ap, co),\n runner: extractRunnerConfig(ap) ?? undefined,\n };\n if (co.description) {\n assessment.description = co.description;\n }\n assessments.push(assessment);\n }\n }\n\n // Ensure at least one assessment exists\n if (assessments.length === 0) {\n assessments.push({ baselineRef: 'oscal-assessment-plan' });\n }\n\n return assessments;\n}\n\nfunction deriveBaselineRef(ap: SecurityAssessmentPlanSAP, cs: AssessedControls): string {\n if (cs['include-all'] !== undefined) {\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n return 'all-controls';\n }\n\n if (cs['include-controls'] && cs['include-controls'].length > 0) {\n const ids = cs['include-controls'].map(sc => controlIdToNistTag(sc['control-id']));\n return ids.join(',');\n }\n\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n\n return 'oscal-assessment-plan';\n}\n\nfunction deriveBaselineRefFromObjectives(\n ap: SecurityAssessmentPlanSAP,\n co: ReferencedControlObjectives,\n): string {\n if (co['include-all'] !== undefined) {\n if (ap['import-ssp']?.href) {\n return ap['import-ssp'].href;\n }\n return 'all-objectives';\n }\n\n if (co['include-objectives'] && co['include-objectives'].length > 0) {\n const ids = co['include-objectives'].map(sc =>\n extractControlIdFromObjectiveId(sc['objective-id']),\n );\n return controlIdsToNistTags(ids).join(',');\n }\n\n return 'oscal-assessment-plan';\n}\n\nfunction extractRunnerConfig(ap: SecurityAssessmentPlanSAP): RunnerConfig | null {\n const assets = ap['assessment-assets'];\n if (!assets) return null;\n\n // Look for the first assessment platform\n const platforms = assets['assessment-platforms'];\n if (platforms && platforms.length > 0) {\n const platform = platforms[0]!;\n const config: RunnerConfig = {};\n if (platform.title) {\n config.name = platform.title;\n }\n return config;\n }\n\n // Fall back to components\n if (assets.components && assets.components.length > 0) {\n const comp = assets.components[0]!;\n const config: RunnerConfig = {\n name: comp.title,\n };\n const version = extractPropValue(comp.props, 'version');\n if (version) {\n config.version = version;\n }\n return config;\n }\n\n return null;\n}\n\nfunction buildTargetSelector(\n ap: SecurityAssessmentPlanSAP,\n): Record<string, string> | null {\n const subjects = ap['assessment-subjects'];\n if (!subjects || subjects.length === 0) return null;\n\n const selector: Record<string, string> = {};\n for (const subject of subjects) {\n if (subject.type) {\n const key = 'subject-type';\n if (selector[key] !== undefined) {\n selector[key] += ',' + subject.type;\n } else {\n selector[key] = subject.type;\n }\n }\n if (subject['include-all'] !== undefined) {\n selector['include-' + subject.type] = 'all';\n }\n }\n\n if (Object.keys(selector).length === 0) return null;\n return selector;\n}\n\nfunction determinePlanType(ap: SecurityAssessmentPlanSAP): PlanType | undefined {\n const aType = extractPropValue(ap.metadata.props, 'assessment-type');\n if (aType) {\n switch (aType.toLowerCase()) {\n case 'automated':\n return PlanType.Automated;\n case 'manual':\n return PlanType.Manual;\n }\n }\n\n if (ap.tasks && ap.tasks.length > 0) {\n return PlanType.Hybrid;\n }\n\n return undefined;\n}\n\nfunction buildPlanDescription(ap: SecurityAssessmentPlanSAP): string | undefined {\n const parts: string[] = [];\n\n if (ap.metadata.remarks) {\n parts.push(ap.metadata.remarks);\n }\n\n if (ap['terms-and-conditions']?.parts && ap['terms-and-conditions'].parts.length > 0) {\n const terms = flattenParts(ap['terms-and-conditions'].parts);\n if (terms) {\n parts.push('Terms and Conditions: ' + terms);\n }\n }\n\n if (parts.length === 0) return undefined;\n return parts.join('\\n\\n');\n}\n","/**\n * OSCAL Assessment Results (SAR) to HDF Results converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_sar.go.\n */\n\nimport { parseJSON, parseTimestamp } from '@mitre/hdf-utilities';\nimport { deriveControlTypeFromTags, inputChecksum, inputIntegrity, serializeHdf, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n HDFResults,\n EvaluatedBaseline,\n EvaluatedRequirement,\n RequirementResult,\n} from '@mitre/hdf-schema';\nimport {\n ResultStatus,\n createMinimalBaseline,\n createRequirement,\n createResult,\n type Description,\n} from '@mitre/hdf-schema';\nimport type {\n Oscal,\n SecurityAssessmentResultsSAR,\n AssessmentResult,\n Finding,\n Observation,\n IdentifiedRisk,\n} from './types.js';\nimport {\n controlIdToNistTag,\n extractControlIdFromObjectiveId,\n oscalStatusToHdf,\n extractRiskSeverity,\n extractMetadata,\n toKebabCase,\n} from './shared.js';\n\n/**\n * Converts an OSCAL Assessment Results (SAR) document to HDF Results JSON.\n *\n * @param input - Raw JSON string containing OSCAL assessment-results\n * @returns HDF Results JSON string\n */\nexport async function convertOscalSarToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-assessment-results');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['assessment-results']) {\n throw new Error(\n \"oscal-assessment-results: input is not an assessment-results document (root key is not 'assessment-results')\",\n );\n }\n\n const sar = doc['assessment-results'];\n const meta = extractMetadata(sar.metadata);\n\n // One conversion-time value, shared as the startTime fallback for any\n // finding whose OSCAL result lacks a usable start.\n const scanTime = new Date();\n\n // Skip results with no findings — an empty baseline would violate the\n // schema's requirements.minItems=1. Mirrors the Go SAR converter.\n const baselines: EvaluatedBaseline[] = [];\n for (const result of sar.results) {\n if (!result.findings || result.findings.length === 0) {\n // eslint-disable-next-line no-console\n console.warn(\n `WARNING: Skipping assessment result \"${result.title || result.uuid}\": no findings (empty result set)`,\n );\n continue;\n }\n const baseline = await resultToEvaluatedBaseline(result, sar, input, scanTime);\n baselines.push(baseline);\n }\n\n // Extract planRef from import-ap\n const planRef = sar['import-ap']?.href || undefined;\n\n // Parse timestamp from metadata\n let timestamp: Date | undefined;\n if (meta.lastModified) {\n const t = parseTimestamp(meta.lastModified);\n if (t) {\n timestamp = t;\n }\n }\n\n const hdf: HDFResults = {\n baselines,\n generator: {\n name: 'oscal-assessment-results-to-hdf',\n version: '1.0.0',\n },\n tool: {\n name: 'OSCAL Assessment Results',\n format: 'OSCAL',\n },\n timestamp: timestamp ?? new Date(),\n planRef,\n };\n\n return serializeHdf(hdf);\n}\n\nasync function resultToEvaluatedBaseline(\n result: AssessmentResult,\n sar: SecurityAssessmentResultsSAR,\n rawInput: string,\n scanTime: Date,\n): Promise<EvaluatedBaseline> {\n const checksum = await inputChecksum(rawInput);\n\n // Build lookup maps for observations and risks\n const obsMap = buildObservationMap(result.observations ?? []);\n const riskMap = buildRiskMap(result.risks ?? []);\n\n // Group findings by control ID, preserving insertion order\n const controlOrder: string[] = [];\n const controlMap = new Map<string, Finding[]>();\n\n for (const f of result.findings ?? []) {\n const controlId = extractControlIdFromFinding(f);\n const existing = controlMap.get(controlId);\n if (existing) {\n existing.push(f);\n } else {\n controlOrder.push(controlId);\n controlMap.set(controlId, [f]);\n }\n }\n\n // Build requirements in insertion order\n const requirements: EvaluatedRequirement[] = [];\n for (const controlId of controlOrder) {\n const findings = controlMap.get(controlId)!;\n const req = findingsToEvaluatedRequirement(controlId, findings, obsMap, riskMap, result, scanTime);\n requirements.push(req);\n }\n\n // Derive baseline name\n const name = sarBaselineName(result, sar);\n\n const baseline = createMinimalBaseline(name, requirements, {\n resultsChecksum: checksum,\n integrity: await inputIntegrity(rawInput),\n status: 'loaded',\n title: result.title,\n }) as EvaluatedBaseline;\n\n if (result.description) {\n (baseline as Record<string, unknown>).description = result.description;\n }\n\n return baseline;\n}\n\nfunction findingsToEvaluatedRequirement(\n controlId: string,\n findings: Finding[],\n obsMap: Map<string, Observation>,\n riskMap: Map<string, IdentifiedRisk>,\n result: AssessmentResult,\n scanTime: Date,\n): EvaluatedRequirement {\n const nistTag = controlIdToNistTag(controlId);\n\n // Use the first finding for title\n const firstFinding = findings[0]!;\n const title = firstFinding.title || nistTag;\n\n // Determine impact from related risks\n const impact = sarFindingsImpact(findings, riskMap);\n\n // Build descriptions from findings and observations\n const descriptions = sarBuildDescriptions(findings, obsMap);\n\n // Build results from each finding\n const results: RequirementResult[] = [];\n for (const f of findings) {\n results.push(findingToRequirementResult(f, obsMap, riskMap, result, scanTime));\n }\n\n const tags: Record<string, unknown> = {\n nist: [nistTag],\n };\n\n const req = createRequirement(nistTag, title, descriptions, impact, results, { tags }) as EvaluatedRequirement;\n const controlType = deriveControlTypeFromTags([nistTag]);\n if (controlType !== undefined) req.controlType = controlType;\n return req;\n}\n\nfunction findingToRequirementResult(\n f: Finding,\n obsMap: Map<string, Observation>,\n riskMap: Map<string, IdentifiedRisk>,\n result: AssessmentResult,\n scanTime: Date,\n): RequirementResult {\n const status = mapFindingStatus(f);\n const codeDesc = buildCodeDesc(f, obsMap);\n const message = buildRiskMessage(f, riskMap);\n // The OSCAL result's assessment-period start applies to all its findings;\n // fall back to the single conversion-time value when the source omits it.\n const startTime = parseResultStartTime(result);\n\n return createResult(status, message || undefined, {\n codeDesc,\n startTime: startTime.getTime() > 0 ? startTime : scanTime,\n });\n}\n\nfunction extractControlIdFromFinding(f: Finding): string {\n const targetId = f.target['target-id'];\n if (!targetId) return 'unknown';\n\n // For objective-id and statement-id, extract the base control ID\n let controlId = extractControlIdFromObjectiveId(targetId);\n\n // Handle statement-id format: \"au-1_smt.a\" -> \"au-1\"\n const idx = controlId.indexOf('_');\n if (idx > 0) {\n controlId = controlId.slice(0, idx);\n }\n\n return controlId;\n}\n\nfunction mapFindingStatus(f: Finding): ResultStatus {\n const status = oscalStatusToHdf(f.target.status.state);\n if (status === 'passed') return ResultStatus.Passed;\n if (status === 'failed') return ResultStatus.Failed;\n return ResultStatus.NotReviewed;\n}\n\nfunction buildCodeDesc(f: Finding, obsMap: Map<string, Observation>): string {\n const parts: string[] = [];\n\n for (const ref of f['related-observations'] ?? []) {\n const obsUuid = ref['observation-uuid'];\n if (!obsUuid) continue;\n const obs = obsMap.get(obsUuid);\n if (!obs) continue;\n\n if (obs.methods && obs.methods.length > 0) {\n parts.push('Methods: ' + obs.methods.join(', '));\n }\n\n for (const subj of obs.subjects ?? []) {\n let subjDesc = subj.type;\n if (subj.title) {\n subjDesc = subj.title + ' (' + subj.type + ')';\n }\n parts.push('Subject: ' + subjDesc);\n }\n }\n\n if (parts.length === 0) return f.title;\n\n return parts.join('; ');\n}\n\nfunction buildRiskMessage(f: Finding, riskMap: Map<string, IdentifiedRisk>): string {\n const messages: string[] = [];\n\n for (const ref of f['related-risks'] ?? []) {\n const riskUuid = ref['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n\n let msg = risk.title;\n if (risk.description) {\n msg += ': ' + risk.description;\n }\n messages.push(msg);\n }\n\n return messages.join('\\n');\n}\n\nfunction sarFindingsImpact(\n findings: Finding[],\n riskMap: Map<string, IdentifiedRisk>,\n): number {\n let highestImpact = -1.0;\n\n for (const f of findings) {\n for (const ref of f['related-risks'] ?? []) {\n const riskUuid = ref['risk-uuid'];\n if (!riskUuid) continue;\n const risk = riskMap.get(riskUuid);\n if (!risk) continue;\n const impact = extractRiskSeverity(risk.characterizations, -1.0);\n if (impact > highestImpact) {\n highestImpact = impact;\n }\n }\n }\n\n if (highestImpact < 0) return 0.5; // default medium impact\n return highestImpact;\n}\n\nfunction sarBuildDescriptions(\n findings: Finding[],\n obsMap: Map<string, Observation>,\n): Description[] {\n const descriptions: Description[] = [];\n\n // Default description from finding descriptions\n const findingDescs: string[] = [];\n for (const f of findings) {\n if (f.description) {\n findingDescs.push(f.description);\n }\n }\n descriptions.push({\n label: 'default',\n data: findingDescs.join('\\n') || '',\n });\n\n // Rationale from observation descriptions\n const obsDescs: string[] = [];\n const seen = new Set<string>();\n for (const f of findings) {\n for (const ref of f['related-observations'] ?? []) {\n const obsUuid = ref['observation-uuid'];\n if (!obsUuid || seen.has(obsUuid)) continue;\n seen.add(obsUuid);\n const obs = obsMap.get(obsUuid);\n if (obs?.description) {\n obsDescs.push(obs.description);\n }\n }\n }\n if (obsDescs.length > 0) {\n descriptions.push({\n label: 'rationale',\n data: obsDescs.join('\\n'),\n });\n }\n\n return descriptions;\n}\n\nfunction buildObservationMap(observations: Observation[]): Map<string, Observation> {\n const m = new Map<string, Observation>();\n for (const obs of observations) {\n m.set(obs.uuid, obs);\n }\n return m;\n}\n\nfunction buildRiskMap(risks: IdentifiedRisk[]): Map<string, IdentifiedRisk> {\n const m = new Map<string, IdentifiedRisk>();\n for (const risk of risks) {\n m.set(risk.uuid, risk);\n }\n return m;\n}\n\nfunction parseResultStartTime(result: AssessmentResult): Date {\n if (result.start) {\n // Generator types this as Date, but it is a string at runtime (parsed\n // without a Date reviver); coerce so parseTimestamp applies UTC handling.\n const t = parseTimestamp(String(result.start));\n if (t) {\n return t;\n }\n }\n return new Date(0);\n}\n\nfunction sarBaselineName(result: AssessmentResult, sar: SecurityAssessmentResultsSAR): string {\n const title = result.title || sar.metadata.title;\n return toKebabCase(title, 'oscal-assessment-results');\n}\n","/**\n * OSCAL System Security Plan (SSP) to HDF System converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_ssp.go.\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type { HDFSystem } from '@mitre/hdf-schema';\nimport {\n AuthorizationStatus,\n CategorizationLevel,\n TargetType,\n} from '@mitre/hdf-schema';\n// Import Component from system types to avoid type incompatibility with results Component\nimport type { Component as HdfComponent } from '@mitre/hdf-schema/hdf-system';\nimport type {\n Oscal,\n SystemSecurityPlanSSP,\n SecurityImpactLevel,\n AssessmentAssetsComponent,\n ControlImplementationClass,\n} from './types.js';\nimport { controlIdToNistTag, extractMetadata } from './shared.js';\n\n/**\n * Converts an OSCAL System Security Plan document to HDF System JSON.\n *\n * @param input - Raw JSON string containing an OSCAL SSP\n * @returns HDF System JSON string\n */\nexport async function convertOscalSspToHdf(input: string): Promise<string> {\n validateInputSize(input, 'oscal-ssp');\n\n if (!input || input.trim().length === 0) {\n throw new Error('empty input');\n }\n\n const doc = parseJSON<Oscal>(input);\n if (!doc['system-security-plan']) {\n throw new Error(\n \"oscal-ssp: input is not a system-security-plan document (root key is not 'system-security-plan')\",\n );\n }\n\n const ssp = doc['system-security-plan'];\n const integrity = await inputIntegrity(input);\n\n const system: HDFSystem = {\n name: sspSystemName(ssp),\n integrity,\n components: [],\n generator: {\n name: 'oscal-ssp-to-hdf',\n version: '1.0.0',\n },\n };\n\n // Map system characteristics\n const sc = ssp['system-characteristics'];\n if (sc) {\n if (sc.description) {\n let desc = sc.description;\n if (sc['authorization-boundary']?.description) {\n desc += '\\n\\nAuthorization Boundary: ' + sc['authorization-boundary'].description;\n }\n system.description = desc;\n }\n\n // Map categorization level from security impact level\n const sil = sc['security-impact-level'];\n if (sil) {\n system.categorizationLevel = sspCategorizationLevel(sil) ?? undefined;\n } else if (sc['security-sensitivity-level']) {\n system.categorizationLevel = mapSensitivityToCategorizationLevel(sc['security-sensitivity-level']) ?? undefined;\n }\n\n // Map authorization status from system status\n if (sc.status) {\n system.authorizationStatus = sspAuthorizationStatus(sc.status.state) ?? undefined;\n }\n\n // Map boundary description\n if (sc['authorization-boundary']?.description) {\n system.boundaryDescription = sc['authorization-boundary'].description;\n }\n\n // Map system identifier\n const systemIds = sc['system-ids'];\n if (systemIds && systemIds.length > 0) {\n system.identifier = systemIds[0]!.id;\n if (systemIds[0]!['identifier-type']) {\n system.identifierScheme = systemIds[0]!['identifier-type'];\n }\n }\n }\n\n // Map version from metadata\n const meta = extractMetadata(ssp.metadata);\n if (meta.version) {\n system.version = meta.version;\n }\n\n // Build component-UUID -> control-ID mapping\n const componentControls = buildComponentControlMap(ssp['control-implementation']);\n\n // Map system-implementation components to HDF Components\n const si = ssp['system-implementation'];\n if (si?.components) {\n for (const comp of si.components) {\n system.components.push(sspComponentToHDFComponent(comp, componentControls));\n }\n }\n\n return JSON.stringify(system, null, 2);\n}\n\nfunction sspSystemName(ssp: SystemSecurityPlanSSP): string {\n const sc = ssp['system-characteristics'];\n if (sc?.['system-name']) {\n return sc['system-name'];\n }\n if (ssp.metadata.title) {\n return ssp.metadata.title;\n }\n return 'oscal-ssp';\n}\n\nfunction sspCategorizationLevel(\n sil: SecurityImpactLevel,\n): CategorizationLevel | null {\n const levels = [\n sil['security-objective-confidentiality'] ?? '',\n sil['security-objective-integrity'] ?? '',\n sil['security-objective-availability'] ?? '',\n ];\n\n let highest = '';\n for (const l of levels) {\n const normalized = normalizeFIPSLevel(l);\n if (fipsLevelRank(normalized) > fipsLevelRank(highest)) {\n highest = normalized;\n }\n }\n\n if (!highest) return null;\n\n switch (highest) {\n case 'high':\n return CategorizationLevel.High;\n case 'moderate':\n return CategorizationLevel.Moderate;\n case 'low':\n return CategorizationLevel.Low;\n default:\n return null;\n }\n}\n\nfunction normalizeFIPSLevel(level: string): string {\n let lower = level.toLowerCase();\n lower = lower.replace(/^fips-199-/, '');\n switch (lower) {\n case 'high':\n return 'high';\n case 'moderate':\n case 'medium':\n return 'moderate';\n case 'low':\n return 'low';\n default:\n return '';\n }\n}\n\nfunction fipsLevelRank(level: string): number {\n switch (level) {\n case 'high':\n return 3;\n case 'moderate':\n return 2;\n case 'low':\n return 1;\n default:\n return 0;\n }\n}\n\nfunction mapSensitivityToCategorizationLevel(\n level: string,\n): CategorizationLevel | null {\n const normalized = normalizeFIPSLevel(level);\n if (!normalized) return null;\n\n switch (normalized) {\n case 'high':\n return CategorizationLevel.High;\n case 'moderate':\n return CategorizationLevel.Moderate;\n case 'low':\n return CategorizationLevel.Low;\n default:\n return null;\n }\n}\n\nfunction sspAuthorizationStatus(state: string): AuthorizationStatus | null {\n switch (state.toLowerCase()) {\n case 'operational':\n return AuthorizationStatus.Authorized;\n case 'under-development':\n return AuthorizationStatus.PendingAuthorization;\n case 'disposition':\n return AuthorizationStatus.Revoked;\n case 'other':\n return AuthorizationStatus.NotYetRequested;\n default:\n return null;\n }\n}\n\nfunction buildComponentControlMap(\n ci: ControlImplementationClass | undefined,\n): Map<string, Set<string>> {\n const result = new Map<string, Set<string>>();\n if (!ci) return result;\n\n for (const ir of ci['implemented-requirements'] ?? []) {\n const controlId = ir['control-id'];\n\n // Direct by-components on the implemented-requirement\n for (const bc of ir['by-components'] ?? []) {\n addComponentControl(result, bc['component-uuid'], controlId);\n }\n\n // by-components within statements\n for (const stmt of ir.statements ?? []) {\n for (const bc of stmt['by-components'] ?? []) {\n addComponentControl(result, bc['component-uuid'], controlId);\n }\n }\n }\n\n return result;\n}\n\nfunction addComponentControl(\n m: Map<string, Set<string>>,\n compUUID: string,\n controlId: string,\n): void {\n let controls = m.get(compUUID);\n if (!controls) {\n controls = new Set<string>();\n m.set(compUUID, controls);\n }\n controls.add(controlId);\n}\n\nfunction sspComponentToHDFComponent(\n sc: AssessmentAssetsComponent,\n componentControls: Map<string, Set<string>>,\n): HdfComponent {\n const comp: HdfComponent = {\n name: sc.title,\n type: mapOSCALComponentType(sc.type),\n };\n\n if (sc.description) {\n comp.description = sc.description;\n }\n\n // Add control IDs as baseline refs (NIST notation). Sort for a stable,\n // language-agnostic order that matches the Go converter (whose map iteration\n // is randomized).\n const controls = componentControls.get(sc.uuid);\n if (controls && controls.size > 0) {\n const refs: string[] = [];\n for (const controlId of controls) {\n refs.push(controlIdToNistTag(controlId));\n }\n if (refs.length > 0) {\n refs.sort();\n comp.baselineRefs = refs;\n }\n }\n\n return comp;\n}\n\nfunction mapOSCALComponentType(oscalType: string): TargetType {\n switch (oscalType.toLowerCase()) {\n case 'software':\n case 'this-system':\n return TargetType.Application;\n case 'service':\n return TargetType.Application;\n case 'hardware':\n return TargetType.Host;\n case 'network':\n return TargetType.Network;\n case 'database':\n return TargetType.Database;\n case 'storage':\n return TargetType.Artifact;\n default:\n return TargetType.Application;\n }\n}\n","/**\n * OSCAL Profile to HDF Baseline converter.\n *\n * Mirrors the Go implementation in converters/oscal-to-hdf/go/converter_profile.go.\n *\n * This implements the \"simple resolver\" -- it handles:\n * - A single catalog import\n * - include-controls with with-ids filtering\n * - set-parameters from modify section\n * - merge as-is (preserve catalog structure)\n *\n * It does NOT handle:\n * - Multiple imports\n * - Nested profile imports\n * - alter directives\n * - Complex merge strategies\n */\n\nimport { parseJSON } from '@mitre/hdf-utilities';\nimport { inputIntegrity, validateInputSize } from '../../../shared/typescript/converterutil.js';\nimport type {\n Oscal,\n Catalog,\n Control,\n CatalogControlGroup,\n ImportResource,\n Part,\n ParameterSetting,\n} from './types.js';\nimport { catalogToBaseline } from './converter-catalog.js';\n\n/**\n * Converts an OSCAL Profile against a provided catalog to HDF Baseline JSON.\n *\n * @param profileInput - Raw JSON string containing an OSCAL profile\n * @param catalogInput - Raw JSON string containing an OSCAL catalog\n * @returns HDF Baseline JSON string\n */\nexport async function convertOscalProfileToHdf(\n profileInput: string,\n catalogInput: string,\n): Promise<string> {\n validateInputSize(profileInput, 'oscal-profile');\n\n if (!profileInput || profileInput.trim().length === 0) {\n throw new Error('empty profile input');\n }\n if (!catalogInput || catalogInput.trim().length === 0) {\n throw new Error('empty catalog input');\n }\n\n // Parse profile\n const profileDoc = parseJSON<Oscal>(profileInput);\n if (!profileDoc.profile) {\n throw new Error(\n \"oscal-profile: input is not a profile document (root key is not 'profile')\",\n );\n }\n const profile = profileDoc.profile;\n\n // Parse catalog\n const catalogDoc = parseJSON<Oscal>(catalogInput);\n if (!catalogDoc.catalog) {\n throw new Error(\n \"oscal-profile: catalog input is not a catalog document (root key is not 'catalog')\",\n );\n }\n const catalog = catalogDoc.catalog;\n\n // Validate: single import only\n if (!profile.imports || profile.imports.length === 0) {\n throw new Error('oscal-profile: profile has no imports');\n }\n if (profile.imports.length > 1) {\n throw new Error(\n `oscal-profile: profile has ${profile.imports.length} imports -- this converter only supports single-catalog imports. Use NIST's oscal-cli to resolve complex profiles, or use a pre-resolved catalog`,\n );\n }\n\n // Validate: no alter directives\n if (profile.modify?.alters && profile.modify.alters.length > 0) {\n throw new Error(\n `oscal-profile: profile contains ${profile.modify.alters.length} alter directives -- this converter only supports parameter overrides. Use NIST's oscal-cli to resolve profiles with alter directives, or use a pre-resolved catalog`,\n );\n }\n\n // Collect included/excluded control IDs\n const imp = profile.imports[0]!;\n const includedIDs = collectIncludedIDs(imp);\n const excludedIDs = collectExcludedIDs(imp);\n\n // Filter catalog\n const resolvedCatalog = filterCatalog(catalog, includedIDs, excludedIDs);\n\n // Apply parameter overrides\n if (profile.modify?.['set-parameters']) {\n applyParameterOverrides(resolvedCatalog, profile.modify['set-parameters']);\n }\n\n // Override metadata from profile\n resolvedCatalog.metadata = profile.metadata;\n resolvedCatalog.uuid = profile.uuid;\n\n const baseline = await catalogToBaseline(resolvedCatalog, profileInput);\n\n // Override the integrity to be based on the profile input\n baseline.integrity = await inputIntegrity(profileInput);\n\n return JSON.stringify(baseline, null, 2);\n}\n\n/** Extracts all control IDs from an import's include-controls. Returns null if include all. */\nfunction collectIncludedIDs(imp: ImportResource): Set<string> | null {\n const includeControls = imp['include-controls'];\n if (!includeControls || includeControls.length === 0) {\n return null; // include all\n }\n\n const ids = new Set<string>();\n for (const ic of includeControls) {\n for (const id of ic['with-ids'] ?? []) {\n ids.add(id);\n }\n }\n return ids;\n}\n\n/** Extracts all control IDs from an import's exclude-controls. */\nfunction collectExcludedIDs(imp: ImportResource): Set<string> | null {\n const excludeControls = imp['exclude-controls'];\n if (!excludeControls || excludeControls.length === 0) {\n return null;\n }\n\n const ids = new Set<string>();\n for (const ec of excludeControls) {\n for (const id of ec['with-ids'] ?? []) {\n ids.add(id);\n }\n }\n return ids;\n}\n\n/** Creates a new catalog containing only the controls matching filters. */\nfunction filterCatalog(\n catalog: Catalog,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n): Catalog {\n const includeAll = includedIDs === null;\n\n const result: Catalog = {\n uuid: catalog.uuid,\n metadata: catalog.metadata,\n 'back-matter': catalog['back-matter'],\n groups: [],\n controls: [],\n };\n\n for (const group of catalog.groups ?? []) {\n const filtered = filterGroupControls(group, includedIDs, excludedIDs, includeAll);\n if (filtered.controls && filtered.controls.length > 0) {\n result.groups!.push(filtered);\n }\n }\n\n for (const ctrl of catalog.controls ?? []) {\n if (shouldIncludeControl(ctrl.id, includedIDs, excludedIDs, includeAll)) {\n const filteredCtrl = filterControlEnhancements(ctrl, includedIDs, excludedIDs, includeAll);\n result.controls!.push(filteredCtrl);\n }\n }\n\n return result;\n}\n\nfunction filterGroupControls(\n group: CatalogControlGroup,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): CatalogControlGroup {\n const filtered: CatalogControlGroup = {\n id: group.id,\n class: group.class,\n title: group.title,\n props: group.props,\n parts: group.parts,\n controls: [],\n };\n\n for (const ctrl of group.controls ?? []) {\n if (shouldIncludeControl(ctrl.id, includedIDs, excludedIDs, includeAll)) {\n const filteredCtrl = filterControlEnhancements(ctrl, includedIDs, excludedIDs, includeAll);\n filtered.controls!.push(filteredCtrl);\n }\n }\n\n return filtered;\n}\n\nfunction filterControlEnhancements(\n ctrl: Control,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): Control {\n const result: Control = {\n id: ctrl.id,\n class: ctrl.class,\n title: ctrl.title,\n params: ctrl.params,\n props: ctrl.props,\n links: ctrl.links,\n parts: ctrl.parts,\n controls: [],\n };\n\n for (const enh of ctrl.controls ?? []) {\n if (shouldIncludeControl(enh.id, includedIDs, excludedIDs, includeAll)) {\n result.controls!.push(enh);\n }\n }\n\n return result;\n}\n\nfunction shouldIncludeControl(\n id: string,\n includedIDs: Set<string> | null,\n excludedIDs: Set<string> | null,\n includeAll: boolean,\n): boolean {\n if (excludedIDs !== null && excludedIDs.has(id)) {\n return false;\n }\n if (includeAll) {\n return true;\n }\n return includedIDs !== null && includedIDs.has(id);\n}\n\n/** Applies set-parameters from the profile's modify section to the resolved catalog. */\nfunction applyParameterOverrides(\n catalog: Catalog,\n setParams: ParameterSetting[],\n): void {\n if (setParams.length === 0) return;\n\n // Build param-id -> values lookup\n const overrides = new Map<string, string[]>();\n for (const sp of setParams) {\n if (sp['param-id']) {\n overrides.set(sp['param-id'], sp.values ?? []);\n }\n }\n\n // Apply to all controls in groups\n for (const group of catalog.groups ?? []) {\n for (const ctrl of group.controls ?? []) {\n applyParamOverridesToControl(ctrl, overrides);\n for (const enh of ctrl.controls ?? []) {\n applyParamOverridesToControl(enh, overrides);\n }\n }\n }\n\n // Apply to top-level controls\n for (const ctrl of catalog.controls ?? []) {\n applyParamOverridesToControl(ctrl, overrides);\n for (const enh of ctrl.controls ?? []) {\n applyParamOverridesToControl(enh, overrides);\n }\n }\n}\n\nfunction applyParamOverridesToControl(\n ctrl: Control,\n overrides: Map<string, string[]>,\n): void {\n if (ctrl.params) {\n for (const param of ctrl.params) {\n if (!param.id) continue;\n const values = overrides.get(param.id);\n if (values) {\n param.label = values.join(', ');\n }\n }\n }\n\n // Replace parameter insertions in prose\n if (ctrl.parts) {\n for (const part of ctrl.parts) {\n replaceParamInsertions(part, overrides);\n }\n }\n}\n\nfunction replaceParamInsertions(part: Part, overrides: Map<string, string[]>): void {\n if (part.prose) {\n part.prose = substituteParams(part.prose, overrides);\n }\n if (part.parts) {\n for (const child of part.parts) {\n replaceParamInsertions(child, overrides);\n }\n }\n}\n\n/** Replaces OSCAL parameter insertion patterns: {{ insert: param, <param-id> }} */\nfunction substituteParams(text: string, overrides: Map<string, string[]>): string {\n let result = text;\n for (const [paramId, values] of overrides) {\n const placeholder = `{{ insert: param, ${paramId} }}`;\n const replacement = values.join(', ');\n result = result.split(placeholder).join(replacement);\n }\n return result;\n}\n"],"mappings":"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"}