@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,918 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
import { parse as parseYaml } from "yaml";
|
|
6
|
+
|
|
7
|
+
import { DEFAULT_CDX_SPEC_VERSION } from "./bomUtils.js";
|
|
8
|
+
import {
|
|
9
|
+
canonicalizeAST,
|
|
10
|
+
correctLicenseId,
|
|
11
|
+
isLicenseRef,
|
|
12
|
+
parseSpdxExpression,
|
|
13
|
+
renderAST,
|
|
14
|
+
tokenize,
|
|
15
|
+
upgradeDeprecatedAST,
|
|
16
|
+
} from "./spdxExpression.js";
|
|
17
|
+
|
|
18
|
+
let spdxLicenseList = null;
|
|
19
|
+
let licenseDb = null;
|
|
20
|
+
let licenseAliases = null;
|
|
21
|
+
let licenseDeprecations = null;
|
|
22
|
+
|
|
23
|
+
let url = import.meta?.url;
|
|
24
|
+
if (url && !url.startsWith("file://")) {
|
|
25
|
+
url = new URL(`file://${import.meta.url}`).toString();
|
|
26
|
+
}
|
|
27
|
+
const dirNameStr = url
|
|
28
|
+
? dirname(dirname(dirname(fileURLToPath(url))))
|
|
29
|
+
: __dirname;
|
|
30
|
+
|
|
31
|
+
function loadSpdxLicenseList() {
|
|
32
|
+
if (!spdxLicenseList) {
|
|
33
|
+
try {
|
|
34
|
+
spdxLicenseList = JSON.parse(
|
|
35
|
+
readFileSync(
|
|
36
|
+
join(dirNameStr, "data", "spdx-license-list.json"),
|
|
37
|
+
"utf-8",
|
|
38
|
+
),
|
|
39
|
+
);
|
|
40
|
+
} catch (_e) {
|
|
41
|
+
spdxLicenseList = { licenses: {}, exceptions: {} };
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
return spdxLicenseList;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function loadLicenseDb() {
|
|
48
|
+
if (!licenseDb) {
|
|
49
|
+
try {
|
|
50
|
+
licenseDb = JSON.parse(
|
|
51
|
+
readFileSync(join(dirNameStr, "data", "license-db.json"), "utf-8"),
|
|
52
|
+
);
|
|
53
|
+
} catch (_e) {
|
|
54
|
+
licenseDb = {};
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return licenseDb;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function _loadLicenseAliases() {
|
|
61
|
+
if (!licenseAliases) {
|
|
62
|
+
try {
|
|
63
|
+
licenseAliases = JSON.parse(
|
|
64
|
+
readFileSync(join(dirNameStr, "data", "license-aliases.json"), "utf-8"),
|
|
65
|
+
);
|
|
66
|
+
} catch (_e) {
|
|
67
|
+
licenseAliases = {};
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return licenseAliases;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
function loadLicenseDeprecations() {
|
|
74
|
+
if (!licenseDeprecations) {
|
|
75
|
+
try {
|
|
76
|
+
licenseDeprecations = JSON.parse(
|
|
77
|
+
readFileSync(
|
|
78
|
+
join(dirNameStr, "data", "license-deprecations.json"),
|
|
79
|
+
"utf-8",
|
|
80
|
+
),
|
|
81
|
+
);
|
|
82
|
+
} catch (_e) {
|
|
83
|
+
licenseDeprecations = {};
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return licenseDeprecations;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const FOSS_CATEGORIES = new Set([
|
|
90
|
+
"Copyleft",
|
|
91
|
+
"Copyleft Limited",
|
|
92
|
+
"Patent License",
|
|
93
|
+
"Permissive",
|
|
94
|
+
"Public Domain",
|
|
95
|
+
"CLA",
|
|
96
|
+
]);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Parses a compliance policy file.
|
|
100
|
+
*
|
|
101
|
+
* @param {string} policyPath Path to policy file
|
|
102
|
+
* @returns {object|null} Parsed policy object
|
|
103
|
+
*/
|
|
104
|
+
export function loadPolicy(policyPath) {
|
|
105
|
+
if (!policyPath) return null;
|
|
106
|
+
try {
|
|
107
|
+
const content = readFileSync(policyPath, "utf-8");
|
|
108
|
+
return parseYaml(content);
|
|
109
|
+
} catch (err) {
|
|
110
|
+
console.error(
|
|
111
|
+
`Failed to load license policy from ${policyPath}: ${err.message}`,
|
|
112
|
+
);
|
|
113
|
+
return null;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export { parseSpdxExpression };
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Resolves a raw license ID or expression to a CycloneDX license object shape.
|
|
121
|
+
*
|
|
122
|
+
* @param {string} raw Raw license string
|
|
123
|
+
* @param {object} opts Options
|
|
124
|
+
* @returns {object|null} Resolved license object: { id } or { expression } or { name }
|
|
125
|
+
*/
|
|
126
|
+
export function resolveLicenseId(raw, opts = {}) {
|
|
127
|
+
if (!raw) return null;
|
|
128
|
+
const trimmed = raw.trim();
|
|
129
|
+
if (!trimmed) return null;
|
|
130
|
+
|
|
131
|
+
// 1. URL check
|
|
132
|
+
if (trimmed.startsWith("http")) {
|
|
133
|
+
const spdxList = loadSpdxLicenseList();
|
|
134
|
+
const cleanUrl = trimmed.toLowerCase().replace(/\/$/, "");
|
|
135
|
+
for (const [id, meta] of Object.entries(spdxList.licenses)) {
|
|
136
|
+
if (meta.seeAlso) {
|
|
137
|
+
for (const u of meta.seeAlso) {
|
|
138
|
+
if (u.trim().toLowerCase().replace(/\/$/, "") === cleanUrl) {
|
|
139
|
+
return { id, url: trimmed };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (opts.getKnownLicense) {
|
|
146
|
+
const known = opts.getKnownLicense(trimmed, opts.pkg || {});
|
|
147
|
+
if (known) {
|
|
148
|
+
const res = {};
|
|
149
|
+
if (known.id) res.id = known.id;
|
|
150
|
+
if (known.name) res.name = known.name;
|
|
151
|
+
res.url = trimmed;
|
|
152
|
+
return res;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
return { name: "CUSTOM", url: trimmed };
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// 2. Parser check for complex expression
|
|
160
|
+
const tokens = tokenize(trimmed);
|
|
161
|
+
const hasOperators = tokens.some((t) => {
|
|
162
|
+
const u = t.toUpperCase();
|
|
163
|
+
return u === "AND" || u === "OR" || u === "WITH";
|
|
164
|
+
});
|
|
165
|
+
|
|
166
|
+
if (hasOperators || tokens.includes("(") || tokens.includes(")")) {
|
|
167
|
+
const parsed = parseSpdxExpression(trimmed);
|
|
168
|
+
if (parsed.ast) {
|
|
169
|
+
const upgradedAST = upgradeDeprecatedAST(parsed.ast);
|
|
170
|
+
const canonicalAST = canonicalizeAST(upgradedAST);
|
|
171
|
+
const normalizedExpr = renderAST(canonicalAST);
|
|
172
|
+
return { expression: normalizedExpr };
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// 3. Simple identifier/alias check
|
|
177
|
+
const corrected = correctLicenseId(trimmed);
|
|
178
|
+
if (corrected) {
|
|
179
|
+
const upgraded = upgradeDeprecated(corrected);
|
|
180
|
+
if (
|
|
181
|
+
upgraded.includes(" ") ||
|
|
182
|
+
upgraded.includes("WITH") ||
|
|
183
|
+
upgraded.includes("AND") ||
|
|
184
|
+
upgraded.includes("OR")
|
|
185
|
+
) {
|
|
186
|
+
return { expression: upgraded };
|
|
187
|
+
}
|
|
188
|
+
// LicenseRef-* identifiers are not valid SPDX ids and must not be placed in
|
|
189
|
+
// the CycloneDX `id` field. Emit them as an `expression` when LicenseRef
|
|
190
|
+
// synthesis is enabled, otherwise fall through so the original name/text is
|
|
191
|
+
// preserved (avoids producing schema-invalid BOMs).
|
|
192
|
+
if (isLicenseRef(upgraded)) {
|
|
193
|
+
if (opts.licenseRef) {
|
|
194
|
+
return { expression: upgraded };
|
|
195
|
+
}
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
const res = { id: upgraded };
|
|
199
|
+
res.url = `https://opensource.org/licenses/${upgraded}`;
|
|
200
|
+
return res;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// 4. Fallback: synthesize LicenseRef if enabled
|
|
204
|
+
if (opts.licenseRef) {
|
|
205
|
+
const slug = makeRefSlug(trimmed);
|
|
206
|
+
if (slug) {
|
|
207
|
+
return { expression: `LicenseRef-cdxgen-${slug}` };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return null;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const MAX_REF_SLUG_LENGTH = 128;
|
|
215
|
+
|
|
216
|
+
function makeRefSlug(str) {
|
|
217
|
+
// Runs of non-alphanumerics collapse to a single dash, so at most one leading
|
|
218
|
+
// and one trailing dash can remain and slicing them off is enough.
|
|
219
|
+
const slug = str
|
|
220
|
+
.slice(0, MAX_REF_SLUG_LENGTH)
|
|
221
|
+
.toLowerCase()
|
|
222
|
+
.replaceAll(/[^a-z0-9]+/g, "-");
|
|
223
|
+
const start = slug.startsWith("-") ? 1 : 0;
|
|
224
|
+
const end = slug.endsWith("-") ? slug.length - 1 : slug.length;
|
|
225
|
+
return end > start ? slug.slice(start, end) : "";
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* Upgrades deprecated SPDX license identifiers or expressions.
|
|
230
|
+
*
|
|
231
|
+
* @param {string} idOrExpr License ID or expression
|
|
232
|
+
* @returns {string} Upgraded identifier or expression
|
|
233
|
+
*/
|
|
234
|
+
export function upgradeDeprecated(idOrExpr) {
|
|
235
|
+
if (!idOrExpr) return idOrExpr;
|
|
236
|
+
|
|
237
|
+
const tokens = tokenize(idOrExpr);
|
|
238
|
+
const hasOperators = tokens.some((t) => {
|
|
239
|
+
const u = t.toUpperCase();
|
|
240
|
+
return u === "AND" || u === "OR" || u === "WITH";
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
if (hasOperators || tokens.includes("(") || tokens.includes(")")) {
|
|
244
|
+
const parsed = parseSpdxExpression(idOrExpr);
|
|
245
|
+
if (parsed.ast) {
|
|
246
|
+
const upgradedAST = upgradeDeprecatedAST(parsed.ast);
|
|
247
|
+
const canonicalAST = canonicalizeAST(upgradedAST);
|
|
248
|
+
return renderAST(canonicalAST);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
const deprecations = loadLicenseDeprecations();
|
|
253
|
+
const canonical = getCanonicalId(idOrExpr);
|
|
254
|
+
const repl =
|
|
255
|
+
deprecations[idOrExpr] ||
|
|
256
|
+
deprecations[idOrExpr.toLowerCase()] ||
|
|
257
|
+
(canonical && deprecations[canonical]);
|
|
258
|
+
if (repl) {
|
|
259
|
+
return repl;
|
|
260
|
+
}
|
|
261
|
+
return canonical || idOrExpr;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Memoized lowercase lookup maps to avoid O(n) scans on every license.
|
|
265
|
+
let spdxLowerMap = null;
|
|
266
|
+
let dbKeyLowerMap = null;
|
|
267
|
+
let dbBySpdxLowerMap = null;
|
|
268
|
+
|
|
269
|
+
function getSpdxLowerMap() {
|
|
270
|
+
if (!spdxLowerMap) {
|
|
271
|
+
spdxLowerMap = new Map();
|
|
272
|
+
for (const [id, entry] of Object.entries(loadSpdxLicenseList().licenses)) {
|
|
273
|
+
spdxLowerMap.set(id.toLowerCase(), { id, entry });
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
return spdxLowerMap;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
function getDbKeyLowerMap() {
|
|
280
|
+
if (!dbKeyLowerMap) {
|
|
281
|
+
dbKeyLowerMap = new Map();
|
|
282
|
+
const db = loadLicenseDb();
|
|
283
|
+
for (const key of Object.keys(db)) {
|
|
284
|
+
dbKeyLowerMap.set(key.toLowerCase(), db[key].spdx_license_key);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
return dbKeyLowerMap;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
function getDbBySpdxLowerMap() {
|
|
291
|
+
if (!dbBySpdxLowerMap) {
|
|
292
|
+
dbBySpdxLowerMap = new Map();
|
|
293
|
+
for (const entry of Object.values(loadLicenseDb())) {
|
|
294
|
+
if (entry.spdx_license_key) {
|
|
295
|
+
const k = entry.spdx_license_key.toLowerCase();
|
|
296
|
+
// First entry wins to keep behavior deterministic.
|
|
297
|
+
if (!dbBySpdxLowerMap.has(k)) {
|
|
298
|
+
dbBySpdxLowerMap.set(k, entry);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return dbBySpdxLowerMap;
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
function getCanonicalId(id) {
|
|
307
|
+
if (!id) return null;
|
|
308
|
+
const lower = id.toLowerCase();
|
|
309
|
+
const spdxHit = getSpdxLowerMap().get(lower);
|
|
310
|
+
if (spdxHit) {
|
|
311
|
+
return spdxHit.id;
|
|
312
|
+
}
|
|
313
|
+
const dbHit = getDbKeyLowerMap().get(lower);
|
|
314
|
+
if (dbHit) {
|
|
315
|
+
return dbHit;
|
|
316
|
+
}
|
|
317
|
+
return null;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Normalizes a single CycloneDX license object or string.
|
|
322
|
+
*
|
|
323
|
+
* @param {object|string} license License object or string
|
|
324
|
+
* @param {object} opts Options
|
|
325
|
+
* @returns {object} Normalized license object
|
|
326
|
+
*/
|
|
327
|
+
export function normalizeLicense(license, opts = {}) {
|
|
328
|
+
if (!license) return license;
|
|
329
|
+
|
|
330
|
+
if (typeof license === "string") {
|
|
331
|
+
const resolved = resolveLicenseId(license, opts);
|
|
332
|
+
if (resolved) {
|
|
333
|
+
return resolved;
|
|
334
|
+
}
|
|
335
|
+
return { name: license };
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
if (license.license && typeof license.license === "object") {
|
|
339
|
+
const resLic = normalizeLicense(license.license, opts);
|
|
340
|
+
// CycloneDX requires an SPDX expression at the license-choice level
|
|
341
|
+
// ({ expression }), not nested inside `license`. When the inner license
|
|
342
|
+
// resolves to an expression, hoist it and drop the `license` wrapper to
|
|
343
|
+
// keep the BOM schema-valid.
|
|
344
|
+
if (resLic?.expression) {
|
|
345
|
+
const hoisted = { expression: resLic.expression };
|
|
346
|
+
if (license.acknowledgement) {
|
|
347
|
+
hoisted.acknowledgement = license.acknowledgement;
|
|
348
|
+
}
|
|
349
|
+
if (license["bom-ref"]) {
|
|
350
|
+
hoisted["bom-ref"] = license["bom-ref"];
|
|
351
|
+
}
|
|
352
|
+
return hoisted;
|
|
353
|
+
}
|
|
354
|
+
return { ...license, license: resLic };
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
const result = { ...license };
|
|
358
|
+
if (result.expression) {
|
|
359
|
+
const resolved = resolveLicenseId(result.expression, opts);
|
|
360
|
+
if (resolved?.expression) {
|
|
361
|
+
result.expression = resolved.expression;
|
|
362
|
+
delete result.id;
|
|
363
|
+
delete result.name;
|
|
364
|
+
}
|
|
365
|
+
} else if (result.id) {
|
|
366
|
+
const resolved = resolveLicenseId(result.id, opts);
|
|
367
|
+
if (resolved) {
|
|
368
|
+
if (resolved.id) {
|
|
369
|
+
if (result.id !== resolved.id) {
|
|
370
|
+
delete result.url;
|
|
371
|
+
}
|
|
372
|
+
result.id = resolved.id;
|
|
373
|
+
delete result.name;
|
|
374
|
+
delete result.expression;
|
|
375
|
+
} else if (resolved.expression) {
|
|
376
|
+
result.expression = resolved.expression;
|
|
377
|
+
delete result.id;
|
|
378
|
+
delete result.name;
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
} else if (result.name) {
|
|
382
|
+
const resolved = resolveLicenseId(result.name, opts);
|
|
383
|
+
if (resolved) {
|
|
384
|
+
if (resolved.id) {
|
|
385
|
+
result.id = resolved.id;
|
|
386
|
+
delete result.name;
|
|
387
|
+
delete result.expression;
|
|
388
|
+
} else if (resolved.expression) {
|
|
389
|
+
result.expression = resolved.expression;
|
|
390
|
+
delete result.id;
|
|
391
|
+
delete result.name;
|
|
392
|
+
}
|
|
393
|
+
} else if (opts.licenseRef) {
|
|
394
|
+
const slug = makeRefSlug(result.name);
|
|
395
|
+
if (slug) {
|
|
396
|
+
result.expression = `LicenseRef-cdxgen-${slug}`;
|
|
397
|
+
delete result.id;
|
|
398
|
+
delete result.name;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
if (
|
|
403
|
+
result.id &&
|
|
404
|
+
!result.id.toLowerCase().startsWith("licenseref-") &&
|
|
405
|
+
!result.url
|
|
406
|
+
) {
|
|
407
|
+
result.url = `https://opensource.org/licenses/${result.id}`;
|
|
408
|
+
}
|
|
409
|
+
return result;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Normalizes and deduplicates a component's licenses array.
|
|
414
|
+
*
|
|
415
|
+
* @param {object} component CycloneDX Component
|
|
416
|
+
* @param {object} opts Options
|
|
417
|
+
* @returns {object} Modified component
|
|
418
|
+
*/
|
|
419
|
+
export function enhanceComponentLicenses(component, opts = {}) {
|
|
420
|
+
if (!component?.licenses) return component;
|
|
421
|
+
|
|
422
|
+
const compOpts = {
|
|
423
|
+
...opts,
|
|
424
|
+
pkg: {
|
|
425
|
+
name: component.name,
|
|
426
|
+
group: component.group,
|
|
427
|
+
purl: component.purl,
|
|
428
|
+
},
|
|
429
|
+
};
|
|
430
|
+
|
|
431
|
+
const rawLicenses = Array.isArray(component.licenses)
|
|
432
|
+
? component.licenses
|
|
433
|
+
: [component.licenses];
|
|
434
|
+
|
|
435
|
+
const normalized = rawLicenses
|
|
436
|
+
.map((l) => normalizeLicense(l, compOpts))
|
|
437
|
+
.filter(Boolean);
|
|
438
|
+
|
|
439
|
+
const seen = new Set();
|
|
440
|
+
const deduped = [];
|
|
441
|
+
for (const l of normalized) {
|
|
442
|
+
const core = l.license || l;
|
|
443
|
+
const key = core.expression
|
|
444
|
+
? `expr:${core.expression}`
|
|
445
|
+
: core.id
|
|
446
|
+
? `id:${core.id}`
|
|
447
|
+
: `name:${core.name}`;
|
|
448
|
+
|
|
449
|
+
if (!seen.has(key)) {
|
|
450
|
+
seen.add(key);
|
|
451
|
+
deduped.push(l);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Pre-1.7 schemas require a single SPDX-expression tuple when an expression is
|
|
456
|
+
// present; 1.7 permits a mixed list, so only collapse when asked.
|
|
457
|
+
component.licenses = opts._collapseLicenses
|
|
458
|
+
? collapseLicenseChoice(deduped)
|
|
459
|
+
: deduped;
|
|
460
|
+
return component;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
/**
|
|
464
|
+
* Combines license-choice entries into a single SPDX expression operand string,
|
|
465
|
+
* AND-ing the operands (matching the CycloneDX schema example
|
|
466
|
+
* `Apache-2.0 AND (MIT OR GPL-2.0-only)`). Sub-expressions containing AND/OR are
|
|
467
|
+
* parenthesized. Named (non-SPDX) licenses cannot be valid expression operands
|
|
468
|
+
* and are omitted.
|
|
469
|
+
*
|
|
470
|
+
* @param {object[]} entries normalized license-choice entries
|
|
471
|
+
* @returns {string|null} combined expression, or null when no valid operands
|
|
472
|
+
*/
|
|
473
|
+
function combineLicensesToExpression(entries) {
|
|
474
|
+
const operands = [];
|
|
475
|
+
for (const entry of entries) {
|
|
476
|
+
if (entry.expression) {
|
|
477
|
+
operands.push(
|
|
478
|
+
/\b(AND|OR)\b/i.test(entry.expression)
|
|
479
|
+
? `(${entry.expression})`
|
|
480
|
+
: entry.expression,
|
|
481
|
+
);
|
|
482
|
+
continue;
|
|
483
|
+
}
|
|
484
|
+
const core = entry.license || entry;
|
|
485
|
+
if (core.id) {
|
|
486
|
+
operands.push(core.id);
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
return operands.length ? operands.join(" AND ") : null;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
/**
|
|
493
|
+
* Enforces the CycloneDX license-choice rule: a `licenses` array is EITHER a
|
|
494
|
+
* list of `{license:{id|name}}` objects OR a single-element tuple holding one
|
|
495
|
+
* `{expression}`. When normalization yields an expression mixed with other
|
|
496
|
+
* entries (or multiple entries with an expression), collapse everything into a
|
|
497
|
+
* single combined expression so the BOM stays schema-valid.
|
|
498
|
+
*
|
|
499
|
+
* @param {object[]} entries normalized license-choice entries
|
|
500
|
+
* @returns {object[]} a schema-valid license-choice array
|
|
501
|
+
*/
|
|
502
|
+
function collapseLicenseChoice(entries) {
|
|
503
|
+
if (!Array.isArray(entries) || entries.length <= 1) {
|
|
504
|
+
return entries;
|
|
505
|
+
}
|
|
506
|
+
if (!entries.some((entry) => entry.expression)) {
|
|
507
|
+
// Pure list of id/name licenses is already a valid choice.
|
|
508
|
+
return entries;
|
|
509
|
+
}
|
|
510
|
+
const combined = combineLicensesToExpression(entries);
|
|
511
|
+
return combined ? [{ expression: combined }] : entries;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
function getComplianceAlert(licenseId, category, policy) {
|
|
515
|
+
if (!policy?.license_policies) return null;
|
|
516
|
+
const idLower = licenseId ? licenseId.toLowerCase() : "";
|
|
517
|
+
const catLower = category ? category.toLowerCase() : "";
|
|
518
|
+
|
|
519
|
+
for (const entry of policy.license_policies) {
|
|
520
|
+
if (entry.license_key && entry.license_key.toLowerCase() === idLower) {
|
|
521
|
+
return normalizeAlertLabel(entry.label || entry.compliance_alert);
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
|
|
525
|
+
for (const entry of policy.license_policies) {
|
|
526
|
+
if (entry.category && entry.category.toLowerCase() === catLower) {
|
|
527
|
+
return normalizeAlertLabel(entry.label || entry.compliance_alert);
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
return null;
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
function normalizeAlertLabel(label) {
|
|
535
|
+
if (!label) return null;
|
|
536
|
+
const l = label.toLowerCase();
|
|
537
|
+
if (
|
|
538
|
+
l.includes("approve") ||
|
|
539
|
+
l.includes("pass") ||
|
|
540
|
+
l.includes("allow") ||
|
|
541
|
+
l === "green"
|
|
542
|
+
) {
|
|
543
|
+
return "pass";
|
|
544
|
+
}
|
|
545
|
+
if (l.includes("restrict") || l.includes("warn") || l === "yellow") {
|
|
546
|
+
return "warning";
|
|
547
|
+
}
|
|
548
|
+
if (
|
|
549
|
+
l.includes("prohibit") ||
|
|
550
|
+
l.includes("error") ||
|
|
551
|
+
l.includes("fail") ||
|
|
552
|
+
l.includes("deny") ||
|
|
553
|
+
l.includes("reject") ||
|
|
554
|
+
l === "red"
|
|
555
|
+
) {
|
|
556
|
+
return "error";
|
|
557
|
+
}
|
|
558
|
+
return label;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Opt-in: enriches a license object with metadata properties and compliance policy.
|
|
563
|
+
*
|
|
564
|
+
* @param {object} licenseWrapper License wrapper object
|
|
565
|
+
* @param {object} policy Compliance policy
|
|
566
|
+
* @param {object} opts Options
|
|
567
|
+
* @returns {object} Enriched license wrapper
|
|
568
|
+
*/
|
|
569
|
+
export function enrichLicenseMetadata(licenseWrapper, policy, _opts = {}) {
|
|
570
|
+
if (!licenseWrapper) return licenseWrapper;
|
|
571
|
+
|
|
572
|
+
const core = licenseWrapper.license || licenseWrapper;
|
|
573
|
+
if (!core || core.expression) {
|
|
574
|
+
return licenseWrapper;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
const id = core.id;
|
|
578
|
+
const name = core.name;
|
|
579
|
+
|
|
580
|
+
let category = "Unstated License";
|
|
581
|
+
let osiApproved = "false";
|
|
582
|
+
let fsfLibre = "false";
|
|
583
|
+
let deprecated = "false";
|
|
584
|
+
|
|
585
|
+
let dbEntry = null;
|
|
586
|
+
if (id) {
|
|
587
|
+
dbEntry = getDbBySpdxLowerMap().get(id.toLowerCase()) || null;
|
|
588
|
+
} else if (name) {
|
|
589
|
+
const alias = correctLicenseId(name);
|
|
590
|
+
if (alias) {
|
|
591
|
+
dbEntry = getDbBySpdxLowerMap().get(alias.toLowerCase()) || null;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
if (dbEntry) {
|
|
596
|
+
category = dbEntry.category || "Unstated License";
|
|
597
|
+
deprecated = dbEntry.is_deprecated ? "true" : "false";
|
|
598
|
+
if (dbEntry.osi_url) {
|
|
599
|
+
osiApproved = "true";
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
const spdxHit = id ? getSpdxLowerMap().get(id.toLowerCase()) : null;
|
|
604
|
+
if (spdxHit) {
|
|
605
|
+
const spdxEntry = spdxHit.entry;
|
|
606
|
+
osiApproved = spdxEntry.isOsiApproved ? "true" : "false";
|
|
607
|
+
fsfLibre = spdxEntry.isFsfLibre ? "true" : "false";
|
|
608
|
+
deprecated = spdxEntry.isDeprecated ? "true" : "false";
|
|
609
|
+
}
|
|
610
|
+
|
|
611
|
+
const foss = FOSS_CATEGORIES.has(category) ? "true" : "false";
|
|
612
|
+
const alert = getComplianceAlert(id || name, category, policy);
|
|
613
|
+
|
|
614
|
+
if (!core.properties) {
|
|
615
|
+
core.properties = [];
|
|
616
|
+
}
|
|
617
|
+
|
|
618
|
+
const props = [
|
|
619
|
+
{ name: "cdx:license:category", value: category },
|
|
620
|
+
{ name: "cdx:license:foss", value: foss },
|
|
621
|
+
{ name: "cdx:license:osiApproved", value: osiApproved },
|
|
622
|
+
{ name: "cdx:license:fsfLibre", value: fsfLibre },
|
|
623
|
+
{ name: "cdx:license:deprecated", value: deprecated },
|
|
624
|
+
];
|
|
625
|
+
|
|
626
|
+
if (alert) {
|
|
627
|
+
props.push({ name: "cdx:license:complianceAlert", value: alert });
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
for (const p of props) {
|
|
631
|
+
const idx = core.properties.findIndex((item) => item.name === p.name);
|
|
632
|
+
if (idx >= 0) {
|
|
633
|
+
core.properties[idx].value = p.value;
|
|
634
|
+
} else {
|
|
635
|
+
core.properties.push(p);
|
|
636
|
+
}
|
|
637
|
+
}
|
|
638
|
+
|
|
639
|
+
return licenseWrapper;
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
/**
|
|
643
|
+
* Walks a whole BOM and enhances all metadata and component licenses.
|
|
644
|
+
*
|
|
645
|
+
* @param {object} bom CycloneDX BOM JSON Object
|
|
646
|
+
* @param {object} opts Options
|
|
647
|
+
* @returns {object} Enhanced BOM
|
|
648
|
+
*/
|
|
649
|
+
export function enhanceBom(bom, opts = {}) {
|
|
650
|
+
if (!bom) return bom;
|
|
651
|
+
|
|
652
|
+
const policy = opts.licensePolicy ? loadPolicy(opts.licensePolicy) : null;
|
|
653
|
+
|
|
654
|
+
// CycloneDX 1.7 allows a mixed list of named licenses and SPDX expressions in
|
|
655
|
+
// the same `licenses` array, so we preserve that granularity. Pre-1.7 schemas
|
|
656
|
+
// require a single SPDX-expression tuple, so collapse mixed entries there.
|
|
657
|
+
const specVersion = Number(
|
|
658
|
+
opts.specVersion ?? bom.specVersion ?? DEFAULT_CDX_SPEC_VERSION,
|
|
659
|
+
);
|
|
660
|
+
const effectiveOpts = {
|
|
661
|
+
...opts,
|
|
662
|
+
_collapseLicenses: Number.isFinite(specVersion) && specVersion < 1.7,
|
|
663
|
+
};
|
|
664
|
+
|
|
665
|
+
if (bom.metadata?.component) {
|
|
666
|
+
enhanceComponent(bom.metadata.component, policy, effectiveOpts);
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
if (bom.metadata?.licenses) {
|
|
670
|
+
const rawLicenses = Array.isArray(bom.metadata.licenses)
|
|
671
|
+
? bom.metadata.licenses
|
|
672
|
+
: [bom.metadata.licenses];
|
|
673
|
+
|
|
674
|
+
const normalizedMeta = rawLicenses
|
|
675
|
+
.map((l) => {
|
|
676
|
+
const normalized = normalizeLicense(l, effectiveOpts);
|
|
677
|
+
if (effectiveOpts.licenseEnrich) {
|
|
678
|
+
enrichLicenseMetadata(normalized, policy, effectiveOpts);
|
|
679
|
+
}
|
|
680
|
+
return normalized;
|
|
681
|
+
})
|
|
682
|
+
.filter(Boolean);
|
|
683
|
+
bom.metadata.licenses = effectiveOpts._collapseLicenses
|
|
684
|
+
? collapseLicenseChoice(normalizedMeta)
|
|
685
|
+
: normalizedMeta;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
if (bom.components && Array.isArray(bom.components)) {
|
|
689
|
+
for (const comp of bom.components) {
|
|
690
|
+
enhanceComponent(comp, policy, effectiveOpts);
|
|
691
|
+
}
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
return bom;
|
|
695
|
+
}
|
|
696
|
+
|
|
697
|
+
function enhanceComponent(component, policy, opts) {
|
|
698
|
+
if (!component) return;
|
|
699
|
+
|
|
700
|
+
if (opts.licenseEnhance !== false) {
|
|
701
|
+
enhanceComponentLicenses(component, opts);
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
if (opts.licenseEnrich && component.licenses) {
|
|
705
|
+
let componentWorstAlert = null;
|
|
706
|
+
const categories = new Set();
|
|
707
|
+
|
|
708
|
+
for (const l of component.licenses) {
|
|
709
|
+
enrichLicenseMetadata(l, policy, opts);
|
|
710
|
+
|
|
711
|
+
const core = l.license || l;
|
|
712
|
+
if (core.properties) {
|
|
713
|
+
const catProp = core.properties.find(
|
|
714
|
+
(p) => p.name === "cdx:license:category",
|
|
715
|
+
);
|
|
716
|
+
if (catProp) categories.add(catProp.value);
|
|
717
|
+
|
|
718
|
+
const alertProp = core.properties.find(
|
|
719
|
+
(p) => p.name === "cdx:license:complianceAlert",
|
|
720
|
+
);
|
|
721
|
+
if (alertProp) {
|
|
722
|
+
componentWorstAlert = getWorstAlert(
|
|
723
|
+
componentWorstAlert,
|
|
724
|
+
alertProp.value,
|
|
725
|
+
);
|
|
726
|
+
}
|
|
727
|
+
}
|
|
728
|
+
}
|
|
729
|
+
|
|
730
|
+
if (!componentWorstAlert && policy) {
|
|
731
|
+
for (const l of component.licenses) {
|
|
732
|
+
const core = l.license || l;
|
|
733
|
+
if (core.expression) {
|
|
734
|
+
const parsed = parseSpdxExpression(core.expression);
|
|
735
|
+
if (parsed.ast) {
|
|
736
|
+
const operands = [];
|
|
737
|
+
collectASTOperands(parsed.ast, operands);
|
|
738
|
+
for (const op of operands) {
|
|
739
|
+
const alert = getComplianceAlert(op, null, policy);
|
|
740
|
+
if (alert) {
|
|
741
|
+
componentWorstAlert = getWorstAlert(componentWorstAlert, alert);
|
|
742
|
+
}
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
}
|
|
748
|
+
|
|
749
|
+
if (categories.size > 0) {
|
|
750
|
+
setComponentProperty(
|
|
751
|
+
component,
|
|
752
|
+
"cdx:license:category",
|
|
753
|
+
Array.from(categories).join(", "),
|
|
754
|
+
);
|
|
755
|
+
}
|
|
756
|
+
if (componentWorstAlert) {
|
|
757
|
+
setComponentProperty(
|
|
758
|
+
component,
|
|
759
|
+
"cdx:license:complianceAlert",
|
|
760
|
+
componentWorstAlert,
|
|
761
|
+
);
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
if (component.components && Array.isArray(component.components)) {
|
|
766
|
+
for (const sub of component.components) {
|
|
767
|
+
enhanceComponent(sub, policy, opts);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
function getWorstAlert(current, next) {
|
|
773
|
+
if (!current) return next;
|
|
774
|
+
if (!next) return current;
|
|
775
|
+
const levels = { error: 3, warning: 2, pass: 1 };
|
|
776
|
+
const currentVal = levels[current] || 0;
|
|
777
|
+
const nextVal = levels[next] || 0;
|
|
778
|
+
return nextVal > currentVal ? next : current;
|
|
779
|
+
}
|
|
780
|
+
|
|
781
|
+
function setComponentProperty(component, name, value) {
|
|
782
|
+
if (!component.properties) {
|
|
783
|
+
component.properties = [];
|
|
784
|
+
}
|
|
785
|
+
const idx = component.properties.findIndex((p) => p.name === name);
|
|
786
|
+
if (idx >= 0) {
|
|
787
|
+
component.properties[idx].value = value;
|
|
788
|
+
} else {
|
|
789
|
+
component.properties.push({ name, value });
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
function collectASTOperands(node, operands) {
|
|
794
|
+
if (node.type === "License") {
|
|
795
|
+
operands.push(node.id);
|
|
796
|
+
} else if (node.type === "With") {
|
|
797
|
+
collectASTOperands(node.license, operands);
|
|
798
|
+
} else if (node.type === "And" || node.type === "Or") {
|
|
799
|
+
collectASTOperands(node.left, operands);
|
|
800
|
+
collectASTOperands(node.right, operands);
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
/**
|
|
805
|
+
* Looks up the ScanCode category for a license identifier from the bundled
|
|
806
|
+
* database.
|
|
807
|
+
*
|
|
808
|
+
* @param {string} id SPDX license identifier
|
|
809
|
+
* @returns {string|null} Category label or null
|
|
810
|
+
*/
|
|
811
|
+
function getLicenseCategory(id) {
|
|
812
|
+
if (!id) {
|
|
813
|
+
return null;
|
|
814
|
+
}
|
|
815
|
+
const entry = getDbBySpdxLowerMap().get(id.toLowerCase());
|
|
816
|
+
return entry?.category || null;
|
|
817
|
+
}
|
|
818
|
+
|
|
819
|
+
const ALERT_RANK = { error: 3, warning: 2, pass: 1 };
|
|
820
|
+
|
|
821
|
+
/**
|
|
822
|
+
* Evaluates a single license object (`{id}`, `{name}`, or `{expression}`)
|
|
823
|
+
* against a compliance policy.
|
|
824
|
+
*
|
|
825
|
+
* @param {object} core License object
|
|
826
|
+
* @param {object} policy Parsed policy
|
|
827
|
+
* @returns {object|null} { license, category, alert } or null when no alert
|
|
828
|
+
*/
|
|
829
|
+
function evaluateLicensePolicy(core, policy) {
|
|
830
|
+
if (!core) {
|
|
831
|
+
return null;
|
|
832
|
+
}
|
|
833
|
+
if (core.expression) {
|
|
834
|
+
const parsed = parseSpdxExpression(core.expression);
|
|
835
|
+
if (!parsed.ast) {
|
|
836
|
+
return null;
|
|
837
|
+
}
|
|
838
|
+
const operands = [];
|
|
839
|
+
collectASTOperands(parsed.ast, operands);
|
|
840
|
+
let worstAlert = null;
|
|
841
|
+
let worstCategory = null;
|
|
842
|
+
for (const op of operands) {
|
|
843
|
+
const category = getLicenseCategory(op);
|
|
844
|
+
const alert = getComplianceAlert(op, category, policy);
|
|
845
|
+
if (
|
|
846
|
+
alert &&
|
|
847
|
+
(!worstAlert || ALERT_RANK[alert] > ALERT_RANK[worstAlert])
|
|
848
|
+
) {
|
|
849
|
+
worstAlert = alert;
|
|
850
|
+
worstCategory = category;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
return worstAlert
|
|
854
|
+
? { license: core.expression, category: worstCategory, alert: worstAlert }
|
|
855
|
+
: null;
|
|
856
|
+
}
|
|
857
|
+
const display = core.id || core.name;
|
|
858
|
+
if (!display) {
|
|
859
|
+
return null;
|
|
860
|
+
}
|
|
861
|
+
const id = core.id || correctLicenseId(core.name);
|
|
862
|
+
const category = getLicenseCategory(id);
|
|
863
|
+
const alert = getComplianceAlert(id || core.name, category, policy);
|
|
864
|
+
return alert ? { license: display, category, alert } : null;
|
|
865
|
+
}
|
|
866
|
+
|
|
867
|
+
/**
|
|
868
|
+
* Walks every component license in a BOM and returns the entries that violate
|
|
869
|
+
* the supplied compliance policy (alert `error`, or `warning` when
|
|
870
|
+
* `includeWarnings` is set). Recurses into nested components and the metadata
|
|
871
|
+
* component.
|
|
872
|
+
*
|
|
873
|
+
* @param {object} bom CycloneDX BOM
|
|
874
|
+
* @param {object} policy Parsed policy object (see loadPolicy)
|
|
875
|
+
* @param {object} [opts] { includeWarnings?: boolean }
|
|
876
|
+
* @returns {object[]} Violations: { ref, name, version, license, category, alert }
|
|
877
|
+
*/
|
|
878
|
+
export function collectPolicyViolations(bom, policy, opts = {}) {
|
|
879
|
+
if (!bom || !policy) {
|
|
880
|
+
return [];
|
|
881
|
+
}
|
|
882
|
+
const minRank = opts.includeWarnings === true ? 2 : 3;
|
|
883
|
+
const violations = [];
|
|
884
|
+
const visit = (component) => {
|
|
885
|
+
if (!component) {
|
|
886
|
+
return;
|
|
887
|
+
}
|
|
888
|
+
const licenses = Array.isArray(component.licenses)
|
|
889
|
+
? component.licenses
|
|
890
|
+
: component.licenses
|
|
891
|
+
? [component.licenses]
|
|
892
|
+
: [];
|
|
893
|
+
for (const l of licenses) {
|
|
894
|
+
const core = l.license || l;
|
|
895
|
+
const evaluated = evaluateLicensePolicy(core, policy);
|
|
896
|
+
if (evaluated && (ALERT_RANK[evaluated.alert] || 0) >= minRank) {
|
|
897
|
+
violations.push({
|
|
898
|
+
ref:
|
|
899
|
+
component.purl ||
|
|
900
|
+
component["bom-ref"] ||
|
|
901
|
+
component.name ||
|
|
902
|
+
"unknown",
|
|
903
|
+
name: component.name,
|
|
904
|
+
version: component.version,
|
|
905
|
+
...evaluated,
|
|
906
|
+
});
|
|
907
|
+
}
|
|
908
|
+
}
|
|
909
|
+
for (const sub of component.components || []) {
|
|
910
|
+
visit(sub);
|
|
911
|
+
}
|
|
912
|
+
};
|
|
913
|
+
visit(bom?.metadata?.component);
|
|
914
|
+
for (const component of bom?.components || []) {
|
|
915
|
+
visit(component);
|
|
916
|
+
}
|
|
917
|
+
return violations;
|
|
918
|
+
}
|