@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,213 @@
|
|
|
1
|
+
import { randomUUID as uuidv4 } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
|
|
4
|
+
import { parse as _load } from "yaml";
|
|
5
|
+
|
|
6
|
+
import { disambiguateSteps } from "./common.js";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Parse a single .gitlab-ci.yml file and return formulation-shaped data.
|
|
10
|
+
*
|
|
11
|
+
* @param {string} f Absolute path to the YAML file
|
|
12
|
+
* @param {Object} _options CLI options
|
|
13
|
+
* @returns {{ workflows: Object[], components: Object[], services: Object[], properties: Object[], dependencies: Object[] }}
|
|
14
|
+
*/
|
|
15
|
+
function parseGitlabCiFile(f, _options) {
|
|
16
|
+
const workflows = [];
|
|
17
|
+
const components = [];
|
|
18
|
+
const services = [];
|
|
19
|
+
const dependencies = [];
|
|
20
|
+
|
|
21
|
+
let raw;
|
|
22
|
+
try {
|
|
23
|
+
raw = readFileSync(f, { encoding: "utf-8" });
|
|
24
|
+
} catch (_e) {
|
|
25
|
+
return { workflows, components, services, properties: [], dependencies };
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
let yamlObj;
|
|
29
|
+
try {
|
|
30
|
+
yamlObj = _load(raw);
|
|
31
|
+
} catch (_e) {
|
|
32
|
+
return { workflows, components, services, properties: [], dependencies };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
if (!yamlObj || typeof yamlObj !== "object") {
|
|
36
|
+
return { workflows, components, services, properties: [], dependencies };
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Top-level reserved keys that are not job names
|
|
40
|
+
const RESERVED_KEYS = new Set([
|
|
41
|
+
"image",
|
|
42
|
+
"services",
|
|
43
|
+
"stages",
|
|
44
|
+
"types",
|
|
45
|
+
"before_script",
|
|
46
|
+
"after_script",
|
|
47
|
+
"variables",
|
|
48
|
+
"cache",
|
|
49
|
+
"include",
|
|
50
|
+
"workflow",
|
|
51
|
+
"default",
|
|
52
|
+
"pages",
|
|
53
|
+
".pre",
|
|
54
|
+
".post",
|
|
55
|
+
]);
|
|
56
|
+
|
|
57
|
+
const globalImage = yamlObj.image?.name || yamlObj.image || "";
|
|
58
|
+
const stages = Array.isArray(yamlObj.stages) ? yamlObj.stages : [];
|
|
59
|
+
|
|
60
|
+
// Collect global services as CycloneDX service objects
|
|
61
|
+
const globalServices = Array.isArray(yamlObj.services)
|
|
62
|
+
? yamlObj.services
|
|
63
|
+
: [];
|
|
64
|
+
for (const svc of globalServices) {
|
|
65
|
+
const svcName = typeof svc === "string" ? svc : svc?.name || "";
|
|
66
|
+
if (svcName) {
|
|
67
|
+
services.push({ name: svcName });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const tasks = [];
|
|
72
|
+
const workflowRef = uuidv4();
|
|
73
|
+
const workflowDependsOn = [];
|
|
74
|
+
|
|
75
|
+
for (const key of Object.keys(yamlObj)) {
|
|
76
|
+
if (RESERVED_KEYS.has(key) || key.startsWith(".")) {
|
|
77
|
+
continue;
|
|
78
|
+
}
|
|
79
|
+
const job = yamlObj[key];
|
|
80
|
+
if (!job || typeof job !== "object" || Array.isArray(job)) {
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const jobRef = uuidv4();
|
|
85
|
+
const steps = [];
|
|
86
|
+
const jobProperties = [{ name: "cdx:gitlab:job:name", value: key }];
|
|
87
|
+
|
|
88
|
+
const jobStage = job.stage || "test";
|
|
89
|
+
jobProperties.push({ name: "cdx:gitlab:job:stage", value: jobStage });
|
|
90
|
+
|
|
91
|
+
const jobImage = job.image?.name || job.image || globalImage;
|
|
92
|
+
if (jobImage) {
|
|
93
|
+
jobProperties.push({ name: "cdx:gitlab:job:image", value: jobImage });
|
|
94
|
+
components.push({ type: "container", name: jobImage });
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const jobEnv = job.environment?.name || job.environment || "";
|
|
98
|
+
if (jobEnv) {
|
|
99
|
+
jobProperties.push({ name: "cdx:gitlab:job:environment", value: jobEnv });
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Collect job-level services
|
|
103
|
+
const jobServices = Array.isArray(job.services) ? job.services : [];
|
|
104
|
+
for (const svc of jobServices) {
|
|
105
|
+
const svcName = typeof svc === "string" ? svc : svc?.name || "";
|
|
106
|
+
if (svcName) {
|
|
107
|
+
services.push({ name: svcName });
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
if (jobServices.length) {
|
|
111
|
+
jobProperties.push({
|
|
112
|
+
name: "cdx:gitlab:job:services",
|
|
113
|
+
value: jobServices
|
|
114
|
+
.map((s) => (typeof s === "string" ? s : s?.name || ""))
|
|
115
|
+
.join(","),
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
const jobNeeds = Array.isArray(job.needs) ? job.needs : [];
|
|
120
|
+
if (jobNeeds.length) {
|
|
121
|
+
const jobNeedNames = jobNeeds
|
|
122
|
+
.map((need) => (typeof need === "string" ? need : need?.job || ""))
|
|
123
|
+
.filter(Boolean);
|
|
124
|
+
if (jobNeedNames.length) {
|
|
125
|
+
jobProperties.push({
|
|
126
|
+
name: "cdx:gitlab:job:needs",
|
|
127
|
+
value: jobNeedNames.join(","),
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// before_script
|
|
133
|
+
for (const cmd of Array.isArray(job.before_script)
|
|
134
|
+
? job.before_script
|
|
135
|
+
: []) {
|
|
136
|
+
steps.push({ name: "before_script", commands: [{ executed: cmd }] });
|
|
137
|
+
}
|
|
138
|
+
// script (main)
|
|
139
|
+
for (const cmd of Array.isArray(job.script) ? job.script : []) {
|
|
140
|
+
steps.push({ name: "script", commands: [{ executed: cmd }] });
|
|
141
|
+
}
|
|
142
|
+
// after_script
|
|
143
|
+
for (const cmd of Array.isArray(job.after_script) ? job.after_script : []) {
|
|
144
|
+
steps.push({ name: "after_script", commands: [{ executed: cmd }] });
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
tasks.push({
|
|
148
|
+
"bom-ref": jobRef,
|
|
149
|
+
uid: jobRef,
|
|
150
|
+
name: key,
|
|
151
|
+
taskTypes: ["build"],
|
|
152
|
+
steps: disambiguateSteps(steps),
|
|
153
|
+
properties: jobProperties,
|
|
154
|
+
});
|
|
155
|
+
workflowDependsOn.push(jobRef);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const stagesProperty = stages.length
|
|
159
|
+
? [{ name: "cdx:gitlab:stages", value: stages.join(",") }]
|
|
160
|
+
: [];
|
|
161
|
+
|
|
162
|
+
const workflow = {
|
|
163
|
+
"bom-ref": workflowRef,
|
|
164
|
+
uid: workflowRef,
|
|
165
|
+
name: "GitLab CI Pipeline",
|
|
166
|
+
taskTypes: ["build"],
|
|
167
|
+
tasks: tasks.length ? tasks : undefined,
|
|
168
|
+
properties: [{ name: "cdx:gitlab:config", value: f }, ...stagesProperty],
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
workflows.push(workflow);
|
|
172
|
+
if (workflowDependsOn.length) {
|
|
173
|
+
dependencies.push({ ref: workflowRef, dependsOn: workflowDependsOn });
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
return { workflows, components, services, properties: [], dependencies };
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* GitLab CI formulation parser.
|
|
181
|
+
*
|
|
182
|
+
* Matches `.gitlab-ci.yml` files and converts them into CycloneDX formulation
|
|
183
|
+
* workflow objects. Each GitLab job becomes a task; script lines become steps.
|
|
184
|
+
*
|
|
185
|
+
* Parser contract: `parse(files, options)` returns
|
|
186
|
+
* `{ workflows, components, services, properties, dependencies }`.
|
|
187
|
+
*/
|
|
188
|
+
export const gitlabCiParser = {
|
|
189
|
+
id: "gitlab-ci",
|
|
190
|
+
patterns: ["**/.gitlab-ci.yml", ".gitlab-ci.yml"],
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* @param {string[]} files Matched CI config file paths
|
|
194
|
+
* @param {Object} options CLI options
|
|
195
|
+
* @returns {{ workflows: Object[], components: Object[], services: Object[], properties: Object[], dependencies: Object[] }}
|
|
196
|
+
*/
|
|
197
|
+
parse(files, options) {
|
|
198
|
+
const workflows = [];
|
|
199
|
+
const components = [];
|
|
200
|
+
const services = [];
|
|
201
|
+
const dependencies = [];
|
|
202
|
+
|
|
203
|
+
for (const f of files) {
|
|
204
|
+
const result = parseGitlabCiFile(f, options);
|
|
205
|
+
workflows.push(...result.workflows);
|
|
206
|
+
components.push(...result.components);
|
|
207
|
+
services.push(...result.services);
|
|
208
|
+
dependencies.push(...result.dependencies);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
return { workflows, components, services, properties: [], dependencies };
|
|
212
|
+
},
|
|
213
|
+
};
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { randomUUID as uuidv4 } from "node:crypto";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
|
|
4
|
+
import { disambiguateSteps } from "./common.js";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Very lightweight declarative Jenkinsfile parser using regex heuristics.
|
|
8
|
+
*
|
|
9
|
+
* Only parses the declarative pipeline syntax (`pipeline { ... }`).
|
|
10
|
+
* Full Groovy/scripted pipelines are not supported.
|
|
11
|
+
*
|
|
12
|
+
* @param {string} f Path to Jenkinsfile
|
|
13
|
+
* @param {Object} _options CLI options
|
|
14
|
+
* @returns {{ workflows: Object[], components: Object[], services: Object[], properties: Object[], dependencies: Object[] }}
|
|
15
|
+
*/
|
|
16
|
+
function parseJenkinsfile(f, _options) {
|
|
17
|
+
const workflows = [];
|
|
18
|
+
const components = [];
|
|
19
|
+
const dependencies = [];
|
|
20
|
+
|
|
21
|
+
let raw;
|
|
22
|
+
try {
|
|
23
|
+
raw = readFileSync(f, { encoding: "utf-8" });
|
|
24
|
+
} catch (_e) {
|
|
25
|
+
return {
|
|
26
|
+
workflows,
|
|
27
|
+
components,
|
|
28
|
+
services: [],
|
|
29
|
+
properties: [],
|
|
30
|
+
dependencies,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Quick check: must look like a declarative pipeline
|
|
35
|
+
if (!raw.includes("pipeline") || !raw.includes("stages")) {
|
|
36
|
+
return {
|
|
37
|
+
workflows,
|
|
38
|
+
components,
|
|
39
|
+
services: [],
|
|
40
|
+
properties: [],
|
|
41
|
+
dependencies,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const workflowRef = uuidv4();
|
|
46
|
+
const tasks = [];
|
|
47
|
+
const workflowDependsOn = [];
|
|
48
|
+
const workflowProperties = [{ name: "cdx:jenkins:file", value: f }];
|
|
49
|
+
|
|
50
|
+
// Extract agent info
|
|
51
|
+
const agentMatch = raw.match(
|
|
52
|
+
/agent\s*\{[^}]*docker\s*\{[^}]*image\s+['"]([^'"]+)['"]/s,
|
|
53
|
+
);
|
|
54
|
+
if (agentMatch) {
|
|
55
|
+
const agentImage = agentMatch[1];
|
|
56
|
+
components.push({ type: "container", name: agentImage });
|
|
57
|
+
workflowProperties.push({
|
|
58
|
+
name: "cdx:jenkins:agent:image",
|
|
59
|
+
value: agentImage,
|
|
60
|
+
});
|
|
61
|
+
} else {
|
|
62
|
+
const simpleAgentMatch = raw.match(/agent\s+['"]?(\w+)['"]?/);
|
|
63
|
+
if (simpleAgentMatch) {
|
|
64
|
+
workflowProperties.push({
|
|
65
|
+
name: "cdx:jenkins:agent",
|
|
66
|
+
value: simpleAgentMatch[1],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// Extract stage blocks using a regex heuristic.
|
|
72
|
+
// NOTE: This only works reliably for declarative pipelines with simple,
|
|
73
|
+
// non-deeply-nested stage blocks. Scripted pipelines or stages with heavily
|
|
74
|
+
// nested closures may produce incomplete or incorrect results.
|
|
75
|
+
const stagePattern =
|
|
76
|
+
/stage\s*\(\s*['"]([^'"]+)['"]\s*\)\s*\{([\s\S]*?)(?=stage\s*\(|post\s*\{|$)/g;
|
|
77
|
+
let stageMatch;
|
|
78
|
+
while ((stageMatch = stagePattern.exec(raw)) !== null) {
|
|
79
|
+
const stageName = stageMatch[1];
|
|
80
|
+
const stageBody = stageMatch[2];
|
|
81
|
+
const taskRef = uuidv4();
|
|
82
|
+
const steps = [];
|
|
83
|
+
const taskProperties = [
|
|
84
|
+
{ name: "cdx:jenkins:stage:name", value: stageName },
|
|
85
|
+
];
|
|
86
|
+
|
|
87
|
+
// Detect parallel stages
|
|
88
|
+
if (stageBody.includes("parallel")) {
|
|
89
|
+
taskProperties.push({
|
|
90
|
+
name: "cdx:jenkins:stage:parallel",
|
|
91
|
+
value: "true",
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Detect when conditions
|
|
96
|
+
const whenMatch = stageBody.match(/when\s*\{([^}]+)\}/);
|
|
97
|
+
if (whenMatch) {
|
|
98
|
+
taskProperties.push({
|
|
99
|
+
name: "cdx:jenkins:stage:when",
|
|
100
|
+
value: whenMatch[1].trim(),
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Extract sh/echo/script steps
|
|
105
|
+
const shPattern = /(?:sh|bat|powershell)\s+['"]([^'"]+)['"]/g;
|
|
106
|
+
let shMatch;
|
|
107
|
+
while ((shMatch = shPattern.exec(stageBody)) !== null) {
|
|
108
|
+
steps.push({
|
|
109
|
+
name: `sh: ${shMatch[1].substring(0, 60)}`,
|
|
110
|
+
commands: [{ executed: shMatch[1] }],
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
tasks.push({
|
|
115
|
+
"bom-ref": taskRef,
|
|
116
|
+
uid: taskRef,
|
|
117
|
+
name: stageName,
|
|
118
|
+
taskTypes: ["build"],
|
|
119
|
+
steps: disambiguateSteps(steps),
|
|
120
|
+
properties: taskProperties,
|
|
121
|
+
});
|
|
122
|
+
workflowDependsOn.push(taskRef);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const workflow = {
|
|
126
|
+
"bom-ref": workflowRef,
|
|
127
|
+
uid: workflowRef,
|
|
128
|
+
name: "Jenkinsfile Pipeline",
|
|
129
|
+
taskTypes: ["build"],
|
|
130
|
+
tasks: tasks.length ? tasks : undefined,
|
|
131
|
+
properties: workflowProperties,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
workflows.push(workflow);
|
|
135
|
+
if (workflowDependsOn.length) {
|
|
136
|
+
dependencies.push({ ref: workflowRef, dependsOn: workflowDependsOn });
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return { workflows, components, services: [], properties: [], dependencies };
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Jenkins formulation parser.
|
|
144
|
+
*
|
|
145
|
+
* Matches `Jenkinsfile` and `Jenkinsfile.*` at any directory depth and converts
|
|
146
|
+
* declarative pipeline syntax into CycloneDX formulation workflow objects.
|
|
147
|
+
*
|
|
148
|
+
* Parser contract: `parse(files, options)` returns
|
|
149
|
+
* `{ workflows, components, services, properties, dependencies }`.
|
|
150
|
+
*/
|
|
151
|
+
export const jenkinsParser = {
|
|
152
|
+
id: "jenkins",
|
|
153
|
+
patterns: ["**/Jenkinsfile", "**/Jenkinsfile.*"],
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @param {string[]} files Matched Jenkinsfile paths
|
|
157
|
+
* @param {Object} options CLI options
|
|
158
|
+
* @returns {{ workflows: Object[], components: Object[], services: Object[], properties: Object[], dependencies: Object[] }}
|
|
159
|
+
*/
|
|
160
|
+
parse(files, options) {
|
|
161
|
+
const workflows = [];
|
|
162
|
+
const components = [];
|
|
163
|
+
const dependencies = [];
|
|
164
|
+
|
|
165
|
+
for (const f of files) {
|
|
166
|
+
const result = parseJenkinsfile(f, options);
|
|
167
|
+
workflows.push(...result.workflows);
|
|
168
|
+
components.push(...result.components);
|
|
169
|
+
dependencies.push(...result.dependencies);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
return {
|
|
173
|
+
workflows,
|
|
174
|
+
components,
|
|
175
|
+
services: [],
|
|
176
|
+
properties: [],
|
|
177
|
+
dependencies,
|
|
178
|
+
};
|
|
179
|
+
},
|
|
180
|
+
};
|
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
|
|
4
|
+
import { dirNameStr } from "../core/paths.js";
|
|
5
|
+
|
|
6
|
+
// CycloneDX 1.7 introduced a root-level `citations` array. A citation records
|
|
7
|
+
// which entity or process supplied a given piece of BOM data, and points at the
|
|
8
|
+
// field(s) it vouches for via JSON Pointer(s) or JSONPath expression(s).
|
|
9
|
+
//
|
|
10
|
+
// Schema constraints (data/bom-1.7.schema.json#/definitions/citation):
|
|
11
|
+
// - `timestamp` is required.
|
|
12
|
+
// - Exactly one of `pointers` or `expressions` must be present (oneOf).
|
|
13
|
+
// - At least one of `attributedTo` or `process` must be present (anyOf).
|
|
14
|
+
// - `attributedTo` / `process` hold the `bom-ref` of an object already present
|
|
15
|
+
// in the BOM (a component, service, tool, organisational entity or person,
|
|
16
|
+
// or a formulation process).
|
|
17
|
+
//
|
|
18
|
+
// Because `attributedTo`/`process` reference other BOM entries by bom-ref, a
|
|
19
|
+
// citation is never self-contained: it must be emitted alongside the entity it
|
|
20
|
+
// names. The helpers below preserve that linkage and never invent refs.
|
|
21
|
+
|
|
22
|
+
const CDXGEN_VERSION_JSON = JSON.parse(
|
|
23
|
+
readFileSync(join(dirNameStr, "package.json"), "utf-8"),
|
|
24
|
+
);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Build a schema-valid CycloneDX 1.7 citation object.
|
|
28
|
+
*
|
|
29
|
+
* Either `pointers` or `expressions` must be supplied (mutually exclusive), and
|
|
30
|
+
* either `attributedTo` or `process` must be supplied. The caller is expected to
|
|
31
|
+
* pass the bom-ref of an entity that actually exists in the BOM; this helper
|
|
32
|
+
* does not fabricate refs.
|
|
33
|
+
*
|
|
34
|
+
* @param {Object} input Citation fields
|
|
35
|
+
* @param {string[]} [input.pointers] JSON Pointer strings (RFC 6901) targeting the attributed fields
|
|
36
|
+
* @param {string[]} [input.expressions] JSONPath strings (RFC 9535) targeting the attributed fields
|
|
37
|
+
* @param {string} [input.attributedTo] bom-ref of the component/service/tool/entity that supplied the data
|
|
38
|
+
* @param {string} [input.process] bom-ref of a formulation process that produced the data
|
|
39
|
+
* @param {string} [input.bomRef] Optional bom-ref for the citation itself
|
|
40
|
+
* @param {string} [input.note] Free-form context or quality note
|
|
41
|
+
* @param {string} [input.timestamp] ISO-8601 timestamp; defaults to now. Pass
|
|
42
|
+
* `citationTimestamp(bomJson)` so repeated renders of one BOM agree.
|
|
43
|
+
* @returns {Object|null} A citation object, or null when the required oneOf/anyOf pairs are not satisfied
|
|
44
|
+
*/
|
|
45
|
+
export function createCitation({
|
|
46
|
+
pointers,
|
|
47
|
+
expressions,
|
|
48
|
+
attributedTo,
|
|
49
|
+
process,
|
|
50
|
+
bomRef,
|
|
51
|
+
note,
|
|
52
|
+
timestamp,
|
|
53
|
+
} = {}) {
|
|
54
|
+
const hasPointers = Array.isArray(pointers) && pointers.length > 0;
|
|
55
|
+
const hasExpressions = Array.isArray(expressions) && expressions.length > 0;
|
|
56
|
+
// oneOf: exactly one targeting mechanism.
|
|
57
|
+
if (hasPointers === hasExpressions) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
// anyOf: at least one attribution target.
|
|
61
|
+
if (!attributedTo && !process) {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
// A citation left without a timestamp is completed by `attachCitations` from
|
|
65
|
+
// the document's own metadata.timestamp, so two renders of one BOM agree.
|
|
66
|
+
const citation = timestamp ? { timestamp } : {};
|
|
67
|
+
if (hasPointers) {
|
|
68
|
+
citation.pointers = [...pointers];
|
|
69
|
+
} else {
|
|
70
|
+
citation.expressions = [...expressions];
|
|
71
|
+
}
|
|
72
|
+
if (attributedTo) {
|
|
73
|
+
citation.attributedTo = attributedTo;
|
|
74
|
+
}
|
|
75
|
+
if (process) {
|
|
76
|
+
citation.process = process;
|
|
77
|
+
}
|
|
78
|
+
if (bomRef) {
|
|
79
|
+
citation["bom-ref"] = bomRef;
|
|
80
|
+
}
|
|
81
|
+
if (note) {
|
|
82
|
+
citation.note = note;
|
|
83
|
+
}
|
|
84
|
+
return citation;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Compute a stable identity for a citation so duplicate attributions can be
|
|
89
|
+
* merged without producing near-identical entries. Two citations are considered
|
|
90
|
+
* equivalent when they attribute the same target (entity/process) to the same
|
|
91
|
+
* field selector(s).
|
|
92
|
+
*
|
|
93
|
+
* @param {Object} citation A citation object
|
|
94
|
+
* @returns {string} Identity key
|
|
95
|
+
*/
|
|
96
|
+
function citationIdentity(citation) {
|
|
97
|
+
const target = citation.attributedTo || citation.process || "";
|
|
98
|
+
const selectors = (citation.pointers || citation.expressions || []).join(
|
|
99
|
+
"\n",
|
|
100
|
+
);
|
|
101
|
+
return `${target}\u0000${selectors}`;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Merge two citation arrays, dropping exact duplicates. When two citations share
|
|
106
|
+
* an identity but differ in note/bom-ref, the first one wins and the second is
|
|
107
|
+
* discarded to keep the array small and stable.
|
|
108
|
+
*
|
|
109
|
+
* @param {Object[]} existing Citations already present on the BOM
|
|
110
|
+
* @param {Object[]} additions Citations produced by a collector
|
|
111
|
+
* @returns {Object[]} De-duplicated citation array
|
|
112
|
+
*/
|
|
113
|
+
export function mergeCitations(existing = [], additions = []) {
|
|
114
|
+
const seen = new Set();
|
|
115
|
+
const merged = [];
|
|
116
|
+
for (const citation of [...(existing || []), ...(additions || [])]) {
|
|
117
|
+
if (!citation || typeof citation !== "object") {
|
|
118
|
+
continue;
|
|
119
|
+
}
|
|
120
|
+
const key = citation["bom-ref"] || citationIdentity(citation);
|
|
121
|
+
if (seen.has(key)) {
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
seen.add(key);
|
|
125
|
+
merged.push(citation);
|
|
126
|
+
}
|
|
127
|
+
return merged;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Collect the bom-refs of all tool components recorded under metadata.tools.
|
|
132
|
+
* Tool components are the natural attribution target for data that cdxgen
|
|
133
|
+
* itself produced or resolved.
|
|
134
|
+
*
|
|
135
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
136
|
+
* @returns {string[]} bom-ref strings, in document order
|
|
137
|
+
*/
|
|
138
|
+
export function collectToolBomRefs(bomJson) {
|
|
139
|
+
const refs = [];
|
|
140
|
+
const tools = bomJson?.metadata?.tools;
|
|
141
|
+
const pushComponent = (component) => {
|
|
142
|
+
if (component?.["bom-ref"]) {
|
|
143
|
+
refs.push(component["bom-ref"]);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
if (Array.isArray(tools)) {
|
|
147
|
+
tools.forEach(pushComponent);
|
|
148
|
+
} else if (tools && Array.isArray(tools.components)) {
|
|
149
|
+
tools.components.forEach(pushComponent);
|
|
150
|
+
}
|
|
151
|
+
return refs;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Resolve the bom-ref of the cdxgen tool component, if present. This is the
|
|
156
|
+
* canonical attribution target for inventory that cdxgen collected itself.
|
|
157
|
+
*
|
|
158
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
159
|
+
* @returns {string|undefined} bom-ref of the cdxgen tool, or undefined
|
|
160
|
+
*/
|
|
161
|
+
export function findCdxgenToolBomRef(bomJson) {
|
|
162
|
+
const refs = collectToolBomRefs(bomJson);
|
|
163
|
+
return refs.find((ref) => ref.includes("cdxgen"));
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The timestamp every citation on a document shares. Deriving it from the
|
|
168
|
+
* document rather than the clock keeps two renders of one BOM identical, the
|
|
169
|
+
* same rule the annotator follows.
|
|
170
|
+
*
|
|
171
|
+
* @param {Object} bomJson CycloneDX BOM
|
|
172
|
+
* @returns {string} ISO-8601 timestamp
|
|
173
|
+
*/
|
|
174
|
+
export function citationTimestamp(bomJson) {
|
|
175
|
+
return bomJson?.metadata?.timestamp || new Date().toISOString();
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Attach a citations array to the BOM root, but only when the spec version can
|
|
180
|
+
* carry it. At 1.6 and below the field is not allowed and the downgrade path
|
|
181
|
+
* strips it; this guard keeps callers from emitting data that would immediately
|
|
182
|
+
* be removed.
|
|
183
|
+
*
|
|
184
|
+
* @param {Object} bomJson CycloneDX BOM (mutated)
|
|
185
|
+
* @param {Object[]} citations Citations to attach
|
|
186
|
+
* @param {Object} options CLI options (for specVersion)
|
|
187
|
+
* @returns {Object} The mutated BOM
|
|
188
|
+
*/
|
|
189
|
+
export function attachCitations(bomJson, citations, options = {}) {
|
|
190
|
+
if (!bomJson) {
|
|
191
|
+
return bomJson;
|
|
192
|
+
}
|
|
193
|
+
const specVersion = options.specVersion || bomJson.specVersion;
|
|
194
|
+
if (!specVersion || Number(specVersion) < 1.7) {
|
|
195
|
+
return bomJson;
|
|
196
|
+
}
|
|
197
|
+
const documentTimestamp = citationTimestamp(bomJson);
|
|
198
|
+
for (const citation of citations || []) {
|
|
199
|
+
if (citation && !citation.timestamp) {
|
|
200
|
+
citation.timestamp = documentTimestamp;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const merged = mergeCitations(bomJson.citations, citations);
|
|
204
|
+
if (merged.length) {
|
|
205
|
+
bomJson.citations = merged;
|
|
206
|
+
} else {
|
|
207
|
+
delete bomJson.citations;
|
|
208
|
+
}
|
|
209
|
+
return bomJson;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Build a citation that attributes the BOM's component inventory to the cdxgen
|
|
214
|
+
* tool. This is the baseline provenance statement: cdxgen collected the
|
|
215
|
+
* components, so the inventory is attributed to cdxgen's tool component.
|
|
216
|
+
*
|
|
217
|
+
* @param {Object} bomJson CycloneDX BOM (read for the tool bom-ref)
|
|
218
|
+
* @param {Object} [context] Extra context
|
|
219
|
+
* @param {string} [context.note] Optional note appended to the attribution
|
|
220
|
+
* @returns {Object|null} A citation, or null when no cdxgen tool is referenced
|
|
221
|
+
*/
|
|
222
|
+
export function buildInventoryCitation(bomJson, context = {}) {
|
|
223
|
+
const attributedTo = findCdxgenToolBomRef(bomJson);
|
|
224
|
+
if (!attributedTo) {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
return createCitation({
|
|
228
|
+
expressions: ["$.components"],
|
|
229
|
+
attributedTo,
|
|
230
|
+
note:
|
|
231
|
+
context.note ||
|
|
232
|
+
`Component inventory collected by cdxgen ${CDXGEN_VERSION_JSON.version}.`,
|
|
233
|
+
});
|
|
234
|
+
}
|