@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,875 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
|
|
3
|
+
import { npmPurl, tryBuildPurl } from "../inventory/purl.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Bazel bzlmod dependency extraction.
|
|
7
|
+
*
|
|
8
|
+
* bzlmod (`MODULE.bazel` + `MODULE.bazel.lock`) pulls dependencies from many
|
|
9
|
+
* ecosystems. The whole point of parsing it for an SBOM is to map each
|
|
10
|
+
* resolved dependency onto its true ecosystem purl so vulnerability
|
|
11
|
+
* advisories match — a Maven dependency pulled through bzlmod is a `pkg:maven`
|
|
12
|
+
* package, not a `pkg:bazel` one.
|
|
13
|
+
*
|
|
14
|
+
* Two sources are consulted:
|
|
15
|
+
*
|
|
16
|
+
* - `MODULE.bazel` (Starlark): the manifest. `bazel_dep(name, version)`
|
|
17
|
+
* declares Bazel Central Registry modules, which ARE the registered
|
|
18
|
+
* `bazel` purl type's intended target (flat name, no namespace, default
|
|
19
|
+
* `repository_url = https://bcr.bazel.build`). Extension calls such as
|
|
20
|
+
* `maven.artifact(...)` declare dependencies in their native ecosystem.
|
|
21
|
+
*
|
|
22
|
+
* - `MODULE.bazel.lock` (JSON): the resolved lock. Its structure has changed
|
|
23
|
+
* across `lockFileVersion`, so this parser reads defensively — a legacy
|
|
24
|
+
* `modules` array when present, and the modern `moduleExtensions` whose
|
|
25
|
+
* `generatedRepoSpecs` carry resolved Maven coordinates.
|
|
26
|
+
*
|
|
27
|
+
* `pkg:bazel/...` is used only for BCR modules. Squatting it for a Maven
|
|
28
|
+
* artifact would silently break every vulnerability match.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
const BCR_DEFAULT_REPOSITORY_URL = "https://bcr.bazel.build";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Module extensions that resolve the build environment rather than the
|
|
35
|
+
* project's dependencies. They dominate a real lock — a `flatbuffers` lock
|
|
36
|
+
* generates 48 repositories from `rules_java`'s `toolchains` extension alone,
|
|
37
|
+
* every one of them a JDK or a Java tools archive — and listing them as
|
|
38
|
+
* components describes the machine that ran the build, not the software being
|
|
39
|
+
* built.
|
|
40
|
+
*
|
|
41
|
+
* Only `toolchains`-suffixed extensions are excluded by name. The
|
|
42
|
+
* `*_configure_extension` families (cc, xcode, sh, apple_cc) also describe the
|
|
43
|
+
* environment, but they generate `local_config_*` repositories with no
|
|
44
|
+
* coordinates, so they drop out on their own — whereas an extension named
|
|
45
|
+
* `internal_configure_extension` is how pybind11 declares a real dependency.
|
|
46
|
+
*/
|
|
47
|
+
const TOOLCHAIN_EXTENSION = /%(?:[a-z_]*_)?toolchains?$/i;
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parse a `MODULE.bazel` manifest and return its BCR modules and ecosystem
|
|
51
|
+
* dependencies. The MODULE.bazel file is Starlark; this extractor finds calls
|
|
52
|
+
* by name and reads their keyword/string arguments using a balanced-paren scan
|
|
53
|
+
* rather than a regex, because MODULE.bazel calls can nest.
|
|
54
|
+
*
|
|
55
|
+
* @param {string} moduleFile Path to `MODULE.bazel`
|
|
56
|
+
* @returns {{ pkgList: object[], parentComponent: object, rootInputs: string[] }}
|
|
57
|
+
*/
|
|
58
|
+
export function parseModuleBazel(moduleFile) {
|
|
59
|
+
let src;
|
|
60
|
+
try {
|
|
61
|
+
src = readFileSync(moduleFile, "utf-8");
|
|
62
|
+
} catch (error) {
|
|
63
|
+
console.warn(`Failed to parse ${moduleFile}: ${error.message}`);
|
|
64
|
+
return { pkgList: [], parentComponent: {}, rootInputs: [] };
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
const pkgList = [];
|
|
68
|
+
const parentComponent = {};
|
|
69
|
+
|
|
70
|
+
const moduleName = scalarArg(findFirstCall(src, "module"), "name");
|
|
71
|
+
const moduleVersion = scalarArg(findFirstCall(src, "module"), "version");
|
|
72
|
+
if (moduleName) {
|
|
73
|
+
Object.assign(parentComponent, {
|
|
74
|
+
type: "application",
|
|
75
|
+
name: moduleName,
|
|
76
|
+
...(moduleVersion ? { version: moduleVersion } : {}),
|
|
77
|
+
description: `Bazel module: ${moduleName}`,
|
|
78
|
+
properties: [{ name: "internal:SrcFile", value: moduleFile }],
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (const call of findAllCalls(src, "bazel_dep")) {
|
|
83
|
+
const name = scalarArg(call, "name");
|
|
84
|
+
const version = scalarArg(call, "version");
|
|
85
|
+
const repoName = scalarArg(call, "repo_name");
|
|
86
|
+
if (!name || !version) continue;
|
|
87
|
+
pkgList.push(buildBcrPackage(repoName || name, name, version, moduleFile));
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
for (const call of findAllCalls(src, "maven.artifact")) {
|
|
91
|
+
const pkg = mavenPackageFromCall(call, moduleFile);
|
|
92
|
+
if (pkg) pkgList.push(pkg);
|
|
93
|
+
}
|
|
94
|
+
// rules_jvm_external exposes `maven.artifact`; some projects call it on a
|
|
95
|
+
// locally aliased handle. Catch the common alias shapes too.
|
|
96
|
+
for (const call of findAllCalls(src, "artifact")) {
|
|
97
|
+
if (looksLikeMavenArtifactCall(call)) {
|
|
98
|
+
const pkg = mavenPackageFromCall(call, moduleFile);
|
|
99
|
+
if (pkg) pkgList.push(pkg);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const rootInputs = pkgList.map((p) => p["bom-ref"]);
|
|
104
|
+
return { pkgList, parentComponent, rootInputs };
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Parse a `MODULE.bazel.lock` for resolved dependencies and the module graph.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} lockFile Path to `MODULE.bazel.lock`
|
|
111
|
+
* @returns {{ pkgList: object[], dependencies: object[] }}
|
|
112
|
+
*/
|
|
113
|
+
export function parseModuleBazelLock(lockFile) {
|
|
114
|
+
let lock;
|
|
115
|
+
try {
|
|
116
|
+
lock = JSON.parse(readFileSync(lockFile, "utf-8"));
|
|
117
|
+
} catch (error) {
|
|
118
|
+
console.warn(`Failed to parse ${lockFile}: ${error.message}`);
|
|
119
|
+
return { pkgList: [], dependencies: [] };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
const pkgList = [];
|
|
123
|
+
const dependencies = [];
|
|
124
|
+
|
|
125
|
+
// Legacy lockFileVersion (<= ~9) carries a resolved `modules` array.
|
|
126
|
+
if (Array.isArray(lock.modules)) {
|
|
127
|
+
const byKey = new Map();
|
|
128
|
+
for (const mod of lock.modules) {
|
|
129
|
+
const name = mod.name;
|
|
130
|
+
const version = mod.version;
|
|
131
|
+
if (!name || !version) continue;
|
|
132
|
+
const pkg = buildBcrPackage(
|
|
133
|
+
mod.repoName || name,
|
|
134
|
+
name,
|
|
135
|
+
version,
|
|
136
|
+
lockFile,
|
|
137
|
+
);
|
|
138
|
+
pkgList.push(pkg);
|
|
139
|
+
byKey.set(`${name}@${version}`, pkg["bom-ref"]);
|
|
140
|
+
}
|
|
141
|
+
for (const mod of lock.modules) {
|
|
142
|
+
const ref = byKey.get(`${mod.name}@${mod.version}`);
|
|
143
|
+
if (!ref) continue;
|
|
144
|
+
const dependsOn = (mod.deps || [])
|
|
145
|
+
.map((d) => byKey.get(`${d.name}@${d.version}`))
|
|
146
|
+
.filter(Boolean);
|
|
147
|
+
dependencies.push({ ref, dependsOn: [...new Set(dependsOn)].sort() });
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// Module extensions record what each extension resolved. The entries are
|
|
152
|
+
// keyed by the repository name the build sees; the rule that generated them
|
|
153
|
+
// says which ecosystem the dependency belongs to.
|
|
154
|
+
for (const spec of iterateRepoSpecs(lock)) {
|
|
155
|
+
const pkg = packageFromRepoSpec(spec.repoName, spec.spec, lockFile);
|
|
156
|
+
if (pkg) pkgList.push(pkg);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
return { pkgList, dependencies };
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Walk every generated repository spec in a lock, whichever shape the lock
|
|
164
|
+
* uses.
|
|
165
|
+
*
|
|
166
|
+
* A module extension's results are grouped per platform key: `general` when
|
|
167
|
+
* the extension is platform-independent, and an os/arch key otherwise. Reading
|
|
168
|
+
* only `general` would miss every platform-specific dependency, so all groups
|
|
169
|
+
* are walked and duplicates are collapsed by repository name.
|
|
170
|
+
*
|
|
171
|
+
* @param {object} lock Parsed lock file
|
|
172
|
+
* @returns {Array<{repoName: string, spec: object}>} repository specs
|
|
173
|
+
*/
|
|
174
|
+
function iterateRepoSpecs(lock) {
|
|
175
|
+
const out = [];
|
|
176
|
+
const seen = new Set();
|
|
177
|
+
const extensions = lock?.moduleExtensions;
|
|
178
|
+
if (!extensions || typeof extensions !== "object") {
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
for (const [extensionId, ext] of Object.entries(extensions)) {
|
|
182
|
+
if (!ext || typeof ext !== "object") continue;
|
|
183
|
+
if (TOOLCHAIN_EXTENSION.test(extensionId)) continue;
|
|
184
|
+
for (const group of Object.values(ext)) {
|
|
185
|
+
const specs = group?.generatedRepoSpecs;
|
|
186
|
+
if (!specs || typeof specs !== "object") continue;
|
|
187
|
+
for (const [repoName, spec] of Object.entries(specs)) {
|
|
188
|
+
if (seen.has(repoName)) continue;
|
|
189
|
+
seen.add(repoName);
|
|
190
|
+
out.push({ repoName, spec });
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
return out;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
/**
|
|
198
|
+
* Name the repository rule that produced a generated repository.
|
|
199
|
+
*
|
|
200
|
+
* Lock format 20 and later name the rule in `repoRuleId`
|
|
201
|
+
* (`@@repo//path:file.bzl%rule_name`); earlier formats split it across
|
|
202
|
+
* `bzlFile` and `ruleClassName`. Both are still in circulation, so both are
|
|
203
|
+
* read.
|
|
204
|
+
*
|
|
205
|
+
* @param {object} spec A generatedRepoSpec value
|
|
206
|
+
* @returns {string} bare rule name, or an empty string
|
|
207
|
+
*/
|
|
208
|
+
function repoRuleName(spec) {
|
|
209
|
+
const id = `${spec?.repoRuleId || ""}`;
|
|
210
|
+
if (id) {
|
|
211
|
+
return id.split("%").pop();
|
|
212
|
+
}
|
|
213
|
+
return `${spec?.ruleClassName || ""}`;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
/**
|
|
217
|
+
* Build a component from a generated repository spec, mapping it to the purl
|
|
218
|
+
* type of the ecosystem it actually came from.
|
|
219
|
+
*
|
|
220
|
+
* Only rules whose coordinates are unambiguous produce a component. A
|
|
221
|
+
* repository generated by a toolchain or platform-detection rule describes the
|
|
222
|
+
* build environment rather than a dependency, and is skipped.
|
|
223
|
+
*
|
|
224
|
+
* @param {string} repoName Repository name the build sees
|
|
225
|
+
* @param {object} spec A generatedRepoSpec value
|
|
226
|
+
* @param {string} srcFile Lock file path for evidence
|
|
227
|
+
* @returns {object|null} Package record, or null when the rule carries no dependency
|
|
228
|
+
*/
|
|
229
|
+
function packageFromRepoSpec(repoName, spec, srcFile) {
|
|
230
|
+
if (!spec || typeof spec !== "object") return null;
|
|
231
|
+
const rule = repoRuleName(spec);
|
|
232
|
+
const attrs = spec.attributes || {};
|
|
233
|
+
if (!rule) return null;
|
|
234
|
+
|
|
235
|
+
if (/maven|jvm_import_external/.test(rule)) {
|
|
236
|
+
const parsed = parseMavenCoordinates(attrs.artifact, attrs);
|
|
237
|
+
return parsed
|
|
238
|
+
? buildMavenPackage(parsed.group, parsed.name, parsed.version, srcFile)
|
|
239
|
+
: null;
|
|
240
|
+
}
|
|
241
|
+
if (rule === "go_repository" && attrs.importpath) {
|
|
242
|
+
// A Go module path is a namespace plus a final segment, and the purl keeps
|
|
243
|
+
// its slashes unescaped, exactly as the Go collectors build it.
|
|
244
|
+
const importPath = `${attrs.importpath}`;
|
|
245
|
+
const slash = importPath.lastIndexOf("/");
|
|
246
|
+
return buildEcosystemPackage(
|
|
247
|
+
{
|
|
248
|
+
type: "golang",
|
|
249
|
+
namespace: slash > -1 ? importPath.slice(0, slash) : null,
|
|
250
|
+
name: slash > -1 ? importPath.slice(slash + 1) : importPath,
|
|
251
|
+
version: attrs.version,
|
|
252
|
+
displayName: importPath,
|
|
253
|
+
},
|
|
254
|
+
{ ecosystem: "go", repoName, srcFile, sum: attrs.sum },
|
|
255
|
+
);
|
|
256
|
+
}
|
|
257
|
+
if (rule === "whl_library" || rule === "pypi_file") {
|
|
258
|
+
const parsed = parsePipRequirement(attrs.requirement || attrs.whl_name);
|
|
259
|
+
return parsed
|
|
260
|
+
? buildEcosystemPackage(
|
|
261
|
+
{ type: "pypi", name: parsed.name, version: parsed.version },
|
|
262
|
+
{ ecosystem: "pypi", repoName, srcFile, sha256: attrs.sha256 },
|
|
263
|
+
)
|
|
264
|
+
: null;
|
|
265
|
+
}
|
|
266
|
+
if (rule === "npm_import" && attrs.package) {
|
|
267
|
+
// A scoped npm name is a namespace plus a name; npmPurl owns that split.
|
|
268
|
+
const packageName = `${attrs.package}`;
|
|
269
|
+
return buildEcosystemPackage(
|
|
270
|
+
{
|
|
271
|
+
type: "npm",
|
|
272
|
+
purlString: npmPurl(
|
|
273
|
+
packageName,
|
|
274
|
+
attrs.version ? `${attrs.version}` : undefined,
|
|
275
|
+
),
|
|
276
|
+
name: packageName,
|
|
277
|
+
version: attrs.version,
|
|
278
|
+
},
|
|
279
|
+
{ ecosystem: "npm", repoName, srcFile, integrity: attrs.integrity },
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
if (rule === "crate_repository" || rule === "cargo_bootstrap_repository") {
|
|
283
|
+
// rules_rust vendors an entire crate universe behind one repository, so
|
|
284
|
+
// the spec names the vendoring rule rather than any single crate. Cargo
|
|
285
|
+
// dependencies are read from the vendored Cargo.lock by the Rust
|
|
286
|
+
// collector instead.
|
|
287
|
+
return null;
|
|
288
|
+
}
|
|
289
|
+
if (rule === "http_archive" || rule === "http_file") {
|
|
290
|
+
return httpArchivePackage(repoName, attrs, srcFile);
|
|
291
|
+
}
|
|
292
|
+
return null;
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
/**
|
|
296
|
+
* Build a component for a dependency fetched by `http_archive`/`http_file`.
|
|
297
|
+
*
|
|
298
|
+
* These carry no ecosystem identity — just a URL and a checksum — so they are
|
|
299
|
+
* `pkg:generic` with a `download_url` qualifier. The version is taken from
|
|
300
|
+
* `strip_prefix` (which conventionally embeds the release, as in
|
|
301
|
+
* `buildtools-8.5.1`) or from a version-shaped segment of the URL.
|
|
302
|
+
*
|
|
303
|
+
* @param {string} repoName Repository name, used as the component name
|
|
304
|
+
* @param {object} attrs Rule attributes
|
|
305
|
+
* @param {string} srcFile Lock file path for evidence
|
|
306
|
+
* @returns {object|null} Package record, or null without a usable URL
|
|
307
|
+
*/
|
|
308
|
+
function httpArchivePackage(repoName, attrs, srcFile) {
|
|
309
|
+
const urls = Array.isArray(attrs.urls)
|
|
310
|
+
? attrs.urls
|
|
311
|
+
: attrs.url
|
|
312
|
+
? [`${attrs.url}`]
|
|
313
|
+
: [];
|
|
314
|
+
const url = urls.find((u) => typeof u === "string" && u.length);
|
|
315
|
+
if (!url) return null;
|
|
316
|
+
const version = archiveVersion(attrs.strip_prefix, url);
|
|
317
|
+
const pkg = buildEcosystemPackage(
|
|
318
|
+
{
|
|
319
|
+
type: "generic",
|
|
320
|
+
name: repoName,
|
|
321
|
+
version,
|
|
322
|
+
qualifiers: { download_url: url },
|
|
323
|
+
},
|
|
324
|
+
{ ecosystem: "http_archive", repoName, srcFile, sha256: attrs.sha256 },
|
|
325
|
+
);
|
|
326
|
+
return pkg;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Derive a version for an archive dependency.
|
|
331
|
+
*
|
|
332
|
+
* @param {string|undefined} stripPrefix `strip_prefix` attribute
|
|
333
|
+
* @param {string} url Download URL
|
|
334
|
+
* @returns {string|undefined} version, or undefined when none is discernible
|
|
335
|
+
*/
|
|
336
|
+
function archiveVersion(stripPrefix, url) {
|
|
337
|
+
const fromPrefix = `${stripPrefix || ""}`.match(/-(v?\d+(?:\.\d+)*)$/);
|
|
338
|
+
if (fromPrefix) {
|
|
339
|
+
return fromPrefix[1].replace(/^v/, "");
|
|
340
|
+
}
|
|
341
|
+
const cleaned = url
|
|
342
|
+
.split("?")[0]
|
|
343
|
+
.replace(/\.(tar\.gz|tgz|tar\.xz|zip)$/i, "");
|
|
344
|
+
const last = cleaned.split("/").pop() || "";
|
|
345
|
+
const fromUrl = last.match(/^v?(\d+(?:\.\d+)+)$/);
|
|
346
|
+
return fromUrl ? fromUrl[1] : undefined;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Split a pip requirement (`name==version`) into its parts.
|
|
351
|
+
*
|
|
352
|
+
* @param {string|undefined} requirement Requirement string
|
|
353
|
+
* @returns {{name: string, version: string|undefined}|null}
|
|
354
|
+
*/
|
|
355
|
+
function parsePipRequirement(requirement) {
|
|
356
|
+
const value = `${requirement || ""}`.trim();
|
|
357
|
+
if (!value) return null;
|
|
358
|
+
const match = value.match(/^([A-Za-z0-9._-]+)\s*==\s*([^\s;]+)/);
|
|
359
|
+
if (match) {
|
|
360
|
+
return { name: match[1], version: match[2] };
|
|
361
|
+
}
|
|
362
|
+
const bare = value.match(/^([A-Za-z0-9._-]+)$/);
|
|
363
|
+
return bare ? { name: bare[1], version: undefined } : null;
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Build a component for a bzlmod dependency that belongs to a known ecosystem.
|
|
368
|
+
*
|
|
369
|
+
* @param {{type: string, name: string, version?: string, namespace?: string, qualifiers?: object}} coords purl coordinates
|
|
370
|
+
* @param {{ecosystem: string, repoName: string, srcFile: string, sha256?: string, integrity?: string, sum?: string}} context Evidence context
|
|
371
|
+
* @returns {object|null} Package record, or null when the purl cannot be built
|
|
372
|
+
*/
|
|
373
|
+
function buildEcosystemPackage(coords, context) {
|
|
374
|
+
const version = coords.version ? `${coords.version}` : undefined;
|
|
375
|
+
const { displayName, purlString, ...purlParts } = coords;
|
|
376
|
+
// Go purls keep their path separators readable, matching the Go collectors
|
|
377
|
+
// so one module resolves to one bom-ref however it was discovered.
|
|
378
|
+
const purl =
|
|
379
|
+
purlString ||
|
|
380
|
+
tryBuildPurl({ ...purlParts, version })?.replace(
|
|
381
|
+
coords.type === "golang" ? /%2F/g : /$^/,
|
|
382
|
+
"/",
|
|
383
|
+
);
|
|
384
|
+
if (!purl) return null;
|
|
385
|
+
const properties = [
|
|
386
|
+
{ name: "internal:SrcFile", value: context.srcFile },
|
|
387
|
+
{ name: "cdx:bazel:ecosystem", value: context.ecosystem },
|
|
388
|
+
{ name: "cdx:bazel:repo_name", value: context.repoName },
|
|
389
|
+
];
|
|
390
|
+
const pkg = {
|
|
391
|
+
name: displayName || coords.name,
|
|
392
|
+
...(version ? { version } : {}),
|
|
393
|
+
type: "library",
|
|
394
|
+
scope: "required",
|
|
395
|
+
...(coords.namespace ? { group: coords.namespace } : {}),
|
|
396
|
+
purl,
|
|
397
|
+
"bom-ref": decodeURIComponent(purl),
|
|
398
|
+
properties,
|
|
399
|
+
evidence: {
|
|
400
|
+
identity: {
|
|
401
|
+
field: "purl",
|
|
402
|
+
confidence: 1.0,
|
|
403
|
+
methods: [
|
|
404
|
+
{
|
|
405
|
+
technique: "manifest-analysis",
|
|
406
|
+
confidence: 1.0,
|
|
407
|
+
value: context.srcFile,
|
|
408
|
+
},
|
|
409
|
+
],
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
};
|
|
413
|
+
if (context.sha256 && /^[a-f0-9]{64}$/i.test(`${context.sha256}`)) {
|
|
414
|
+
pkg.hashes = [{ alg: "SHA-256", content: `${context.sha256}` }];
|
|
415
|
+
} else if (context.integrity) {
|
|
416
|
+
// npm records an ssri string (`sha512-<base64>`). `processHashes` turns it
|
|
417
|
+
// into a CycloneDX `hashes[]` entry with the digest hex-encoded.
|
|
418
|
+
pkg._integrity = `${context.integrity}`;
|
|
419
|
+
} else if (context.sum) {
|
|
420
|
+
// A go.sum line is `h1:<base64>`, a SHA-256 dirhash over the module
|
|
421
|
+
// contents. cdxgen carries it in the same `sha256-<base64>` form the Go
|
|
422
|
+
// collectors use, so both paths produce identical hashes for one module.
|
|
423
|
+
pkg._integrity = `${context.sum}`.replace(/^h1:/, "sha256-");
|
|
424
|
+
}
|
|
425
|
+
return pkg;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Build a component record for a BCR (Bazel Central Registry) module.
|
|
430
|
+
*
|
|
431
|
+
* BCR modules are the registered `bazel` purl type's intended target: a flat
|
|
432
|
+
* module name, no namespace, and the BCR as the default repository.
|
|
433
|
+
*
|
|
434
|
+
* @param {string} displayRepoName Repository name used in the build (for SrcFile context)
|
|
435
|
+
* @param {string} moduleName Canonical module name
|
|
436
|
+
* @param {string} version Resolved version
|
|
437
|
+
* @param {string} srcFile Source file for evidence
|
|
438
|
+
* @returns {object} Package record
|
|
439
|
+
*/
|
|
440
|
+
function buildBcrPackage(displayRepoName, moduleName, version, srcFile) {
|
|
441
|
+
const purl = tryBuildPurl({
|
|
442
|
+
type: "bazel",
|
|
443
|
+
name: moduleName,
|
|
444
|
+
version,
|
|
445
|
+
qualifiers: { repository_url: BCR_DEFAULT_REPOSITORY_URL },
|
|
446
|
+
});
|
|
447
|
+
return {
|
|
448
|
+
name: moduleName,
|
|
449
|
+
version,
|
|
450
|
+
type: "library",
|
|
451
|
+
scope: "required",
|
|
452
|
+
purl,
|
|
453
|
+
"bom-ref": decodeURIComponent(purl),
|
|
454
|
+
properties: [
|
|
455
|
+
{ name: "internal:SrcFile", value: srcFile },
|
|
456
|
+
{ name: "cdx:bazel:module", value: moduleName },
|
|
457
|
+
{ name: "cdx:bazel:repository_url", value: BCR_DEFAULT_REPOSITORY_URL },
|
|
458
|
+
...(displayRepoName !== moduleName
|
|
459
|
+
? [{ name: "cdx:bazel:repo_name", value: displayRepoName }]
|
|
460
|
+
: []),
|
|
461
|
+
],
|
|
462
|
+
evidence: {
|
|
463
|
+
identity: {
|
|
464
|
+
field: "purl",
|
|
465
|
+
confidence: 1.0,
|
|
466
|
+
methods: [
|
|
467
|
+
{
|
|
468
|
+
technique: "manifest-analysis",
|
|
469
|
+
confidence: 1.0,
|
|
470
|
+
value: srcFile,
|
|
471
|
+
},
|
|
472
|
+
],
|
|
473
|
+
},
|
|
474
|
+
},
|
|
475
|
+
};
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Build a Maven package from a Starlark `maven.artifact(...)` call.
|
|
480
|
+
*
|
|
481
|
+
* rules_jvm_external accepts either a coordinate string
|
|
482
|
+
* (`"group:artifact:version"`) or separate `group`/`artifact`/`version`
|
|
483
|
+
* keyword arguments.
|
|
484
|
+
*
|
|
485
|
+
* @param {Map<string, string|string[]>} call Parsed call arguments
|
|
486
|
+
* @param {string} srcFile Source file for evidence
|
|
487
|
+
* @returns {object|null} Package record, or null when no coordinates parse
|
|
488
|
+
*/
|
|
489
|
+
function mavenPackageFromCall(call, srcFile) {
|
|
490
|
+
const parsed = parseMavenCoordinates(
|
|
491
|
+
scalarArg(call, "artifact") ||
|
|
492
|
+
scalarArg(call, "coord") ||
|
|
493
|
+
scalarArg(call, "coordinates") ||
|
|
494
|
+
scalarArg(call, ""),
|
|
495
|
+
call,
|
|
496
|
+
);
|
|
497
|
+
if (!parsed) return null;
|
|
498
|
+
return buildMavenPackage(parsed.group, parsed.name, parsed.version, srcFile);
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Parse Maven coordinates from a coordinate string or a set of attributes.
|
|
503
|
+
*
|
|
504
|
+
* @param {string|undefined} coordStr A `group:artifact:version` string
|
|
505
|
+
* @param {object|Map} attrs Attribute map with group/artifact/version keys
|
|
506
|
+
* @returns {{group: string, name: string, version: string}|null}
|
|
507
|
+
*/
|
|
508
|
+
function parseMavenCoordinates(coordStr, attrs) {
|
|
509
|
+
if (coordStr && typeof coordStr === "string") {
|
|
510
|
+
const parts = coordStr.split(":");
|
|
511
|
+
if (parts.length >= 3) {
|
|
512
|
+
return { group: parts[0], name: parts[1], version: parts[2] };
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
const group = scalarArg(attrs, "group");
|
|
516
|
+
const name = scalarArg(attrs, "artifact") || scalarArg(attrs, "name");
|
|
517
|
+
const version = scalarArg(attrs, "version");
|
|
518
|
+
if (group && name && version) {
|
|
519
|
+
return { group, name, version };
|
|
520
|
+
}
|
|
521
|
+
return null;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
/**
|
|
525
|
+
* Construct a Maven package record. Maven purls require a group (namespace).
|
|
526
|
+
*
|
|
527
|
+
* @param {string} group Group ID
|
|
528
|
+
* @param {string} name Artifact ID
|
|
529
|
+
* @param {string} version Version
|
|
530
|
+
* @param {string} srcFile Source file for evidence
|
|
531
|
+
* @returns {object} Package record
|
|
532
|
+
*/
|
|
533
|
+
function buildMavenPackage(group, name, version, srcFile) {
|
|
534
|
+
const purl = tryBuildPurl({
|
|
535
|
+
type: "maven",
|
|
536
|
+
namespace: group,
|
|
537
|
+
name,
|
|
538
|
+
version,
|
|
539
|
+
});
|
|
540
|
+
const pkg = {
|
|
541
|
+
name,
|
|
542
|
+
version,
|
|
543
|
+
type: "library",
|
|
544
|
+
scope: "required",
|
|
545
|
+
group,
|
|
546
|
+
properties: [
|
|
547
|
+
{ name: "internal:SrcFile", value: srcFile },
|
|
548
|
+
{ name: "cdx:bazel:ecosystem", value: "maven" },
|
|
549
|
+
],
|
|
550
|
+
};
|
|
551
|
+
if (purl) {
|
|
552
|
+
pkg.purl = purl;
|
|
553
|
+
pkg["bom-ref"] = decodeURIComponent(purl);
|
|
554
|
+
} else {
|
|
555
|
+
pkg["bom-ref"] = `library:${group}:${name}:${version}`;
|
|
556
|
+
}
|
|
557
|
+
return pkg;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Heuristic: does an `artifact(...)` call look like a Maven artifact
|
|
562
|
+
* declaration? Used to avoid treating unrelated `artifact` calls (e.g. test
|
|
563
|
+
* fixtures) as Maven coordinates. A Maven coordinate string has at least two
|
|
564
|
+
* colons; separate group/artifact/version args are a stronger signal.
|
|
565
|
+
*
|
|
566
|
+
* @param {Map<string, string|string[]>} call Parsed call arguments
|
|
567
|
+
* @returns {boolean}
|
|
568
|
+
*/
|
|
569
|
+
function looksLikeMavenArtifactCall(call) {
|
|
570
|
+
const coord =
|
|
571
|
+
scalarArg(call, "artifact") ||
|
|
572
|
+
scalarArg(call, "coord") ||
|
|
573
|
+
scalarArg(call, "coordinates");
|
|
574
|
+
if (coord && coord.split(":").length >= 3) {
|
|
575
|
+
return true;
|
|
576
|
+
}
|
|
577
|
+
return !!(
|
|
578
|
+
scalarArg(call, "group") &&
|
|
579
|
+
(scalarArg(call, "artifact") || scalarArg(call, "name")) &&
|
|
580
|
+
scalarArg(call, "version")
|
|
581
|
+
);
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
// ---------------------------------------------------------------------------
|
|
585
|
+
// Starlark call extraction
|
|
586
|
+
// ---------------------------------------------------------------------------
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Find every top-level call to `name(...)` in Starlark source and return the
|
|
590
|
+
* parsed keyword/string arguments of each. Scanning uses a balanced-paren
|
|
591
|
+
* counter rather than a regex, because MODULE.bazel calls can nest other calls
|
|
592
|
+
* inside their argument lists.
|
|
593
|
+
*
|
|
594
|
+
* @param {string} src Starlark source
|
|
595
|
+
* @param {string} name Function name to match (dotted names supported)
|
|
596
|
+
* @returns {Array<Map<string, string|string[]>>} one argument map per call
|
|
597
|
+
*/
|
|
598
|
+
export function findAllCalls(src, name) {
|
|
599
|
+
const calls = [];
|
|
600
|
+
let i = 0;
|
|
601
|
+
while (i < src.length) {
|
|
602
|
+
const hit = src.indexOf(name, i);
|
|
603
|
+
if (hit === -1) break;
|
|
604
|
+
// Ensure the match is a whole token, not a suffix of a longer identifier.
|
|
605
|
+
const before = hit > 0 ? src[hit - 1] : "";
|
|
606
|
+
if (/[A-Za-z0-9_.]/.test(before)) {
|
|
607
|
+
i = hit + 1;
|
|
608
|
+
continue;
|
|
609
|
+
}
|
|
610
|
+
let j = hit + name.length;
|
|
611
|
+
while (j < src.length && (src[j] === " " || src[j] === "\t")) j++;
|
|
612
|
+
if (src[j] !== "(") {
|
|
613
|
+
i = hit + 1;
|
|
614
|
+
continue;
|
|
615
|
+
}
|
|
616
|
+
const close = matchingParen(src, j);
|
|
617
|
+
if (close === -1) break;
|
|
618
|
+
const argSrc = src.substring(j + 1, close);
|
|
619
|
+
calls.push(parseCallArgs(argSrc));
|
|
620
|
+
i = close + 1;
|
|
621
|
+
}
|
|
622
|
+
return calls;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Find the first call to `name(...)` and return its arguments, or null.
|
|
627
|
+
*
|
|
628
|
+
* @param {string} src Starlark source
|
|
629
|
+
* @param {string} name Function name
|
|
630
|
+
* @returns {Map<string, string|string[]>|null}
|
|
631
|
+
*/
|
|
632
|
+
function findFirstCall(src, name) {
|
|
633
|
+
return findAllCalls(src, name)[0] || null;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
/**
|
|
637
|
+
* Return the index of the closing paren that matches the opening paren at
|
|
638
|
+
* `open`, skipping string literals. Returns -1 if unbalanced.
|
|
639
|
+
*
|
|
640
|
+
* @param {string} src Source
|
|
641
|
+
* @param {number} open Index of the opening `(`
|
|
642
|
+
* @returns {number} index of the matching `)`, or -1
|
|
643
|
+
*/
|
|
644
|
+
function matchingParen(src, open) {
|
|
645
|
+
let depth = 0;
|
|
646
|
+
let i = open;
|
|
647
|
+
while (i < src.length) {
|
|
648
|
+
const c = src[i];
|
|
649
|
+
if (c === '"' || c === "'") {
|
|
650
|
+
i = skipString(src, i);
|
|
651
|
+
continue;
|
|
652
|
+
}
|
|
653
|
+
if (c === "#") {
|
|
654
|
+
// Line comment; skip to end of line.
|
|
655
|
+
i = src.indexOf("\n", i);
|
|
656
|
+
if (i === -1) return -1;
|
|
657
|
+
i++;
|
|
658
|
+
continue;
|
|
659
|
+
}
|
|
660
|
+
if (c === "(") depth++;
|
|
661
|
+
else if (c === ")") {
|
|
662
|
+
depth--;
|
|
663
|
+
if (depth === 0) return i;
|
|
664
|
+
}
|
|
665
|
+
i++;
|
|
666
|
+
}
|
|
667
|
+
return -1;
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
/**
|
|
671
|
+
* Advance past a string literal starting at `start` (the opening quote),
|
|
672
|
+
* respecting backslash escapes. Returns the index after the closing quote.
|
|
673
|
+
*
|
|
674
|
+
* @param {string} src Source
|
|
675
|
+
* @param {number} start Index of the opening quote
|
|
676
|
+
* @returns {number} index after the closing quote
|
|
677
|
+
*/
|
|
678
|
+
function skipString(src, start) {
|
|
679
|
+
const quote = src[start];
|
|
680
|
+
let i = start + 1;
|
|
681
|
+
while (i < src.length) {
|
|
682
|
+
if (src[i] === "\\") {
|
|
683
|
+
i += 2;
|
|
684
|
+
continue;
|
|
685
|
+
}
|
|
686
|
+
if (src[i] === quote) {
|
|
687
|
+
return i + 1;
|
|
688
|
+
}
|
|
689
|
+
i++;
|
|
690
|
+
}
|
|
691
|
+
return i;
|
|
692
|
+
}
|
|
693
|
+
|
|
694
|
+
/**
|
|
695
|
+
* Parse the argument list of a Starlark call into a map of keyword arguments.
|
|
696
|
+
*
|
|
697
|
+
* Handles `key = "value"`, `key = [list, of, values]`, bare positional string
|
|
698
|
+
* arguments (collected under the special `""` key), and nested calls (the
|
|
699
|
+
* value is captured as the raw source span). Only the constructs that appear
|
|
700
|
+
* in MODULE.bazel are supported.
|
|
701
|
+
*
|
|
702
|
+
* @param {string} argSrc Source inside the call's parentheses
|
|
703
|
+
* @returns {Map<string, string|string[]>} parsed arguments
|
|
704
|
+
*/
|
|
705
|
+
function parseCallArgs(argSrc) {
|
|
706
|
+
const args = new Map();
|
|
707
|
+
let i = 0;
|
|
708
|
+
while (i < argSrc.length) {
|
|
709
|
+
i = skipSpaceAndComments(argSrc, i);
|
|
710
|
+
if (i >= argSrc.length || argSrc[i] === ",") {
|
|
711
|
+
i++;
|
|
712
|
+
continue;
|
|
713
|
+
}
|
|
714
|
+
// Read a key (identifier) when followed by '='.
|
|
715
|
+
let key = "";
|
|
716
|
+
while (i < argSrc.length && /[A-Za-z0-9_.]/.test(argSrc[i])) {
|
|
717
|
+
key += argSrc[i];
|
|
718
|
+
i++;
|
|
719
|
+
}
|
|
720
|
+
const afterKey = skipSpaceAndComments(argSrc, i);
|
|
721
|
+
if (key && argSrc[afterKey] === "=") {
|
|
722
|
+
i = skipSpaceAndComments(argSrc, afterKey + 1);
|
|
723
|
+
const { value, end } = readValue(argSrc, i);
|
|
724
|
+
args.set(key, value);
|
|
725
|
+
i = end;
|
|
726
|
+
} else {
|
|
727
|
+
// Positional argument; capture as a bare value under "".
|
|
728
|
+
const { value, end } = readValue(argSrc, key ? i - key.length : i);
|
|
729
|
+
const existing = args.get("");
|
|
730
|
+
const next = value;
|
|
731
|
+
args.set(
|
|
732
|
+
"",
|
|
733
|
+
Array.isArray(existing)
|
|
734
|
+
? [...existing, next]
|
|
735
|
+
: existing !== undefined
|
|
736
|
+
? [existing, next]
|
|
737
|
+
: next,
|
|
738
|
+
);
|
|
739
|
+
i = end;
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
return args;
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Read a single Starlark value (string, list, or nested call span) starting at
|
|
747
|
+
* `start`, returning the decoded value and the index past it.
|
|
748
|
+
*
|
|
749
|
+
* @param {string} src Source
|
|
750
|
+
* @param {number} start Start index
|
|
751
|
+
* @returns {{value: string|string[], end: number}}
|
|
752
|
+
*/
|
|
753
|
+
function readValue(src, start) {
|
|
754
|
+
const i = skipSpaceAndComments(src, start);
|
|
755
|
+
const c = src[i];
|
|
756
|
+
if (c === '"' || c === "'") {
|
|
757
|
+
const end = skipString(src, i);
|
|
758
|
+
return { value: unquote(src.substring(i, end)), end };
|
|
759
|
+
}
|
|
760
|
+
if (c === "[") {
|
|
761
|
+
return readList(src, i);
|
|
762
|
+
}
|
|
763
|
+
// A nested call or bare token: read until a top-level comma or closing paren.
|
|
764
|
+
let depth = 0;
|
|
765
|
+
let j = i;
|
|
766
|
+
while (j < src.length) {
|
|
767
|
+
const ch = src[j];
|
|
768
|
+
if (ch === '"' || ch === "'") {
|
|
769
|
+
j = skipString(src, j);
|
|
770
|
+
continue;
|
|
771
|
+
}
|
|
772
|
+
if (ch === "[" || ch === "(") {
|
|
773
|
+
depth++;
|
|
774
|
+
} else if (ch === "]" || ch === ")") {
|
|
775
|
+
if (depth === 0) break;
|
|
776
|
+
depth--;
|
|
777
|
+
} else if (ch === "," && depth === 0) {
|
|
778
|
+
break;
|
|
779
|
+
}
|
|
780
|
+
j++;
|
|
781
|
+
}
|
|
782
|
+
return { value: src.substring(i, j).trim(), end: j };
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
/**
|
|
786
|
+
* Read a Starlark list literal, returning its string elements.
|
|
787
|
+
*
|
|
788
|
+
* @param {string} src Source
|
|
789
|
+
* @param {number} start Index of the opening `[`
|
|
790
|
+
* @returns {{value: string[], end: number}}
|
|
791
|
+
*/
|
|
792
|
+
function readList(src, start) {
|
|
793
|
+
const items = [];
|
|
794
|
+
let i = start + 1;
|
|
795
|
+
while (i < src.length && src[i] !== "]") {
|
|
796
|
+
i = skipSpaceAndComments(src, i);
|
|
797
|
+
if (src[i] === ",") {
|
|
798
|
+
i++;
|
|
799
|
+
continue;
|
|
800
|
+
}
|
|
801
|
+
if (src[i] === "]") break;
|
|
802
|
+
const { value, end } = readValue(src, i);
|
|
803
|
+
if (typeof value === "string" && value) {
|
|
804
|
+
items.push(value);
|
|
805
|
+
} else if (Array.isArray(value)) {
|
|
806
|
+
items.push(...value);
|
|
807
|
+
}
|
|
808
|
+
i = end;
|
|
809
|
+
}
|
|
810
|
+
return { value: items, end: i < src.length ? i + 1 : i };
|
|
811
|
+
}
|
|
812
|
+
|
|
813
|
+
/**
|
|
814
|
+
* Skip whitespace and Starlark line comments, returning the next significant
|
|
815
|
+
* index.
|
|
816
|
+
*
|
|
817
|
+
* @param {string} src Source
|
|
818
|
+
* @param {number} i Current index
|
|
819
|
+
* @returns {number} next significant index
|
|
820
|
+
*/
|
|
821
|
+
function skipSpaceAndComments(src, i) {
|
|
822
|
+
while (i < src.length) {
|
|
823
|
+
const c = src[i];
|
|
824
|
+
if (c === " " || c === "\t" || c === "\r" || c === "\n") {
|
|
825
|
+
i++;
|
|
826
|
+
} else if (c === "#") {
|
|
827
|
+
const nl = src.indexOf("\n", i);
|
|
828
|
+
i = nl === -1 ? src.length : nl + 1;
|
|
829
|
+
} else if (c === "\\" && src[i + 1] === "\n") {
|
|
830
|
+
// Line continuation.
|
|
831
|
+
i += 2;
|
|
832
|
+
} else {
|
|
833
|
+
return i;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
return i;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
/**
|
|
840
|
+
* Remove surrounding quotes and resolve backslash escapes from a string token.
|
|
841
|
+
*
|
|
842
|
+
* @param {string} token A quoted string token including the quotes
|
|
843
|
+
* @returns {string} the decoded string value
|
|
844
|
+
*/
|
|
845
|
+
function unquote(token) {
|
|
846
|
+
if (!token) return "";
|
|
847
|
+
const quote = token[0];
|
|
848
|
+
if (quote !== '"' && quote !== "'") return token;
|
|
849
|
+
const inner = token.slice(1, -1);
|
|
850
|
+
return inner.replace(/\\(.)/g, (_m, ch) =>
|
|
851
|
+
ch === "n" ? "\n" : ch === "t" ? "\t" : ch,
|
|
852
|
+
);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
/**
|
|
856
|
+
* Extract a scalar string value for a key from a parsed call argument map,
|
|
857
|
+
* accepting either a plain object or a Map (so the same helper works for
|
|
858
|
+
* Starlark call args and lock attribute objects).
|
|
859
|
+
*
|
|
860
|
+
* @param {Map|object} call Parsed arguments
|
|
861
|
+
* @param {string} key Argument name
|
|
862
|
+
* @returns {string|undefined}
|
|
863
|
+
*/
|
|
864
|
+
function scalarArg(call, key) {
|
|
865
|
+
if (!call) return undefined;
|
|
866
|
+
let v;
|
|
867
|
+
if (typeof call.get === "function") {
|
|
868
|
+
v = call.get(key);
|
|
869
|
+
} else {
|
|
870
|
+
v = call[key];
|
|
871
|
+
}
|
|
872
|
+
if (v == null) return undefined;
|
|
873
|
+
if (Array.isArray(v)) return `${v[0]}`;
|
|
874
|
+
return `${v}`;
|
|
875
|
+
}
|