@cdxgen/cdxgen 0.0.1 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1833 -0
- package/lib/cli/cliOptions.js +513 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +142 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +876 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +575 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1789 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +277 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +315 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +28 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +120 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +19 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +76 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,703 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CycloneDX specification version compatibility.
|
|
3
|
+
*
|
|
4
|
+
* A BOM assembled in memory always carries the richest shape cdxgen knows how
|
|
5
|
+
* to produce. Emitting it at an older specification version therefore means
|
|
6
|
+
* removing elements that version does not define, and reshaping the ones it
|
|
7
|
+
* models differently — CycloneDX forbids additional properties, so a stray
|
|
8
|
+
* field fails schema validation outright.
|
|
9
|
+
*
|
|
10
|
+
* The reshaping is not purely subtractive. `evidence.identity` is a single
|
|
11
|
+
* object up to 1.5 and an array from 1.6, and `metadata.tools` flips from a
|
|
12
|
+
* `tools` object to component/service arrays at 2.0, so downgrades and upgrades
|
|
13
|
+
* both rewrite structure rather than just delete keys.
|
|
14
|
+
*
|
|
15
|
+
* This module is the single home for that logic. It is applied to generated
|
|
16
|
+
* BOMs by the postgen stage and to existing BOMs by `cdx-convert --to`, so both
|
|
17
|
+
* paths produce byte-identical output for the same target version.
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
import { thoughtLog } from "../../core/logger.js";
|
|
21
|
+
import {
|
|
22
|
+
DEFAULT_CDX_SPEC_VERSION,
|
|
23
|
+
getSupportedCycloneDxComponentTypes,
|
|
24
|
+
isCycloneDx20SpecVersion,
|
|
25
|
+
normalizeCycloneDxComponentTypeFilter,
|
|
26
|
+
normalizeCycloneDxSpecVersion,
|
|
27
|
+
setCycloneDxFormat,
|
|
28
|
+
toCycloneDxSpecVersionString,
|
|
29
|
+
} from "../../inventory/bomUtils.js";
|
|
30
|
+
|
|
31
|
+
const COMPONENT_1_6_ONLY_FIELDS = new Set([
|
|
32
|
+
"authors",
|
|
33
|
+
"manufacturer",
|
|
34
|
+
"omniborId",
|
|
35
|
+
"swhid",
|
|
36
|
+
"tags",
|
|
37
|
+
]);
|
|
38
|
+
const COMPONENT_1_7_ONLY_FIELDS = new Set([
|
|
39
|
+
"isExternal",
|
|
40
|
+
"patentAssertions",
|
|
41
|
+
"versionRange",
|
|
42
|
+
]);
|
|
43
|
+
const SERVICE_1_6_ONLY_FIELDS = new Set(["tags"]);
|
|
44
|
+
const SERVICE_1_7_ONLY_FIELDS = new Set(["patentAssertions"]);
|
|
45
|
+
const METADATA_1_6_ONLY_FIELDS = new Set(["manufacturer"]);
|
|
46
|
+
const METADATA_1_7_ONLY_FIELDS = new Set(["distributionConstraints"]);
|
|
47
|
+
// Root-level (BOM) fields introduced by CycloneDX 1.7. These live directly on
|
|
48
|
+
// the document object, so the per-key recursion in downgradeSubjectForSpecVersion
|
|
49
|
+
// never sees them — they need an explicit root-level strip. `citations` is the
|
|
50
|
+
// only such field today. Ref: data/bom-1.7.schema.json (root `properties`).
|
|
51
|
+
const BOM_1_7_ONLY_FIELDS = new Set(["citations"]);
|
|
52
|
+
const DEPENDENCY_1_6_ONLY_FIELDS = new Set(["provides"]);
|
|
53
|
+
// License and license expression objects gained these attributes only in the
|
|
54
|
+
// given spec versions. CycloneDX forbids additional properties, so they must be
|
|
55
|
+
// removed when downgrading. Ref: data/bom-1.{4,5,6}.schema.json
|
|
56
|
+
const LICENSE_1_5_ONLY_FIELDS = new Set(["bom-ref", "licensing", "properties"]);
|
|
57
|
+
const LICENSE_1_6_ONLY_FIELDS = new Set(["acknowledgement"]);
|
|
58
|
+
const LICENSE_EXPRESSION_1_5_ONLY_FIELDS = new Set(["bom-ref"]);
|
|
59
|
+
const LICENSE_EXPRESSION_1_6_ONLY_FIELDS = new Set(["acknowledgement"]);
|
|
60
|
+
const METADATA_2_0_REMOVED_FIELDS = new Set(["manufacture"]);
|
|
61
|
+
const COMPONENT_2_0_REMOVED_FIELDS = new Set(["author", "modified"]);
|
|
62
|
+
|
|
63
|
+
function deleteFields(subject, fields) {
|
|
64
|
+
if (!subject || typeof subject !== "object") {
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
for (const fieldName of fields) {
|
|
68
|
+
delete subject[fieldName];
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isObjectRecord(value) {
|
|
73
|
+
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function normalizeComponentForSpecVersion(subject, specVersion) {
|
|
77
|
+
if (specVersion < 1.6) {
|
|
78
|
+
deleteFields(subject, COMPONENT_1_6_ONLY_FIELDS);
|
|
79
|
+
}
|
|
80
|
+
if (specVersion < 1.7) {
|
|
81
|
+
deleteFields(subject, COMPONENT_1_7_ONLY_FIELDS);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function normalizeServiceForSpecVersion(subject, specVersion) {
|
|
86
|
+
if (specVersion < 1.6) {
|
|
87
|
+
deleteFields(subject, SERVICE_1_6_ONLY_FIELDS);
|
|
88
|
+
}
|
|
89
|
+
if (specVersion < 1.7) {
|
|
90
|
+
deleteFields(subject, SERVICE_1_7_ONLY_FIELDS);
|
|
91
|
+
}
|
|
92
|
+
if (specVersion < 2) {
|
|
93
|
+
delete subject.evidence;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
function normalizeMetadataForSpecVersion(subject, specVersion) {
|
|
98
|
+
if (specVersion < 1.6) {
|
|
99
|
+
deleteFields(subject, METADATA_1_6_ONLY_FIELDS);
|
|
100
|
+
}
|
|
101
|
+
if (specVersion < 1.7) {
|
|
102
|
+
deleteFields(subject, METADATA_1_7_ONLY_FIELDS);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function normalizeBomForSpecVersion(subject, specVersion) {
|
|
107
|
+
if (specVersion < 1.7) {
|
|
108
|
+
deleteFields(subject, BOM_1_7_ONLY_FIELDS);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function normalizeDependencyForSpecVersion(subject, specVersion) {
|
|
113
|
+
if (specVersion < 1.6) {
|
|
114
|
+
deleteFields(subject, DEPENDENCY_1_6_ONLY_FIELDS);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Removes license attributes that are unsupported by the requested spec version.
|
|
120
|
+
* Named (non-SPDX) licenses are commonly enriched with `properties`, which is
|
|
121
|
+
* invalid for CycloneDX 1.4 and below.
|
|
122
|
+
*
|
|
123
|
+
* @param {Object} subject A single entry of a `licenses` array
|
|
124
|
+
* @param {Number} specVersion Requested spec version
|
|
125
|
+
*/
|
|
126
|
+
function normalizeLicenseForSpecVersion(subject, specVersion) {
|
|
127
|
+
if (!isObjectRecord(subject)) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (isObjectRecord(subject.license)) {
|
|
131
|
+
if (specVersion < 1.6) {
|
|
132
|
+
deleteFields(subject.license, LICENSE_1_6_ONLY_FIELDS);
|
|
133
|
+
}
|
|
134
|
+
if (specVersion < 1.5) {
|
|
135
|
+
deleteFields(subject.license, LICENSE_1_5_ONLY_FIELDS);
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
if (subject.expression) {
|
|
139
|
+
if (specVersion < 1.6) {
|
|
140
|
+
deleteFields(subject, LICENSE_EXPRESSION_1_6_ONLY_FIELDS);
|
|
141
|
+
}
|
|
142
|
+
if (specVersion < 1.5) {
|
|
143
|
+
deleteFields(subject, LICENSE_EXPRESSION_1_5_ONLY_FIELDS);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
function filterComponentArrayByType(components, allowedTypes) {
|
|
149
|
+
if (!Array.isArray(components) || !allowedTypes?.size) {
|
|
150
|
+
return components;
|
|
151
|
+
}
|
|
152
|
+
const filteredComponents = [];
|
|
153
|
+
for (const component of components) {
|
|
154
|
+
if (!isObjectRecord(component)) {
|
|
155
|
+
filteredComponents.push(component);
|
|
156
|
+
continue;
|
|
157
|
+
}
|
|
158
|
+
if (component.type && !allowedTypes.has(component.type)) {
|
|
159
|
+
continue;
|
|
160
|
+
}
|
|
161
|
+
if (Array.isArray(component.components)) {
|
|
162
|
+
component.components = filterComponentArrayByType(
|
|
163
|
+
component.components,
|
|
164
|
+
allowedTypes,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
filteredComponents.push(component);
|
|
168
|
+
}
|
|
169
|
+
return filteredComponents;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function filterComponentObjectByType(component, allowedTypes) {
|
|
173
|
+
if (!isObjectRecord(component) || !allowedTypes?.size) {
|
|
174
|
+
return component;
|
|
175
|
+
}
|
|
176
|
+
if (component.type && !allowedTypes.has(component.type)) {
|
|
177
|
+
return undefined;
|
|
178
|
+
}
|
|
179
|
+
if (Array.isArray(component.components)) {
|
|
180
|
+
component.components = filterComponentArrayByType(
|
|
181
|
+
component.components,
|
|
182
|
+
allowedTypes,
|
|
183
|
+
);
|
|
184
|
+
}
|
|
185
|
+
return component;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function filterComponentArrayProperty(subject, propertyName, allowedTypes) {
|
|
189
|
+
if (!isObjectRecord(subject) || !Object.hasOwn(subject, propertyName)) {
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const filteredComponents = filterComponentArrayByType(
|
|
193
|
+
subject[propertyName],
|
|
194
|
+
allowedTypes,
|
|
195
|
+
);
|
|
196
|
+
if (filteredComponents === undefined) {
|
|
197
|
+
delete subject[propertyName];
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
subject[propertyName] = filteredComponents;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
function filterComponentObjectProperty(subject, propertyName, allowedTypes) {
|
|
204
|
+
if (!isObjectRecord(subject) || !Object.hasOwn(subject, propertyName)) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const filteredComponent = filterComponentObjectByType(
|
|
208
|
+
subject[propertyName],
|
|
209
|
+
allowedTypes,
|
|
210
|
+
);
|
|
211
|
+
if (filteredComponent === undefined) {
|
|
212
|
+
delete subject[propertyName];
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
subject[propertyName] = filteredComponent;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function filterTypedComponentCollections(
|
|
219
|
+
subject,
|
|
220
|
+
allowedTypes,
|
|
221
|
+
{ includeMetadata = true } = {},
|
|
222
|
+
) {
|
|
223
|
+
if (!isObjectRecord(subject) || !allowedTypes?.size) {
|
|
224
|
+
return subject;
|
|
225
|
+
}
|
|
226
|
+
filterComponentArrayProperty(subject, "components", allowedTypes);
|
|
227
|
+
if (includeMetadata && isObjectRecord(subject.metadata)) {
|
|
228
|
+
filterComponentObjectProperty(subject.metadata, "component", allowedTypes);
|
|
229
|
+
if (isObjectRecord(subject.metadata.tools)) {
|
|
230
|
+
filterComponentArrayProperty(
|
|
231
|
+
subject.metadata.tools,
|
|
232
|
+
"components",
|
|
233
|
+
allowedTypes,
|
|
234
|
+
);
|
|
235
|
+
} else if (Array.isArray(subject.metadata.tools)) {
|
|
236
|
+
subject.metadata.tools = filterComponentArrayByType(
|
|
237
|
+
subject.metadata.tools,
|
|
238
|
+
allowedTypes,
|
|
239
|
+
);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (Array.isArray(subject.formulation)) {
|
|
243
|
+
for (const formula of subject.formulation) {
|
|
244
|
+
filterTypedComponentCollections(formula, allowedTypes, {
|
|
245
|
+
includeMetadata,
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (isObjectRecord(subject.definitions)) {
|
|
250
|
+
filterComponentArrayProperty(
|
|
251
|
+
subject.definitions,
|
|
252
|
+
"components",
|
|
253
|
+
allowedTypes,
|
|
254
|
+
);
|
|
255
|
+
}
|
|
256
|
+
if (Array.isArray(subject.vulnerabilities)) {
|
|
257
|
+
for (const vulnerability of subject.vulnerabilities) {
|
|
258
|
+
if (isObjectRecord(vulnerability?.tools)) {
|
|
259
|
+
filterComponentArrayProperty(
|
|
260
|
+
vulnerability.tools,
|
|
261
|
+
"components",
|
|
262
|
+
allowedTypes,
|
|
263
|
+
);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
return subject;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function collectRetainedBomRefs(subject, retainedRefs = new Set()) {
|
|
271
|
+
if (!subject || typeof subject !== "object") {
|
|
272
|
+
return retainedRefs;
|
|
273
|
+
}
|
|
274
|
+
if (Array.isArray(subject)) {
|
|
275
|
+
subject.forEach((entry) => {
|
|
276
|
+
collectRetainedBomRefs(entry, retainedRefs);
|
|
277
|
+
});
|
|
278
|
+
return retainedRefs;
|
|
279
|
+
}
|
|
280
|
+
if (subject["bom-ref"]) {
|
|
281
|
+
retainedRefs.add(subject["bom-ref"]);
|
|
282
|
+
}
|
|
283
|
+
for (const value of Object.values(subject)) {
|
|
284
|
+
collectRetainedBomRefs(value, retainedRefs);
|
|
285
|
+
}
|
|
286
|
+
return retainedRefs;
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
function pruneDependenciesToRetainedRefs(bomJson) {
|
|
290
|
+
if (!Array.isArray(bomJson?.dependencies)) {
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
const retainedRefs = collectRetainedBomRefs({
|
|
294
|
+
components: bomJson.components,
|
|
295
|
+
metadata: bomJson.metadata,
|
|
296
|
+
services: bomJson.services,
|
|
297
|
+
});
|
|
298
|
+
bomJson.dependencies = bomJson.dependencies
|
|
299
|
+
.filter((dependency) => retainedRefs.has(dependency.ref))
|
|
300
|
+
.map((dependency) => {
|
|
301
|
+
const prunedDependency = {
|
|
302
|
+
ref: dependency.ref,
|
|
303
|
+
dependsOn: (dependency.dependsOn || []).filter((ref) =>
|
|
304
|
+
retainedRefs.has(ref),
|
|
305
|
+
),
|
|
306
|
+
};
|
|
307
|
+
if (dependency.provides?.length) {
|
|
308
|
+
prunedDependency.provides = dependency.provides.filter((ref) =>
|
|
309
|
+
retainedRefs.has(ref),
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
return prunedDependency;
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Restrict a BOM to the component types the caller asked for.
|
|
318
|
+
*
|
|
319
|
+
* Dependencies referencing pruned components are dropped so the graph never
|
|
320
|
+
* points at a `bom-ref` that no longer exists.
|
|
321
|
+
*
|
|
322
|
+
* @param {Object} bomJson CycloneDX BOM, mutated in place
|
|
323
|
+
* @param {Object} options CLI options carrying `componentType`
|
|
324
|
+
* @returns {Object} The mutated BOM
|
|
325
|
+
*/
|
|
326
|
+
export function applyComponentTypeFilter(bomJson, options) {
|
|
327
|
+
const componentTypes = normalizeCycloneDxComponentTypeFilter(
|
|
328
|
+
options?.componentType,
|
|
329
|
+
);
|
|
330
|
+
if (!componentTypes.length) {
|
|
331
|
+
return bomJson;
|
|
332
|
+
}
|
|
333
|
+
filterTypedComponentCollections(bomJson, new Set(componentTypes), {
|
|
334
|
+
includeMetadata: false,
|
|
335
|
+
});
|
|
336
|
+
pruneDependenciesToRetainedRefs(bomJson);
|
|
337
|
+
return bomJson;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
function filterUnsupportedComponentTypesForSpecVersion(bomJson, specVersion) {
|
|
341
|
+
const supportedTypes = new Set(
|
|
342
|
+
getSupportedCycloneDxComponentTypes(specVersion),
|
|
343
|
+
);
|
|
344
|
+
filterTypedComponentCollections(bomJson, supportedTypes);
|
|
345
|
+
pruneDependenciesToRetainedRefs(bomJson);
|
|
346
|
+
return bomJson;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function authorStringToAuthors(authorValue) {
|
|
350
|
+
if (typeof authorValue !== "string") {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
const authors = authorValue
|
|
354
|
+
.split(",")
|
|
355
|
+
.map((author) => author.trim())
|
|
356
|
+
.filter(Boolean)
|
|
357
|
+
.map((name) => ({ name }));
|
|
358
|
+
return authors.length ? authors : undefined;
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
function normalizeLegacyToolComponent(tool) {
|
|
362
|
+
if (!isObjectRecord(tool)) {
|
|
363
|
+
return tool;
|
|
364
|
+
}
|
|
365
|
+
if (!tool.type) {
|
|
366
|
+
tool.type = "application";
|
|
367
|
+
}
|
|
368
|
+
if (tool.vendor && !tool.publisher) {
|
|
369
|
+
tool.publisher = tool.vendor;
|
|
370
|
+
}
|
|
371
|
+
delete tool.vendor;
|
|
372
|
+
if (!tool.authors && tool.author) {
|
|
373
|
+
tool.authors = authorStringToAuthors(tool.author);
|
|
374
|
+
}
|
|
375
|
+
deleteFields(tool, COMPONENT_2_0_REMOVED_FIELDS);
|
|
376
|
+
normalizeComponentsForSpecVersion(tool.components);
|
|
377
|
+
return tool;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function hasExplicitSpecVersion(specVersion) {
|
|
381
|
+
return (
|
|
382
|
+
specVersion !== undefined &&
|
|
383
|
+
specVersion !== null &&
|
|
384
|
+
`${specVersion}`.trim() !== ""
|
|
385
|
+
);
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
function resolveSpecVersionForCompatibility(bomJson, options) {
|
|
389
|
+
if (hasExplicitSpecVersion(options?.specVersion)) {
|
|
390
|
+
return options.specVersion;
|
|
391
|
+
}
|
|
392
|
+
if (hasExplicitSpecVersion(bomJson?.specVersion)) {
|
|
393
|
+
return bomJson.specVersion;
|
|
394
|
+
}
|
|
395
|
+
return DEFAULT_CDX_SPEC_VERSION;
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
function normalizeLegacyToolService(service) {
|
|
399
|
+
if (!isObjectRecord(service)) {
|
|
400
|
+
return service;
|
|
401
|
+
}
|
|
402
|
+
if (service.vendor && !service.provider) {
|
|
403
|
+
service.provider =
|
|
404
|
+
typeof service.vendor === "string"
|
|
405
|
+
? { name: service.vendor }
|
|
406
|
+
: service.vendor;
|
|
407
|
+
}
|
|
408
|
+
delete service.vendor;
|
|
409
|
+
deleteFields(service, COMPONENT_2_0_REMOVED_FIELDS);
|
|
410
|
+
normalizeServicesForSpecVersion(service.services);
|
|
411
|
+
return service;
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
function normalizeComponentsForSpecVersion(components) {
|
|
415
|
+
if (!Array.isArray(components)) {
|
|
416
|
+
return;
|
|
417
|
+
}
|
|
418
|
+
for (const component of components) {
|
|
419
|
+
normalizeComponentForSpecVersion20(component);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function normalizeComponentForSpecVersion20(component) {
|
|
424
|
+
if (!isObjectRecord(component)) {
|
|
425
|
+
return;
|
|
426
|
+
}
|
|
427
|
+
if (!component.authors && component.author) {
|
|
428
|
+
component.authors = authorStringToAuthors(component.author);
|
|
429
|
+
}
|
|
430
|
+
deleteFields(component, COMPONENT_2_0_REMOVED_FIELDS);
|
|
431
|
+
normalizeComponentsForSpecVersion(component.components);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
function normalizeServicesForSpecVersion(services) {
|
|
435
|
+
if (!Array.isArray(services)) {
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
for (const service of services) {
|
|
439
|
+
normalizeLegacyToolService(service);
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
function normalizeFormulationForSpecVersion(formulation) {
|
|
444
|
+
if (!Array.isArray(formulation)) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
for (const formula of formulation) {
|
|
448
|
+
if (!isObjectRecord(formula)) {
|
|
449
|
+
continue;
|
|
450
|
+
}
|
|
451
|
+
normalizeComponentsForSpecVersion(formula.components);
|
|
452
|
+
normalizeServicesForSpecVersion(formula.services);
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
function normalizeVulnerabilitiesForSpecVersion(vulnerabilities) {
|
|
457
|
+
if (!Array.isArray(vulnerabilities)) {
|
|
458
|
+
return;
|
|
459
|
+
}
|
|
460
|
+
for (const vulnerability of vulnerabilities) {
|
|
461
|
+
if (!isObjectRecord(vulnerability?.tools)) {
|
|
462
|
+
continue;
|
|
463
|
+
}
|
|
464
|
+
normalizeComponentsForSpecVersion(vulnerability.tools.components);
|
|
465
|
+
normalizeServicesForSpecVersion(vulnerability.tools.services);
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
function normalizeDefinitionsForSpecVersion(definitions) {
|
|
470
|
+
if (!isObjectRecord(definitions)) {
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
normalizeComponentsForSpecVersion(definitions.components);
|
|
474
|
+
normalizeServicesForSpecVersion(definitions.services);
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
function migrateLegacyManufactureForSpecVersion(metadata) {
|
|
478
|
+
if (!metadata.manufacture) {
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
if (isObjectRecord(metadata.component) && !metadata.component.manufacturer) {
|
|
482
|
+
metadata.component.manufacturer = metadata.manufacture;
|
|
483
|
+
return;
|
|
484
|
+
}
|
|
485
|
+
if (!metadata.manufacturer) {
|
|
486
|
+
metadata.manufacturer = metadata.manufacture;
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
function normalizeToolsForSpecVersion(subject, specVersion) {
|
|
491
|
+
if (!subject || !isCycloneDx20SpecVersion(specVersion)) {
|
|
492
|
+
return;
|
|
493
|
+
}
|
|
494
|
+
if (Array.isArray(subject.tools)) {
|
|
495
|
+
subject.tools = {
|
|
496
|
+
components: subject.tools.map((tool) =>
|
|
497
|
+
normalizeLegacyToolComponent(isObjectRecord(tool) ? { ...tool } : tool),
|
|
498
|
+
),
|
|
499
|
+
};
|
|
500
|
+
return;
|
|
501
|
+
}
|
|
502
|
+
if (!isObjectRecord(subject.tools)) {
|
|
503
|
+
return;
|
|
504
|
+
}
|
|
505
|
+
if (Array.isArray(subject.tools.components)) {
|
|
506
|
+
subject.tools.components = subject.tools.components.map((tool) =>
|
|
507
|
+
normalizeLegacyToolComponent(tool),
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
if (Array.isArray(subject.tools.services)) {
|
|
511
|
+
subject.tools.services = subject.tools.services.map((service) =>
|
|
512
|
+
normalizeLegacyToolService(service),
|
|
513
|
+
);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
function upgradeSubjectForSpecVersion(subject, specVersion) {
|
|
518
|
+
if (!isObjectRecord(subject) || !isCycloneDx20SpecVersion(specVersion)) {
|
|
519
|
+
return;
|
|
520
|
+
}
|
|
521
|
+
if (isObjectRecord(subject.metadata)) {
|
|
522
|
+
migrateLegacyManufactureForSpecVersion(subject.metadata);
|
|
523
|
+
deleteFields(subject.metadata, METADATA_2_0_REMOVED_FIELDS);
|
|
524
|
+
normalizeToolsForSpecVersion(subject.metadata, specVersion);
|
|
525
|
+
normalizeComponentForSpecVersion20(subject.metadata.component);
|
|
526
|
+
}
|
|
527
|
+
normalizeComponentsForSpecVersion(subject.components);
|
|
528
|
+
normalizeFormulationForSpecVersion(subject.formulation);
|
|
529
|
+
normalizeDefinitionsForSpecVersion(subject.definitions);
|
|
530
|
+
normalizeVulnerabilitiesForSpecVersion(subject.vulnerabilities);
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
function downgradeSubjectForSpecVersion(subject, specVersion, parentKey) {
|
|
534
|
+
if (!subject || typeof subject !== "object") {
|
|
535
|
+
return;
|
|
536
|
+
}
|
|
537
|
+
if (Array.isArray(subject)) {
|
|
538
|
+
subject.forEach((entry) => {
|
|
539
|
+
downgradeSubjectForSpecVersion(entry, specVersion, parentKey);
|
|
540
|
+
});
|
|
541
|
+
return;
|
|
542
|
+
}
|
|
543
|
+
if (parentKey === "metadata") {
|
|
544
|
+
normalizeMetadataForSpecVersion(subject, specVersion);
|
|
545
|
+
}
|
|
546
|
+
if (parentKey === "component" || parentKey === "components") {
|
|
547
|
+
normalizeComponentForSpecVersion(subject, specVersion);
|
|
548
|
+
}
|
|
549
|
+
if (parentKey === "service" || parentKey === "services") {
|
|
550
|
+
normalizeServiceForSpecVersion(subject, specVersion);
|
|
551
|
+
}
|
|
552
|
+
if (parentKey === "dependencies") {
|
|
553
|
+
normalizeDependencyForSpecVersion(subject, specVersion);
|
|
554
|
+
}
|
|
555
|
+
if (parentKey === "licenses") {
|
|
556
|
+
normalizeLicenseForSpecVersion(subject, specVersion);
|
|
557
|
+
}
|
|
558
|
+
if (specVersion < 1.6) {
|
|
559
|
+
if (subject.cryptoProperties) {
|
|
560
|
+
delete subject.cryptoProperties;
|
|
561
|
+
}
|
|
562
|
+
if (
|
|
563
|
+
subject?.evidence?.occurrences &&
|
|
564
|
+
Array.isArray(subject.evidence.occurrences)
|
|
565
|
+
) {
|
|
566
|
+
subject.evidence.occurrences.forEach((occurrence) => {
|
|
567
|
+
delete occurrence.line;
|
|
568
|
+
delete occurrence.offset;
|
|
569
|
+
delete occurrence.symbol;
|
|
570
|
+
delete occurrence.additionalContext;
|
|
571
|
+
});
|
|
572
|
+
}
|
|
573
|
+
if (
|
|
574
|
+
subject?.evidence?.identity &&
|
|
575
|
+
Array.isArray(subject.evidence.identity)
|
|
576
|
+
) {
|
|
577
|
+
subject.evidence.identity = subject.evidence.identity[0];
|
|
578
|
+
if (subject.evidence.identity?.concludedValue) {
|
|
579
|
+
delete subject.evidence.identity.concludedValue;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
} else if (
|
|
583
|
+
specVersion < 1.7 &&
|
|
584
|
+
subject.cryptoProperties?.assetType === "certificate" &&
|
|
585
|
+
subject.cryptoProperties.certificateProperties
|
|
586
|
+
) {
|
|
587
|
+
const certificateProperties =
|
|
588
|
+
subject.cryptoProperties.certificateProperties;
|
|
589
|
+
if (
|
|
590
|
+
!certificateProperties.certificateExtension &&
|
|
591
|
+
certificateProperties.certificateFileExtension
|
|
592
|
+
) {
|
|
593
|
+
certificateProperties.certificateExtension =
|
|
594
|
+
certificateProperties.certificateFileExtension;
|
|
595
|
+
}
|
|
596
|
+
delete certificateProperties.serialNumber;
|
|
597
|
+
delete certificateProperties.certificateFileExtension;
|
|
598
|
+
delete certificateProperties.fingerprint;
|
|
599
|
+
}
|
|
600
|
+
if (specVersion < 1.7 && subject.cryptoProperties?.algorithmProperties) {
|
|
601
|
+
// `algorithmFamily` and `ellipticCurve` are CycloneDX 1.7 additions to
|
|
602
|
+
// cryptoProperties.algorithmProperties. 1.6 keeps the deprecated free-text
|
|
603
|
+
// `curve`, so that one is preserved. Ref: data/bom-1.6.schema.json.
|
|
604
|
+
const algorithmProperties = subject.cryptoProperties.algorithmProperties;
|
|
605
|
+
delete algorithmProperties.algorithmFamily;
|
|
606
|
+
delete algorithmProperties.ellipticCurve;
|
|
607
|
+
}
|
|
608
|
+
Object.entries(subject).forEach(([key, value]) => {
|
|
609
|
+
downgradeSubjectForSpecVersion(value, specVersion, key);
|
|
610
|
+
});
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/**
|
|
614
|
+
* Reshape a BOM so it is valid at the requested specification version.
|
|
615
|
+
*
|
|
616
|
+
* Component types the target version does not define are filtered out first,
|
|
617
|
+
* then root-level version-only fields are stripped, then the document is walked
|
|
618
|
+
* key by key to downgrade (below 2.0) or upgrade (2.0 and above) each subject.
|
|
619
|
+
* The BOM's `specVersion` and `$schema` are rewritten last.
|
|
620
|
+
*
|
|
621
|
+
* The target version is taken from `options.specVersion` when set, falling back
|
|
622
|
+
* to the BOM's own `specVersion`. A malformed explicit version is left alone
|
|
623
|
+
* rather than guessed at.
|
|
624
|
+
*
|
|
625
|
+
* @param {Object} bomJson CycloneDX BOM, mutated in place
|
|
626
|
+
* @param {Object} options CLI options carrying the requested `specVersion`
|
|
627
|
+
* @returns {Object} The mutated BOM
|
|
628
|
+
*/
|
|
629
|
+
export function applySpecVersionCompatibility(bomJson, options) {
|
|
630
|
+
const requestedSpecVersion = resolveSpecVersionForCompatibility(
|
|
631
|
+
bomJson,
|
|
632
|
+
options,
|
|
633
|
+
);
|
|
634
|
+
const normalizedSpecVersion =
|
|
635
|
+
toCycloneDxSpecVersionString(requestedSpecVersion);
|
|
636
|
+
if (!normalizedSpecVersion) {
|
|
637
|
+
thoughtLog(
|
|
638
|
+
"Skipping CycloneDX specVersion compatibility updates for malformed explicit specVersion.",
|
|
639
|
+
{
|
|
640
|
+
specVersion: requestedSpecVersion,
|
|
641
|
+
},
|
|
642
|
+
);
|
|
643
|
+
return bomJson;
|
|
644
|
+
}
|
|
645
|
+
const specVersion = normalizeCycloneDxSpecVersion(normalizedSpecVersion);
|
|
646
|
+
filterUnsupportedComponentTypesForSpecVersion(bomJson, specVersion);
|
|
647
|
+
// Root-level 1.7-only fields (e.g. `citations`) are not reachable by the
|
|
648
|
+
// key-based recursion below, so strip them before recursing into children.
|
|
649
|
+
normalizeBomForSpecVersion(bomJson, specVersion);
|
|
650
|
+
if (specVersion < 2) {
|
|
651
|
+
downgradeSubjectForSpecVersion(bomJson, specVersion);
|
|
652
|
+
} else if (isCycloneDx20SpecVersion(specVersion)) {
|
|
653
|
+
upgradeSubjectForSpecVersion(bomJson, specVersion);
|
|
654
|
+
}
|
|
655
|
+
return setCycloneDxFormat(bomJson, normalizedSpecVersion);
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
/**
|
|
659
|
+
* Collect the set of field paths present in a BOM.
|
|
660
|
+
*
|
|
661
|
+
* Array nesting does not extend the path, so the result describes which fields
|
|
662
|
+
* a document carries rather than where they sit. That keeps a comparison
|
|
663
|
+
* between two BOMs meaningful across a compatibility pass, which both drops
|
|
664
|
+
* array entries and reshapes fields whose cardinality changed between spec
|
|
665
|
+
* versions — `evidence.identity` reads the same whether it holds one object or
|
|
666
|
+
* an array of them.
|
|
667
|
+
*
|
|
668
|
+
* @param {Object} subject BOM or BOM fragment
|
|
669
|
+
* @param {string} [prefix] Path accumulated so far
|
|
670
|
+
* @param {Set<string>} [paths] Accumulator
|
|
671
|
+
* @returns {Set<string>} Field paths, e.g. `components.evidence.identity`
|
|
672
|
+
*/
|
|
673
|
+
export function collectFieldPaths(subject, prefix = "", paths = new Set()) {
|
|
674
|
+
if (Array.isArray(subject)) {
|
|
675
|
+
for (const entry of subject) {
|
|
676
|
+
collectFieldPaths(entry, prefix, paths);
|
|
677
|
+
}
|
|
678
|
+
return paths;
|
|
679
|
+
}
|
|
680
|
+
if (!isObjectRecord(subject)) {
|
|
681
|
+
return paths;
|
|
682
|
+
}
|
|
683
|
+
for (const [key, value] of Object.entries(subject)) {
|
|
684
|
+
const path = prefix ? `${prefix}.${key}` : key;
|
|
685
|
+
paths.add(path);
|
|
686
|
+
collectFieldPaths(value, path, paths);
|
|
687
|
+
}
|
|
688
|
+
return paths;
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
/**
|
|
692
|
+
* Report which field paths a compatibility pass removed.
|
|
693
|
+
*
|
|
694
|
+
* @param {Object} sourceBomJson BOM before normalization
|
|
695
|
+
* @param {Object} normalizedBomJson BOM after normalization
|
|
696
|
+
* @returns {string[]} Sorted field paths that no longer appear
|
|
697
|
+
*/
|
|
698
|
+
export function diffRemovedFieldPaths(sourceBomJson, normalizedBomJson) {
|
|
699
|
+
const retainedPaths = collectFieldPaths(normalizedBomJson);
|
|
700
|
+
return [...collectFieldPaths(sourceBomJson)]
|
|
701
|
+
.filter((path) => !retainedPaths.has(path))
|
|
702
|
+
.sort();
|
|
703
|
+
}
|