@cdxgen/cdxgen 0.0.1 → 13.0.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/README.md +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2335 -0
- package/bin/convert.js +220 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +504 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +303 -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 +1882 -0
- package/lib/cli/cliOptions.js +543 -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 +280 -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 +920 -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 +583 -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 +1793 -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 +383 -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 +267 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3459 -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 +329 -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 +50 -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 +201 -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 +22 -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 +147 -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,985 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { Purl } from "@cdxgen/cdx-purl";
|
|
5
|
+
import Ajv from "ajv";
|
|
6
|
+
import Ajv2020 from "ajv/dist/2020.js";
|
|
7
|
+
import addFormats from "ajv-formats";
|
|
8
|
+
|
|
9
|
+
import { DEBUG_MODE, readEnvironmentVariable } from "../core/activity.js";
|
|
10
|
+
import { thoughtLog } from "../core/logger.js";
|
|
11
|
+
import { dirNameStr } from "../core/paths.js";
|
|
12
|
+
import { SPDX_JSONLD_CONTEXT, SPDX_SPEC_VERSION } from "../core/spdx.js";
|
|
13
|
+
import {
|
|
14
|
+
isCycloneDxSpecVersionAtLeast,
|
|
15
|
+
toCycloneDxSpecVersionString,
|
|
16
|
+
} from "../inventory/bomUtils.js";
|
|
17
|
+
import { isPartialTree } from "../inventory/depsUtils.js";
|
|
18
|
+
import { isValidPurl } from "../inventory/purl.js";
|
|
19
|
+
|
|
20
|
+
const dirName = dirNameStr;
|
|
21
|
+
// The v13 floor is spec 1.6. 1.4 and 1.5 were dropped here so that the JS and
|
|
22
|
+
// Rust (`cdxrs validate`) validators agree on what they accept: cdxrs supports
|
|
23
|
+
// 1.6/1.7 only, and while the two sets differed, whether a 1.5 BOM passed
|
|
24
|
+
// validation depended on whether a cdxrs binary happened to be installed.
|
|
25
|
+
const SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
|
|
26
|
+
const PLACEHOLDER_COMPONENT_NAMES = new Set(["app", "application", "project"]);
|
|
27
|
+
const SPDX_EXPORT_TYPES = new Set([
|
|
28
|
+
"CreationInfo",
|
|
29
|
+
"Relationship",
|
|
30
|
+
"SpdxDocument",
|
|
31
|
+
"software_File",
|
|
32
|
+
"software_Package",
|
|
33
|
+
]);
|
|
34
|
+
const NPM_NATIVE_ADDON_EVIDENCE_PROPERTIES = new Set([
|
|
35
|
+
"cdx:npm:native_addon",
|
|
36
|
+
"cdx:npm:has_binary",
|
|
37
|
+
"cdx:npm:os",
|
|
38
|
+
"cdx:npm:cpu",
|
|
39
|
+
]);
|
|
40
|
+
let spdxExportSchemaValidator;
|
|
41
|
+
const cycloneDxSchemaValidators = new Map();
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Compile a schema validator at runtime.
|
|
45
|
+
*
|
|
46
|
+
* This is the fallback used when the pre-compiled module from
|
|
47
|
+
* `contrib/gen-validators.mjs` is not available (e.g. during development
|
|
48
|
+
* before `node contrib/gen-validators.mjs` has been run). It pays the full
|
|
49
|
+
* ~114 ms compilation cost on the first call per spec version per process.
|
|
50
|
+
*/
|
|
51
|
+
const compileSchemaValidator = (specVersion) => {
|
|
52
|
+
let validate;
|
|
53
|
+
if (isCycloneDxSpecVersionAtLeast(specVersion, "2.0")) {
|
|
54
|
+
const ajv = new Ajv2020(AJV_OPTIONS);
|
|
55
|
+
useLinearUniqueItems(ajv);
|
|
56
|
+
addFormats(ajv);
|
|
57
|
+
addDraft2020BundledSchema(
|
|
58
|
+
ajv,
|
|
59
|
+
readJsonSchema("cryptography-defs.schema.json"),
|
|
60
|
+
"https://cyclonedx.org/schema/cryptography-defs.schema.json",
|
|
61
|
+
);
|
|
62
|
+
addDraft2020BundledSchema(
|
|
63
|
+
ajv,
|
|
64
|
+
readJsonSchema("jsf-0.82.schema.json"),
|
|
65
|
+
"https://cyclonedx.org/schema/jsf-0.82.schema.json",
|
|
66
|
+
);
|
|
67
|
+
addDraft2020BundledSchema(
|
|
68
|
+
ajv,
|
|
69
|
+
readJsonSchema("spdx.schema.json"),
|
|
70
|
+
"https://cyclonedx.org/schema/spdx.schema.json",
|
|
71
|
+
);
|
|
72
|
+
validate = ajv.compile(readJsonSchema("cyclonedx-2.0-bundled.schema.json"));
|
|
73
|
+
} else {
|
|
74
|
+
const schemas = [
|
|
75
|
+
readJsonSchema(`bom-${specVersion}.schema.json`),
|
|
76
|
+
readJsonSchema("jsf-0.82.schema.json"),
|
|
77
|
+
readJsonSchema("spdx.schema.json"),
|
|
78
|
+
];
|
|
79
|
+
if (isCycloneDxSpecVersionAtLeast(specVersion, "1.7")) {
|
|
80
|
+
schemas.push(readJsonSchema("cryptography-defs.schema.json"));
|
|
81
|
+
}
|
|
82
|
+
const ajv = new Ajv({
|
|
83
|
+
...AJV_OPTIONS,
|
|
84
|
+
schemas,
|
|
85
|
+
});
|
|
86
|
+
useLinearUniqueItems(ajv);
|
|
87
|
+
addFormats(ajv);
|
|
88
|
+
validate = ajv.getSchema(
|
|
89
|
+
`http://cyclonedx.org/schema/bom-${specVersion}.schema.json`,
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
return validate;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Return the schema validator for a CycloneDX spec version.
|
|
97
|
+
*
|
|
98
|
+
* Prefers the pre-compiled module generated by `contrib/gen-validators.mjs`
|
|
99
|
+
* (skips ~114 ms of ajv compilation per process). Falls back to runtime
|
|
100
|
+
* compilation if the generated file is missing. Set
|
|
101
|
+
* `CDXGEN_PRECOMPILED_VALIDATORS=0` to always compile, which is how the two
|
|
102
|
+
* paths are compared for equivalence.
|
|
103
|
+
*
|
|
104
|
+
* Returns a Promise that resolves to the validator function, so callers must
|
|
105
|
+
* `await` the result. The promise is cached so repeated calls for the same
|
|
106
|
+
* version resolve instantly.
|
|
107
|
+
*
|
|
108
|
+
* @param {string} specVersion CycloneDX spec version ("1.6", "1.7", "2.0")
|
|
109
|
+
* @returns {Promise<Function>} Validator function (call with data to validate)
|
|
110
|
+
*/
|
|
111
|
+
const getCycloneDxSchemaValidator = (specVersion) => {
|
|
112
|
+
if (cycloneDxSchemaValidators.has(specVersion)) {
|
|
113
|
+
return cycloneDxSchemaValidators.get(specVersion);
|
|
114
|
+
}
|
|
115
|
+
const precompiledDisabled = ["0", "false"].includes(
|
|
116
|
+
(readEnvironmentVariable("CDXGEN_PRECOMPILED_VALIDATORS") || "")
|
|
117
|
+
.trim()
|
|
118
|
+
.toLowerCase(),
|
|
119
|
+
);
|
|
120
|
+
const promise = precompiledDisabled
|
|
121
|
+
? Promise.resolve(compileSchemaValidator(specVersion))
|
|
122
|
+
: import(`./generated/validate-${specVersion}.mjs`)
|
|
123
|
+
.then((mod) => mod.default || mod.validate)
|
|
124
|
+
.catch((err) => {
|
|
125
|
+
// The two validators are equivalent, so falling back only costs the
|
|
126
|
+
// compilation time. Saying so keeps a missing or unreadable generated
|
|
127
|
+
// module from looking like a validation result.
|
|
128
|
+
thoughtLog(
|
|
129
|
+
`Pre-compiled validator for CycloneDX ${specVersion} is unavailable (${err.message}); compiling the schema instead.`,
|
|
130
|
+
);
|
|
131
|
+
return compileSchemaValidator(specVersion);
|
|
132
|
+
});
|
|
133
|
+
cycloneDxSchemaValidators.set(specVersion, promise);
|
|
134
|
+
return promise;
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
const AJV_OPTIONS = {
|
|
138
|
+
strict: false,
|
|
139
|
+
logger: false,
|
|
140
|
+
verbose: true,
|
|
141
|
+
code: {
|
|
142
|
+
source: true,
|
|
143
|
+
lines: true,
|
|
144
|
+
optimize: true,
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Serialise a value so that two values are deep-equal exactly when their
|
|
150
|
+
* serialisations match: object keys are emitted in sorted order and every
|
|
151
|
+
* string is length-prefixed so that no two distinct values can collide.
|
|
152
|
+
*
|
|
153
|
+
* @param {*} value Value from a parsed BOM document
|
|
154
|
+
* @returns {string} Canonical form of the value
|
|
155
|
+
*/
|
|
156
|
+
const canonicalize = (value) => {
|
|
157
|
+
if (value === null || typeof value !== "object") {
|
|
158
|
+
return typeof value === "string"
|
|
159
|
+
? `s${value.length}:${value}`
|
|
160
|
+
: `${typeof value}:${value}`;
|
|
161
|
+
}
|
|
162
|
+
if (Array.isArray(value)) {
|
|
163
|
+
return `[${value.map(canonicalize).join(",")}]`;
|
|
164
|
+
}
|
|
165
|
+
const keys = Object.keys(value).sort();
|
|
166
|
+
return `{${keys.map((key) => `s${key.length}:${key}=${canonicalize(value[key])}`).join(",")}}`;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Replace Ajv's `uniqueItems` implementation with one that runs in linear time.
|
|
171
|
+
*
|
|
172
|
+
* Ajv compares every pair of items with a deep equality check, which is
|
|
173
|
+
* quadratic in the length of the array. The CycloneDX schema sets the keyword
|
|
174
|
+
* on 46 arrays, `components` among them, so a BOM describing a container image
|
|
175
|
+
* spends the bulk of its validation there. Comparing canonical serialisations
|
|
176
|
+
* through a set decides the same question in one pass.
|
|
177
|
+
*
|
|
178
|
+
* @param {object} ajv Ajv instance whose validators are about to be compiled
|
|
179
|
+
*/
|
|
180
|
+
const useLinearUniqueItems = (ajv) => {
|
|
181
|
+
ajv.removeKeyword("uniqueItems");
|
|
182
|
+
ajv.addKeyword({
|
|
183
|
+
keyword: "uniqueItems",
|
|
184
|
+
type: "array",
|
|
185
|
+
schemaType: "boolean",
|
|
186
|
+
errors: false,
|
|
187
|
+
error: {
|
|
188
|
+
message: "must NOT have duplicate items",
|
|
189
|
+
},
|
|
190
|
+
validate: (schema, data) => {
|
|
191
|
+
if (schema === false || !Array.isArray(data) || data.length < 2) {
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
const seen = new Set();
|
|
195
|
+
for (const item of data) {
|
|
196
|
+
const key = canonicalize(item);
|
|
197
|
+
if (seen.has(key)) {
|
|
198
|
+
return false;
|
|
199
|
+
}
|
|
200
|
+
seen.add(key);
|
|
201
|
+
}
|
|
202
|
+
return true;
|
|
203
|
+
},
|
|
204
|
+
});
|
|
205
|
+
};
|
|
206
|
+
|
|
207
|
+
const readJsonSchema = (fileName) =>
|
|
208
|
+
JSON.parse(readFileSync(join(dirName, "data", fileName), "utf-8"));
|
|
209
|
+
|
|
210
|
+
const addDraft2020BundledSchema = (ajv, schema, schemaId) => {
|
|
211
|
+
const bundledSchema = { ...schema };
|
|
212
|
+
delete bundledSchema.$schema;
|
|
213
|
+
bundledSchema.$id = schemaId;
|
|
214
|
+
ajv.addSchema(bundledSchema);
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
const getSpdxElementId = (element) => element?.spdxId || element?.["@id"];
|
|
218
|
+
|
|
219
|
+
const getSpdxExportSchemaValidator = () => {
|
|
220
|
+
if (spdxExportSchemaValidator !== undefined) {
|
|
221
|
+
return spdxExportSchemaValidator;
|
|
222
|
+
}
|
|
223
|
+
try {
|
|
224
|
+
const spdxExportSchema = JSON.parse(
|
|
225
|
+
readFileSync(join(dirName, "data", "spdx-export.schema.json"), "utf-8"),
|
|
226
|
+
);
|
|
227
|
+
const ajv = new Ajv2020({
|
|
228
|
+
strict: false,
|
|
229
|
+
validateSchema: false,
|
|
230
|
+
logger: false,
|
|
231
|
+
verbose: true,
|
|
232
|
+
code: {
|
|
233
|
+
source: true,
|
|
234
|
+
lines: true,
|
|
235
|
+
optimize: true,
|
|
236
|
+
},
|
|
237
|
+
});
|
|
238
|
+
addFormats(ajv);
|
|
239
|
+
spdxExportSchemaValidator = ajv.compile(spdxExportSchema);
|
|
240
|
+
} catch (_error) {
|
|
241
|
+
spdxExportSchemaValidator = null;
|
|
242
|
+
}
|
|
243
|
+
return spdxExportSchemaValidator;
|
|
244
|
+
};
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Validate the generated bom using jsonschema
|
|
248
|
+
*
|
|
249
|
+
* @param {object} bomJson content
|
|
250
|
+
*
|
|
251
|
+
* @returns {Promise<Boolean>} true if the BOM is valid. false otherwise.
|
|
252
|
+
*/
|
|
253
|
+
export const validateBom = async (bomJson) => {
|
|
254
|
+
if (!bomJson) {
|
|
255
|
+
return true;
|
|
256
|
+
}
|
|
257
|
+
const specVersion = toCycloneDxSpecVersionString(bomJson.specVersion);
|
|
258
|
+
if (!SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS.has(specVersion)) {
|
|
259
|
+
console.log(
|
|
260
|
+
`Unsupported CycloneDX specVersion '${bomJson.specVersion}'. Supported versions are ${[
|
|
261
|
+
...SUPPORTED_CYCLONEDX_SCHEMA_VERSIONS,
|
|
262
|
+
].join(", ")}.`,
|
|
263
|
+
);
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
const validate = await getCycloneDxSchemaValidator(specVersion);
|
|
267
|
+
const isValid = validate(bomJson);
|
|
268
|
+
if (!isValid) {
|
|
269
|
+
if (bomJson.metadata?.component?.name) {
|
|
270
|
+
console.log(
|
|
271
|
+
`Schema validation failed for ${bomJson.metadata.component.name}`,
|
|
272
|
+
);
|
|
273
|
+
} else {
|
|
274
|
+
console.log("Schema validation failed");
|
|
275
|
+
}
|
|
276
|
+
console.log(validate.errors);
|
|
277
|
+
return false;
|
|
278
|
+
}
|
|
279
|
+
// Deep validation tests
|
|
280
|
+
return (
|
|
281
|
+
validateMetadata(bomJson) &&
|
|
282
|
+
validatePurls(bomJson) &&
|
|
283
|
+
validateRefs(bomJson) &&
|
|
284
|
+
validateProps(bomJson)
|
|
285
|
+
);
|
|
286
|
+
};
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Validate the generated SPDX export.
|
|
290
|
+
*
|
|
291
|
+
* @param {object|string} spdxJson SPDX json object
|
|
292
|
+
* @returns {boolean} true if the SPDX export is valid
|
|
293
|
+
*/
|
|
294
|
+
export const validateSpdx = (spdxJson) => {
|
|
295
|
+
if (!spdxJson) {
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
if (typeof spdxJson === "string" || spdxJson instanceof String) {
|
|
299
|
+
spdxJson = JSON.parse(spdxJson);
|
|
300
|
+
}
|
|
301
|
+
const spdxDocument = (spdxJson?.["@graph"] || []).find(
|
|
302
|
+
(element) => element?.type === "SpdxDocument",
|
|
303
|
+
);
|
|
304
|
+
const validateSchema = getSpdxExportSchemaValidator();
|
|
305
|
+
if (!validateSchema) {
|
|
306
|
+
console.log("The bundled SPDX export schema is empty or malformed.");
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
if (!validateSchema(spdxJson)) {
|
|
310
|
+
console.log(
|
|
311
|
+
`SPDX 3.0.1 schema validation failed${spdxDocument?.name ? ` for ${spdxDocument.name}` : ""}`,
|
|
312
|
+
);
|
|
313
|
+
console.log(validateSchema.errors);
|
|
314
|
+
return false;
|
|
315
|
+
}
|
|
316
|
+
const errorList = [];
|
|
317
|
+
if (spdxJson?.["@context"] !== SPDX_JSONLD_CONTEXT) {
|
|
318
|
+
errorList.push(`@context must be '${SPDX_JSONLD_CONTEXT}'.`);
|
|
319
|
+
}
|
|
320
|
+
if (!Array.isArray(spdxJson?.["@graph"]) || !spdxJson["@graph"].length) {
|
|
321
|
+
errorList.push("@graph must be a non-empty array.");
|
|
322
|
+
}
|
|
323
|
+
const ids = new Set();
|
|
324
|
+
const knownRefs = new Set();
|
|
325
|
+
let creationInfoCount = 0;
|
|
326
|
+
let documentCount = 0;
|
|
327
|
+
let usesExtensionProfile = false;
|
|
328
|
+
for (const element of spdxJson?.["@graph"] || []) {
|
|
329
|
+
if (!SPDX_EXPORT_TYPES.has(element?.type)) {
|
|
330
|
+
errorList.push(`Unsupported SPDX export type '${element?.type}'.`);
|
|
331
|
+
}
|
|
332
|
+
const elementId = getSpdxElementId(element);
|
|
333
|
+
if (!elementId || typeof elementId !== "string") {
|
|
334
|
+
errorList.push(
|
|
335
|
+
`Missing SPDX identifier for type '${element?.type || "unknown"}'.`,
|
|
336
|
+
);
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
if (ids.has(elementId)) {
|
|
340
|
+
errorList.push(`Duplicate SPDX identifier '${elementId}'.`);
|
|
341
|
+
}
|
|
342
|
+
ids.add(elementId);
|
|
343
|
+
knownRefs.add(elementId);
|
|
344
|
+
if (Array.isArray(element?.extension) && element.extension.length) {
|
|
345
|
+
usesExtensionProfile = true;
|
|
346
|
+
}
|
|
347
|
+
switch (element.type) {
|
|
348
|
+
case "CreationInfo":
|
|
349
|
+
creationInfoCount += 1;
|
|
350
|
+
if (element.specVersion !== SPDX_SPEC_VERSION) {
|
|
351
|
+
errorList.push(
|
|
352
|
+
`CreationInfo '${elementId}' has unexpected specVersion '${element.specVersion}'.`,
|
|
353
|
+
);
|
|
354
|
+
}
|
|
355
|
+
if (!Array.isArray(element.createdBy) || !element.createdBy.length) {
|
|
356
|
+
errorList.push(`CreationInfo '${elementId}' must include createdBy.`);
|
|
357
|
+
}
|
|
358
|
+
if (!element.created) {
|
|
359
|
+
errorList.push(`CreationInfo '${elementId}' must include created.`);
|
|
360
|
+
}
|
|
361
|
+
break;
|
|
362
|
+
case "SpdxDocument":
|
|
363
|
+
documentCount += 1;
|
|
364
|
+
if (!element.creationInfo) {
|
|
365
|
+
errorList.push(
|
|
366
|
+
`SpdxDocument '${elementId}' must include creationInfo.`,
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
if (!Array.isArray(element.element) || !element.element.length) {
|
|
370
|
+
errorList.push(
|
|
371
|
+
`SpdxDocument '${elementId}' must include element refs.`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
if (
|
|
375
|
+
element.rootElement &&
|
|
376
|
+
(!Array.isArray(element.rootElement) || !element.rootElement.length)
|
|
377
|
+
) {
|
|
378
|
+
errorList.push(
|
|
379
|
+
`SpdxDocument '${elementId}' rootElement must be a non-empty array when present.`,
|
|
380
|
+
);
|
|
381
|
+
}
|
|
382
|
+
break;
|
|
383
|
+
case "Relationship":
|
|
384
|
+
if (
|
|
385
|
+
!element.creationInfo ||
|
|
386
|
+
!element.from ||
|
|
387
|
+
typeof element.from !== "string"
|
|
388
|
+
) {
|
|
389
|
+
errorList.push(
|
|
390
|
+
`Relationship '${elementId}' must include creationInfo and from.`,
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
if (!element.to || !Array.isArray(element.to) || !element.to.length) {
|
|
394
|
+
errorList.push(`Relationship '${elementId}' must include to refs.`);
|
|
395
|
+
}
|
|
396
|
+
if (element.relationshipType !== "dependsOn") {
|
|
397
|
+
errorList.push(
|
|
398
|
+
`Relationship '${elementId}' has unsupported relationshipType '${element.relationshipType}'.`,
|
|
399
|
+
);
|
|
400
|
+
}
|
|
401
|
+
break;
|
|
402
|
+
case "software_File":
|
|
403
|
+
case "software_Package":
|
|
404
|
+
if (!element.creationInfo || !element.name) {
|
|
405
|
+
errorList.push(
|
|
406
|
+
`${element.type} '${elementId}' must include creationInfo and name.`,
|
|
407
|
+
);
|
|
408
|
+
}
|
|
409
|
+
break;
|
|
410
|
+
default:
|
|
411
|
+
break;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
if (creationInfoCount !== 1) {
|
|
415
|
+
errorList.push(
|
|
416
|
+
`Expected exactly one CreationInfo, found ${creationInfoCount}.`,
|
|
417
|
+
);
|
|
418
|
+
}
|
|
419
|
+
if (documentCount !== 1) {
|
|
420
|
+
errorList.push(
|
|
421
|
+
`Expected exactly one SpdxDocument, found ${documentCount}.`,
|
|
422
|
+
);
|
|
423
|
+
}
|
|
424
|
+
for (const element of spdxJson?.["@graph"] || []) {
|
|
425
|
+
const elementId = getSpdxElementId(element);
|
|
426
|
+
if (element.creationInfo && !knownRefs.has(element.creationInfo)) {
|
|
427
|
+
errorList.push(
|
|
428
|
+
`Element '${elementId || "unknown"}' references unknown creationInfo '${element.creationInfo}'.`,
|
|
429
|
+
);
|
|
430
|
+
}
|
|
431
|
+
if (Array.isArray(element.element)) {
|
|
432
|
+
for (const ref of element.element) {
|
|
433
|
+
if (!knownRefs.has(ref)) {
|
|
434
|
+
errorList.push(
|
|
435
|
+
`SpdxDocument '${elementId || "unknown"}' references unknown element '${ref}'.`,
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
if (Array.isArray(element.rootElement)) {
|
|
441
|
+
for (const ref of element.rootElement) {
|
|
442
|
+
if (!knownRefs.has(ref)) {
|
|
443
|
+
errorList.push(
|
|
444
|
+
`SpdxDocument '${elementId || "unknown"}' references unknown rootElement '${ref}'.`,
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
if (typeof element.from === "string" && !knownRefs.has(element.from)) {
|
|
450
|
+
errorList.push(
|
|
451
|
+
`Relationship '${elementId || "unknown"}' references unknown from '${element.from}'.`,
|
|
452
|
+
);
|
|
453
|
+
}
|
|
454
|
+
if (Array.isArray(element.to)) {
|
|
455
|
+
for (const ref of element.to) {
|
|
456
|
+
if (!knownRefs.has(ref)) {
|
|
457
|
+
errorList.push(
|
|
458
|
+
`Relationship '${elementId || "unknown"}' references unknown to '${ref}'.`,
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (usesExtensionProfile) {
|
|
465
|
+
if (!spdxDocument?.profileConformance?.includes("extension")) {
|
|
466
|
+
errorList.push(
|
|
467
|
+
`SpdxDocument '${spdxDocument?.spdxId || "unknown"}' must declare the extension profile when extension data is present.`,
|
|
468
|
+
);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
if (errorList.length > 0) {
|
|
472
|
+
console.log("SPDX 3.0.1 validation failed");
|
|
473
|
+
console.log(errorList);
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
return true;
|
|
477
|
+
};
|
|
478
|
+
|
|
479
|
+
/**
|
|
480
|
+
* Validate the metadata object
|
|
481
|
+
*
|
|
482
|
+
* @param {object} bomJson Bom json object
|
|
483
|
+
*/
|
|
484
|
+
export const validateMetadata = (bomJson) => {
|
|
485
|
+
const errorList = [];
|
|
486
|
+
const warningsList = [];
|
|
487
|
+
if (bomJson?.metadata) {
|
|
488
|
+
if (
|
|
489
|
+
!bomJson.metadata.component ||
|
|
490
|
+
!Object.keys(bomJson.metadata.component).length
|
|
491
|
+
) {
|
|
492
|
+
warningsList.push(
|
|
493
|
+
"metadata.component is missing. Run cdxgen with both --project-name and --project-version argument.",
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
if (bomJson.metadata.component) {
|
|
497
|
+
// Do we have a purl and bom-ref for metadata.component
|
|
498
|
+
if (!bomJson.metadata.component.purl) {
|
|
499
|
+
warningsList.push("purl is missing for metadata.component");
|
|
500
|
+
}
|
|
501
|
+
if (!bomJson.metadata.component["bom-ref"]) {
|
|
502
|
+
warningsList.push("bom-ref is missing for metadata.component");
|
|
503
|
+
}
|
|
504
|
+
// Do we have a version for metadata.component
|
|
505
|
+
if (!bomJson.metadata.component.version) {
|
|
506
|
+
warningsList.push(
|
|
507
|
+
"Version is missing for metadata.component. Pass the version using --project-version argument.",
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
const metadataName = bomJson.metadata.component.name
|
|
511
|
+
?.trim()
|
|
512
|
+
.toLowerCase();
|
|
513
|
+
if (metadataName && PLACEHOLDER_COMPONENT_NAMES.has(metadataName)) {
|
|
514
|
+
warningsList.push(
|
|
515
|
+
`metadata.component.name appears to be a placeholder ('${bomJson.metadata.component.name}'). Pass --project-name to set the correct parent component name.`,
|
|
516
|
+
);
|
|
517
|
+
}
|
|
518
|
+
// Is the same component getting repeated inside the components block
|
|
519
|
+
if (bomJson.metadata.component.components?.length) {
|
|
520
|
+
for (const comp of bomJson.metadata.component.components) {
|
|
521
|
+
if (comp["bom-ref"] === bomJson.metadata.component["bom-ref"]) {
|
|
522
|
+
warningsList.push(
|
|
523
|
+
`Found parent component with ref ${comp["bom-ref"]} in metadata.component.components`,
|
|
524
|
+
);
|
|
525
|
+
} else if (
|
|
526
|
+
(!comp["bom-ref"] || !bomJson.metadata.component["bom-ref"]) &&
|
|
527
|
+
comp["name"] === bomJson.metadata.component["name"]
|
|
528
|
+
) {
|
|
529
|
+
warningsList.push(
|
|
530
|
+
`Found parent component with name ${comp["name"]} in metadata.component.components`,
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
if (DEBUG_MODE && warningsList.length !== 0) {
|
|
538
|
+
console.log("===== WARNINGS =====");
|
|
539
|
+
console.log(warningsList);
|
|
540
|
+
thoughtLog(
|
|
541
|
+
"**VALIDATION**: There are some warnings regarding the BOM Metadata.",
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
if (errorList.length !== 0) {
|
|
545
|
+
console.log(errorList);
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
return true;
|
|
549
|
+
};
|
|
550
|
+
|
|
551
|
+
/**
|
|
552
|
+
* Yield `{ purl, where }` for every purl outside the top-level `components`
|
|
553
|
+
* array, which `validatePurls` walks separately for its richer per-type rules.
|
|
554
|
+
*
|
|
555
|
+
* Covers `metadata.component` (and its nested components),
|
|
556
|
+
* `metadata.tools.components`, `services`, and components nested inside
|
|
557
|
+
* top-level components.
|
|
558
|
+
*
|
|
559
|
+
* @param {object} bomJson Bom json object
|
|
560
|
+
*/
|
|
561
|
+
function* eachExtraPurl(bomJson) {
|
|
562
|
+
function* walk(node, where) {
|
|
563
|
+
if (!node || typeof node !== "object") {
|
|
564
|
+
return;
|
|
565
|
+
}
|
|
566
|
+
if (Array.isArray(node)) {
|
|
567
|
+
for (let i = 0; i < node.length; i++) {
|
|
568
|
+
yield* walk(node[i], `${where}[${i}]`);
|
|
569
|
+
}
|
|
570
|
+
return;
|
|
571
|
+
}
|
|
572
|
+
if (typeof node.purl === "string" && node.purl.length) {
|
|
573
|
+
yield { purl: node.purl, where: `${where}.purl` };
|
|
574
|
+
}
|
|
575
|
+
yield* walk(node.components, `${where}.components`);
|
|
576
|
+
}
|
|
577
|
+
yield* walk(bomJson?.metadata?.component, "metadata.component");
|
|
578
|
+
yield* walk(
|
|
579
|
+
bomJson?.metadata?.tools?.components,
|
|
580
|
+
"metadata.tools.components",
|
|
581
|
+
);
|
|
582
|
+
yield* walk(bomJson?.services, "services");
|
|
583
|
+
// Nested components only — the top-level entries themselves are covered by
|
|
584
|
+
// the main loop, which also applies the crypto-asset and qualifier rules.
|
|
585
|
+
for (let i = 0; i < (bomJson?.components?.length || 0); i++) {
|
|
586
|
+
yield* walk(
|
|
587
|
+
bomJson.components[i].components,
|
|
588
|
+
`components[${i}].components`,
|
|
589
|
+
);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
|
|
593
|
+
/**
|
|
594
|
+
* Validate the format of all purls
|
|
595
|
+
*
|
|
596
|
+
* @param {object} bomJson Bom json object
|
|
597
|
+
*/
|
|
598
|
+
export const validatePurls = (bomJson) => {
|
|
599
|
+
const errorList = [];
|
|
600
|
+
const warningsList = [];
|
|
601
|
+
let frameworksCount = 0;
|
|
602
|
+
if (bomJson?.components) {
|
|
603
|
+
for (const comp of bomJson.components) {
|
|
604
|
+
if (comp.type === "framework") {
|
|
605
|
+
frameworksCount += 1;
|
|
606
|
+
}
|
|
607
|
+
if (comp.type === "cryptographic-asset") {
|
|
608
|
+
if (comp.purl?.length) {
|
|
609
|
+
errorList.push(
|
|
610
|
+
`purl should not be defined for cryptographic-asset ${comp.purl}`,
|
|
611
|
+
);
|
|
612
|
+
}
|
|
613
|
+
if (!comp.cryptoProperties) {
|
|
614
|
+
errorList.push(
|
|
615
|
+
`cryptoProperties is missing for cryptographic-asset ${comp.purl}`,
|
|
616
|
+
);
|
|
617
|
+
} else if (
|
|
618
|
+
comp.cryptoProperties.assetType === "algorithm" &&
|
|
619
|
+
!comp.cryptoProperties.oid
|
|
620
|
+
) {
|
|
621
|
+
errorList.push(
|
|
622
|
+
`cryptoProperties.oid is missing for cryptographic-asset of type algorithm ${comp.purl}`,
|
|
623
|
+
);
|
|
624
|
+
} else if (
|
|
625
|
+
comp.cryptoProperties.assetType === "certificate" &&
|
|
626
|
+
!comp.cryptoProperties.algorithmProperties
|
|
627
|
+
) {
|
|
628
|
+
errorList.push(
|
|
629
|
+
`cryptoProperties.algorithmProperties is missing for cryptographic-asset of type certificate ${comp.purl}`,
|
|
630
|
+
);
|
|
631
|
+
}
|
|
632
|
+
} else {
|
|
633
|
+
try {
|
|
634
|
+
if (comp.purl) {
|
|
635
|
+
const purlObj = Purl.parse(comp.purl);
|
|
636
|
+
if (purlObj.type && purlObj.type !== purlObj.type.toLowerCase()) {
|
|
637
|
+
warningsList.push(
|
|
638
|
+
`purl type is not normalized to lower case ${comp.purl}`,
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
if (
|
|
642
|
+
["npm", "golang"].includes(purlObj.type) &&
|
|
643
|
+
purlObj.name.includes("%2F") &&
|
|
644
|
+
!purlObj.namespace
|
|
645
|
+
) {
|
|
646
|
+
errorList.push(
|
|
647
|
+
`purl does not include namespace but includes encoded slash in name for npm type. ${comp.purl}`,
|
|
648
|
+
);
|
|
649
|
+
}
|
|
650
|
+
// Catch the trivy version hack that removes the epoch from version
|
|
651
|
+
const qualifiers = purlObj.qualifiers || {};
|
|
652
|
+
if (
|
|
653
|
+
Object.keys(qualifiers).length &&
|
|
654
|
+
[
|
|
655
|
+
"cargo",
|
|
656
|
+
"cocoapods",
|
|
657
|
+
"composer",
|
|
658
|
+
"cran",
|
|
659
|
+
"github",
|
|
660
|
+
"golang",
|
|
661
|
+
"hackage",
|
|
662
|
+
"nuget",
|
|
663
|
+
"opam",
|
|
664
|
+
"pub",
|
|
665
|
+
"qpkg",
|
|
666
|
+
"swift",
|
|
667
|
+
].includes(purlObj.type)
|
|
668
|
+
) {
|
|
669
|
+
warningsList.push(
|
|
670
|
+
`SPEC VIOLATION: Qualifiers are not expected for ${purlObj.type} type. Purl: ${comp.purl}, Qualifier(s): ${Object.keys(qualifiers).join(", ")}.`,
|
|
671
|
+
);
|
|
672
|
+
}
|
|
673
|
+
if (
|
|
674
|
+
qualifiers.epoch &&
|
|
675
|
+
!comp.version.startsWith(`${qualifiers.epoch}:`)
|
|
676
|
+
) {
|
|
677
|
+
errorList.push(
|
|
678
|
+
`'${comp.name}' version '${comp.version}' doesn't include epoch '${qualifiers.epoch}'.`,
|
|
679
|
+
);
|
|
680
|
+
}
|
|
681
|
+
}
|
|
682
|
+
} catch (_ex) {
|
|
683
|
+
errorList.push(`Invalid purl ${comp.purl}`);
|
|
684
|
+
}
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
// Syntax check every *other* place a purl can appear. The loop above only
|
|
689
|
+
// walks top-level `components`, which is how `"purl": "swift-smoke"` reached
|
|
690
|
+
// a committed golden through `metadata.component` unnoticed. Nested
|
|
691
|
+
// components and `metadata.tools.components` had the same blind spot.
|
|
692
|
+
for (const { purl, where } of eachExtraPurl(bomJson)) {
|
|
693
|
+
if (!isValidPurl(purl)) {
|
|
694
|
+
errorList.push(`Invalid purl ${purl} at ${where}`);
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
if (frameworksCount > 20) {
|
|
698
|
+
warningsList.push(
|
|
699
|
+
`BOM likey has too many framework components. Count: ${frameworksCount}`,
|
|
700
|
+
);
|
|
701
|
+
}
|
|
702
|
+
if (DEBUG_MODE && warningsList.length !== 0) {
|
|
703
|
+
console.log("===== WARNINGS =====");
|
|
704
|
+
console.log(warningsList);
|
|
705
|
+
thoughtLog(
|
|
706
|
+
"**VALIDATION**: There are some warnings regarding the purls in our SBOM. These could be bugs.",
|
|
707
|
+
);
|
|
708
|
+
}
|
|
709
|
+
if (errorList.length !== 0) {
|
|
710
|
+
console.log(errorList);
|
|
711
|
+
return false;
|
|
712
|
+
}
|
|
713
|
+
return true;
|
|
714
|
+
};
|
|
715
|
+
|
|
716
|
+
const buildRefs = (bomJson) => {
|
|
717
|
+
const refMap = {};
|
|
718
|
+
if (bomJson) {
|
|
719
|
+
if (bomJson.metadata) {
|
|
720
|
+
if (bomJson.metadata.component) {
|
|
721
|
+
refMap[bomJson.metadata.component["bom-ref"]] = true;
|
|
722
|
+
if (bomJson.metadata.component.components) {
|
|
723
|
+
for (const comp of bomJson.metadata.component.components) {
|
|
724
|
+
refMap[comp["bom-ref"]] = true;
|
|
725
|
+
}
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
if (bomJson.components) {
|
|
730
|
+
for (const comp of bomJson.components) {
|
|
731
|
+
refMap[comp["bom-ref"]] = true;
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
if (bomJson?.formulation) {
|
|
735
|
+
for (const aformulation of bomJson.formulation) {
|
|
736
|
+
if (aformulation?.components?.length) {
|
|
737
|
+
for (const formComp of aformulation.components) {
|
|
738
|
+
refMap[formComp["bom-ref"]] = true;
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
if (aformulation?.workflows?.length) {
|
|
742
|
+
for (const formWf of aformulation.workflows) {
|
|
743
|
+
refMap[formWf["bom-ref"]] = true;
|
|
744
|
+
if (formWf?.tasks?.length) {
|
|
745
|
+
for (const atask of formWf.tasks) {
|
|
746
|
+
refMap[atask["bom-ref"]] = true;
|
|
747
|
+
}
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
return refMap;
|
|
755
|
+
};
|
|
756
|
+
|
|
757
|
+
/**
|
|
758
|
+
* Validate the refs in dependencies block
|
|
759
|
+
*
|
|
760
|
+
* @param {object} bomJson Bom json object
|
|
761
|
+
*/
|
|
762
|
+
export const validateRefs = (bomJson) => {
|
|
763
|
+
const errorList = [];
|
|
764
|
+
const warningsList = [];
|
|
765
|
+
const refMap = buildRefs(bomJson);
|
|
766
|
+
const parentComponentRef = bomJson?.metadata?.component?.["bom-ref"];
|
|
767
|
+
if (bomJson?.dependencies) {
|
|
768
|
+
if (isPartialTree(bomJson.dependencies, bomJson?.components?.length)) {
|
|
769
|
+
warningsList.push(
|
|
770
|
+
"Dependency tree has multiple empty dependsOn attributes.",
|
|
771
|
+
);
|
|
772
|
+
}
|
|
773
|
+
for (const dep of bomJson.dependencies) {
|
|
774
|
+
if (
|
|
775
|
+
dep.ref.includes("%40") ||
|
|
776
|
+
dep.ref.includes("%3A") ||
|
|
777
|
+
dep.ref.includes("%2F")
|
|
778
|
+
) {
|
|
779
|
+
errorList.push(`Invalid encoded ref in dependencies ${dep.ref}`);
|
|
780
|
+
}
|
|
781
|
+
if (!refMap[dep.ref]) {
|
|
782
|
+
warningsList.push(`Invalid ref in dependencies ${dep.ref}`);
|
|
783
|
+
}
|
|
784
|
+
let parentPurlType;
|
|
785
|
+
try {
|
|
786
|
+
const purlObj = Purl.parse(dep.ref);
|
|
787
|
+
parentPurlType = purlObj.type;
|
|
788
|
+
} catch (_e) {
|
|
789
|
+
// pass
|
|
790
|
+
}
|
|
791
|
+
if (
|
|
792
|
+
parentComponentRef &&
|
|
793
|
+
dep.ref === parentComponentRef &&
|
|
794
|
+
dep.dependsOn.length === 0 &&
|
|
795
|
+
bomJson.dependencies.length > 1
|
|
796
|
+
) {
|
|
797
|
+
warningsList.push(
|
|
798
|
+
`Parent component ${parentComponentRef} doesn't have any children. The dependency tree must contain dangling nodes, which are unsupported by tools such as Dependency-Track.`,
|
|
799
|
+
);
|
|
800
|
+
}
|
|
801
|
+
if (dep.dependsOn) {
|
|
802
|
+
for (const don of dep.dependsOn) {
|
|
803
|
+
if (!refMap[don]) {
|
|
804
|
+
warningsList.push(
|
|
805
|
+
`Invalid ref in dependencies.dependsOn ${don}. Parent: ${dep.ref}`,
|
|
806
|
+
);
|
|
807
|
+
}
|
|
808
|
+
let childPurlType;
|
|
809
|
+
try {
|
|
810
|
+
const purlObj = Purl.parse(don);
|
|
811
|
+
childPurlType = purlObj.type;
|
|
812
|
+
} catch (_e) {
|
|
813
|
+
// pass
|
|
814
|
+
}
|
|
815
|
+
if (
|
|
816
|
+
parentPurlType &&
|
|
817
|
+
childPurlType &&
|
|
818
|
+
parentPurlType !== childPurlType &&
|
|
819
|
+
!["oci", "generic", "container"].includes(parentPurlType)
|
|
820
|
+
) {
|
|
821
|
+
warningsList.push(
|
|
822
|
+
`The parent package '${dep.ref}' (type ${parentPurlType}) depends on the child package '${don}' (type ${childPurlType}). This is a bug in cdxgen if this project is not a monorepo.`,
|
|
823
|
+
);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
}
|
|
827
|
+
if (dep.provides) {
|
|
828
|
+
for (const don of dep.provides) {
|
|
829
|
+
if (!refMap[don]) {
|
|
830
|
+
warningsList.push(`Invalid ref in dependencies.provides ${don}`);
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
|
+
}
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
if (DEBUG_MODE && warningsList.length !== 0) {
|
|
837
|
+
console.log("===== WARNINGS =====");
|
|
838
|
+
console.log(warningsList);
|
|
839
|
+
thoughtLog(
|
|
840
|
+
"**VALIDATION**: There are some warnings regarding the dependency tree in our BOM.",
|
|
841
|
+
);
|
|
842
|
+
}
|
|
843
|
+
if (errorList.length !== 0) {
|
|
844
|
+
console.log(errorList);
|
|
845
|
+
return false;
|
|
846
|
+
}
|
|
847
|
+
return true;
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
/**
|
|
851
|
+
* Validate the component properties
|
|
852
|
+
*
|
|
853
|
+
* @param {object} bomJson Bom json object
|
|
854
|
+
*/
|
|
855
|
+
export function validateProps(bomJson) {
|
|
856
|
+
const errorList = [];
|
|
857
|
+
const warningsList = [];
|
|
858
|
+
let isWorkspaceMode = false;
|
|
859
|
+
let lacksProperties = false;
|
|
860
|
+
let lacksEvidence = false;
|
|
861
|
+
let lacksRelativePath = false;
|
|
862
|
+
let npmComponentsWithoutTarball = 0;
|
|
863
|
+
let npmComponentsWithTarball = 0;
|
|
864
|
+
if (
|
|
865
|
+
!["application", "framework", "library"].includes(
|
|
866
|
+
bomJson?.metadata?.component?.type,
|
|
867
|
+
)
|
|
868
|
+
) {
|
|
869
|
+
return true;
|
|
870
|
+
}
|
|
871
|
+
if (bomJson?.components) {
|
|
872
|
+
const npmPkgs =
|
|
873
|
+
bomJson.components?.filter((c) => c.purl?.startsWith("pkg:npm")) || [];
|
|
874
|
+
const nativeByName = new Set(
|
|
875
|
+
npmPkgs
|
|
876
|
+
.filter((c) =>
|
|
877
|
+
c.properties?.some(
|
|
878
|
+
(p) => p.name === "cdx:npm:native_addon" && p.value === "true",
|
|
879
|
+
),
|
|
880
|
+
)
|
|
881
|
+
.map((c) => c.name),
|
|
882
|
+
);
|
|
883
|
+
const suspicious = npmPkgs.filter(
|
|
884
|
+
(c) =>
|
|
885
|
+
c.scope !== "optional" &&
|
|
886
|
+
(c.name.includes("native") || c.name.includes("bindings")) &&
|
|
887
|
+
!nativeByName.has(c.name) &&
|
|
888
|
+
!c.properties?.some((p) =>
|
|
889
|
+
NPM_NATIVE_ADDON_EVIDENCE_PROPERTIES.has(p.name),
|
|
890
|
+
),
|
|
891
|
+
);
|
|
892
|
+
if (suspicious.length > 0 && DEBUG_MODE) {
|
|
893
|
+
warningsList.push(
|
|
894
|
+
`Found ${suspicious.length} packages with native-sounding names but no native_addon flag: ${suspicious.map((c) => c.name).join(", ")}. May need deeper inspection.`,
|
|
895
|
+
);
|
|
896
|
+
}
|
|
897
|
+
for (const comp of bomJson.components) {
|
|
898
|
+
if (!["library", "framework"].includes(comp.type)) {
|
|
899
|
+
continue;
|
|
900
|
+
}
|
|
901
|
+
// Limit to only npm and pypi for now
|
|
902
|
+
if (
|
|
903
|
+
!comp.purl?.startsWith("pkg:npm") &&
|
|
904
|
+
!comp.purl?.startsWith("pkg:pypi")
|
|
905
|
+
) {
|
|
906
|
+
continue;
|
|
907
|
+
}
|
|
908
|
+
if (comp.purl?.startsWith("pkg:npm")) {
|
|
909
|
+
const hasDistributionRef = comp.externalReferences?.some(
|
|
910
|
+
(ref) => ref.type === "distribution" && ref.url,
|
|
911
|
+
);
|
|
912
|
+
if (hasDistributionRef) {
|
|
913
|
+
npmComponentsWithTarball++;
|
|
914
|
+
} else {
|
|
915
|
+
npmComponentsWithoutTarball++;
|
|
916
|
+
}
|
|
917
|
+
}
|
|
918
|
+
if (!comp.properties) {
|
|
919
|
+
if (!lacksProperties) {
|
|
920
|
+
warningsList.push(`${comp["bom-ref"]} lacks properties.`);
|
|
921
|
+
lacksProperties = true;
|
|
922
|
+
}
|
|
923
|
+
} else {
|
|
924
|
+
let srcFilePropFound = false;
|
|
925
|
+
let workspacePropFound = false;
|
|
926
|
+
for (const p of comp.properties) {
|
|
927
|
+
if (p.name === "internal:SrcFile") {
|
|
928
|
+
srcFilePropFound = true;
|
|
929
|
+
// Quick linux/unix only check for relative paths.
|
|
930
|
+
if (!lacksRelativePath && p.value?.startsWith("/")) {
|
|
931
|
+
lacksRelativePath = true;
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
if (p.name === "internal:workspaceRef") {
|
|
935
|
+
isWorkspaceMode = true;
|
|
936
|
+
workspacePropFound = true;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
if (
|
|
940
|
+
isWorkspaceMode &&
|
|
941
|
+
!workspacePropFound &&
|
|
942
|
+
!srcFilePropFound &&
|
|
943
|
+
comp?.scope !== "optional"
|
|
944
|
+
) {
|
|
945
|
+
warningsList.push(
|
|
946
|
+
`${comp["bom-ref"]} lacks workspace-related properties.`,
|
|
947
|
+
);
|
|
948
|
+
}
|
|
949
|
+
if (!srcFilePropFound && !lacksProperties) {
|
|
950
|
+
warningsList.push(`${comp["bom-ref"]} lacks SrcFile property.`);
|
|
951
|
+
lacksProperties = true;
|
|
952
|
+
}
|
|
953
|
+
}
|
|
954
|
+
if (!comp.evidence && !lacksEvidence) {
|
|
955
|
+
lacksEvidence = true;
|
|
956
|
+
warningsList.push(`${comp["bom-ref"]} lacks evidence.`);
|
|
957
|
+
}
|
|
958
|
+
}
|
|
959
|
+
}
|
|
960
|
+
if (npmComponentsWithoutTarball > 0 && npmComponentsWithTarball > 0) {
|
|
961
|
+
warningsList.push(
|
|
962
|
+
`Found ${npmComponentsWithoutTarball} pkg:npm components without externalReferences.distribution. Please file a bug, if your package-lock.json or pnpm-lock.yaml includes the tarball url.`,
|
|
963
|
+
);
|
|
964
|
+
}
|
|
965
|
+
if (lacksRelativePath) {
|
|
966
|
+
warningsList.push(
|
|
967
|
+
"BOM includes absolute paths for properties like SrcFile.",
|
|
968
|
+
);
|
|
969
|
+
thoughtLog(
|
|
970
|
+
"BOM still includes absolute paths for properties like SrcFile. My postgen optimizations didn't work completely.",
|
|
971
|
+
);
|
|
972
|
+
}
|
|
973
|
+
if (DEBUG_MODE && warningsList.length !== 0) {
|
|
974
|
+
console.log("===== WARNINGS =====");
|
|
975
|
+
console.log(warningsList);
|
|
976
|
+
thoughtLog(
|
|
977
|
+
"**VALIDATION**: There are some warnings regarding the evidence attribute in our BOM, which can be safely ignored.",
|
|
978
|
+
);
|
|
979
|
+
}
|
|
980
|
+
if (errorList.length !== 0) {
|
|
981
|
+
console.log(errorList);
|
|
982
|
+
return false;
|
|
983
|
+
}
|
|
984
|
+
return true;
|
|
985
|
+
}
|