@cdxgen/cdxgen 0.0.1 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1833 -0
- package/lib/cli/cliOptions.js +513 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +142 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +876 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +575 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1789 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +277 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +315 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +28 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +120 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +19 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +76 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,749 @@
|
|
|
1
|
+
import { URL } from "node:url";
|
|
2
|
+
|
|
3
|
+
import { build, Purl, TypedPurls } from "@cdxgen/cdx-purl";
|
|
4
|
+
|
|
5
|
+
import { DEBUG_MODE } from "../core/activity.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The set of purl types that carry validation rules in cdx-purl.
|
|
9
|
+
*
|
|
10
|
+
* cdx-purl's `build()` is permissive: it accepts *any* type string (even an
|
|
11
|
+
* unregistered one like `pkg:nix/...`) without throwing, because the "type"
|
|
12
|
+
* segment of a Package URL is not restricted by the spec. What distinguishes a
|
|
13
|
+
* *registered* type is that cdx-purl ships a rule table for it
|
|
14
|
+
* (`TYPE_RULES_SOURCE`, exposed as `TypedPurls`) — namespace requirements,
|
|
15
|
+
* permitted qualifiers, and so on. A purl built with an unregistered type
|
|
16
|
+
* round-trips but gets no type-specific normalization, and more importantly it
|
|
17
|
+
* identifies a package in a namespace no vulnerability database or advisory
|
|
18
|
+
* feed recognises.
|
|
19
|
+
*
|
|
20
|
+
* Ecosystems cdxgen supports that have no registered type (nix, zig, mojo, and
|
|
21
|
+
* gleam when it is not published via hex) must therefore emit `pkg:generic/...`
|
|
22
|
+
* with a `cdx:purl:proposedType` property instead of squatting a type. This set
|
|
23
|
+
* is the single source of truth for that decision, sourced directly from
|
|
24
|
+
* cdx-purl so it updates automatically when a type is registered upstream.
|
|
25
|
+
*/
|
|
26
|
+
export const REGISTERED_PURL_TYPES = new Set(Object.keys(TypedPurls));
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Report whether a purl type is registered in cdx-purl's rule table.
|
|
30
|
+
*
|
|
31
|
+
* @param {string} type Purl type (the segment after `pkg:`)
|
|
32
|
+
* @returns {boolean} `true` when the type carries validation rules upstream
|
|
33
|
+
*/
|
|
34
|
+
export function purlTypeIsRegistered(type) {
|
|
35
|
+
return REGISTERED_PURL_TYPES.has(type);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Report whether a purl string uses a type that cdx-purl has registered rules
|
|
40
|
+
* for. Purls that fail to parse are treated as unregistered rather than
|
|
41
|
+
* throwing, because the caller is vetting untrusted output.
|
|
42
|
+
*
|
|
43
|
+
* @param {string} purlString Purl string to vet
|
|
44
|
+
* @returns {boolean} `true` when the purl's type is registered upstream
|
|
45
|
+
*/
|
|
46
|
+
export function purlTypeIsRegisteredString(purlString) {
|
|
47
|
+
try {
|
|
48
|
+
const parsed = Purl.parse(purlString);
|
|
49
|
+
return purlTypeIsRegistered(parsed.type);
|
|
50
|
+
} catch {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Encode a string for safe inclusion in a PackageURL, percent-encoding special characters
|
|
57
|
+
* while preserving already-encoded `%40` sequences and keeping `:` and `/` unencoded.
|
|
58
|
+
*
|
|
59
|
+
* @param {string} s String to encode
|
|
60
|
+
* @returns {string} Encoded string suitable for use in a PackageURL component
|
|
61
|
+
*/
|
|
62
|
+
export function encodeForPurl(s) {
|
|
63
|
+
return s && !s.includes("%40")
|
|
64
|
+
? encodeURIComponent(s).replace(/%3A/g, ":").replace(/%2F/g, "/")
|
|
65
|
+
: s;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Build a purl string, returning `null` instead of throwing when the parts do
|
|
70
|
+
* not form a valid purl.
|
|
71
|
+
*
|
|
72
|
+
* cdx-purl is strict: it rejects a maven purl without a groupId, a swift or
|
|
73
|
+
* golang purl without a namespace, a vscode-extension without a publisher, and
|
|
74
|
+
* so on. Those rejections are correct and must not be papered over — but they
|
|
75
|
+
* also must not crash a scan of an otherwise fine project. This helper is the
|
|
76
|
+
* one sanctioned place to turn a `PurlError` into an absent purl.
|
|
77
|
+
*
|
|
78
|
+
* Only `PurlError` is swallowed. Anything else (a `TypeError` from a bad call,
|
|
79
|
+
* for instance) is a defect in the caller and is rethrown.
|
|
80
|
+
*
|
|
81
|
+
* @param {object} parts Purl parts accepted by cdx-purl's `build()`
|
|
82
|
+
* @returns {string|null} Canonical purl string, or `null` if it is not valid
|
|
83
|
+
*/
|
|
84
|
+
export function tryBuildPurl(parts) {
|
|
85
|
+
try {
|
|
86
|
+
return build(parts);
|
|
87
|
+
} catch (err) {
|
|
88
|
+
if (err?.code?.startsWith("E_")) {
|
|
89
|
+
if (DEBUG_MODE) {
|
|
90
|
+
console.log(`Unable to construct a purl from ${JSON.stringify(parts)}`);
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
throw err;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Build a canonical npm purl from a package name and version.
|
|
100
|
+
*
|
|
101
|
+
* Prefer this over hand-assembling `pkg:npm/...` strings. Manual assembly has
|
|
102
|
+
* to re-implement percent-encoding and gets it wrong in ways cdx-purl then
|
|
103
|
+
* rejects: an unencoded `+` in a semver build-metadata version
|
|
104
|
+
* (`1.0.0+build.1`) throws `E_INVALID_CHARACTER`, and the scope separator has
|
|
105
|
+
* to survive encoding. `build()` handles both, so callers pass raw values.
|
|
106
|
+
*
|
|
107
|
+
* @param {string} pkgName Package name, optionally scoped (`@scope/name`)
|
|
108
|
+
* @param {string} [version] Package version, raw and unencoded
|
|
109
|
+
* @returns {string} Canonical npm purl string
|
|
110
|
+
*/
|
|
111
|
+
export function npmPurl(pkgName, version) {
|
|
112
|
+
let namespace = null;
|
|
113
|
+
let name = pkgName;
|
|
114
|
+
if (pkgName?.startsWith("@")) {
|
|
115
|
+
const slash = pkgName.indexOf("/");
|
|
116
|
+
if (slash > -1) {
|
|
117
|
+
namespace = pkgName.slice(0, slash);
|
|
118
|
+
name = pkgName.slice(slash + 1);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return build({
|
|
122
|
+
type: "npm",
|
|
123
|
+
namespace,
|
|
124
|
+
name,
|
|
125
|
+
version: version || null,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Detect whether a version string is a concrete version or an MSBuild
|
|
131
|
+
* expression / NuGet range that names no single version.
|
|
132
|
+
*
|
|
133
|
+
* NuGet project files express versions in a small language of their own:
|
|
134
|
+
* `$(TargetFSharpCoreVersion)` is an MSBuild property that only a build
|
|
135
|
+
* evaluates, `1.0-*` is a floating range, and `[1.0,2.0)` is an interval.
|
|
136
|
+
* None of them is a version, so none can be encoded into a purl — the result
|
|
137
|
+
* would parse but identify no package.
|
|
138
|
+
*
|
|
139
|
+
* Callers resolve such a version from a manifest that pins one (paket.lock,
|
|
140
|
+
* packages.lock.json, project.assets.json, Directory.Packages.props). This
|
|
141
|
+
* function is the last-resort guard for when no manifest pins it: the purl is
|
|
142
|
+
* then emitted without a version rather than with a meaningless one.
|
|
143
|
+
*
|
|
144
|
+
* It encodes NuGet's syntax specifically, so it belongs to the NuGet helpers
|
|
145
|
+
* and not to purl construction in general — an ecosystem that allows brackets
|
|
146
|
+
* or commas in a legitimate version must not have it applied.
|
|
147
|
+
*
|
|
148
|
+
* @param {string} version Candidate version
|
|
149
|
+
* @returns {string|null} The version when concrete, or null to omit it
|
|
150
|
+
*/
|
|
151
|
+
export function concreteVersion(version) {
|
|
152
|
+
if (!version || typeof version !== "string") {
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
const v = version.trim();
|
|
156
|
+
if (!v) {
|
|
157
|
+
return null;
|
|
158
|
+
}
|
|
159
|
+
// MSBuild property reference: $(VariableName)
|
|
160
|
+
if (v.includes("$(")) {
|
|
161
|
+
return null;
|
|
162
|
+
}
|
|
163
|
+
// Floating version range or wildcard: 1.0-*, *, 1.*
|
|
164
|
+
if (/[*]/.test(v)) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
// Bracketed range: [1.0,2.0), (1.0,)
|
|
168
|
+
if (/[[\](),]/.test(v)) {
|
|
169
|
+
return null;
|
|
170
|
+
}
|
|
171
|
+
return v;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Build a canonical NuGet purl from a package name and version.
|
|
176
|
+
*
|
|
177
|
+
* The version is expected to have been resolved from a manifest that pins one.
|
|
178
|
+
* An MSBuild expression or NuGet range that reaches here unresolved is dropped
|
|
179
|
+
* by {@link concreteVersion}, leaving a versionless purl that identifies the
|
|
180
|
+
* package rather than a version-shaped purl that identifies nothing.
|
|
181
|
+
*
|
|
182
|
+
* @param {string} name Package name
|
|
183
|
+
* @param {string} [version] Package version (may be non-concrete)
|
|
184
|
+
* @returns {string|null} Canonical purl, or null when the name is empty
|
|
185
|
+
*/
|
|
186
|
+
export function nugetPurl(name, version) {
|
|
187
|
+
return tryBuildPurl({
|
|
188
|
+
type: "nuget",
|
|
189
|
+
name,
|
|
190
|
+
version: concreteVersion(version),
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
/**
|
|
195
|
+
* Build a canonical PyPI purl from a package name and version.
|
|
196
|
+
*
|
|
197
|
+
* PyPI normalises underscores to hyphens in the name component.
|
|
198
|
+
*
|
|
199
|
+
* @param {string} name Package name (underscores will be normalised)
|
|
200
|
+
* @param {string} [version] Package version
|
|
201
|
+
* @returns {string|null} Canonical purl, or null when invalid
|
|
202
|
+
*/
|
|
203
|
+
export function pypiPurl(name, version) {
|
|
204
|
+
return tryBuildPurl({
|
|
205
|
+
type: "pypi",
|
|
206
|
+
name: (name || "").replaceAll("_", "-"),
|
|
207
|
+
version,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Identifier a dependency graph uses to reference a PyPI component.
|
|
213
|
+
*
|
|
214
|
+
* PyPI names are case-insensitive and treat `_` and `-` as equivalent, so
|
|
215
|
+
* cdx-purl folds both when it builds the purl. A reference assembled by hand
|
|
216
|
+
* from the raw name does not, and then names out of the same distribution
|
|
217
|
+
* disagree: a `zope_interface` requirement points at nothing while the
|
|
218
|
+
* component is `pkg:pypi/zope-interface`. Deriving the reference from the purl
|
|
219
|
+
* keeps the graph attached to the components.
|
|
220
|
+
*
|
|
221
|
+
* @param {string} name Package name
|
|
222
|
+
* @param {string} [version] Package version
|
|
223
|
+
* @returns {string} bom-ref for the component
|
|
224
|
+
*/
|
|
225
|
+
export function pypiBomRef(name, version) {
|
|
226
|
+
const purl = pypiPurl(name, version);
|
|
227
|
+
if (purl) {
|
|
228
|
+
return decodeURIComponent(purl);
|
|
229
|
+
}
|
|
230
|
+
return `library:${name}:${version || ""}`;
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Build a canonical Maven purl from group, name, and version.
|
|
235
|
+
*
|
|
236
|
+
* @param {string} group Group ID (required for Maven)
|
|
237
|
+
* @param {string} name Artifact ID
|
|
238
|
+
* @param {string} [version] Version
|
|
239
|
+
* @param {object} [qualifiers] Optional qualifiers (e.g. `{type: "jar"}`)
|
|
240
|
+
* @returns {string|null} Canonical purl, or null when invalid
|
|
241
|
+
*/
|
|
242
|
+
export function mavenPurl(group, name, version, qualifiers) {
|
|
243
|
+
return tryBuildPurl({
|
|
244
|
+
type: "maven",
|
|
245
|
+
namespace: group,
|
|
246
|
+
name,
|
|
247
|
+
version,
|
|
248
|
+
qualifiers: qualifiers || undefined,
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Build a purl for a Nix flake input using the registered `generic` type.
|
|
254
|
+
*
|
|
255
|
+
* `nix` is not a registered purl type in cdx-purl, so emitting `pkg:nix/...`
|
|
256
|
+
* would squat a namespace no vulnerability database recognises. Nix inputs are
|
|
257
|
+
* therefore identified as generic packages, disambiguated by a `vcs_url`
|
|
258
|
+
* qualifier built from the flake lock, and tagged with a
|
|
259
|
+
* `cdx:purl:proposedType=nix` property on the component so the intended type is
|
|
260
|
+
* recoverable. If `nix` is ever registered upstream, callers can switch over
|
|
261
|
+
* without touching the property scheme.
|
|
262
|
+
*
|
|
263
|
+
* Callers pass the already-encoded qualifier values they derived from the lock
|
|
264
|
+
* node; this helper only owns purl construction.
|
|
265
|
+
*
|
|
266
|
+
* @param {string} name Package name
|
|
267
|
+
* @param {string} [version] Package version (typically the short revision)
|
|
268
|
+
* @param {object} [qualifiers] Optional qualifiers such as `{ vcs_url }`
|
|
269
|
+
* @returns {string|null} Canonical purl, or null when invalid
|
|
270
|
+
*/
|
|
271
|
+
export function nixGenericPurl(name, version, qualifiers) {
|
|
272
|
+
return tryBuildPurl({
|
|
273
|
+
type: "generic",
|
|
274
|
+
name,
|
|
275
|
+
version,
|
|
276
|
+
qualifiers: qualifiers || undefined,
|
|
277
|
+
});
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* Identifier for a Nix flake project, whose version is not pinned by the flake
|
|
282
|
+
* itself.
|
|
283
|
+
*
|
|
284
|
+
* A flake project is named after its directory. The bom-ref deliberately uses
|
|
285
|
+
* the `application:name:version` shape (matching `fallbackBomRef`) rather than a
|
|
286
|
+
* `pkg:` string, because `nix` is not a registered purl type and a bom-ref that
|
|
287
|
+
* looks like a purl but is not valid would mislead downstream tooling.
|
|
288
|
+
*
|
|
289
|
+
* @param {string} name Project name
|
|
290
|
+
* @returns {string} bom-ref for the component
|
|
291
|
+
*/
|
|
292
|
+
export function nixBomRef(name) {
|
|
293
|
+
return `application:${name}:latest`;
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/**
|
|
297
|
+
* Build a canonical generic purl from a name.
|
|
298
|
+
*
|
|
299
|
+
* @param {string} name Package name
|
|
300
|
+
* @returns {string|null} Canonical purl, or null when invalid
|
|
301
|
+
*/
|
|
302
|
+
export function genericPurl(name) {
|
|
303
|
+
return tryBuildPurl({
|
|
304
|
+
type: "generic",
|
|
305
|
+
name,
|
|
306
|
+
});
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Report whether a string is a valid purl according to cdx-purl.
|
|
311
|
+
*
|
|
312
|
+
* Use this before writing anything into a CycloneDX `purl` field that did not
|
|
313
|
+
* come from `build()` — notably when recovering a purl from a `bom-ref`, which
|
|
314
|
+
* is an opaque identifier and frequently is not a purl at all.
|
|
315
|
+
*
|
|
316
|
+
* @param {string} candidate String to test
|
|
317
|
+
* @returns {boolean} true when cdx-purl parses it
|
|
318
|
+
*/
|
|
319
|
+
export function isValidPurl(candidate) {
|
|
320
|
+
if (!candidate || typeof candidate !== "string") {
|
|
321
|
+
return false;
|
|
322
|
+
}
|
|
323
|
+
try {
|
|
324
|
+
Purl.parse(candidate);
|
|
325
|
+
return true;
|
|
326
|
+
} catch {
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
/**
|
|
332
|
+
* Parse a purl string, returning `null` instead of throwing when it is invalid.
|
|
333
|
+
*
|
|
334
|
+
* The parse-side counterpart of {@link tryBuildPurl}, for callers that have
|
|
335
|
+
* already assembled a purl string. Only `PurlError` is swallowed.
|
|
336
|
+
*
|
|
337
|
+
* @param {string} purlString Candidate purl
|
|
338
|
+
* @returns {string|null} Canonical purl string, or `null` if it is not valid
|
|
339
|
+
*/
|
|
340
|
+
export function tryParsePurl(purlString) {
|
|
341
|
+
try {
|
|
342
|
+
return Purl.parse(purlString).toString();
|
|
343
|
+
} catch (err) {
|
|
344
|
+
if (err?.code?.startsWith("E_")) {
|
|
345
|
+
return null;
|
|
346
|
+
}
|
|
347
|
+
throw err;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
/**
|
|
352
|
+
* Build a `bom-ref` for a component that has no valid purl.
|
|
353
|
+
*
|
|
354
|
+
* `bom-ref` must be **unique within the document** — CycloneDX uses it as the
|
|
355
|
+
* key for the dependency graph, so two components sharing one silently merge
|
|
356
|
+
* their edges. The bare component name is therefore not usable: the syft go
|
|
357
|
+
* module graph contains eight versions of `go.opencensus.io`, none of which can
|
|
358
|
+
* carry a golang purl (cdx-purl requires a namespace), and naming them all
|
|
359
|
+
* `go.opencensus.io` collapsed eight distinct modules into one ref.
|
|
360
|
+
*
|
|
361
|
+
* The `type:group/name:version` shape matches the convention already used for
|
|
362
|
+
* root components (`application:swift-smoke:latest`) and for the dedupe key in
|
|
363
|
+
* `lib/stages/postgen/ruleEngine.js`.
|
|
364
|
+
*
|
|
365
|
+
* @param {object} component Component with `type`, `group`, `name`, `version`
|
|
366
|
+
* @returns {string} A document-unique, deterministic bom-ref
|
|
367
|
+
*/
|
|
368
|
+
export function fallbackBomRef(component) {
|
|
369
|
+
const type = component?.type || "library";
|
|
370
|
+
const group = component?.group ? `${component.group}/` : "";
|
|
371
|
+
const name = component?.name || "unnamed";
|
|
372
|
+
const version = component?.version || "";
|
|
373
|
+
return `${type}:${group}${name}:${version}`;
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Attach a purl and `bom-ref` to a component, never emitting an invalid purl.
|
|
378
|
+
*
|
|
379
|
+
* CycloneDX requires `component.purl` to be a valid Package URL when present,
|
|
380
|
+
* so a component we cannot build a purl for must omit the field entirely — it
|
|
381
|
+
* must *not* fall back to the bare name, which is what produced
|
|
382
|
+
* `"purl": "swift-smoke"` in the swift golden.
|
|
383
|
+
*
|
|
384
|
+
* `bom-ref` has no syntax constraint but does have a uniqueness constraint, so
|
|
385
|
+
* the fallback goes through {@link fallbackBomRef} rather than using the name.
|
|
386
|
+
*
|
|
387
|
+
* Any pre-existing `purl` is deleted when the new one is invalid, so a
|
|
388
|
+
* component cannot retain a stale purl from an earlier enrichment pass.
|
|
389
|
+
*
|
|
390
|
+
* @param {object} component Component to mutate
|
|
391
|
+
* @param {string|null} purlString Canonical purl string, or `null`/`undefined`
|
|
392
|
+
* @param {string} [fallbackRef] Explicit `bom-ref` override for when there is no purl
|
|
393
|
+
* @returns {object} The same component, for chaining
|
|
394
|
+
*/
|
|
395
|
+
export function applyPurl(component, purlString, fallbackRef) {
|
|
396
|
+
if (purlString) {
|
|
397
|
+
component.purl = purlString;
|
|
398
|
+
component["bom-ref"] = decodeURIComponent(purlString);
|
|
399
|
+
} else {
|
|
400
|
+
delete component.purl;
|
|
401
|
+
component["bom-ref"] = fallbackRef ?? fallbackBomRef(component);
|
|
402
|
+
}
|
|
403
|
+
return component;
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Sanitize a purl that cdxgen did not author.
|
|
408
|
+
*
|
|
409
|
+
* cdxgen ingests components from places it does not control — caxa binary
|
|
410
|
+
* metadata, existing SBOMs supplied as input, converter output. Those purls can
|
|
411
|
+
* be invalid (`@cdxgen/caxa` emitted `pkg:generic/...?arch=…&platform=…`, and
|
|
412
|
+
* `arch`/`platform` are not qualifiers the `generic` type allows), and cdxgen
|
|
413
|
+
* must neither emit an invalid purl it merely read nor hard-fail on third-party
|
|
414
|
+
* data.
|
|
415
|
+
*
|
|
416
|
+
* Order of preference:
|
|
417
|
+
* 1. Keep the purl when it is already valid.
|
|
418
|
+
* 2. Rebuild a canonical purl from the component's own type/group/name/version.
|
|
419
|
+
* 3. Drop the purl and assign a unique fallback `bom-ref`.
|
|
420
|
+
*
|
|
421
|
+
* The original string is preserved in a property whenever it is discarded, so the
|
|
422
|
+
* provenance of the change is visible in the output rather than silent.
|
|
423
|
+
*
|
|
424
|
+
* @param {object} component Component to sanitize in place
|
|
425
|
+
* @param {string} [purlType] purl type to use when rebuilding (default `generic`)
|
|
426
|
+
* @returns {object} The same component, for chaining
|
|
427
|
+
*/
|
|
428
|
+
export function sanitizeIngestedPurl(component, purlType) {
|
|
429
|
+
if (!component || typeof component !== "object") {
|
|
430
|
+
return component;
|
|
431
|
+
}
|
|
432
|
+
const original = component.purl;
|
|
433
|
+
if (!original || typeof original !== "string") {
|
|
434
|
+
return component;
|
|
435
|
+
}
|
|
436
|
+
if (isValidPurl(original)) {
|
|
437
|
+
return component;
|
|
438
|
+
}
|
|
439
|
+
let rebuilt = null;
|
|
440
|
+
try {
|
|
441
|
+
const parsedType = original.startsWith("pkg:")
|
|
442
|
+
? original.slice(4).split("/")[0].split("@")[0]
|
|
443
|
+
: null;
|
|
444
|
+
rebuilt = tryBuildPurl({
|
|
445
|
+
type: purlType || parsedType || "generic",
|
|
446
|
+
namespace: component.group || null,
|
|
447
|
+
name: component.name,
|
|
448
|
+
version: component.version || null,
|
|
449
|
+
});
|
|
450
|
+
} catch {
|
|
451
|
+
rebuilt = null;
|
|
452
|
+
}
|
|
453
|
+
component.properties = component.properties || [];
|
|
454
|
+
component.properties.push({
|
|
455
|
+
name: "cdx:purl:sanitized_from",
|
|
456
|
+
value: original,
|
|
457
|
+
});
|
|
458
|
+
return applyPurl(component, rebuilt);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Build an `oci` purl from a Docker/OCI repository digest.
|
|
463
|
+
*
|
|
464
|
+
* The `oci` type **prohibits** a namespace, so the registry-qualified repository
|
|
465
|
+
* cannot go in the purl path: `pkg:oci/docker.io/library/alpine@sha256:…` is
|
|
466
|
+
* invalid. Per the purl spec the name is the repository's last segment, the
|
|
467
|
+
* version is the digest, and the full repository travels in `repository_url`.
|
|
468
|
+
*
|
|
469
|
+
* @param {string} repoDigest e.g. `docker.io/library/alpine@sha256:abc…`
|
|
470
|
+
* @param {string} [tag] Optional image tag, emitted as the `tag` qualifier
|
|
471
|
+
* @returns {string|null} Canonical purl, or `null` when one cannot be built
|
|
472
|
+
*/
|
|
473
|
+
export function ociPurl(repoDigest, tag) {
|
|
474
|
+
if (!repoDigest || typeof repoDigest !== "string") {
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
const atIndex = repoDigest.lastIndexOf("@");
|
|
478
|
+
const repository = atIndex > -1 ? repoDigest.slice(0, atIndex) : repoDigest;
|
|
479
|
+
const digest = atIndex > -1 ? repoDigest.slice(atIndex + 1) : null;
|
|
480
|
+
const segments = repository.split("/").filter(Boolean);
|
|
481
|
+
const name = segments[segments.length - 1];
|
|
482
|
+
if (!name) {
|
|
483
|
+
return null;
|
|
484
|
+
}
|
|
485
|
+
const qualifiers = {};
|
|
486
|
+
// Only worth recording when it carries more than the bare name.
|
|
487
|
+
if (segments.length > 1) {
|
|
488
|
+
qualifiers.repository_url = repository;
|
|
489
|
+
}
|
|
490
|
+
if (tag) {
|
|
491
|
+
qualifiers.tag = tag;
|
|
492
|
+
}
|
|
493
|
+
return tryBuildPurl({
|
|
494
|
+
type: "oci",
|
|
495
|
+
name: name.toLowerCase(),
|
|
496
|
+
version: digest,
|
|
497
|
+
qualifiers: Object.keys(qualifiers).length ? qualifiers : null,
|
|
498
|
+
});
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Create a PackageURL object from a repository URL string, package type, and version.
|
|
503
|
+
*
|
|
504
|
+
* Supports HTTPS URLs, SSH `git@` URLs, Bitbucket SSH URLs, and local paths.
|
|
505
|
+
* Extracts the namespace (host + path prefix) and repository name from the URL.
|
|
506
|
+
*
|
|
507
|
+
* @param {string} type PackageURL type (e.g. `"swift"`, `"generic"`)
|
|
508
|
+
* @param {string} repoUrl Repository URL string
|
|
509
|
+
* @param {string} version Package version
|
|
510
|
+
* @returns {PackageURL|undefined} PackageURL object, or undefined for unsupported URL formats
|
|
511
|
+
*/
|
|
512
|
+
export function purlFromUrlString(type, repoUrl, version) {
|
|
513
|
+
let namespace = "";
|
|
514
|
+
let name;
|
|
515
|
+
if (repoUrl?.startsWith("http")) {
|
|
516
|
+
const url = new URL(repoUrl);
|
|
517
|
+
const pathnameParts = url.pathname.split("/");
|
|
518
|
+
// Bug #4136 fix. Strip trailing slash
|
|
519
|
+
if (pathnameParts[pathnameParts.length - 1] === "") {
|
|
520
|
+
pathnameParts.pop();
|
|
521
|
+
}
|
|
522
|
+
const pathnameLastElement = pathnameParts.pop(); // pop() returns last element and removes it from pathnameParts
|
|
523
|
+
name = pathnameLastElement.replace(".git", "");
|
|
524
|
+
const urlpath = pathnameParts.join("/");
|
|
525
|
+
namespace = url.hostname + urlpath;
|
|
526
|
+
} else if (repoUrl?.startsWith("git@")) {
|
|
527
|
+
const parts = repoUrl.split(":");
|
|
528
|
+
const hostname = parts[0].split("@")[1];
|
|
529
|
+
const pathnameParts = parts[1].split("/");
|
|
530
|
+
const pathnameLastElement = pathnameParts.pop();
|
|
531
|
+
name = pathnameLastElement.replace(".git", "");
|
|
532
|
+
const urlpath = pathnameParts.join("/");
|
|
533
|
+
namespace = `${hostname}/${urlpath}`;
|
|
534
|
+
} else if (repoUrl?.startsWith("ssh://git@bitbucket")) {
|
|
535
|
+
repoUrl = repoUrl.replace("ssh://git@", "");
|
|
536
|
+
const parts = repoUrl.split(":");
|
|
537
|
+
const hostname = parts[0];
|
|
538
|
+
const pathnameParts = parts[1].split("/").slice(1);
|
|
539
|
+
const pathnameLastElement = pathnameParts.pop();
|
|
540
|
+
name = pathnameLastElement.replace(".git", "");
|
|
541
|
+
const urlpath = pathnameParts.join("/");
|
|
542
|
+
namespace = `${hostname}/${urlpath}`;
|
|
543
|
+
} else if (repoUrl?.startsWith("/")) {
|
|
544
|
+
const parts = repoUrl.split("/");
|
|
545
|
+
name = parts[parts.length - 1] || "unknown";
|
|
546
|
+
if (type === "swift") {
|
|
547
|
+
// cdx-purl requires a swift namespace with host/owner segments.
|
|
548
|
+
// Local paths have none, so return undefined and let the caller
|
|
549
|
+
// construct the component without a purl.
|
|
550
|
+
return undefined;
|
|
551
|
+
}
|
|
552
|
+
} else {
|
|
553
|
+
if (DEBUG_MODE) {
|
|
554
|
+
console.warn("unsupported repo url for swift type");
|
|
555
|
+
}
|
|
556
|
+
return undefined;
|
|
557
|
+
}
|
|
558
|
+
|
|
559
|
+
return new Purl({
|
|
560
|
+
type: type,
|
|
561
|
+
namespace: namespace || null,
|
|
562
|
+
name: name,
|
|
563
|
+
version: version || null,
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
/**
|
|
568
|
+
* NOT IMPLEMENTED YET.
|
|
569
|
+
* A future method to locate a generic package given some name and properties
|
|
570
|
+
*
|
|
571
|
+
* @param {object} apkg Package to locate
|
|
572
|
+
* @returns Located project with precise purl or the original unmodified input.
|
|
573
|
+
*/
|
|
574
|
+
export function locateGenericPackage(apkg) {
|
|
575
|
+
return apkg;
|
|
576
|
+
}
|
|
577
|
+
|
|
578
|
+
function createConanPurlString(name, version, user, channel, rrev, prev) {
|
|
579
|
+
// https://github.com/package-url/purl-spec/blob/master/PURL-TYPES.rst#conan
|
|
580
|
+
|
|
581
|
+
const qualifiers = {};
|
|
582
|
+
|
|
583
|
+
if (user) qualifiers["user"] = user;
|
|
584
|
+
if (channel) qualifiers["channel"] = channel;
|
|
585
|
+
if (rrev) qualifiers["rrev"] = rrev;
|
|
586
|
+
if (prev) qualifiers["prev"] = prev;
|
|
587
|
+
|
|
588
|
+
return build({
|
|
589
|
+
type: "conan",
|
|
590
|
+
namespace: "" || null,
|
|
591
|
+
name: name,
|
|
592
|
+
version: version || null,
|
|
593
|
+
qualifiers: Object.keys(qualifiers).length ? qualifiers : null || null,
|
|
594
|
+
});
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
function untilFirst(separator, inputStr) {
|
|
598
|
+
// untilFirst("/", "a/b") -> ["/", "a", "b"]
|
|
599
|
+
// untilFirst("/", "abc") -> ["/", "abc", null]
|
|
600
|
+
|
|
601
|
+
if (!inputStr || inputStr.length === 0) {
|
|
602
|
+
return [null, null, null];
|
|
603
|
+
}
|
|
604
|
+
|
|
605
|
+
const separatorIndex = inputStr.search(separator);
|
|
606
|
+
if (separatorIndex === -1) {
|
|
607
|
+
return ["", inputStr, null];
|
|
608
|
+
}
|
|
609
|
+
return [
|
|
610
|
+
inputStr[separatorIndex],
|
|
611
|
+
inputStr.substring(0, separatorIndex),
|
|
612
|
+
inputStr.substring(separatorIndex + 1),
|
|
613
|
+
];
|
|
614
|
+
}
|
|
615
|
+
|
|
616
|
+
/**
|
|
617
|
+
* Parse a Conan package reference into purl coordinates.
|
|
618
|
+
*
|
|
619
|
+
* Accepts references such as `name/version@user/channel#recipe_revision` and
|
|
620
|
+
* returns a `[purl, name, version]` tuple, or `[null, null, null]` when the
|
|
621
|
+
* reference cannot be parsed.
|
|
622
|
+
*
|
|
623
|
+
* @param {string} conanPkgRef Conan package reference
|
|
624
|
+
* @returns {(string|null)[]} Tuple of purl string, package name, and version
|
|
625
|
+
*/
|
|
626
|
+
export function mapConanPkgRefToPurlStringAndNameAndVersion(conanPkgRef) {
|
|
627
|
+
// A full Conan package reference may be composed of the following segments:
|
|
628
|
+
// conanPkgRef = "name/version@user/channel#recipe_revision:package_id#package_revision"
|
|
629
|
+
// See also https://docs.conan.io/1/cheatsheet.html#package-terminology
|
|
630
|
+
|
|
631
|
+
// The components 'package_id' and 'package_revision' do not appear in any files processed by cdxgen.
|
|
632
|
+
// The components 'user' and 'channel' are not mandatory.
|
|
633
|
+
// 'name/version' is a valid Conan package reference, so is 'name/version@user/channel' or 'name/version@user/channel#recipe_revision'.
|
|
634
|
+
// pURL for Conan does not recognize 'package_id'.
|
|
635
|
+
|
|
636
|
+
const UNABLE_TO_PARSE_CONAN_PKG_REF = [null, null, null];
|
|
637
|
+
|
|
638
|
+
if (!conanPkgRef) {
|
|
639
|
+
if (DEBUG_MODE)
|
|
640
|
+
console.warn(
|
|
641
|
+
`Could not parse Conan package reference '${conanPkgRef}', input does not seem valid.`,
|
|
642
|
+
);
|
|
643
|
+
|
|
644
|
+
return UNABLE_TO_PARSE_CONAN_PKG_REF;
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
const separatorRegex = /[@#:\/]/;
|
|
648
|
+
|
|
649
|
+
const info = {
|
|
650
|
+
name: null,
|
|
651
|
+
version: null,
|
|
652
|
+
user: null,
|
|
653
|
+
channel: null,
|
|
654
|
+
recipe_revision: null,
|
|
655
|
+
package_id: null,
|
|
656
|
+
package_revision: null,
|
|
657
|
+
phase_history: [],
|
|
658
|
+
};
|
|
659
|
+
|
|
660
|
+
const transitions = {
|
|
661
|
+
["name"]: {
|
|
662
|
+
"/": "version",
|
|
663
|
+
"#": "recipe_revision",
|
|
664
|
+
"": "end",
|
|
665
|
+
},
|
|
666
|
+
["version"]: {
|
|
667
|
+
"@": "user",
|
|
668
|
+
"#": "recipe_revision",
|
|
669
|
+
"": "end",
|
|
670
|
+
},
|
|
671
|
+
["user"]: {
|
|
672
|
+
"/": "channel",
|
|
673
|
+
},
|
|
674
|
+
["channel"]: {
|
|
675
|
+
"#": "recipe_revision",
|
|
676
|
+
"": "end",
|
|
677
|
+
},
|
|
678
|
+
["recipe_revision"]: {
|
|
679
|
+
":": "package_id",
|
|
680
|
+
"": "end",
|
|
681
|
+
},
|
|
682
|
+
["package_id"]: {
|
|
683
|
+
"#": "package_revision",
|
|
684
|
+
},
|
|
685
|
+
["package_revision"]: {
|
|
686
|
+
"": "end",
|
|
687
|
+
},
|
|
688
|
+
};
|
|
689
|
+
|
|
690
|
+
let phase = "name";
|
|
691
|
+
let remainder = conanPkgRef;
|
|
692
|
+
let separator;
|
|
693
|
+
let item;
|
|
694
|
+
|
|
695
|
+
while (remainder) {
|
|
696
|
+
[separator, item, remainder] = untilFirst(separatorRegex, remainder);
|
|
697
|
+
|
|
698
|
+
if (!item) {
|
|
699
|
+
if (DEBUG_MODE)
|
|
700
|
+
console.warn(
|
|
701
|
+
`Could not parse Conan package reference '${conanPkgRef}', empty item in phase '${phase}', separator=${separator}, remainder=${remainder}, info=${JSON.stringify(info)}`,
|
|
702
|
+
);
|
|
703
|
+
return UNABLE_TO_PARSE_CONAN_PKG_REF;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
info[phase] = item;
|
|
707
|
+
info.phase_history.push(phase);
|
|
708
|
+
|
|
709
|
+
if (!(phase in transitions)) {
|
|
710
|
+
if (DEBUG_MODE)
|
|
711
|
+
console.warn(
|
|
712
|
+
`Could not parse Conan package reference '${conanPkgRef}', no transition from '${phase}', separator=${separator}, item=${item}, remainder=${remainder}, info=${JSON.stringify(info)}`,
|
|
713
|
+
);
|
|
714
|
+
return UNABLE_TO_PARSE_CONAN_PKG_REF;
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
const possibleTransitions = transitions[phase];
|
|
718
|
+
if (!(separator in possibleTransitions)) {
|
|
719
|
+
if (DEBUG_MODE)
|
|
720
|
+
console.warn(
|
|
721
|
+
`Could not parse Conan package reference '${conanPkgRef}', transition '${separator}' not allowed from '${phase}', item=${item}, remainder=${remainder}, info=${JSON.stringify(info)}`,
|
|
722
|
+
);
|
|
723
|
+
return UNABLE_TO_PARSE_CONAN_PKG_REF;
|
|
724
|
+
}
|
|
725
|
+
|
|
726
|
+
phase = possibleTransitions[separator];
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
if (phase !== "end") {
|
|
730
|
+
if (DEBUG_MODE)
|
|
731
|
+
console.warn(
|
|
732
|
+
`Could not parse Conan package reference '${conanPkgRef}', end of input string reached unexpectedly in phase '${phase}', info=${JSON.stringify(info)}.`,
|
|
733
|
+
);
|
|
734
|
+
return UNABLE_TO_PARSE_CONAN_PKG_REF;
|
|
735
|
+
}
|
|
736
|
+
|
|
737
|
+
if (!info.version) info.version = "latest";
|
|
738
|
+
|
|
739
|
+
const purl = createConanPurlString(
|
|
740
|
+
info.name,
|
|
741
|
+
info.version,
|
|
742
|
+
info.user,
|
|
743
|
+
info.channel,
|
|
744
|
+
info.recipe_revision,
|
|
745
|
+
info.package_revision,
|
|
746
|
+
);
|
|
747
|
+
|
|
748
|
+
return [purl, info.name, info.version];
|
|
749
|
+
}
|