@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,587 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CMake build-context resolver: the layer-3 bridge between the pure parsers
|
|
3
|
+
* (`lib/parsers/cmakeCache.js`, `lib/parsers/gitmodules.js`) and the C/C++ BOM
|
|
4
|
+
* lifecycle in `lib/cli/nativeBom.js`.
|
|
5
|
+
*
|
|
6
|
+
* This module owns every subprocess invocation and every filesystem read
|
|
7
|
+
* outside the scan root. It reads `CMakeCache.txt`, `.gitmodules`, the
|
|
8
|
+
* FetchContent gitclone scripts, and `git submodule status` output, then
|
|
9
|
+
* returns repo-relative facts the lifecycle can attach to components.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { readFileSync } from "node:fs";
|
|
13
|
+
import { basename, dirname, join, relative, resolve, sep } from "node:path";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
DEBUG_MODE,
|
|
17
|
+
isSecureMode,
|
|
18
|
+
recordSensitiveFileRead,
|
|
19
|
+
} from "../core/activity.js";
|
|
20
|
+
import { getAllFiles, safeExistsSync } from "../core/fs.js";
|
|
21
|
+
import {
|
|
22
|
+
execGitCommand,
|
|
23
|
+
GIT_COMMAND,
|
|
24
|
+
getOriginUrl,
|
|
25
|
+
} from "../inventory/envcontext.js";
|
|
26
|
+
import { applyPurl, tryBuildPurl } from "../inventory/purl.js";
|
|
27
|
+
import {
|
|
28
|
+
parseCmakeCache,
|
|
29
|
+
resolveCmakeCacheFacts,
|
|
30
|
+
} from "../parsers/cmakeCache.js";
|
|
31
|
+
import {
|
|
32
|
+
parseGitmodules,
|
|
33
|
+
parseGitRemoteUrl,
|
|
34
|
+
resolveSubmoduleUrl,
|
|
35
|
+
submodulePurlCoordinates,
|
|
36
|
+
} from "../parsers/gitmodules.js";
|
|
37
|
+
|
|
38
|
+
const FETCHCONTENT_CANDIDATE_GLOBS = ["build", "out"];
|
|
39
|
+
const CMAKE_BUILD_DIR_GLOBS = ["cmake-build-*"];
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Make an absolute build-machine path repo-relative. Returns `null` when the
|
|
43
|
+
* path does not lie under the scan root (so the caller can drop it rather than
|
|
44
|
+
* emit a verbatim build-machine path).
|
|
45
|
+
*
|
|
46
|
+
* @param {string} absPath Absolute path from CMakeCache
|
|
47
|
+
* @param {string} scanRoot The project scan root
|
|
48
|
+
* @returns {string|null} Repo-relative path using POSIX separators, or null
|
|
49
|
+
*/
|
|
50
|
+
function toRepoRelative(absPath, scanRoot) {
|
|
51
|
+
if (!absPath || !scanRoot) {
|
|
52
|
+
return null;
|
|
53
|
+
}
|
|
54
|
+
const rel = relative(resolve(scanRoot), resolve(absPath));
|
|
55
|
+
if (rel.startsWith("..")) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
return rel.split(sep).join("/");
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Detect the build directory that holds a `CMakeCache.txt`.
|
|
63
|
+
*
|
|
64
|
+
* Looks for `build/`, `cmake-build-* /`, and `out/` under the scan root. An
|
|
65
|
+
* explicit `--cmake-cache <path>` option (passed via `options.cmakeCache`)
|
|
66
|
+
* takes precedence and skips autodetection.
|
|
67
|
+
*
|
|
68
|
+
* @param {string} path Project scan root
|
|
69
|
+
* @param {Object} options CLI options; `options.cmakeCache` is an explicit override
|
|
70
|
+
* @returns {{ cacheFile: string, buildDir: string } | null}
|
|
71
|
+
*/
|
|
72
|
+
export function detectCmakeBuildDir(path, options) {
|
|
73
|
+
if (options?.cmakeCache) {
|
|
74
|
+
const cacheFile = resolve(options.cmakeCache);
|
|
75
|
+
if (safeExistsSync(cacheFile)) {
|
|
76
|
+
recordSensitiveFileRead(cacheFile, {
|
|
77
|
+
label: "CMakeCache.txt (explicit override)",
|
|
78
|
+
});
|
|
79
|
+
return { cacheFile, buildDir: resolve(dirname(cacheFile)) };
|
|
80
|
+
}
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
for (const sub of FETCHCONTENT_CANDIDATE_GLOBS) {
|
|
84
|
+
const cacheFile = join(path, sub, "CMakeCache.txt");
|
|
85
|
+
if (safeExistsSync(cacheFile)) {
|
|
86
|
+
recordSensitiveFileRead(cacheFile, {
|
|
87
|
+
label: "CMakeCache.txt (autodetected)",
|
|
88
|
+
});
|
|
89
|
+
return { cacheFile, buildDir: join(path, sub) };
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
const buildDirs = getAllFiles(path, `{${CMAKE_BUILD_DIR_GLOBS.join(",")}}`, {
|
|
93
|
+
noIgnore: true,
|
|
94
|
+
}).filter((f) => safeExistsSync(join(f, "CMakeCache.txt")));
|
|
95
|
+
if (buildDirs.length) {
|
|
96
|
+
const buildDir = buildDirs[0];
|
|
97
|
+
const cacheFile = join(buildDir, "CMakeCache.txt");
|
|
98
|
+
recordSensitiveFileRead(cacheFile, {
|
|
99
|
+
label: "CMakeCache.txt (autodetected)",
|
|
100
|
+
});
|
|
101
|
+
return { cacheFile, buildDir };
|
|
102
|
+
}
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Read and resolve the CMakeCache facts for a project.
|
|
108
|
+
*
|
|
109
|
+
* @param {string} path Project scan root
|
|
110
|
+
* @param {Object} options CLI options
|
|
111
|
+
* @returns {{ rootProject: {name?:string, version?:string}|null, projects: Map, findPackages: Map, fetchContentBase?: string, buildDir?: string } | null}
|
|
112
|
+
*/
|
|
113
|
+
export function resolveCmakeCache(path, options) {
|
|
114
|
+
const detected = detectCmakeBuildDir(path, options);
|
|
115
|
+
if (!detected) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
let text;
|
|
119
|
+
try {
|
|
120
|
+
text = readFileSync(detected.cacheFile, "utf-8");
|
|
121
|
+
} catch (err) {
|
|
122
|
+
if (DEBUG_MODE) {
|
|
123
|
+
console.warn(
|
|
124
|
+
`Unable to read CMakeCache at ${detected.cacheFile}: ${err.message}`,
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
}
|
|
129
|
+
const facts = resolveCmakeCacheFacts(parseCmakeCache(text));
|
|
130
|
+
return {
|
|
131
|
+
...facts,
|
|
132
|
+
buildDir: detected.buildDir,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Read the FetchContent gitclone script and extract the repository URL and tag.
|
|
138
|
+
*
|
|
139
|
+
* The script lives at
|
|
140
|
+
* `<build>/_deps/<name>-subbuild/<name>-populate-prefix/tmp/<name>-populate-gitclone.cmake`
|
|
141
|
+
* and contains the literal `clone ... "<GIT_REPOSITORY>" "<name>-src"` and
|
|
142
|
+
* `checkout "<GIT_TAG>" --` lines. No git invocation is needed.
|
|
143
|
+
*
|
|
144
|
+
* @param {string} buildDir Build directory
|
|
145
|
+
* @param {string} depName FetchContent dep name (lowercase)
|
|
146
|
+
* @returns {{ url: string|null, tag: string|null }}
|
|
147
|
+
*/
|
|
148
|
+
export function readFetchContentGitclone(buildDir, depName) {
|
|
149
|
+
// `depName` reaches here from a CMakeCache key and is interpolated into a
|
|
150
|
+
// path, so a separator or a `..` segment in it would read outside the build
|
|
151
|
+
// directory. A FetchContent dependency name is a CMake identifier; anything
|
|
152
|
+
// else is refused rather than resolved.
|
|
153
|
+
if (
|
|
154
|
+
!depName ||
|
|
155
|
+
!/^[A-Za-z0-9_.+-]+$/.test(depName) ||
|
|
156
|
+
depName.includes("..")
|
|
157
|
+
) {
|
|
158
|
+
return { url: null, tag: null };
|
|
159
|
+
}
|
|
160
|
+
const scriptPath = join(
|
|
161
|
+
buildDir,
|
|
162
|
+
"_deps",
|
|
163
|
+
`${depName}-subbuild`,
|
|
164
|
+
`${depName}-populate-prefix`,
|
|
165
|
+
"tmp",
|
|
166
|
+
`${depName}-populate-gitclone.cmake`,
|
|
167
|
+
);
|
|
168
|
+
if (!safeExistsSync(scriptPath)) {
|
|
169
|
+
return { url: null, tag: null };
|
|
170
|
+
}
|
|
171
|
+
recordSensitiveFileRead(scriptPath, {
|
|
172
|
+
label: "FetchContent gitclone script",
|
|
173
|
+
});
|
|
174
|
+
let text;
|
|
175
|
+
try {
|
|
176
|
+
text = readFileSync(scriptPath, "utf-8");
|
|
177
|
+
} catch {
|
|
178
|
+
return { url: null, tag: null };
|
|
179
|
+
}
|
|
180
|
+
return parseGitcloneScript(text);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Parse a gitclone.cmake script for the GIT_REPOSITORY and GIT_TAG literals.
|
|
185
|
+
*
|
|
186
|
+
* The clone line carries several quoted arguments (`--config "..."`, the
|
|
187
|
+
* repository URL, and the source dir), so the URL is identified as the quoted
|
|
188
|
+
* token that parses as a git remote rather than the first quoted token.
|
|
189
|
+
*
|
|
190
|
+
* @param {string} text Script contents
|
|
191
|
+
* @returns {{ url: string|null, tag: string|null }}
|
|
192
|
+
*/
|
|
193
|
+
export function parseGitcloneScript(text) {
|
|
194
|
+
if (!text || typeof text !== "string") {
|
|
195
|
+
return { url: null, tag: null };
|
|
196
|
+
}
|
|
197
|
+
let url = null;
|
|
198
|
+
let tag = null;
|
|
199
|
+
for (const rawLine of text.split(/\r\n|\r|\n/)) {
|
|
200
|
+
const line = rawLine.trim();
|
|
201
|
+
if (!url && line.startsWith("clone")) {
|
|
202
|
+
const quoted = line.matchAll(/"([^"]+)"/g);
|
|
203
|
+
for (const match of quoted) {
|
|
204
|
+
const candidate = match[1];
|
|
205
|
+
if (parseGitRemoteUrl(candidate)) {
|
|
206
|
+
url = candidate;
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
if (!tag && line.startsWith("checkout")) {
|
|
212
|
+
const quoted = line.matchAll(/"([^"]+)"/g);
|
|
213
|
+
for (const match of quoted) {
|
|
214
|
+
tag = match[1];
|
|
215
|
+
break;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
return { url, tag };
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Collect submodule pin data via a single `git submodule status --recursive`.
|
|
224
|
+
*
|
|
225
|
+
* Each output line is `<prefix><sha> <path> (<describe>)` where prefix is
|
|
226
|
+
* ` ` (ok), `-` (uninitialised), `+` (out of sync), `U` (conflict).
|
|
227
|
+
* Uninitialised submodules (the normal case for `--depth 1` clones and CI)
|
|
228
|
+
* have no populated working tree, so `describe` is absent; the version
|
|
229
|
+
* degrades to the commit SHA.
|
|
230
|
+
*
|
|
231
|
+
* Falls back to `git ls-tree HEAD <path>` (gitlink, mode 160000) when the
|
|
232
|
+
* submodule machinery is unavailable.
|
|
233
|
+
*
|
|
234
|
+
* @param {string} path Repo directory
|
|
235
|
+
* @returns {Map<string, { sha: string, describe: string|null, prefix: string }>} Path → pin data
|
|
236
|
+
*/
|
|
237
|
+
export function collectSubmoduleStatus(path) {
|
|
238
|
+
const result = new Map();
|
|
239
|
+
if (isSecureMode) {
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
const output = execGitCommand(path, ["submodule", "status", "--recursive"]);
|
|
243
|
+
if (output) {
|
|
244
|
+
for (const line of output.split("\n")) {
|
|
245
|
+
const parsed = parseSubmoduleStatusLine(line);
|
|
246
|
+
if (parsed) {
|
|
247
|
+
result.set(parsed.path, parsed);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
return result;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
/**
|
|
255
|
+
* Parse a single `git submodule status` output line.
|
|
256
|
+
*
|
|
257
|
+
* The status prefix is optional here. `git` writes a space for a submodule that
|
|
258
|
+
* matches the recorded commit, and the command output arrives trimmed, so that
|
|
259
|
+
* space is absent from the first line. The prefixes that carry meaning — `-`
|
|
260
|
+
* uninitialised, `+` out of sync, `U` conflicted — are not whitespace and
|
|
261
|
+
* always survive, so a line that opens with the SHA is in sync.
|
|
262
|
+
*
|
|
263
|
+
* @param {string} line Raw status line
|
|
264
|
+
* @returns {{ sha: string, describe: string|null, prefix: string, path: string } | null}
|
|
265
|
+
*/
|
|
266
|
+
export function parseSubmoduleStatusLine(line) {
|
|
267
|
+
if (!line) {
|
|
268
|
+
return null;
|
|
269
|
+
}
|
|
270
|
+
const hasPrefix = ["-", "+", "U", " "].includes(line[0]);
|
|
271
|
+
const prefix = hasPrefix ? line[0] : " ";
|
|
272
|
+
const rest = (hasPrefix ? line.slice(1) : line).trim();
|
|
273
|
+
const spaceIdx = rest.indexOf(" ");
|
|
274
|
+
if (spaceIdx === -1) {
|
|
275
|
+
return null;
|
|
276
|
+
}
|
|
277
|
+
const sha = rest.slice(0, spaceIdx).trim();
|
|
278
|
+
const remainder = rest.slice(spaceIdx + 1).trim();
|
|
279
|
+
let subPath;
|
|
280
|
+
let describe = null;
|
|
281
|
+
const parenIdx = remainder.lastIndexOf("(");
|
|
282
|
+
if (parenIdx !== -1 && remainder.endsWith(")")) {
|
|
283
|
+
subPath = remainder.slice(0, parenIdx).trim();
|
|
284
|
+
describe = remainder.slice(parenIdx + 1, -1).trim() || null;
|
|
285
|
+
} else {
|
|
286
|
+
subPath = remainder;
|
|
287
|
+
}
|
|
288
|
+
if (!sha || !subPath) {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
return { sha, describe, prefix, path: subPath };
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Build the complete CMake/submodule resolution for a project.
|
|
296
|
+
*
|
|
297
|
+
* Combines CMakeCache facts, `.gitmodules`, submodule pins, and FetchContent
|
|
298
|
+
* gitclone scripts into a single boundary set and component list the C/C++
|
|
299
|
+
* lifecycle can consume.
|
|
300
|
+
*
|
|
301
|
+
* @param {string} path Project scan root
|
|
302
|
+
* @param {Object} options CLI options
|
|
303
|
+
* @returns {{ rootProject: {name?:string, version?:string}|null, findPackages: Map<string,string>, submodules: Array, fetchDeps: Array, boundaries: Map<string,{kind:string,version?:string,url?:string,name:string}> }}
|
|
304
|
+
*/
|
|
305
|
+
export function resolveCmakeContext(path, options) {
|
|
306
|
+
const cacheFacts = resolveCmakeCache(path, options);
|
|
307
|
+
const rootProject = cacheFacts?.rootProject || null;
|
|
308
|
+
const findPackages = cacheFacts?.findPackages || new Map();
|
|
309
|
+
const buildDir = cacheFacts?.buildDir;
|
|
310
|
+
|
|
311
|
+
const boundaries = new Map();
|
|
312
|
+
const fetchDeps = [];
|
|
313
|
+
const submodules = [];
|
|
314
|
+
|
|
315
|
+
if (cacheFacts?.projects) {
|
|
316
|
+
for (const [name, project] of cacheFacts.projects) {
|
|
317
|
+
if (project.kind === "fetch" && project.sourceDir) {
|
|
318
|
+
const relDir = toRepoRelative(project.sourceDir, path);
|
|
319
|
+
const gitclone = buildDir
|
|
320
|
+
? readFetchContentGitclone(buildDir, name)
|
|
321
|
+
: { url: null, tag: null };
|
|
322
|
+
const tag = gitclone.tag || project.version || null;
|
|
323
|
+
const url = gitclone.url || null;
|
|
324
|
+
const entry = {
|
|
325
|
+
kind: "fetch",
|
|
326
|
+
name,
|
|
327
|
+
version: tag,
|
|
328
|
+
url,
|
|
329
|
+
sourceDir: relDir,
|
|
330
|
+
};
|
|
331
|
+
fetchDeps.push(entry);
|
|
332
|
+
if (relDir) {
|
|
333
|
+
boundaries.set(relDir, entry);
|
|
334
|
+
}
|
|
335
|
+
continue;
|
|
336
|
+
}
|
|
337
|
+
if (project.kind === "internal" && project.sourceDir) {
|
|
338
|
+
const relDir = toRepoRelative(project.sourceDir, path);
|
|
339
|
+
if (relDir && relDir !== ".") {
|
|
340
|
+
boundaries.set(relDir, {
|
|
341
|
+
kind: "internal",
|
|
342
|
+
name,
|
|
343
|
+
version: project.version,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
const gitmodulesFile = findGitmodules(path);
|
|
351
|
+
let originUrl = null;
|
|
352
|
+
// Only ask git about a directory that is a working tree. A container scan
|
|
353
|
+
// walks every directory of an exploded image, none of which are checkouts,
|
|
354
|
+
// and each call is a process spawn.
|
|
355
|
+
if (safeExistsSync(join(path, ".git"))) {
|
|
356
|
+
try {
|
|
357
|
+
originUrl = getOriginUrl(path);
|
|
358
|
+
} catch {
|
|
359
|
+
originUrl = null;
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
if (gitmodulesFile) {
|
|
363
|
+
let gmText;
|
|
364
|
+
try {
|
|
365
|
+
gmText = readFileSync(gitmodulesFile, "utf-8");
|
|
366
|
+
} catch {
|
|
367
|
+
gmText = "";
|
|
368
|
+
}
|
|
369
|
+
const parsed = parseGitmodules(gmText);
|
|
370
|
+
const statusMap = collectSubmoduleStatus(path);
|
|
371
|
+
for (const sub of parsed) {
|
|
372
|
+
if (!sub.path) {
|
|
373
|
+
continue;
|
|
374
|
+
}
|
|
375
|
+
const status = statusMap.get(sub.path);
|
|
376
|
+
const sha = status?.sha || null;
|
|
377
|
+
const describe = status?.describe || null;
|
|
378
|
+
const version = describe || sha || null;
|
|
379
|
+
const resolvedUrl = sub.url
|
|
380
|
+
? resolveSubmoduleUrl(sub.url, originUrl)
|
|
381
|
+
: null;
|
|
382
|
+
const entry = {
|
|
383
|
+
kind: "submodule",
|
|
384
|
+
name: basename(sub.path),
|
|
385
|
+
path: sub.path,
|
|
386
|
+
version,
|
|
387
|
+
sha,
|
|
388
|
+
describe,
|
|
389
|
+
url: resolvedUrl,
|
|
390
|
+
uninitialised: status?.prefix === "-",
|
|
391
|
+
};
|
|
392
|
+
submodules.push(entry);
|
|
393
|
+
boundaries.set(sub.path, entry);
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
rootProject,
|
|
399
|
+
findPackages,
|
|
400
|
+
submodules,
|
|
401
|
+
fetchDeps,
|
|
402
|
+
boundaries,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Locate `.gitmodules` in the project root.
|
|
408
|
+
*
|
|
409
|
+
* @param {string} path Project scan root
|
|
410
|
+
* @returns {string|null}
|
|
411
|
+
*/
|
|
412
|
+
function findGitmodules(path) {
|
|
413
|
+
const candidate = join(path, ".gitmodules");
|
|
414
|
+
if (safeExistsSync(candidate)) {
|
|
415
|
+
return candidate;
|
|
416
|
+
}
|
|
417
|
+
return null;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
/**
|
|
421
|
+
* Build a purl string from resolved submodule/fetch coordinates, returning
|
|
422
|
+
* null when the parts do not form a valid purl.
|
|
423
|
+
*
|
|
424
|
+
* @param {string} resolvedUrl Absolute git URL
|
|
425
|
+
* @param {string} [version] Resolved version
|
|
426
|
+
* @returns {string|null}
|
|
427
|
+
*/
|
|
428
|
+
export function buildDependentPurl(resolvedUrl, version) {
|
|
429
|
+
const coords = submodulePurlCoordinates(resolvedUrl, version);
|
|
430
|
+
if (!coords) {
|
|
431
|
+
return null;
|
|
432
|
+
}
|
|
433
|
+
return tryBuildPurl({
|
|
434
|
+
type: coords.type,
|
|
435
|
+
namespace: coords.namespace,
|
|
436
|
+
name: coords.name,
|
|
437
|
+
version: coords.version,
|
|
438
|
+
qualifiers: coords.qualifiers,
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
/**
|
|
443
|
+
* Order two `find_package` version requirements.
|
|
444
|
+
*
|
|
445
|
+
* The arguments are CMake version requirements such as `1.54` or `3.0.1`, which
|
|
446
|
+
* are dotted numbers rather than semver, so they are compared segment by
|
|
447
|
+
* segment. A segment that is not a number orders below every number, which puts
|
|
448
|
+
* git describe output and similar strings behind a plain version.
|
|
449
|
+
*
|
|
450
|
+
* @param {string} left First version
|
|
451
|
+
* @param {string} right Second version
|
|
452
|
+
* @returns {number} Negative when `left` is lower, positive when it is higher
|
|
453
|
+
*/
|
|
454
|
+
function compareCmakeVersions(left, right) {
|
|
455
|
+
const leftParts = String(left).split(".");
|
|
456
|
+
const rightParts = String(right).split(".");
|
|
457
|
+
for (let i = 0; i < Math.max(leftParts.length, rightParts.length); i++) {
|
|
458
|
+
const leftNumber = Number.parseInt(leftParts[i] ?? "", 10);
|
|
459
|
+
const rightNumber = Number.parseInt(rightParts[i] ?? "", 10);
|
|
460
|
+
const leftValid = Number.isFinite(leftNumber);
|
|
461
|
+
const rightValid = Number.isFinite(rightNumber);
|
|
462
|
+
if (!leftValid && !rightValid) {
|
|
463
|
+
continue;
|
|
464
|
+
}
|
|
465
|
+
if (!leftValid) {
|
|
466
|
+
return -1;
|
|
467
|
+
}
|
|
468
|
+
if (!rightValid) {
|
|
469
|
+
return 1;
|
|
470
|
+
}
|
|
471
|
+
if (leftNumber !== rightNumber) {
|
|
472
|
+
return leftNumber - rightNumber;
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return 0;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Fold the identity methods of a discarded duplicate into the retained one.
|
|
480
|
+
*
|
|
481
|
+
* Each CMake-like file records itself as a `Filename` method, so a package that
|
|
482
|
+
* several files declare keeps one method per file naming them all.
|
|
483
|
+
*
|
|
484
|
+
* @param {Object} target Component being retained
|
|
485
|
+
* @param {Object} source Component being collapsed away
|
|
486
|
+
*/
|
|
487
|
+
function mergeEvidence(target, source) {
|
|
488
|
+
const sourceIdentity = source?.evidence?.identity;
|
|
489
|
+
const incoming = (
|
|
490
|
+
Array.isArray(sourceIdentity) ? sourceIdentity[0] : sourceIdentity
|
|
491
|
+
)?.methods;
|
|
492
|
+
if (!incoming?.length) {
|
|
493
|
+
return;
|
|
494
|
+
}
|
|
495
|
+
target.evidence = target.evidence || {};
|
|
496
|
+
target.evidence.identity = target.evidence.identity || { field: "purl" };
|
|
497
|
+
const identity = Array.isArray(target.evidence.identity)
|
|
498
|
+
? target.evidence.identity[0]
|
|
499
|
+
: target.evidence.identity;
|
|
500
|
+
if (!identity) {
|
|
501
|
+
return;
|
|
502
|
+
}
|
|
503
|
+
const methods = (identity.methods = identity.methods || []);
|
|
504
|
+
for (const method of incoming) {
|
|
505
|
+
if (!methods.some((existing) => existing.value === method.value)) {
|
|
506
|
+
methods.push(method);
|
|
507
|
+
}
|
|
508
|
+
}
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
/**
|
|
512
|
+
* Collapse components that name the same CMake package at different versions.
|
|
513
|
+
*
|
|
514
|
+
* `find_package(Boost 1.54)` in one `CMakeLists.txt` and `find_package(Boost
|
|
515
|
+
* 1.64)` in another state two minimum requirements for a single dependency, not
|
|
516
|
+
* two dependencies. A build that satisfies both links one Boost, the higher of
|
|
517
|
+
* the two, so that requirement becomes the component version and the full set
|
|
518
|
+
* is kept under `cdx:cmake:versionRequirements`.
|
|
519
|
+
*
|
|
520
|
+
* Matching is on name alone, case-insensitively. Components carrying a
|
|
521
|
+
* `cdx:cmake:depKind` property are left alone: a FetchContent dependency or a
|
|
522
|
+
* submodule is pinned to a commit that was really checked out, and two such
|
|
523
|
+
* pins are genuinely two things.
|
|
524
|
+
*
|
|
525
|
+
* @param {Object[]} pkgList Components scraped from CMake-like files
|
|
526
|
+
* @returns {Object[]} Components with one entry per package name, in first-seen order
|
|
527
|
+
*/
|
|
528
|
+
export function collapseCmakeVersions(pkgList) {
|
|
529
|
+
if (!Array.isArray(pkgList) || pkgList.length < 2) {
|
|
530
|
+
return Array.isArray(pkgList) ? pkgList : [];
|
|
531
|
+
}
|
|
532
|
+
const collapsed = [];
|
|
533
|
+
const byName = new Map();
|
|
534
|
+
const requirements = new Map();
|
|
535
|
+
for (const pkg of pkgList) {
|
|
536
|
+
const isResolvedDep = pkg?.properties?.some(
|
|
537
|
+
(prop) => prop.name === "cdx:cmake:depKind",
|
|
538
|
+
);
|
|
539
|
+
if (!pkg?.name || isResolvedDep) {
|
|
540
|
+
collapsed.push(pkg);
|
|
541
|
+
continue;
|
|
542
|
+
}
|
|
543
|
+
const key = `${pkg.group || ""}/${pkg.name.toLowerCase()}`;
|
|
544
|
+
const existing = byName.get(key);
|
|
545
|
+
if (!existing) {
|
|
546
|
+
byName.set(key, pkg);
|
|
547
|
+
requirements.set(key, new Set(pkg.version ? [pkg.version] : []));
|
|
548
|
+
collapsed.push(pkg);
|
|
549
|
+
continue;
|
|
550
|
+
}
|
|
551
|
+
mergeEvidence(existing, pkg);
|
|
552
|
+
if (pkg.version) {
|
|
553
|
+
requirements.get(key).add(pkg.version);
|
|
554
|
+
if (
|
|
555
|
+
!existing.version ||
|
|
556
|
+
compareCmakeVersions(pkg.version, existing.version) > 0
|
|
557
|
+
) {
|
|
558
|
+
existing.version = pkg.version;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
}
|
|
562
|
+
for (const [key, pkg] of byName) {
|
|
563
|
+
const versions = Array.from(requirements.get(key)).sort(
|
|
564
|
+
compareCmakeVersions,
|
|
565
|
+
);
|
|
566
|
+
if (versions.length < 2) {
|
|
567
|
+
continue;
|
|
568
|
+
}
|
|
569
|
+
pkg.properties = pkg.properties || [];
|
|
570
|
+
pkg.properties.push({
|
|
571
|
+
name: "cdx:cmake:versionRequirements",
|
|
572
|
+
value: versions.join("|"),
|
|
573
|
+
});
|
|
574
|
+
applyPurl(
|
|
575
|
+
pkg,
|
|
576
|
+
tryBuildPurl({
|
|
577
|
+
type: pkg.type || "generic",
|
|
578
|
+
namespace: pkg.group || null,
|
|
579
|
+
name: pkg.name,
|
|
580
|
+
version: pkg.version || null,
|
|
581
|
+
}),
|
|
582
|
+
);
|
|
583
|
+
}
|
|
584
|
+
return collapsed;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
export { GIT_COMMAND, toRepoRelative };
|