@cdxgen/cdxgen 13.5.0 → 13.7.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 +17 -10
- package/bin/audit.js +7 -4
- package/bin/cdxgen.js +260 -37
- package/bin/convert.js +146 -22
- package/bin/evinse.js +28 -3
- package/bin/repl.js +47 -3
- package/bin/sign.js +211 -34
- package/bin/tracebom.js +18 -6
- package/bin/validate.js +24 -3
- package/bin/verify.js +113 -5
- package/data/behavior-taxonomy.schema.json +1491 -0
- package/data/cyclonedx-2.0-bundled.schema.json +18606 -5528
- package/data/cyclonedx-2.0-cryptography-defs.schema.json +857 -0
- package/data/license-aliases.json +24 -2
- package/data/pqc-migration.json +239 -0
- package/data/remediations.json +176 -0
- package/data/rules/ai-bom.yaml +1 -1
- package/data/rules/brotli-decoder.yaml +107 -0
- package/data/rules/cbom-security.yaml +4 -3
- package/data/rules/package-integrity.yaml +28 -0
- package/data/rules/vscode-extensions.yaml +75 -0
- package/data/spdx-license-list.json +121 -7
- package/data/spdx-licenses.json +69 -0
- package/data/spdx.schema.json +845 -2
- package/lib/audit/index.js +25 -3
- package/lib/cli/bomAssembly.js +172 -4
- package/lib/cli/cliOptions.js +121 -17
- package/lib/cli/index.js +720 -902
- package/lib/cli/jsBom.js +156 -64
- package/lib/cli/jvmBom.js +602 -86
- package/lib/cli/managedBom.js +161 -19
- package/lib/cli/nativeBom.js +52 -5
- package/lib/core/boundedFile.js +344 -0
- package/lib/core/brotliProbe.js +182 -0
- package/lib/core/env.js +34 -0
- package/lib/core/fs.js +138 -3
- package/lib/core/globPatterns.js +218 -0
- package/lib/core/httpClient.js +98 -1
- package/lib/core/lockPaths.js +38 -0
- package/lib/core/paths.js +24 -1
- package/lib/core/processTree.js +100 -8
- package/lib/core/projectConfig.js +332 -25
- package/lib/core/toolRegistry.js +184 -0
- package/lib/ecosystems/cppEvidence.js +263 -106
- package/lib/ecosystems/cppIncludeResolver.js +16 -5
- package/lib/ecosystems/denoutils.js +2 -2
- package/lib/ecosystems/ecosystems.js +25 -10
- package/lib/ecosystems/gemHostProbe.js +301 -0
- package/lib/ecosystems/golem.js +3 -8
- package/lib/ecosystems/gradleutils.js +1909 -229
- package/lib/ecosystems/jsEvidence.js +90 -38
- package/lib/ecosystems/kosi.js +3 -5
- package/lib/ecosystems/npmVersionResolution.js +376 -0
- package/lib/ecosystems/parsers-bazel.js +107 -6
- package/lib/ecosystems/parsers-js.js +505 -22
- package/lib/ecosystems/parsers-misc.js +209 -20
- package/lib/ecosystems/parsers-python.js +178 -30
- package/lib/ecosystems/parsers-rust.js +117 -15
- package/lib/ecosystems/pythonutils.js +128 -2
- package/lib/ecosystems/remote/huggingface.js +22 -0
- package/lib/ecosystems/rubyutils.js +538 -31
- package/lib/ecosystems/rusi.js +2 -4
- package/lib/ecosystems/scalacliutils.js +2 -0
- package/lib/ecosystems/scalasem.js +798 -152
- package/lib/ecosystems/vendoredCode.js +237 -3
- package/lib/ecosystems/venvProbe.js +360 -0
- package/lib/evinser/evinser.js +536 -71
- package/lib/evinser/scalasem.js +5 -1
- package/lib/helpers/agenticToolutils.js +525 -94
- package/lib/helpers/bomSigner.js +43 -9
- package/lib/helpers/jssSigner.js +1276 -0
- package/lib/helpers/vsixutils.js +1574 -315
- package/lib/inventory/agentBlueprint.js +193 -0
- package/lib/inventory/agentToolNames.js +145 -0
- package/lib/inventory/aiCollector.js +153 -7
- package/lib/inventory/aiInventory.js +44 -8
- package/lib/inventory/aiProviders.js +324 -0
- package/lib/inventory/atomUtils.js +77 -0
- package/lib/inventory/bomUtils.js +8 -1
- package/lib/inventory/brotliDecoder.js +142 -0
- package/lib/inventory/buildToolRateLimit.js +1 -1
- package/lib/inventory/cbomutils.js +56 -7
- package/lib/inventory/ciParsers/githubActionsLock.js +821 -0
- package/lib/inventory/citations.js +31 -2
- package/lib/inventory/communityAiConfigParser.js +978 -80
- package/lib/inventory/cyclonedx20.js +152 -0
- package/lib/inventory/cyclonedx20Common.js +286 -0
- package/lib/inventory/cyclonedx20Derived.js +159 -0
- package/lib/inventory/cyclonedx20Parties.js +552 -0
- package/lib/inventory/cyclonedx20Read.js +768 -0
- package/lib/inventory/cyclonedx20ReadCommon.js +374 -0
- package/lib/inventory/cyclonedx20ReadComponents.js +692 -0
- package/lib/inventory/cyclonedx20ReadContext.js +380 -0
- package/lib/inventory/cyclonedx20ReadEvidence.js +466 -0
- package/lib/inventory/cyclonedx20ReadSections.js +599 -0
- package/lib/inventory/cyclonedx20Render.js +766 -0
- package/lib/inventory/cyclonedx20RenderComponents.js +716 -0
- package/lib/inventory/cyclonedx20RenderDefinitions.js +405 -0
- package/lib/inventory/cyclonedx20RenderEvidence.js +726 -0
- package/lib/inventory/cyclonedx20RenderHardware.js +203 -0
- package/lib/inventory/cyclonedx20RenderPatents.js +174 -0
- package/lib/inventory/cyclonedx20RenderRefIds.js +314 -0
- package/lib/inventory/cyclonedx20RenderSections.js +499 -0
- package/lib/inventory/cyclonedx20Tables.js +594 -0
- package/lib/inventory/deps.js +141 -13
- package/lib/inventory/dosai.js +375 -6
- package/lib/inventory/dosaiParsers.js +3 -6
- package/lib/inventory/dotnetRuntime.js +367 -0
- package/lib/inventory/ecosystemFormulationParsers.js +979 -0
- package/lib/inventory/envcontext.js +436 -48
- package/lib/inventory/evidenceUtils.js +13 -1
- package/lib/inventory/fetchBatch.js +1 -1
- package/lib/inventory/formulationParsers.js +124 -14
- package/lib/inventory/gtfobins.js +13 -0
- package/lib/inventory/hbom.js +45 -6
- package/lib/inventory/hbomLoader.js +166 -0
- package/lib/inventory/hostRuntimeProbe.js +686 -0
- package/lib/inventory/jvmLocalRepos.js +9 -2
- package/lib/inventory/jvmToolEnv.js +29 -0
- package/lib/inventory/licenseEnhancer.js +12 -0
- package/lib/inventory/mavenCentralMirror.js +534 -0
- package/lib/inventory/mcpConfigParser.js +5 -0
- package/lib/inventory/nodeBuildInfo.js +218 -0
- package/lib/inventory/nodeHostProbe.js +202 -0
- package/lib/inventory/occurrenceKey.js +90 -0
- package/lib/inventory/osPackageResolver.js +182 -0
- package/lib/inventory/phpBuildInfo.js +10 -59
- package/lib/inventory/phpHostProbe.js +32 -488
- package/lib/inventory/pqcMigration.js +426 -0
- package/lib/inventory/rubyBuildInfo.js +972 -0
- package/lib/inventory/rubyHostProbe.js +218 -0
- package/lib/inventory/rustFormulationParser.js +21 -10
- package/lib/inventory/scalaCoords.js +4 -3
- package/lib/inventory/scalaDedupe.js +440 -0
- package/lib/inventory/source.js +114 -8
- package/lib/managers/binary.js +337 -3
- package/lib/managers/docker.js +79 -0
- package/lib/parsers/huggingfaceManifest.js +9 -1
- package/lib/parsers/huggingfaceUtils.js +18 -0
- package/lib/parsers/kiroPermissions.js +166 -0
- package/lib/parsers/largeJson.js +28 -11
- package/lib/parsers/vscodeExtensionId.js +183 -0
- package/lib/server/server.js +48 -35
- package/lib/stages/postgen/postgen.js +41 -1
- package/lib/stages/postgen/ruleEngine.js +13 -5
- package/lib/stages/postgen/specVersionCompat.js +76 -0
- package/lib/stages/pregen/envAudit.js +1 -0
- package/lib/stages/pregen/pregen.js +114 -57
- package/lib/validator/bomValidator.js +14 -2
- package/lib/validator/complianceEngine.js +30 -3
- package/lib/validator/complianceRules.js +1416 -4
- package/lib/validator/generated/validate-1.6.mjs +1 -1
- package/lib/validator/generated/validate-1.7.mjs +1 -1
- package/lib/validator/generated/validate-2.0.mjs +57554 -13851
- package/lib/validator/index.js +49 -8
- package/lib/validator/reporters/json.js +6 -0
- package/package.json +11 -10
- package/types/bin/repl.d.ts.map +1 -1
- package/types/lib/audit/index.d.ts +6 -2
- package/types/lib/audit/index.d.ts.map +1 -1
- package/types/lib/cli/bomAssembly.d.ts +29 -1
- package/types/lib/cli/bomAssembly.d.ts.map +1 -1
- package/types/lib/cli/cliOptions.d.ts +6 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -1
- package/types/lib/cli/index.d.ts.map +1 -1
- package/types/lib/cli/jsBom.d.ts +3 -18
- package/types/lib/cli/jsBom.d.ts.map +1 -1
- package/types/lib/cli/jvmBom.d.ts +15 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -1
- package/types/lib/cli/managedBom.d.ts.map +1 -1
- package/types/lib/cli/nativeBom.d.ts.map +1 -1
- package/types/lib/core/boundedFile.d.ts +100 -0
- package/types/lib/core/boundedFile.d.ts.map +1 -0
- package/types/lib/core/brotliProbe.d.ts +37 -0
- package/types/lib/core/brotliProbe.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +14 -0
- package/types/lib/core/env.d.ts.map +1 -1
- package/types/lib/core/fs.d.ts +4 -0
- package/types/lib/core/fs.d.ts.map +1 -1
- package/types/lib/core/globPatterns.d.ts +70 -0
- package/types/lib/core/globPatterns.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +24 -0
- package/types/lib/core/httpClient.d.ts.map +1 -1
- package/types/lib/core/lockPaths.d.ts +19 -0
- package/types/lib/core/lockPaths.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +9 -0
- package/types/lib/core/paths.d.ts.map +1 -1
- package/types/lib/core/processTree.d.ts +17 -4
- package/types/lib/core/processTree.d.ts.map +1 -1
- package/types/lib/core/projectConfig.d.ts +47 -8
- package/types/lib/core/projectConfig.d.ts.map +1 -1
- package/types/lib/core/toolRegistry.d.ts +36 -0
- package/types/lib/core/toolRegistry.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +40 -13
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts +2 -1
- package/types/lib/ecosystems/cppIncludeResolver.d.ts.map +1 -1
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -1
- package/types/lib/ecosystems/gemHostProbe.d.ts +28 -0
- package/types/lib/ecosystems/gemHostProbe.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -1
- package/types/lib/ecosystems/gradleutils.d.ts +294 -20
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -1
- package/types/lib/ecosystems/jsEvidence.d.ts +14 -1
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -1
- package/types/lib/ecosystems/kosi.d.ts.map +1 -1
- package/types/lib/ecosystems/npmVersionResolution.d.ts +119 -0
- package/types/lib/ecosystems/npmVersionResolution.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-js.d.ts +17 -20
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-misc.d.ts +19 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-python.d.ts +10 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -1
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -1
- package/types/lib/ecosystems/pythonutils.d.ts +19 -1
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -1
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -1
- package/types/lib/ecosystems/rubyutils.d.ts +144 -12
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -1
- package/types/lib/ecosystems/rusi.d.ts.map +1 -1
- package/types/lib/ecosystems/scalacliutils.d.ts.map +1 -1
- package/types/lib/ecosystems/scalasem.d.ts +58 -16
- package/types/lib/ecosystems/scalasem.d.ts.map +1 -1
- package/types/lib/ecosystems/vendoredCode.d.ts +26 -0
- package/types/lib/ecosystems/vendoredCode.d.ts.map +1 -1
- package/types/lib/ecosystems/venvProbe.d.ts +40 -0
- package/types/lib/ecosystems/venvProbe.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +120 -13
- package/types/lib/evinser/evinser.d.ts.map +1 -1
- package/types/lib/evinser/scalasem.d.ts.map +1 -1
- package/types/lib/helpers/agenticToolutils.d.ts +53 -19
- package/types/lib/helpers/agenticToolutils.d.ts.map +1 -1
- package/types/lib/helpers/bomSigner.d.ts +20 -3
- package/types/lib/helpers/bomSigner.d.ts.map +1 -1
- package/types/lib/helpers/jssSigner.d.ts +288 -0
- package/types/lib/helpers/jssSigner.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +303 -19
- package/types/lib/helpers/vsixutils.d.ts.map +1 -1
- package/types/lib/inventory/agentBlueprint.d.ts +70 -0
- package/types/lib/inventory/agentBlueprint.d.ts.map +1 -0
- package/types/lib/inventory/agentToolNames.d.ts +51 -0
- package/types/lib/inventory/agentToolNames.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -1
- package/types/lib/inventory/aiInventory.d.ts.map +1 -1
- package/types/lib/inventory/aiProviders.d.ts +85 -0
- package/types/lib/inventory/aiProviders.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +19 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -1
- package/types/lib/inventory/bomUtils.d.ts.map +1 -1
- package/types/lib/inventory/brotliDecoder.d.ts +58 -0
- package/types/lib/inventory/brotliDecoder.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +17 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -1
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts +101 -0
- package/types/lib/inventory/ciParsers/githubActionsLock.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +5 -0
- package/types/lib/inventory/citations.d.ts.map +1 -1
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/cyclonedx20.d.ts +99 -0
- package/types/lib/inventory/cyclonedx20.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts +102 -0
- package/types/lib/inventory/cyclonedx20Common.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts +74 -0
- package/types/lib/inventory/cyclonedx20Derived.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts +91 -0
- package/types/lib/inventory/cyclonedx20Parties.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts +51 -0
- package/types/lib/inventory/cyclonedx20Read.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts +69 -0
- package/types/lib/inventory/cyclonedx20ReadCommon.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts +77 -0
- package/types/lib/inventory/cyclonedx20ReadComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts +118 -0
- package/types/lib/inventory/cyclonedx20ReadContext.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts +40 -0
- package/types/lib/inventory/cyclonedx20ReadEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20ReadSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts +53 -0
- package/types/lib/inventory/cyclonedx20Render.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts +73 -0
- package/types/lib/inventory/cyclonedx20RenderComponents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts +29 -0
- package/types/lib/inventory/cyclonedx20RenderDefinitions.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts +110 -0
- package/types/lib/inventory/cyclonedx20RenderEvidence.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts +42 -0
- package/types/lib/inventory/cyclonedx20RenderHardware.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts +26 -0
- package/types/lib/inventory/cyclonedx20RenderPatents.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts +55 -0
- package/types/lib/inventory/cyclonedx20RenderRefIds.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts +45 -0
- package/types/lib/inventory/cyclonedx20RenderSections.d.ts.map +1 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts +134 -0
- package/types/lib/inventory/cyclonedx20Tables.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +35 -2
- package/types/lib/inventory/deps.d.ts.map +1 -1
- package/types/lib/inventory/dosai.d.ts +36 -1
- package/types/lib/inventory/dosai.d.ts.map +1 -1
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -1
- package/types/lib/inventory/dotnetRuntime.d.ts +91 -0
- package/types/lib/inventory/dotnetRuntime.d.ts.map +1 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts +73 -0
- package/types/lib/inventory/ecosystemFormulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +74 -12
- package/types/lib/inventory/envcontext.d.ts.map +1 -1
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -1
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -1
- package/types/lib/inventory/gtfobins.d.ts.map +1 -1
- package/types/lib/inventory/hbom.d.ts +11 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -1
- package/types/lib/inventory/hbomLoader.d.ts +54 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -1
- package/types/lib/inventory/hostRuntimeProbe.d.ts +44 -0
- package/types/lib/inventory/hostRuntimeProbe.d.ts.map +1 -0
- package/types/lib/inventory/jvmLocalRepos.d.ts +5 -1
- package/types/lib/inventory/jvmLocalRepos.d.ts.map +1 -1
- package/types/lib/inventory/jvmToolEnv.d.ts +12 -0
- package/types/lib/inventory/jvmToolEnv.d.ts.map +1 -1
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -1
- package/types/lib/inventory/mavenCentralMirror.d.ts +170 -0
- package/types/lib/inventory/mavenCentralMirror.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -1
- package/types/lib/inventory/nodeBuildInfo.d.ts +95 -0
- package/types/lib/inventory/nodeBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/nodeHostProbe.d.ts +15 -0
- package/types/lib/inventory/nodeHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/occurrenceKey.d.ts +52 -0
- package/types/lib/inventory/occurrenceKey.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +38 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -1
- package/types/lib/inventory/phpBuildInfo.d.ts.map +1 -1
- package/types/lib/inventory/phpHostProbe.d.ts.map +1 -1
- package/types/lib/inventory/pqcMigration.d.ts +84 -0
- package/types/lib/inventory/pqcMigration.d.ts.map +1 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts +271 -0
- package/types/lib/inventory/rubyBuildInfo.d.ts.map +1 -0
- package/types/lib/inventory/rubyHostProbe.d.ts +47 -0
- package/types/lib/inventory/rubyHostProbe.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +7 -2
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -1
- package/types/lib/inventory/scalaCoords.d.ts.map +1 -1
- package/types/lib/inventory/scalaDedupe.d.ts +43 -0
- package/types/lib/inventory/scalaDedupe.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +25 -0
- package/types/lib/inventory/source.d.ts.map +1 -1
- package/types/lib/managers/binary.d.ts.map +1 -1
- package/types/lib/managers/docker.d.ts +12 -0
- package/types/lib/managers/docker.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts +10 -1
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -1
- package/types/lib/parsers/huggingfaceUtils.d.ts +12 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -1
- package/types/lib/parsers/kiroPermissions.d.ts +62 -0
- package/types/lib/parsers/kiroPermissions.d.ts.map +1 -0
- package/types/lib/parsers/largeJson.d.ts +4 -3
- package/types/lib/parsers/largeJson.d.ts.map +1 -1
- package/types/lib/parsers/vscodeExtensionId.d.ts +48 -0
- package/types/lib/parsers/vscodeExtensionId.d.ts.map +1 -0
- package/types/lib/server/server.d.ts.map +1 -1
- package/types/lib/stages/postgen/postgen.d.ts +7 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -1
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -1
- package/types/lib/stages/postgen/specVersionCompat.d.ts +25 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -1
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -1
- package/types/lib/stages/pregen/pregen.d.ts +12 -8
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -1
- package/types/lib/validator/bomValidator.d.ts +5 -1
- package/types/lib/validator/bomValidator.d.ts.map +1 -1
- package/types/lib/validator/complianceEngine.d.ts +4 -4
- package/types/lib/validator/complianceEngine.d.ts.map +1 -1
- package/types/lib/validator/complianceRules.d.ts +14 -2
- package/types/lib/validator/complianceRules.d.ts.map +1 -1
- package/types/lib/validator/index.d.ts +10 -0
- package/types/lib/validator/index.d.ts.map +1 -1
- package/types/lib/validator/reporters/json.d.ts.map +1 -1
package/bin/convert.js
CHANGED
|
@@ -20,9 +20,16 @@ import {
|
|
|
20
20
|
} from "../lib/helpers/exportUtils.js";
|
|
21
21
|
import {
|
|
22
22
|
getNonCycloneDxErrorMessage,
|
|
23
|
+
isCycloneDx20SpecVersion,
|
|
23
24
|
isCycloneDxBom,
|
|
24
25
|
toCycloneDxSpecVersionString,
|
|
25
26
|
} from "../lib/inventory/bomUtils.js";
|
|
27
|
+
import {
|
|
28
|
+
CDX20_INTERNAL_SECTIONS_KEY,
|
|
29
|
+
loadBomForAnalysis,
|
|
30
|
+
renderCycloneDx20WithReport,
|
|
31
|
+
} from "../lib/inventory/cyclonedx20.js";
|
|
32
|
+
import { hardwareRenderContext } from "../lib/inventory/hbomLoader.js";
|
|
26
33
|
import {
|
|
27
34
|
importProtobomModule,
|
|
28
35
|
isProtoBomPath,
|
|
@@ -31,13 +38,19 @@ import { sortBomCollections } from "../lib/stages/postgen/sortBom.js";
|
|
|
31
38
|
import { convertCycloneDxToSpdx } from "../lib/stages/postgen/spdxConverter.js";
|
|
32
39
|
import {
|
|
33
40
|
applySpecVersionCompatibility,
|
|
34
|
-
|
|
41
|
+
diffMissingLeafValues,
|
|
42
|
+
diffRemovedFieldPaths,
|
|
35
43
|
} from "../lib/stages/postgen/specVersionCompat.js";
|
|
36
44
|
import { validateBom, validateSpdx } from "../lib/validator/bomValidator.js";
|
|
37
45
|
|
|
38
46
|
// cdxgen bundles CycloneDX JSON schemas for these versions only, so a
|
|
39
47
|
// conversion to any other version is written without a schema check.
|
|
40
48
|
const VALIDATABLE_SPEC_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
|
|
49
|
+
// The 2.0 renderer reads the 1.x model of these versions; older input has
|
|
50
|
+
// shapes it does not convert (a 1.5 tools array, a single identity object).
|
|
51
|
+
const CDX20_SOURCE_SPEC_VERSIONS = new Set(["1.6", "1.7", "2.0"]);
|
|
52
|
+
// Longest value printed for a missing 2.0 leaf; the comparison uses all of it.
|
|
53
|
+
const MAX_PRINTED_LEAF_LENGTH = 160;
|
|
41
54
|
|
|
42
55
|
const _yargs = yargs(hideBin(process.argv));
|
|
43
56
|
|
|
@@ -55,7 +68,7 @@ const args = _yargs
|
|
|
55
68
|
.option("to", {
|
|
56
69
|
default: "spdx",
|
|
57
70
|
description:
|
|
58
|
-
"Conversion target. 'spdx' exports SPDX 3.0.1 JSON-LD. A CycloneDX spec version (1.5, 1.6, 1.7) cross-converts the BOM to that version instead.",
|
|
71
|
+
"Conversion target. 'spdx' exports SPDX 3.0.1 JSON-LD. A CycloneDX spec version (1.5, 1.6, 1.7, 2.0) cross-converts the BOM to that version instead.",
|
|
59
72
|
})
|
|
60
73
|
.option("validate", {
|
|
61
74
|
type: "boolean",
|
|
@@ -63,6 +76,12 @@ const args = _yargs
|
|
|
63
76
|
description:
|
|
64
77
|
"Validate the converted output against its schema. Pass --no-validate to skip.",
|
|
65
78
|
})
|
|
79
|
+
.option("fail-on-loss", {
|
|
80
|
+
type: "boolean",
|
|
81
|
+
default: false,
|
|
82
|
+
description:
|
|
83
|
+
"Exit 2, without writing the output, when the conversion loses data: a CycloneDX 2.0 input's read losses for a 1.x or SPDX target, values the 2.0 render drops, or field paths the target version does not define.",
|
|
84
|
+
})
|
|
66
85
|
.option("json-pretty", {
|
|
67
86
|
type: "boolean",
|
|
68
87
|
default: false,
|
|
@@ -116,10 +135,11 @@ const targetSpecVersion = toCycloneDxSpecVersionString(args.to);
|
|
|
116
135
|
const isSpdxTarget = `${args.to}`.trim().toLowerCase() === "spdx";
|
|
117
136
|
if (!isSpdxTarget && !targetSpecVersion) {
|
|
118
137
|
console.error(
|
|
119
|
-
`Unsupported conversion target '${args.to}'. Pass --to spdx for an SPDX 3.0.1 export, or a CycloneDX spec version such as 1.5, 1.6, or
|
|
138
|
+
`Unsupported conversion target '${args.to}'. Pass --to spdx for an SPDX 3.0.1 export, or a CycloneDX spec version such as 1.5, 1.6, 1.7 or 2.0.`,
|
|
120
139
|
);
|
|
121
140
|
process.exit(1);
|
|
122
141
|
}
|
|
142
|
+
const isCdx20Target = !isSpdxTarget && targetSpecVersion === "2.0";
|
|
123
143
|
|
|
124
144
|
const bomJson = await loadCycloneDxBom(args.input);
|
|
125
145
|
|
|
@@ -127,17 +147,66 @@ if (!isCycloneDxBom(bomJson)) {
|
|
|
127
147
|
console.error(getNonCycloneDxErrorMessage(bomJson, "cdx-convert"));
|
|
128
148
|
process.exit(1);
|
|
129
149
|
}
|
|
130
|
-
|
|
150
|
+
// A 2.0 input reads into the 1.x-shaped internal model first; the losses say
|
|
151
|
+
// what of the input that model (and so any 1.x or SPDX output) cannot hold.
|
|
152
|
+
let analysis;
|
|
153
|
+
try {
|
|
154
|
+
analysis = loadBomForAnalysis(bomJson);
|
|
155
|
+
} catch (err) {
|
|
156
|
+
console.error(`cdx-convert: ${args.input}: ${err.message}`);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
const { internalBom, losses } = analysis;
|
|
160
|
+
const isCdx20Input =
|
|
161
|
+
isCycloneDx20SpecVersion(bomJson?.specVersion) || !!bomJson?.specFormat;
|
|
162
|
+
const cdxSpecVersion = isCdx20Input
|
|
163
|
+
? "2.0"
|
|
164
|
+
: toCycloneDxSpecVersionString(bomJson?.specVersion);
|
|
165
|
+
if (isCdx20Target && !CDX20_SOURCE_SPEC_VERSIONS.has(cdxSpecVersion)) {
|
|
166
|
+
console.error(
|
|
167
|
+
`cdx-convert --to 2.0 reads CycloneDX 1.6, 1.7 or 2.0 input, and '${args.input}' is CycloneDX ${bomJson?.specVersion ?? "(no specVersion)"}. Convert it with --to 1.7 first, then convert that file to 2.0.`,
|
|
168
|
+
);
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
// Every loss is printed, whatever the target; --fail-on-loss counts the ones
|
|
173
|
+
// the output really lacks.
|
|
174
|
+
let lostCount = 0;
|
|
175
|
+
if (losses.length) {
|
|
176
|
+
const targetLabel = isSpdxTarget
|
|
177
|
+
? "the SPDX 3.0.1 export lacks what they name"
|
|
178
|
+
: isCdx20Target
|
|
179
|
+
? "the 2.0 output keeps what the read model carries for 2.0, and any difference is reported below"
|
|
180
|
+
: `the CycloneDX ${targetSpecVersion} output lacks what they name`;
|
|
181
|
+
console.warn(
|
|
182
|
+
`Reading the CycloneDX 2.0 input into cdxgen's 1.x model reported ${losses.length} loss(es); ${targetLabel}:`,
|
|
183
|
+
);
|
|
184
|
+
for (const loss of losses) {
|
|
185
|
+
console.warn(` - ${loss.pointer || "(root)"}: ${loss.reason}`);
|
|
186
|
+
}
|
|
187
|
+
if (!isCdx20Target) {
|
|
188
|
+
lostCount += losses.length;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
const failIfLost = () => {
|
|
192
|
+
if (args.failOnLoss && lostCount > 0) {
|
|
193
|
+
console.error(
|
|
194
|
+
`--fail-on-loss is set and the conversion lost data (${lostCount} loss(es) above).`,
|
|
195
|
+
);
|
|
196
|
+
process.exit(2);
|
|
197
|
+
}
|
|
198
|
+
};
|
|
131
199
|
|
|
132
200
|
if (isSpdxTarget) {
|
|
133
|
-
if (!["1.6", "1.7"].includes(cdxSpecVersion)) {
|
|
201
|
+
if (!["1.6", "1.7", "2.0"].includes(cdxSpecVersion)) {
|
|
134
202
|
console.error(
|
|
135
|
-
`Unsupported CycloneDX specVersion '${bomJson?.specVersion}'. cdx-convert
|
|
203
|
+
`Unsupported CycloneDX specVersion '${bomJson?.specVersion}'. cdx-convert supports CycloneDX 1.6, 1.7 and 2.0 input and exports SPDX 3.0.1.`,
|
|
136
204
|
);
|
|
137
205
|
process.exit(1);
|
|
138
206
|
}
|
|
207
|
+
failIfLost();
|
|
139
208
|
|
|
140
|
-
const spdxJson = convertCycloneDxToSpdx(
|
|
209
|
+
const spdxJson = convertCycloneDxToSpdx(internalBom, args);
|
|
141
210
|
if (!spdxJson) {
|
|
142
211
|
console.error("Conversion failed: unable to generate SPDX output.");
|
|
143
212
|
process.exit(1);
|
|
@@ -167,24 +236,79 @@ if (isSpdxTarget) {
|
|
|
167
236
|
|
|
168
237
|
// The same normalizer the postgen stage applies to freshly generated BOMs, so
|
|
169
238
|
// `cdx-convert --to 1.6` and `cdxgen --spec-version 1.6` agree on the result.
|
|
170
|
-
const
|
|
171
|
-
|
|
172
|
-
specVersion: targetSpecVersion,
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
.
|
|
179
|
-
.
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
239
|
+
const convertedModel = applySpecVersionCompatibility(
|
|
240
|
+
structuredClone(internalBom),
|
|
241
|
+
{ specVersion: targetSpecVersion },
|
|
242
|
+
);
|
|
243
|
+
let convertedBomJson = convertedModel;
|
|
244
|
+
if (isCdx20Target) {
|
|
245
|
+
// A 1.6/1.7 input is sorted, as postProcess sorts before its render, so
|
|
246
|
+
// `cdx-convert --to 2.0` and `cdxgen --spec-version 2.0` agree on the
|
|
247
|
+
// order. A 2.0 input keeps its own order: sorting would reorder the
|
|
248
|
+
// objects the read model keeps as 2.0 originals, and they would no
|
|
249
|
+
// longer render back unchanged.
|
|
250
|
+
if (!isCdx20Input) {
|
|
251
|
+
sortBomCollections(convertedModel);
|
|
252
|
+
}
|
|
253
|
+
// The optional cdx-hbom hardware mapper, as cdxgen --spec-version 2.0
|
|
254
|
+
// uses it, so both render an HBOM the same way.
|
|
255
|
+
const { bomJson: rendered, report } = renderCycloneDx20WithReport(
|
|
256
|
+
convertedModel,
|
|
257
|
+
await hardwareRenderContext(convertedModel),
|
|
258
|
+
);
|
|
259
|
+
convertedBomJson = rendered;
|
|
260
|
+
const dropLabels = Object.keys(report.drops);
|
|
261
|
+
const dropCount = dropLabels.reduce(
|
|
262
|
+
(sum, label) => sum + report.drops[label],
|
|
263
|
+
0,
|
|
183
264
|
);
|
|
184
|
-
|
|
185
|
-
console.warn(
|
|
265
|
+
if (dropCount) {
|
|
266
|
+
console.warn(
|
|
267
|
+
`Rendering CycloneDX 2.0 dropped ${dropCount} value(s) the 2.0 format has no place for:`,
|
|
268
|
+
);
|
|
269
|
+
for (const label of dropLabels) {
|
|
270
|
+
console.warn(` - ${label} ×${report.drops[label]}`);
|
|
271
|
+
}
|
|
272
|
+
lostCount += dropCount;
|
|
273
|
+
}
|
|
274
|
+
if (isCdx20Input) {
|
|
275
|
+
// The read model carries 2.0-only content for 2.0 output, so a 2.0 to
|
|
276
|
+
// 2.0 conversion loses only what is missing from the output.
|
|
277
|
+
const missing = diffMissingLeafValues(bomJson, convertedBomJson);
|
|
278
|
+
if (missing.length) {
|
|
279
|
+
console.warn(
|
|
280
|
+
`The CycloneDX 2.0 output lacks ${missing.length} value(s) of the input (member order ignored):`,
|
|
281
|
+
);
|
|
282
|
+
for (const leaf of missing) {
|
|
283
|
+
console.warn(
|
|
284
|
+
` - ${leaf.length > MAX_PRINTED_LEAF_LENGTH ? `${leaf.slice(0, MAX_PRINTED_LEAF_LENGTH)}…` : leaf}`,
|
|
285
|
+
);
|
|
286
|
+
}
|
|
287
|
+
lostCount += missing.length;
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
} else {
|
|
291
|
+
sortBomCollections(convertedBomJson);
|
|
292
|
+
const removedFieldPaths = diffRemovedFieldPaths(
|
|
293
|
+
internalBom,
|
|
294
|
+
convertedBomJson,
|
|
295
|
+
)
|
|
296
|
+
// The internal sections key is a transport detail of the 1.x model,
|
|
297
|
+
// not a document field, so it never counts as dropped data.
|
|
298
|
+
.filter(
|
|
299
|
+
(fieldPath) => !fieldPath.startsWith(CDX20_INTERNAL_SECTIONS_KEY),
|
|
300
|
+
);
|
|
301
|
+
if (removedFieldPaths.length) {
|
|
302
|
+
console.warn(
|
|
303
|
+
`Converting to CycloneDX ${targetSpecVersion} dropped ${removedFieldPaths.length} field path(s) that version does not define:`,
|
|
304
|
+
);
|
|
305
|
+
for (const fieldPath of removedFieldPaths) {
|
|
306
|
+
console.warn(` - ${fieldPath}`);
|
|
307
|
+
}
|
|
308
|
+
lostCount += removedFieldPaths.length;
|
|
186
309
|
}
|
|
187
310
|
}
|
|
311
|
+
failIfLost();
|
|
188
312
|
|
|
189
313
|
if (args.validate) {
|
|
190
314
|
if (VALIDATABLE_SPEC_VERSIONS.has(targetSpecVersion)) {
|
package/bin/evinse.js
CHANGED
|
@@ -12,12 +12,16 @@ import { safeExistsSync } from "../lib/ecosystems/utils.js";
|
|
|
12
12
|
import {
|
|
13
13
|
analyzeProject,
|
|
14
14
|
createEvinseFile,
|
|
15
|
+
loadEvinseInputBom,
|
|
15
16
|
prepareDB,
|
|
17
|
+
reportEvinseInputLosses,
|
|
16
18
|
} from "../lib/evinser/evinser.js";
|
|
17
19
|
import {
|
|
18
20
|
getNonCycloneDxErrorMessage,
|
|
21
|
+
isCycloneDx20SpecVersion,
|
|
19
22
|
isCycloneDxBom,
|
|
20
23
|
} from "../lib/inventory/bomUtils.js";
|
|
24
|
+
import { loadBomForAnalysis } from "../lib/inventory/cyclonedx20.js";
|
|
21
25
|
import {
|
|
22
26
|
printCallStack,
|
|
23
27
|
printOccurrences,
|
|
@@ -269,6 +273,9 @@ const args = yargs(hideBin(process.argv))
|
|
|
269
273
|
description: "Use an existing usages slices file.",
|
|
270
274
|
default: "usages.slices.json",
|
|
271
275
|
})
|
|
276
|
+
.option("callsites-slices-file", {
|
|
277
|
+
description: "Use an existing callsites slices file (JS/TS).",
|
|
278
|
+
})
|
|
272
279
|
.option("scalasem-command", {
|
|
273
280
|
description:
|
|
274
281
|
"Use a specific scalasem script for Scala evidence analysis. Defaults to SCALASEM_CMD.",
|
|
@@ -360,6 +367,22 @@ function ensureCycloneDxInput(inputFile) {
|
|
|
360
367
|
}
|
|
361
368
|
}
|
|
362
369
|
ensureCycloneDxInput(args.input);
|
|
370
|
+
// A CycloneDX 2.0 input is read into the 1.x internal model once, here. The
|
|
371
|
+
// model goes to prepareDB, analyzeProject and createEvinseFile as
|
|
372
|
+
// `inputBomJson`, so the analysis works on the 1.x shape, and the evinser's
|
|
373
|
+
// postProcess pass writes the result back at 2.0.
|
|
374
|
+
if (safeExistsSync(args.input)) {
|
|
375
|
+
try {
|
|
376
|
+
const { bomJson: inputBom, losses } = loadEvinseInputBom(args);
|
|
377
|
+
if (isCycloneDx20SpecVersion(inputBom?.specVersion)) {
|
|
378
|
+
args.specVersion = "2.0";
|
|
379
|
+
args.inputBomJson = inputBom;
|
|
380
|
+
reportEvinseInputLosses(losses);
|
|
381
|
+
}
|
|
382
|
+
} catch {
|
|
383
|
+
// ensureCycloneDxInput already reported the parse failure.
|
|
384
|
+
}
|
|
385
|
+
}
|
|
363
386
|
(async () => {
|
|
364
387
|
// First, prepare the database by cataloging jars and other libraries
|
|
365
388
|
const dbObjMap = await prepareDB(args);
|
|
@@ -373,10 +396,12 @@ ensureCycloneDxInput(args.input);
|
|
|
373
396
|
process.exit(1);
|
|
374
397
|
}
|
|
375
398
|
if (args.print) {
|
|
376
|
-
|
|
377
|
-
|
|
399
|
+
// The print helpers walk the 1.x shape; a 2.0 result is read back.
|
|
400
|
+
const printBom = loadBomForAnalysis(bomJson).internalBom;
|
|
401
|
+
printOccurrences(printBom);
|
|
402
|
+
printCallStack(printBom);
|
|
378
403
|
printReachables(sliceArtefacts);
|
|
379
|
-
printServices(
|
|
404
|
+
printServices(printBom);
|
|
380
405
|
}
|
|
381
406
|
}
|
|
382
407
|
})();
|
package/bin/repl.js
CHANGED
|
@@ -10,6 +10,7 @@ import jsonata from "jsonata";
|
|
|
10
10
|
|
|
11
11
|
import { createBom } from "../lib/cli/index.js";
|
|
12
12
|
import { readEnvironmentVariable } from "../lib/core/activity.js";
|
|
13
|
+
import { thoughtLog } from "../lib/core/logger.js";
|
|
13
14
|
import {
|
|
14
15
|
getTmpDir,
|
|
15
16
|
isDryRun,
|
|
@@ -19,6 +20,11 @@ import {
|
|
|
19
20
|
safeWriteSync,
|
|
20
21
|
} from "../lib/ecosystems/utils.js";
|
|
21
22
|
import { isSpdxJsonLd } from "../lib/inventory/bomUtils.js";
|
|
23
|
+
import {
|
|
24
|
+
formatReadLossNotice,
|
|
25
|
+
loadBomForAnalysis,
|
|
26
|
+
renderCycloneDx20,
|
|
27
|
+
} from "../lib/inventory/cyclonedx20.js";
|
|
22
28
|
import {
|
|
23
29
|
printAiBomDatasets,
|
|
24
30
|
printAiBomInsights,
|
|
@@ -89,6 +95,20 @@ if (readEnvironmentVariable("CDXGEN_NODE_OPTIONS")) {
|
|
|
89
95
|
|
|
90
96
|
// The current sbom is stored here
|
|
91
97
|
let sbom;
|
|
98
|
+
// For an imported CycloneDX 2.0 document, `sbom` holds the 1.x-shaped model
|
|
99
|
+
// the pivots read. `sbomIs20` says the BOM is a 2.0 one, so .validate and
|
|
100
|
+
// .save work with 2.0 documents; `importedBom20` keeps the document as read
|
|
101
|
+
// until .update changes the model.
|
|
102
|
+
let sbomIs20 = false;
|
|
103
|
+
let importedBom20;
|
|
104
|
+
|
|
105
|
+
/** The current BOM as a document: the 2.0 one for a 2.0 import. */
|
|
106
|
+
const getBomDocument = () => {
|
|
107
|
+
if (!sbomIs20) {
|
|
108
|
+
return sbom;
|
|
109
|
+
}
|
|
110
|
+
return importedBom20 ?? renderCycloneDx20(sbom);
|
|
111
|
+
};
|
|
92
112
|
const getInteractiveBom = () => toCycloneDxLikeBom(sbom);
|
|
93
113
|
|
|
94
114
|
function getContainerRegistryHost(reference) {
|
|
@@ -427,7 +447,20 @@ export const importSbom = async (sbomOrPath) => {
|
|
|
427
447
|
}
|
|
428
448
|
if (importTarget.endsWith(".json") && safeExistsSync(importTarget)) {
|
|
429
449
|
try {
|
|
430
|
-
|
|
450
|
+
const importedBom = JSON.parse(readFileSync(importTarget, "utf-8"));
|
|
451
|
+
// A CycloneDX 2.0 document is read into the 1.x internal model so the
|
|
452
|
+
// pivots below keep working; the number of read losses is noted once.
|
|
453
|
+
const { internalBom, losses, specVersion } =
|
|
454
|
+
loadBomForAnalysis(importedBom);
|
|
455
|
+
sbom = internalBom;
|
|
456
|
+
sbomIs20 = specVersion === "2.0" && internalBom !== importedBom;
|
|
457
|
+
importedBom20 = sbomIs20 ? importedBom : undefined;
|
|
458
|
+
if (losses.length) {
|
|
459
|
+
console.log(`ℹ ${formatReadLossNotice(losses)}`);
|
|
460
|
+
for (const loss of losses) {
|
|
461
|
+
thoughtLog(`cdxi 2.0 loss at ${loss.pointer}: ${loss.reason}`);
|
|
462
|
+
}
|
|
463
|
+
}
|
|
431
464
|
let bomType = "SBOM";
|
|
432
465
|
if (isSpdxJsonLd(sbom)) {
|
|
433
466
|
bomType = "SPDX";
|
|
@@ -473,10 +506,14 @@ export const importSbom = async (sbomOrPath) => {
|
|
|
473
506
|
"protobuf BOM input",
|
|
474
507
|
);
|
|
475
508
|
sbom = readBinary(importTarget, true);
|
|
509
|
+
sbomIs20 = false;
|
|
510
|
+
importedBom20 = undefined;
|
|
476
511
|
printSummary(sbom);
|
|
477
512
|
} else if (isSupportedSbomRegistryReference(importTarget)) {
|
|
478
513
|
try {
|
|
479
514
|
sbom = await getBomWithOras(importTarget);
|
|
515
|
+
sbomIs20 = false;
|
|
516
|
+
importedBom20 = undefined;
|
|
480
517
|
if (sbom) {
|
|
481
518
|
printSummary(sbom);
|
|
482
519
|
} else {
|
|
@@ -557,6 +594,8 @@ cdxgenRepl.defineCommand("create", {
|
|
|
557
594
|
});
|
|
558
595
|
if (bomNSData) {
|
|
559
596
|
sbom = bomNSData.bomJson;
|
|
597
|
+
sbomIs20 = false;
|
|
598
|
+
importedBom20 = undefined;
|
|
560
599
|
console.log("✅ BOM imported successfully.");
|
|
561
600
|
console.log("💭 Type .print to view the BOM as a table");
|
|
562
601
|
console.log(
|
|
@@ -1381,7 +1420,8 @@ cdxgenRepl.defineCommand("validate", {
|
|
|
1381
1420
|
help: "validate the bom using jsonschema",
|
|
1382
1421
|
action() {
|
|
1383
1422
|
if (sbom) {
|
|
1384
|
-
|
|
1423
|
+
// A 2.0 import is validated as the 2.0 document, not as the model.
|
|
1424
|
+
validateBom(getBomDocument()).then((result) => {
|
|
1385
1425
|
if (result) {
|
|
1386
1426
|
console.log("BOM is valid!");
|
|
1387
1427
|
}
|
|
@@ -1408,7 +1448,9 @@ cdxgenRepl.defineCommand("save", {
|
|
|
1408
1448
|
this.displayPrompt();
|
|
1409
1449
|
return;
|
|
1410
1450
|
}
|
|
1411
|
-
|
|
1451
|
+
// A 2.0 import is saved as a 2.0 document rendered from the model.
|
|
1452
|
+
const document = sbomIs20 ? renderCycloneDx20(sbom) : sbom;
|
|
1453
|
+
safeWriteSync(saveToFile, JSON.stringify(document, null, 2));
|
|
1412
1454
|
console.log(`BOM saved successfully to ${saveToFile}`);
|
|
1413
1455
|
} else {
|
|
1414
1456
|
console.log(
|
|
@@ -1436,6 +1478,8 @@ cdxgenRepl.defineCommand("update", {
|
|
|
1436
1478
|
const newSbom = await expression.evaluate(sbom);
|
|
1437
1479
|
if (newSbom && newSbom.components.length <= sbom.components.length) {
|
|
1438
1480
|
sbom = newSbom;
|
|
1481
|
+
// The model changed, so a 2.0 import is rendered again on use.
|
|
1482
|
+
importedBom20 = undefined;
|
|
1439
1483
|
}
|
|
1440
1484
|
console.log("BOM updated successfully.");
|
|
1441
1485
|
} else {
|