@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,84 @@
|
|
|
1
|
+
const MAX_DETAIL_LINES = 12;
|
|
2
|
+
const MAX_PROPERTY_ROWS = 40;
|
|
3
|
+
const MAX_CELL_LENGTH = 160;
|
|
4
|
+
|
|
5
|
+
function truncateText(value, maxLength = MAX_CELL_LENGTH) {
|
|
6
|
+
const normalized = String(value ?? "").trim();
|
|
7
|
+
if (normalized.length <= maxLength) {
|
|
8
|
+
return normalized;
|
|
9
|
+
}
|
|
10
|
+
return `${normalized.slice(0, Math.max(0, maxLength - 1)).trimEnd()}…`;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function escapeMarkdownText(value) {
|
|
14
|
+
return truncateText(value)
|
|
15
|
+
.replace(/&/g, "&")
|
|
16
|
+
.replace(/</g, "<")
|
|
17
|
+
.replace(/>/g, ">")
|
|
18
|
+
.replace(/([\\`*_{}\[\]()#+!|])/g, "\\$1")
|
|
19
|
+
.replace(/\r?\n/g, "<br>")
|
|
20
|
+
.trim();
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function escapeMarkdownCell(value) {
|
|
24
|
+
return escapeMarkdownText(value);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Format annotation properties as a markdown table for CycloneDX annotations.
|
|
29
|
+
*
|
|
30
|
+
* @param {{ name: string, value: string }[]} properties annotation properties
|
|
31
|
+
* @returns {string} markdown table text
|
|
32
|
+
*/
|
|
33
|
+
export function propertiesToMarkdownTable(properties) {
|
|
34
|
+
if (!properties?.length) {
|
|
35
|
+
return "";
|
|
36
|
+
}
|
|
37
|
+
const lines = ["| Property | Value |", "| --- | --- |"];
|
|
38
|
+
const normalizedProperties = [...properties]
|
|
39
|
+
.filter((property) => property?.name || property?.value)
|
|
40
|
+
.sort((left, right) =>
|
|
41
|
+
`${left?.name || ""}\u0000${left?.value || ""}`.localeCompare(
|
|
42
|
+
`${right?.name || ""}\u0000${right?.value || ""}`,
|
|
43
|
+
),
|
|
44
|
+
)
|
|
45
|
+
.slice(0, MAX_PROPERTY_ROWS);
|
|
46
|
+
for (const property of normalizedProperties) {
|
|
47
|
+
lines.push(
|
|
48
|
+
`| ${escapeMarkdownCell(property?.name)} | ${escapeMarkdownCell(property?.value)} |`,
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
if ((properties?.length || 0) > normalizedProperties.length) {
|
|
52
|
+
lines.push(
|
|
53
|
+
`| _truncated_ | ${properties.length - normalizedProperties.length} more properties omitted |`,
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
return lines.join("\n");
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Build production-ready markdown annotation text.
|
|
61
|
+
*
|
|
62
|
+
* @param {string} message leading message text
|
|
63
|
+
* @param {{ name: string, value: string }[]} properties annotation properties
|
|
64
|
+
* @param {string[]} [details] optional detail lines shown before the table
|
|
65
|
+
* @returns {string} annotation text
|
|
66
|
+
*/
|
|
67
|
+
export function buildAnnotationText(message, properties, details = []) {
|
|
68
|
+
const lines = [
|
|
69
|
+
message,
|
|
70
|
+
...details.filter(Boolean).slice(0, MAX_DETAIL_LINES),
|
|
71
|
+
].map(escapeMarkdownText);
|
|
72
|
+
if (details.filter(Boolean).length > MAX_DETAIL_LINES) {
|
|
73
|
+
lines.push(
|
|
74
|
+
escapeMarkdownText(
|
|
75
|
+
`${details.filter(Boolean).length - MAX_DETAIL_LINES} more details omitted`,
|
|
76
|
+
),
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
const markdownTable = propertiesToMarkdownTable(properties);
|
|
80
|
+
if (markdownTable) {
|
|
81
|
+
lines.push("", markdownTable);
|
|
82
|
+
}
|
|
83
|
+
return lines.join("\n");
|
|
84
|
+
}
|
|
@@ -0,0 +1,312 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Lightweight, deterministic JSON Canonicalizer (similar to RFC 8785).
|
|
5
|
+
* Required by JSF to ensure the signature payload remains identical across systems.
|
|
6
|
+
*
|
|
7
|
+
* @param {any} value - The JSON object/value to canonicalize
|
|
8
|
+
* @returns {string} - Canonicalized JSON string
|
|
9
|
+
*/
|
|
10
|
+
function canonicalize(value) {
|
|
11
|
+
if (value === null || typeof value !== "object") {
|
|
12
|
+
return JSON.stringify(value);
|
|
13
|
+
}
|
|
14
|
+
if (Array.isArray(value)) {
|
|
15
|
+
return `[${value.map(canonicalize).join(",")}]`;
|
|
16
|
+
}
|
|
17
|
+
const keys = Object.keys(value).sort();
|
|
18
|
+
let str = "{";
|
|
19
|
+
for (let i = 0; i < keys.length; i++) {
|
|
20
|
+
if (i > 0) str += ",";
|
|
21
|
+
str += `${JSON.stringify(keys[i])}:${canonicalize(value[keys[i]])}`;
|
|
22
|
+
}
|
|
23
|
+
str += "}";
|
|
24
|
+
return str;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a JSF-compliant signature block.
|
|
29
|
+
*
|
|
30
|
+
* @param {Object} payload - The object to sign (e.g., BOM, component)
|
|
31
|
+
* @param {string|Buffer|crypto.KeyObject} privateKey - The signing key
|
|
32
|
+
* @param {string} alg - JSF algorithm identifier
|
|
33
|
+
* @param {Object} [publicKeyJwk] - Optional JWK representation of the public key
|
|
34
|
+
* @param {string} keyId - Key ID
|
|
35
|
+
*
|
|
36
|
+
* @returns {Object} - JSF signature block
|
|
37
|
+
*/
|
|
38
|
+
function createSignatureBlock(
|
|
39
|
+
payload,
|
|
40
|
+
privateKey,
|
|
41
|
+
alg,
|
|
42
|
+
publicKeyJwk = null,
|
|
43
|
+
keyId = null,
|
|
44
|
+
) {
|
|
45
|
+
// Exclude existing signatures from the canonicalized payload as per JSF
|
|
46
|
+
const { signature, ...dataToSign } = payload;
|
|
47
|
+
const canonicalData = canonicalize(dataToSign);
|
|
48
|
+
|
|
49
|
+
let hashAlg;
|
|
50
|
+
const signOptions = { key: privateKey };
|
|
51
|
+
|
|
52
|
+
// Handle HMAC (Symmetric)
|
|
53
|
+
if (alg.startsWith("HS")) {
|
|
54
|
+
const hash = alg.replace("HS", "sha");
|
|
55
|
+
const value = crypto
|
|
56
|
+
.createHmac(hash, privateKey)
|
|
57
|
+
.update(canonicalData, "utf8")
|
|
58
|
+
.digest("base64url");
|
|
59
|
+
const block = { algorithm: alg, value };
|
|
60
|
+
if (publicKeyJwk) {
|
|
61
|
+
block.publicKey = publicKeyJwk;
|
|
62
|
+
}
|
|
63
|
+
if (keyId) {
|
|
64
|
+
block.keyId = keyId;
|
|
65
|
+
}
|
|
66
|
+
return block;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Handle Asymmetric Algorithms
|
|
70
|
+
if (alg.startsWith("RS")) {
|
|
71
|
+
hashAlg = alg.replace("RS", "SHA");
|
|
72
|
+
} else if (alg.startsWith("PS")) {
|
|
73
|
+
hashAlg = alg.replace("PS", "SHA");
|
|
74
|
+
signOptions.padding = crypto.constants.RSA_PKCS1_PSS_PADDING;
|
|
75
|
+
signOptions.saltLength = crypto.constants.RSA_PSS_SALTLEN_AUTO;
|
|
76
|
+
} else if (alg.startsWith("ES")) {
|
|
77
|
+
hashAlg = alg.replace("ES", "SHA");
|
|
78
|
+
// Standard JWA format requires IEEE P1363 (R || S) instead of ASN.1 DER
|
|
79
|
+
signOptions.dsaEncoding = "ieee-p1363";
|
|
80
|
+
} else if (alg === "Ed25519" || alg === "Ed448") {
|
|
81
|
+
// Native EdDSA algorithms do not require a separate hash algorithm definition
|
|
82
|
+
hashAlg = null;
|
|
83
|
+
} else {
|
|
84
|
+
throw new Error(`Unsupported JSF algorithm: ${alg}`);
|
|
85
|
+
}
|
|
86
|
+
const sigBuffer = crypto.sign(
|
|
87
|
+
hashAlg,
|
|
88
|
+
Buffer.from(canonicalData, "utf8"),
|
|
89
|
+
signOptions,
|
|
90
|
+
);
|
|
91
|
+
const block = { algorithm: alg, value: sigBuffer.toString("base64url") };
|
|
92
|
+
if (publicKeyJwk) {
|
|
93
|
+
block.publicKey = publicKeyJwk;
|
|
94
|
+
}
|
|
95
|
+
if (keyId) {
|
|
96
|
+
block.keyId = keyId;
|
|
97
|
+
}
|
|
98
|
+
return block;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Appends or replaces a signature on a target object based on the configured mode.
|
|
103
|
+
*/
|
|
104
|
+
function addSignature(target, sigBlock, mode) {
|
|
105
|
+
if (!target.signature) {
|
|
106
|
+
target.signature = sigBlock;
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
if (mode === "chain") {
|
|
110
|
+
if (target.signature.chain) {
|
|
111
|
+
target.signature.chain.push(sigBlock);
|
|
112
|
+
} else if (target.signature.signers) {
|
|
113
|
+
throw new Error("Cannot mix signature chains and multi-signers.");
|
|
114
|
+
} else {
|
|
115
|
+
target.signature = { chain: [target.signature, sigBlock] };
|
|
116
|
+
}
|
|
117
|
+
} else if (mode === "signers") {
|
|
118
|
+
if (target.signature.signers) {
|
|
119
|
+
target.signature.signers.push(sigBlock);
|
|
120
|
+
} else if (target.signature.chain) {
|
|
121
|
+
throw new Error("Cannot mix signature chains and multi-signers.");
|
|
122
|
+
} else {
|
|
123
|
+
target.signature = { signers: [target.signature, sigBlock] };
|
|
124
|
+
}
|
|
125
|
+
} else {
|
|
126
|
+
target.signature = sigBlock;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Recursively applies signatures to the BOM and its granular components.
|
|
132
|
+
*
|
|
133
|
+
* @param {Object} bomJson - CycloneDX BOM Object
|
|
134
|
+
* @param {Object} options - Signing options { privateKey, algorithm, mode, ... }
|
|
135
|
+
* @returns {Object} - Signed BOM Object
|
|
136
|
+
*/
|
|
137
|
+
export function signBom(bomJson, options = {}) {
|
|
138
|
+
const {
|
|
139
|
+
privateKey,
|
|
140
|
+
algorithm = "RS512",
|
|
141
|
+
publicKeyJwk = null,
|
|
142
|
+
keyId = null,
|
|
143
|
+
mode = "replace", // Supports: 'replace', 'chain', 'signers'
|
|
144
|
+
signComponents = true,
|
|
145
|
+
signServices = true,
|
|
146
|
+
signAnnotations = true,
|
|
147
|
+
} = options;
|
|
148
|
+
|
|
149
|
+
if (!privateKey) {
|
|
150
|
+
throw new Error("privateKey is required for signing");
|
|
151
|
+
}
|
|
152
|
+
if (signComponents && Array.isArray(bomJson.components)) {
|
|
153
|
+
for (const comp of bomJson.components) {
|
|
154
|
+
addSignature(
|
|
155
|
+
comp,
|
|
156
|
+
createSignatureBlock(comp, privateKey, algorithm, publicKeyJwk, keyId),
|
|
157
|
+
mode,
|
|
158
|
+
);
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
if (signServices && Array.isArray(bomJson.services)) {
|
|
162
|
+
for (const svc of bomJson.services) {
|
|
163
|
+
addSignature(
|
|
164
|
+
svc,
|
|
165
|
+
createSignatureBlock(svc, privateKey, algorithm, publicKeyJwk, keyId),
|
|
166
|
+
mode,
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (signAnnotations && Array.isArray(bomJson.annotations)) {
|
|
171
|
+
for (const ann of bomJson.annotations) {
|
|
172
|
+
addSignature(
|
|
173
|
+
ann,
|
|
174
|
+
createSignatureBlock(ann, privateKey, algorithm, publicKeyJwk, keyId),
|
|
175
|
+
mode,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
addSignature(
|
|
180
|
+
bomJson,
|
|
181
|
+
createSignatureBlock(bomJson, privateKey, algorithm, publicKeyJwk, keyId),
|
|
182
|
+
mode,
|
|
183
|
+
);
|
|
184
|
+
return bomJson;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Validates a single JSF signature block against the payload.
|
|
189
|
+
*
|
|
190
|
+
* @param {Object} payload - The payload to verify
|
|
191
|
+
* @param {string|crypto.KeyObject} publicKey - The public key corresponding to the signature
|
|
192
|
+
* @param {Object} sigBlock Signature
|
|
193
|
+
*
|
|
194
|
+
* @returns {boolean|Object} - Signature block if signature is valid. False otherwise.
|
|
195
|
+
*/
|
|
196
|
+
function verifySignatureBlock(payload, publicKey, sigBlock) {
|
|
197
|
+
const { signature, ...dataToVerify } = payload;
|
|
198
|
+
const canonicalData = canonicalize(dataToVerify);
|
|
199
|
+
|
|
200
|
+
const { algorithm: alg, value } = sigBlock;
|
|
201
|
+
|
|
202
|
+
if (alg.startsWith("HS")) {
|
|
203
|
+
const hash = alg.replace("HS", "sha");
|
|
204
|
+
const expected = crypto
|
|
205
|
+
.createHmac(hash, publicKey)
|
|
206
|
+
.update(canonicalData, "utf8")
|
|
207
|
+
.digest("base64url");
|
|
208
|
+
const isValid = expected === value;
|
|
209
|
+
return isValid ? sigBlock : false;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
const verifyOptions = { key: publicKey };
|
|
213
|
+
let hashAlg;
|
|
214
|
+
|
|
215
|
+
if (alg.startsWith("RS")) {
|
|
216
|
+
hashAlg = alg.replace("RS", "SHA");
|
|
217
|
+
} else if (alg.startsWith("PS")) {
|
|
218
|
+
hashAlg = alg.replace("PS", "SHA");
|
|
219
|
+
verifyOptions.padding = crypto.constants.RSA_PKCS1_PSS_PADDING;
|
|
220
|
+
verifyOptions.saltLength = crypto.constants.RSA_PSS_SALTLEN_AUTO;
|
|
221
|
+
} else if (alg.startsWith("ES")) {
|
|
222
|
+
hashAlg = alg.replace("ES", "SHA");
|
|
223
|
+
verifyOptions.dsaEncoding = "ieee-p1363";
|
|
224
|
+
} else if (alg === "Ed25519" || alg === "Ed448") {
|
|
225
|
+
hashAlg = null;
|
|
226
|
+
} else {
|
|
227
|
+
console.warn(`${alg} is unknown.`);
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const isValid = crypto.verify(
|
|
232
|
+
hashAlg,
|
|
233
|
+
Buffer.from(canonicalData, "utf8"),
|
|
234
|
+
verifyOptions,
|
|
235
|
+
Buffer.from(value, "base64url"),
|
|
236
|
+
);
|
|
237
|
+
return isValid ? sigBlock : false;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Verifies the integrity of a specific element node (e.g., BOM root, Component, Service, Annotation).
|
|
242
|
+
* Resolves standard JSF signatures, multisignature (signers), and chains.
|
|
243
|
+
*
|
|
244
|
+
* @param {Object} node - The BOM or granular object to verify
|
|
245
|
+
* @param {string|crypto.KeyObject} publicKey - The public key corresponding to the signature
|
|
246
|
+
* @returns {boolean|Object} - Signature block if signature is valid. False otherwise.
|
|
247
|
+
*/
|
|
248
|
+
export function verifyNode(node, publicKey) {
|
|
249
|
+
if (!node?.signature) {
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
const sigTarget = node.signature;
|
|
253
|
+
if (sigTarget.signers) {
|
|
254
|
+
for (const sig of sigTarget.signers) {
|
|
255
|
+
const match = verifySignatureBlock(node, publicKey, sig);
|
|
256
|
+
if (match) {
|
|
257
|
+
return match;
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
if (sigTarget.chain) {
|
|
263
|
+
for (const sig of sigTarget.chain) {
|
|
264
|
+
const match = verifySignatureBlock(node, publicKey, sig);
|
|
265
|
+
if (match) {
|
|
266
|
+
return match;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
return verifySignatureBlock(node, publicKey, sigTarget);
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Verifies the integrity of a BOM's top-level signature, as well as nested components, services, and annotations.
|
|
276
|
+
* Returns true only if the root signature is valid AND all signed nested elements are valid.
|
|
277
|
+
*
|
|
278
|
+
* @param {Object} bom - CycloneDX BOM Object
|
|
279
|
+
* @param {string|crypto.KeyObject} publicKey - The public key corresponding to the signature
|
|
280
|
+
* @returns {boolean|Object} - Signature block if signature is valid. False otherwise.
|
|
281
|
+
*/
|
|
282
|
+
export function verifyBom(bom, publicKey) {
|
|
283
|
+
if (!bom?.signature) {
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
const rootMatch = verifyNode(bom, publicKey);
|
|
287
|
+
if (!rootMatch) {
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (Array.isArray(bom.components)) {
|
|
291
|
+
for (const comp of bom.components) {
|
|
292
|
+
if (comp.signature && !verifyNode(comp, publicKey)) {
|
|
293
|
+
return false;
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
if (Array.isArray(bom.services)) {
|
|
298
|
+
for (const svc of bom.services) {
|
|
299
|
+
if (svc.signature && !verifyNode(svc, publicKey)) {
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (Array.isArray(bom.annotations)) {
|
|
305
|
+
for (const ann of bom.annotations) {
|
|
306
|
+
if (ann.signature && !verifyNode(ann, publicKey)) {
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
return rootMatch;
|
|
312
|
+
}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
const SUPPORTED_EXPORT_FORMATS = new Set(["cyclonedx", "spdx"]);
|
|
4
|
+
const EXPORT_FORMAT_ALIASES = {
|
|
5
|
+
cdx: "cyclonedx",
|
|
6
|
+
cyclonedx: "cyclonedx",
|
|
7
|
+
spdx: "spdx",
|
|
8
|
+
"spdx-json": "spdx",
|
|
9
|
+
spdx3: "spdx",
|
|
10
|
+
"spdx3-json": "spdx",
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Normalize the requested export formats.
|
|
15
|
+
*
|
|
16
|
+
* @param {string|string[]|undefined|null} format Raw format value
|
|
17
|
+
* @returns {string[]} Normalized export formats
|
|
18
|
+
*/
|
|
19
|
+
export function normalizeOutputFormats(format) {
|
|
20
|
+
if (format === undefined || format === null || format === "") {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const values = Array.isArray(format) ? format : [format];
|
|
24
|
+
const normalized = new Set();
|
|
25
|
+
for (const value of values) {
|
|
26
|
+
if (!value) {
|
|
27
|
+
continue;
|
|
28
|
+
}
|
|
29
|
+
for (const token of `${value}`.split(",")) {
|
|
30
|
+
const normalizedToken = EXPORT_FORMAT_ALIASES[token.trim().toLowerCase()];
|
|
31
|
+
if (normalizedToken && SUPPORTED_EXPORT_FORMATS.has(normalizedToken)) {
|
|
32
|
+
normalized.add(normalizedToken);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return Array.from(normalized);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Derive the SPDX output path from a base output path.
|
|
41
|
+
*
|
|
42
|
+
* @param {string} outputPath Output path
|
|
43
|
+
* @returns {string} SPDX output path
|
|
44
|
+
*/
|
|
45
|
+
export function deriveSpdxOutputPath(outputPath) {
|
|
46
|
+
if (!outputPath) {
|
|
47
|
+
return "bom.spdx.json";
|
|
48
|
+
}
|
|
49
|
+
if (outputPath.endsWith(".spdx.json")) {
|
|
50
|
+
return outputPath;
|
|
51
|
+
}
|
|
52
|
+
if (outputPath.endsWith(".cdx.bin")) {
|
|
53
|
+
return outputPath.replace(/\.cdx\.bin$/u, ".spdx.json");
|
|
54
|
+
}
|
|
55
|
+
if (outputPath.endsWith(".cdx.json")) {
|
|
56
|
+
return outputPath.replace(/\.cdx\.json$/u, ".spdx.json");
|
|
57
|
+
}
|
|
58
|
+
if (outputPath.endsWith(".cdx")) {
|
|
59
|
+
return outputPath.replace(/\.cdx$/u, ".spdx.json");
|
|
60
|
+
}
|
|
61
|
+
if (outputPath.endsWith(".proto")) {
|
|
62
|
+
return outputPath.replace(/\.proto$/u, ".spdx.json");
|
|
63
|
+
}
|
|
64
|
+
if (outputPath.endsWith(".json")) {
|
|
65
|
+
return outputPath.replace(/\.json$/u, ".spdx.json");
|
|
66
|
+
}
|
|
67
|
+
return `${outputPath}.spdx.json`;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Derive the CycloneDX output path from a base output path.
|
|
72
|
+
*
|
|
73
|
+
* @param {string} outputPath Output path
|
|
74
|
+
* @returns {string} CycloneDX output path
|
|
75
|
+
*/
|
|
76
|
+
export function deriveCycloneDxOutputPath(outputPath) {
|
|
77
|
+
if (!outputPath) {
|
|
78
|
+
return "bom.json";
|
|
79
|
+
}
|
|
80
|
+
if (outputPath.endsWith(".spdx.json")) {
|
|
81
|
+
return outputPath.replace(/\.spdx\.json$/u, ".cdx.json");
|
|
82
|
+
}
|
|
83
|
+
return outputPath;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Derive the output path for a CycloneDX BOM converted to another spec version.
|
|
88
|
+
*
|
|
89
|
+
* The spec version is inserted ahead of the existing extension so the source
|
|
90
|
+
* BOM is never overwritten, and the extension is preserved so a protobuf input
|
|
91
|
+
* keeps producing a protobuf-suffixed name.
|
|
92
|
+
*
|
|
93
|
+
* @param {string} inputPath Input BOM path
|
|
94
|
+
* @param {string} specVersion Target CycloneDX spec version
|
|
95
|
+
* @returns {string} Converted CycloneDX output path
|
|
96
|
+
*/
|
|
97
|
+
export function deriveSpecVersionOutputPath(inputPath, specVersion) {
|
|
98
|
+
const suffix = `${specVersion}`.replace(/\./gu, "_");
|
|
99
|
+
if (!inputPath) {
|
|
100
|
+
return `bom-${suffix}.json`;
|
|
101
|
+
}
|
|
102
|
+
for (const extension of [".cdx.bin", ".cdx.json", ".spdx.json"]) {
|
|
103
|
+
if (inputPath.endsWith(extension)) {
|
|
104
|
+
return `${inputPath.slice(0, -extension.length)}-${suffix}${extension}`;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
const extension = path.extname(inputPath);
|
|
108
|
+
if (extension) {
|
|
109
|
+
return `${inputPath.slice(0, -extension.length)}-${suffix}${extension}`;
|
|
110
|
+
}
|
|
111
|
+
return `${inputPath}-${suffix}.json`;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Determine the final output plan for the requested export formats.
|
|
116
|
+
*
|
|
117
|
+
* @param {object} options CLI options
|
|
118
|
+
* @returns {{ formats: Set<string>, outputs: Record<string, string>, explicitFormat: boolean }} Output plan
|
|
119
|
+
*/
|
|
120
|
+
export function createOutputPlan(options) {
|
|
121
|
+
const explicitFormat =
|
|
122
|
+
options?.format !== undefined &&
|
|
123
|
+
options?.format !== null &&
|
|
124
|
+
options?.format !== "";
|
|
125
|
+
const requestedFormats = normalizeOutputFormats(options?.format);
|
|
126
|
+
const outputPath = options?.output || "bom.json";
|
|
127
|
+
const formats = new Set(
|
|
128
|
+
requestedFormats.length
|
|
129
|
+
? requestedFormats
|
|
130
|
+
: [outputPath.endsWith(".spdx.json") ? "spdx" : "cyclonedx"],
|
|
131
|
+
);
|
|
132
|
+
const outputs = {};
|
|
133
|
+
if (formats.has("cyclonedx")) {
|
|
134
|
+
outputs.cyclonedx =
|
|
135
|
+
outputPath.endsWith(".spdx.json") && formats.size > 1
|
|
136
|
+
? deriveCycloneDxOutputPath(outputPath)
|
|
137
|
+
: outputPath;
|
|
138
|
+
}
|
|
139
|
+
if (formats.has("spdx")) {
|
|
140
|
+
if (!formats.has("cyclonedx") || outputPath.endsWith(".spdx.json")) {
|
|
141
|
+
outputs.spdx =
|
|
142
|
+
outputPath === "bom.json"
|
|
143
|
+
? deriveSpdxOutputPath(outputPath)
|
|
144
|
+
: outputPath;
|
|
145
|
+
} else {
|
|
146
|
+
outputs.spdx = deriveSpdxOutputPath(outputPath);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return { formats, outputs, explicitFormat };
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Return the output directory for a planned export path.
|
|
154
|
+
*
|
|
155
|
+
* @param {string} outputPath Output path
|
|
156
|
+
* @returns {string} Output directory
|
|
157
|
+
*/
|
|
158
|
+
export function getOutputDirectory(outputPath) {
|
|
159
|
+
return path.dirname(outputPath);
|
|
160
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
|
|
3
|
+
import { hasDangerousUnicode } from "../../core/activity.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Returns the Dependency-Track BOM API URL as a sanitized URL object.
|
|
7
|
+
*
|
|
8
|
+
* @param {string} serverUrl Dependency-Track server URL
|
|
9
|
+
* @returns {URL | undefined} API URL to submit BOM payload
|
|
10
|
+
*/
|
|
11
|
+
export function getDependencyTrackBomApiUrl(serverUrl) {
|
|
12
|
+
const rawServerUrl = `${serverUrl || ""}`.trim();
|
|
13
|
+
if (!rawServerUrl || hasDangerousUnicode(rawServerUrl)) {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
let parsedUrl;
|
|
17
|
+
try {
|
|
18
|
+
parsedUrl = new URL(rawServerUrl);
|
|
19
|
+
} catch {
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
if (!["http:", "https:"].includes(parsedUrl.protocol)) {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
if (!parsedUrl.hostname || hasDangerousUnicode(parsedUrl.hostname)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
parsedUrl.username = "";
|
|
29
|
+
parsedUrl.password = "";
|
|
30
|
+
parsedUrl.search = "";
|
|
31
|
+
parsedUrl.hash = "";
|
|
32
|
+
parsedUrl.pathname = `${parsedUrl.pathname.replace(/\/+$/, "")}/api/v1/bom`;
|
|
33
|
+
return parsedUrl;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Returns the Dependency-Track BOM API URL string.
|
|
38
|
+
*
|
|
39
|
+
* @param {string} serverUrl Dependency-Track server URL
|
|
40
|
+
* @returns {string | undefined} API URL to submit BOM payload
|
|
41
|
+
*/
|
|
42
|
+
export function getDependencyTrackBomUrl(serverUrl) {
|
|
43
|
+
return getDependencyTrackBomApiUrl(serverUrl)?.toString();
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Build the payload for Dependency-Track BOM submission.
|
|
48
|
+
*
|
|
49
|
+
* @param {Object} args CLI/server arguments
|
|
50
|
+
* @param {Object} bomContents BOM Json
|
|
51
|
+
* @returns {Object | undefined} payload object if project coordinates are valid
|
|
52
|
+
*/
|
|
53
|
+
export function buildDependencyTrackBomPayload(args, bomContents) {
|
|
54
|
+
let encodedBomContents = Buffer.from(JSON.stringify(bomContents)).toString(
|
|
55
|
+
"base64",
|
|
56
|
+
);
|
|
57
|
+
if (encodedBomContents.startsWith("77u/")) {
|
|
58
|
+
encodedBomContents = encodedBomContents.substring(4);
|
|
59
|
+
}
|
|
60
|
+
const autoCreate =
|
|
61
|
+
typeof args.autoCreate === "boolean"
|
|
62
|
+
? args.autoCreate
|
|
63
|
+
: args.autoCreate !== "false";
|
|
64
|
+
const bomPayload = {
|
|
65
|
+
autoCreate: String(autoCreate),
|
|
66
|
+
bom: encodedBomContents,
|
|
67
|
+
};
|
|
68
|
+
if (
|
|
69
|
+
typeof args.projectId !== "undefined" ||
|
|
70
|
+
typeof args.projectName !== "undefined"
|
|
71
|
+
) {
|
|
72
|
+
if (typeof args.projectId !== "undefined") {
|
|
73
|
+
bomPayload.project = args.projectId;
|
|
74
|
+
}
|
|
75
|
+
if (typeof args.projectName !== "undefined") {
|
|
76
|
+
bomPayload.projectName = args.projectName;
|
|
77
|
+
}
|
|
78
|
+
// Dependency-Track submissions use "main" as fallback when no version is provided.
|
|
79
|
+
bomPayload.projectVersion = args.projectVersion || "main";
|
|
80
|
+
} else {
|
|
81
|
+
return undefined;
|
|
82
|
+
}
|
|
83
|
+
const parentProjectId = args.parentProjectId || args.parentUUID;
|
|
84
|
+
const hasParentUuidMode = typeof parentProjectId !== "undefined";
|
|
85
|
+
const hasParentName = typeof args.parentProjectName !== "undefined";
|
|
86
|
+
const hasParentVersion = typeof args.parentProjectVersion !== "undefined";
|
|
87
|
+
const hasParentCoordsMode = hasParentName || hasParentVersion;
|
|
88
|
+
if (hasParentUuidMode && hasParentCoordsMode) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
if (!hasParentUuidMode && hasParentName !== hasParentVersion) {
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
|
94
|
+
if (hasParentUuidMode) {
|
|
95
|
+
bomPayload.parentUUID = parentProjectId;
|
|
96
|
+
}
|
|
97
|
+
if (hasParentName && hasParentVersion) {
|
|
98
|
+
bomPayload.parentName = args.parentProjectName;
|
|
99
|
+
bomPayload.parentVersion = args.parentProjectVersion;
|
|
100
|
+
}
|
|
101
|
+
if (
|
|
102
|
+
typeof args.isLatest === "boolean" ||
|
|
103
|
+
args.isLatest === "true" ||
|
|
104
|
+
args.isLatest === "false"
|
|
105
|
+
) {
|
|
106
|
+
bomPayload.isLatest =
|
|
107
|
+
typeof args.isLatest === "boolean"
|
|
108
|
+
? args.isLatest
|
|
109
|
+
: args.isLatest === "true";
|
|
110
|
+
}
|
|
111
|
+
if (typeof args.projectTag !== "undefined") {
|
|
112
|
+
bomPayload.projectTags = (
|
|
113
|
+
Array.isArray(args.projectTag) ? args.projectTag : [args.projectTag]
|
|
114
|
+
).map((tag) => ({ name: tag }));
|
|
115
|
+
}
|
|
116
|
+
return bomPayload;
|
|
117
|
+
}
|