@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,142 @@
|
|
|
1
|
+
import { Console } from "node:console";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
|
|
5
|
+
// Environment variables here are read with raw `process.env` rather than
|
|
6
|
+
// `readEnvironmentVariable`: that helper lives in activity.js, which imports
|
|
7
|
+
// this module, so routing these through it would form an import cycle.
|
|
8
|
+
|
|
9
|
+
// Stream contract: human-readable diagnostics default to stderr so stdout
|
|
10
|
+
// carries only the BOM payload. CDXGEN_LOG_STREAM=stdout restores the
|
|
11
|
+
// pre-v13 behaviour for callers that scraped cdxgen's stdout.
|
|
12
|
+
const logStream =
|
|
13
|
+
process.env.CDXGEN_LOG_STREAM === "stdout" ? process.stdout : process.stderr;
|
|
14
|
+
|
|
15
|
+
// Custom lightweight colors formatting helper replacing yoctocolors
|
|
16
|
+
const colors = {
|
|
17
|
+
cyanBright: (text) => `\x1b[96m${text}\x1b[39m`,
|
|
18
|
+
dim: (text) => `\x1b[2m${text}\x1b[22m`,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/** True when thought/reasoning logging is enabled (CDXGEN_THOUGHT_LOG, CDXGEN_THINK_MODE, or verbose debug mode). */
|
|
22
|
+
export const THINK_MODE =
|
|
23
|
+
process.env.CDXGEN_THOUGHT_LOG ||
|
|
24
|
+
["true", "1"].includes(process.env.CDXGEN_THINK_MODE) ||
|
|
25
|
+
process.env.CDXGEN_DEBUG_MODE === "verbose";
|
|
26
|
+
|
|
27
|
+
const thinkOutput = process.env.CDXGEN_THOUGHT_LOG
|
|
28
|
+
? fs.createWriteStream(process.env.CDXGEN_THOUGHT_LOG)
|
|
29
|
+
: logStream;
|
|
30
|
+
const thinkErrorOutput = process.env.CDXGEN_THOUGHT_LOG
|
|
31
|
+
? fs.createWriteStream(process.env.CDXGEN_THOUGHT_LOG)
|
|
32
|
+
: process.stderr;
|
|
33
|
+
const thinkLogger = new Console({
|
|
34
|
+
stdout: thinkOutput,
|
|
35
|
+
stderr: thinkErrorOutput,
|
|
36
|
+
colorMode: process.env.CDXGEN_THOUGHT_LOG ? false : "auto",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/** True when structured command/HTTP trace logging is enabled (CDXGEN_TRACE_LOG, CDXGEN_TRACE_ID, CDXGEN_TRACE_MODE, or verbose debug mode). */
|
|
40
|
+
export const TRACE_MODE =
|
|
41
|
+
process.env.CDXGEN_TRACE_LOG ||
|
|
42
|
+
process.env.CDXGEN_TRACE_ID ||
|
|
43
|
+
["true", "1"].includes(process.env.CDXGEN_TRACE_MODE) ||
|
|
44
|
+
process.env.CDXGEN_DEBUG_MODE === "verbose";
|
|
45
|
+
|
|
46
|
+
const traceOutput = process.env.CDXGEN_TRACE_LOG
|
|
47
|
+
? fs.createWriteStream(process.env.CDXGEN_TRACE_LOG)
|
|
48
|
+
: logStream;
|
|
49
|
+
const traceErrorOutput = process.env.CDXGEN_TRACE_LOG
|
|
50
|
+
? fs.createWriteStream(process.env.CDXGEN_TRACE_LOG)
|
|
51
|
+
: process.stderr;
|
|
52
|
+
const traceLogger = new Console({
|
|
53
|
+
stdout: traceOutput,
|
|
54
|
+
stderr: traceErrorOutput,
|
|
55
|
+
colorMode: process.env.CDXGEN_TRACE_LOG ? false : "auto",
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
if (THINK_MODE) {
|
|
59
|
+
thinkLogger.group(colorizeText("<think>"));
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Logs a thought message to the think logger if THINK_MODE is enabled.
|
|
63
|
+
* Automatically appends a period to the message if it lacks terminal punctuation.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} s The thought message to log
|
|
66
|
+
* @param {Object} [args] Optional additional arguments to log alongside the message
|
|
67
|
+
* @returns {void}
|
|
68
|
+
*/
|
|
69
|
+
export function thoughtLog(s, args) {
|
|
70
|
+
if (!THINK_MODE) {
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
if (!s?.endsWith(".") && !s?.endsWith("?") && !s?.endsWith("!")) {
|
|
74
|
+
s = `${s}.`;
|
|
75
|
+
}
|
|
76
|
+
s = s.replaceAll("'.'", "'<project dir>'");
|
|
77
|
+
if (args) {
|
|
78
|
+
thinkLogger.log(colorizeText(`${s}`), args);
|
|
79
|
+
} else {
|
|
80
|
+
thinkLogger.log(colorizeText(`${s}`));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Closes the think log group by emitting the closing `</think>` marker.
|
|
85
|
+
* Has no effect if THINK_MODE is not enabled.
|
|
86
|
+
*
|
|
87
|
+
* @returns {void}
|
|
88
|
+
*/
|
|
89
|
+
export function thoughtEnd() {
|
|
90
|
+
if (THINK_MODE) {
|
|
91
|
+
thinkLogger.groupEnd();
|
|
92
|
+
thinkLogger.log(colorizeText("</think>"));
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function colorizeText(s) {
|
|
97
|
+
// Only colorize for an interactive terminal stream; piped/CI/file output
|
|
98
|
+
// stays free of escape bytes so the diagnostic stream is grep-safe.
|
|
99
|
+
if (process.env.CDXGEN_THOUGHT_LOG || !logStream.isTTY) {
|
|
100
|
+
return s;
|
|
101
|
+
}
|
|
102
|
+
s = s.replace(/(\d+)/g, colors.cyanBright("$1"));
|
|
103
|
+
return colors.dim(s);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Log trace messages
|
|
108
|
+
*
|
|
109
|
+
* @param {String} traceType Trace type
|
|
110
|
+
* @param {Object} args Additional arguments
|
|
111
|
+
*/
|
|
112
|
+
export function traceLog(traceType, args) {
|
|
113
|
+
if (!TRACE_MODE || !traceType || !args) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const traceId = process.env.CDXGEN_TRACE_ID;
|
|
117
|
+
const message = {};
|
|
118
|
+
if (traceId) {
|
|
119
|
+
message.traceId = traceId;
|
|
120
|
+
}
|
|
121
|
+
message["timestamp"] = new Date().toISOString();
|
|
122
|
+
if (traceType) {
|
|
123
|
+
message.type = traceType;
|
|
124
|
+
}
|
|
125
|
+
if (args) {
|
|
126
|
+
for (const k of [
|
|
127
|
+
"command",
|
|
128
|
+
"cwd",
|
|
129
|
+
"protocol",
|
|
130
|
+
"host",
|
|
131
|
+
"path",
|
|
132
|
+
"pathname",
|
|
133
|
+
]) {
|
|
134
|
+
if (args[k]) {
|
|
135
|
+
message[k] = args[k];
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
if (Object.keys(message).length) {
|
|
140
|
+
traceLogger.log(JSON.stringify(message, null, null));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded concurrency utilities for CPU-bound and I/O-bound parallel work.
|
|
3
|
+
*
|
|
4
|
+
* Two primitives live here:
|
|
5
|
+
*
|
|
6
|
+
* - {@link mapWithConcurrency} — a promise pool for async I/O work (file
|
|
7
|
+
* hashing, registry fetches). Tasks are async; results preserve input order.
|
|
8
|
+
*
|
|
9
|
+
* - {@link mapInWorkers} — a worker-thread pool for synchronous CPU work (AST
|
|
10
|
+
* parsing). Below a configurable threshold tasks run inline; above it they
|
|
11
|
+
* are distributed across `worker_threads` workers. Any failure of the thread
|
|
12
|
+
* machinery itself — an unavailable `worker_threads`, a worker entry that
|
|
13
|
+
* will not load, a worker that dies mid-task — falls back to running the
|
|
14
|
+
* remaining tasks inline, so the result is the same whether or not threads
|
|
15
|
+
* were usable.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { availableParallelism } from "node:os";
|
|
19
|
+
|
|
20
|
+
import { readEnvironmentVariable } from "./activity.js";
|
|
21
|
+
|
|
22
|
+
const _isDeno = globalThis.Deno?.version?.deno !== undefined;
|
|
23
|
+
const _isBun = globalThis.Bun?.version !== undefined;
|
|
24
|
+
|
|
25
|
+
const DEFAULT_HASH_CONCURRENCY = Math.min(
|
|
26
|
+
Math.max(availableParallelism(), 4),
|
|
27
|
+
16,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const WORKER_THRESHOLD = Number.parseInt(
|
|
31
|
+
readEnvironmentVariable("CDXGEN_WORKER_THRESHOLD") || "24",
|
|
32
|
+
10,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const MAX_WORKERS = Number.parseInt(
|
|
36
|
+
readEnvironmentVariable("CDXGEN_MAX_WORKERS") ||
|
|
37
|
+
String(Math.min(availableParallelism() || 4, 8)),
|
|
38
|
+
10,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Run an async mapper over an array with bounded concurrency.
|
|
43
|
+
*
|
|
44
|
+
* Results are placed at their original index so order is preserved regardless
|
|
45
|
+
* of completion order. Below the concurrency limit tasks start immediately;
|
|
46
|
+
* above it they queue in FIFO order.
|
|
47
|
+
*
|
|
48
|
+
* The bound is per call, so two pools running at once can together hold twice
|
|
49
|
+
* the limit open. Every caller today awaits its pool before the next phase
|
|
50
|
+
* begins, so the effective bound is the limit; a caller that starts a pool
|
|
51
|
+
* without awaiting it should pass a smaller `concurrency`.
|
|
52
|
+
*
|
|
53
|
+
* @template T, R
|
|
54
|
+
* @param {Array<T>} items
|
|
55
|
+
* @param {(item: T, index: number) => Promise<R>|R} mapper
|
|
56
|
+
* @param {number} [concurrency]
|
|
57
|
+
* @returns {Promise<Array<R>>}
|
|
58
|
+
*/
|
|
59
|
+
export async function mapWithConcurrency(items, mapper, concurrency) {
|
|
60
|
+
const limit = Math.max(1, concurrency || DEFAULT_HASH_CONCURRENCY);
|
|
61
|
+
const results = new Array(items.length);
|
|
62
|
+
let nextIndex = 0;
|
|
63
|
+
|
|
64
|
+
async function runner() {
|
|
65
|
+
while (true) {
|
|
66
|
+
const i = nextIndex;
|
|
67
|
+
nextIndex++;
|
|
68
|
+
if (i >= items.length) return;
|
|
69
|
+
results[i] = await mapper(items[i], i);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const runners = [];
|
|
74
|
+
for (let i = 0; i < Math.min(limit, items.length); i++) {
|
|
75
|
+
runners.push(runner());
|
|
76
|
+
}
|
|
77
|
+
await Promise.all(runners);
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Maximum number of worker threads the pool will create for a single call.
|
|
83
|
+
*
|
|
84
|
+
* @returns {number}
|
|
85
|
+
*/
|
|
86
|
+
export function getMaxWorkers() {
|
|
87
|
+
return Math.max(1, MAX_WORKERS);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The task count at or above which {@link mapInWorkers} dispatches to threads
|
|
92
|
+
* instead of running inline.
|
|
93
|
+
*
|
|
94
|
+
* @returns {number}
|
|
95
|
+
*/
|
|
96
|
+
export function getWorkerThreshold() {
|
|
97
|
+
return WORKER_THRESHOLD;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let _workerSupported = null;
|
|
101
|
+
let lastWorkerCount = 0;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Workers created by the most recent {@link mapInWorkers} call. Scoped to that
|
|
105
|
+
* one call rather than to the process, so a batch that ran inline reports 0
|
|
106
|
+
* rather than the widest earlier batch.
|
|
107
|
+
*
|
|
108
|
+
* @returns {number}
|
|
109
|
+
*/
|
|
110
|
+
export function lastWorkerPoolSize() {
|
|
111
|
+
return lastWorkerCount;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function checkWorkerSupport() {
|
|
115
|
+
if (_workerSupported !== null) return _workerSupported;
|
|
116
|
+
if (_isDeno || _isBun) {
|
|
117
|
+
_workerSupported = false;
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await import("node:worker_threads");
|
|
122
|
+
_workerSupported = true;
|
|
123
|
+
} catch {
|
|
124
|
+
_workerSupported = false;
|
|
125
|
+
}
|
|
126
|
+
return _workerSupported;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* A task failed inside a worker, as opposed to the worker itself failing. The
|
|
131
|
+
* two are handled differently: the first belongs to one task, the second means
|
|
132
|
+
* threads cannot be used at all.
|
|
133
|
+
*/
|
|
134
|
+
class TaskError extends Error {}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Apply `inlineFn` to the tasks at the given indices on the calling thread.
|
|
138
|
+
*
|
|
139
|
+
* @template T, R
|
|
140
|
+
* @param {Array<T>} tasks
|
|
141
|
+
* @param {(task: T) => R} inlineFn
|
|
142
|
+
* @param {Array<R|null>} results Filled in place at each index.
|
|
143
|
+
* @param {Iterable<number>} indices
|
|
144
|
+
* @param {boolean} swallowErrors
|
|
145
|
+
* @param {R|null} errorResult
|
|
146
|
+
*/
|
|
147
|
+
function runInline(
|
|
148
|
+
tasks,
|
|
149
|
+
inlineFn,
|
|
150
|
+
results,
|
|
151
|
+
indices,
|
|
152
|
+
swallowErrors,
|
|
153
|
+
errorResult,
|
|
154
|
+
) {
|
|
155
|
+
for (const i of indices) {
|
|
156
|
+
try {
|
|
157
|
+
results[i] = inlineFn(tasks[i]);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
if (!swallowErrors) {
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
162
|
+
results[i] = errorResult;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Run synchronous CPU-bound tasks across worker threads.
|
|
169
|
+
*
|
|
170
|
+
* Below the threshold (default 24), tasks run inline on the calling thread,
|
|
171
|
+
* because starting a worker costs more than a small batch saves. Above it,
|
|
172
|
+
* tasks are distributed to a pool of ephemeral workers that are terminated
|
|
173
|
+
* before the call returns, so a completed scan does not hold the event loop
|
|
174
|
+
* open.
|
|
175
|
+
*
|
|
176
|
+
* Results are always returned in the original task order.
|
|
177
|
+
*
|
|
178
|
+
* Two kinds of failure are distinguished. A task that fails inside the worker
|
|
179
|
+
* is reported by the worker as `{error}` and is treated as that one task
|
|
180
|
+
* failing: it yields `options.errorResult` when `options.swallowErrors` is set,
|
|
181
|
+
* and rejects otherwise. A failure of the thread machinery — `worker_threads`
|
|
182
|
+
* missing, the entry module refusing to load, a worker exiting mid-task — is
|
|
183
|
+
* not a property of any task, so the tasks that had not completed are run
|
|
184
|
+
* inline instead. That keeps the result independent of whether threads were
|
|
185
|
+
* usable, which matters because callers of this function treat an empty result
|
|
186
|
+
* as "nothing found" rather than as an error.
|
|
187
|
+
*
|
|
188
|
+
* @template T, R
|
|
189
|
+
* @param {URL|string} workerUrl - Resolved URL of the worker entry module
|
|
190
|
+
* @param {Array<T>} tasks - Structured-cloneable task descriptors
|
|
191
|
+
* @param {(task: T) => R} inlineFn - Called per task when running inline
|
|
192
|
+
* @param {Object} [options]
|
|
193
|
+
* @param {number} [options.threshold] - Minimum task count to use threads
|
|
194
|
+
* @param {number} [options.maxWorkers] - Cap on thread count
|
|
195
|
+
* @param {boolean} [options.swallowErrors] - Return errorResult instead of rejecting
|
|
196
|
+
* @param {R} [options.errorResult] - Value used when an error is swallowed
|
|
197
|
+
* @returns {Promise<Array<R|null>>}
|
|
198
|
+
*/
|
|
199
|
+
export async function mapInWorkers(workerUrl, tasks, inlineFn, options = {}) {
|
|
200
|
+
const threshold = options.threshold ?? WORKER_THRESHOLD;
|
|
201
|
+
const swallowErrors = Boolean(options.swallowErrors);
|
|
202
|
+
const errorResult = options.errorResult ?? null;
|
|
203
|
+
const results = new Array(tasks.length).fill(null);
|
|
204
|
+
const useWorkers = tasks.length >= threshold && (await checkWorkerSupport());
|
|
205
|
+
|
|
206
|
+
lastWorkerCount = 0;
|
|
207
|
+
if (!useWorkers) {
|
|
208
|
+
runInline(
|
|
209
|
+
tasks,
|
|
210
|
+
inlineFn,
|
|
211
|
+
results,
|
|
212
|
+
tasks.keys(),
|
|
213
|
+
swallowErrors,
|
|
214
|
+
errorResult,
|
|
215
|
+
);
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const maxWorkers = Math.min(options.maxWorkers ?? MAX_WORKERS, tasks.length);
|
|
220
|
+
const done = new Set();
|
|
221
|
+
let nextTask = 0;
|
|
222
|
+
let workersUsable = true;
|
|
223
|
+
|
|
224
|
+
const { Worker } = await import("node:worker_threads");
|
|
225
|
+
const workers = [];
|
|
226
|
+
|
|
227
|
+
function runOnWorker(worker, task) {
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
const cleanup = () => {
|
|
230
|
+
worker.removeListener("message", onMessage);
|
|
231
|
+
worker.removeListener("error", onError);
|
|
232
|
+
worker.removeListener("exit", onExit);
|
|
233
|
+
};
|
|
234
|
+
const onMessage = (msg) => {
|
|
235
|
+
cleanup();
|
|
236
|
+
if (msg?.error) {
|
|
237
|
+
reject(new TaskError(msg.error));
|
|
238
|
+
} else {
|
|
239
|
+
resolve(msg?.result);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
const onError = (err) => {
|
|
243
|
+
cleanup();
|
|
244
|
+
reject(err);
|
|
245
|
+
};
|
|
246
|
+
// A worker can end without ever emitting `error` — it can be terminated,
|
|
247
|
+
// call `process.exit`, or be killed for running out of memory. Without
|
|
248
|
+
// this the pending request would never settle and the scan would hang.
|
|
249
|
+
const onExit = (code) => {
|
|
250
|
+
cleanup();
|
|
251
|
+
reject(new Error(`Worker exited with code ${code} before replying`));
|
|
252
|
+
};
|
|
253
|
+
worker.on("message", onMessage);
|
|
254
|
+
worker.on("error", onError);
|
|
255
|
+
worker.on("exit", onExit);
|
|
256
|
+
worker.postMessage(task);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function workerLoop() {
|
|
261
|
+
let worker;
|
|
262
|
+
try {
|
|
263
|
+
worker = new Worker(workerUrl);
|
|
264
|
+
} catch {
|
|
265
|
+
workersUsable = false;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
workers.push(worker);
|
|
269
|
+
lastWorkerCount = workers.length;
|
|
270
|
+
try {
|
|
271
|
+
while (workersUsable) {
|
|
272
|
+
const i = nextTask;
|
|
273
|
+
nextTask++;
|
|
274
|
+
if (i >= tasks.length) {
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
results[i] = await runOnWorker(worker, tasks[i]);
|
|
279
|
+
done.add(i);
|
|
280
|
+
} catch (err) {
|
|
281
|
+
if (err instanceof TaskError) {
|
|
282
|
+
if (!swallowErrors) {
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
285
|
+
results[i] = errorResult;
|
|
286
|
+
done.add(i);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
// The worker, not the task, failed. Stop the pool and let the
|
|
290
|
+
// caller finish the outstanding tasks inline.
|
|
291
|
+
workersUsable = false;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} finally {
|
|
296
|
+
await worker.terminate().catch(() => {
|
|
297
|
+
/* already exited */
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
const loops = [];
|
|
304
|
+
for (let i = 0; i < maxWorkers; i++) {
|
|
305
|
+
loops.push(workerLoop());
|
|
306
|
+
}
|
|
307
|
+
await Promise.all(loops);
|
|
308
|
+
} finally {
|
|
309
|
+
await Promise.allSettled(workers.map((w) => w.terminate()));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (!workersUsable) {
|
|
313
|
+
const pending = [];
|
|
314
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
315
|
+
if (!done.has(i)) {
|
|
316
|
+
pending.push(i);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
runInline(tasks, inlineFn, results, pending, swallowErrors, errorResult);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return results;
|
|
323
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-root resolution, shared by every helper that loads a file from `data/`.
|
|
3
|
+
*
|
|
4
|
+
* This lives in its own leaf module — importing nothing from `utils.js` — because
|
|
5
|
+
* the value is consumed at *module-evaluation* time (`JSON.parse(readFileSync(
|
|
6
|
+
* join(dirNameStr, "data", …)))`). A module in a cycle with `utils.js` that reads
|
|
7
|
+
* `dirNameStr` while `utils.js` is still evaluating gets the binding in its
|
|
8
|
+
* temporal dead zone and throws `ReferenceError: Cannot access 'dirNameStr'
|
|
9
|
+
* before initialization`. Keeping the definition in a leaf guarantees it is
|
|
10
|
+
* initialized before any consumer runs.
|
|
11
|
+
*
|
|
12
|
+
* The `file://` normalization below is load-bearing, not defensive noise:
|
|
13
|
+
* `jsr.json` publishes `lib/cli/index.js` to JSR, so `import.meta.url` can be an
|
|
14
|
+
* `https://` URL, and `fileURLToPath` throws `ERR_INVALID_URL_SCHEME` on those.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { platform } from "node:os";
|
|
18
|
+
import { dirname } from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
|
|
21
|
+
let url = import.meta?.url;
|
|
22
|
+
if (url && !url.startsWith("file://")) {
|
|
23
|
+
url = new URL(`file://${import.meta.url}`).toString();
|
|
24
|
+
}
|
|
25
|
+
// TODO: verify if this is a good method (Prabhu)
|
|
26
|
+
// this is due to dirNameStr being "cdxgen/lib/helpers" which causes errors
|
|
27
|
+
/** Absolute path to the cdxgen repository root, resolved from the module URL. */
|
|
28
|
+
export const dirNameStr = url
|
|
29
|
+
? dirname(dirname(dirname(fileURLToPath(url))))
|
|
30
|
+
: __dirname;
|
|
31
|
+
|
|
32
|
+
/** True when running on Windows. */
|
|
33
|
+
export const isWin = platform() === "win32";
|
|
34
|
+
/** True when running on macOS. */
|
|
35
|
+
export const isMac = platform() === "darwin";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a string is a Windows drive root such as `C:\`.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} root Candidate drive root string.
|
|
41
|
+
* @returns {boolean} True when the string is a valid Windows drive root.
|
|
42
|
+
*/
|
|
43
|
+
export function isValidDriveRoot(root) {
|
|
44
|
+
if (root.length > 3) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const driveLetter = root.charAt(0);
|
|
48
|
+
const colon = root.charAt(1);
|
|
49
|
+
const backslash = root.charAt(2);
|
|
50
|
+
const charCode = driveLetter.charCodeAt(0);
|
|
51
|
+
const isAsciiLetter =
|
|
52
|
+
(charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122);
|
|
53
|
+
if (!isAsciiLetter) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (colon.charCodeAt(0) !== 0x3a) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return !(backslash && backslash.charCodeAt(0) !== 0x5c);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Convert a kebab-case string to camelCase.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} str Kebab-case input string.
|
|
66
|
+
* @returns {string} camelCase representation of the input.
|
|
67
|
+
*/
|
|
68
|
+
export function toCamel(str) {
|
|
69
|
+
return str.replace(/-([a-z])/g, (_, g) => g.toUpperCase());
|
|
70
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
|
|
3
|
+
import { toCamel } from "./paths.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Config file names cdxgen reads from the directory it is invoked in.
|
|
7
|
+
*/
|
|
8
|
+
export const PROJECT_CONFIG_FILENAMES = [
|
|
9
|
+
".cdxgenrc",
|
|
10
|
+
".cdxgen.json",
|
|
11
|
+
".cdxgen.yml",
|
|
12
|
+
".cdxgen.yaml",
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Options whose values name a file or directory cdxgen writes to or reads
|
|
17
|
+
* from. A config file may set these, but only to a location inside its own
|
|
18
|
+
* directory.
|
|
19
|
+
*/
|
|
20
|
+
const PATH_OPTIONS = new Set([
|
|
21
|
+
"output",
|
|
22
|
+
"evinse-output",
|
|
23
|
+
"proto-bin-file",
|
|
24
|
+
"deps-slices-file",
|
|
25
|
+
"usages-slices-file",
|
|
26
|
+
"data-flow-slices-file",
|
|
27
|
+
"reachables-slices-file",
|
|
28
|
+
"semantics-slices-file",
|
|
29
|
+
"openapi-spec-file",
|
|
30
|
+
"license-policy",
|
|
31
|
+
"bom-audit-rules-dir",
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Options that change where cdxgen sends data or how much of the host it
|
|
36
|
+
* touches. These stay usable, but never silently.
|
|
37
|
+
*/
|
|
38
|
+
const ANNOUNCED_OPTIONS = new Set([
|
|
39
|
+
"server-url",
|
|
40
|
+
"api-key",
|
|
41
|
+
"include-formulation",
|
|
42
|
+
"install-deps",
|
|
43
|
+
"deep",
|
|
44
|
+
"tea-publish",
|
|
45
|
+
"tea-fetch",
|
|
46
|
+
"tea-artifact-url",
|
|
47
|
+
"tea-token",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Both spellings a config file may use for an option.
|
|
52
|
+
*
|
|
53
|
+
* @param {string} option kebab-case option name
|
|
54
|
+
* @returns {string[]} kebab-case and camelCase spellings
|
|
55
|
+
*/
|
|
56
|
+
function optionSpellings(option) {
|
|
57
|
+
const camel = toCamel(option);
|
|
58
|
+
return camel === option ? [option] : [option, camel];
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Determine whether a config-supplied path stays inside the config's own
|
|
63
|
+
* directory.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} configDir directory the config file was read from
|
|
66
|
+
* @param {unknown} value config-supplied path value
|
|
67
|
+
* @returns {boolean} true when the path resolves inside configDir
|
|
68
|
+
*/
|
|
69
|
+
function isContainedPath(configDir, value) {
|
|
70
|
+
if (typeof value !== "string" || !value.length) {
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
const relativePath = path.relative(
|
|
74
|
+
path.resolve(configDir),
|
|
75
|
+
path.resolve(configDir, value),
|
|
76
|
+
);
|
|
77
|
+
return (
|
|
78
|
+
relativePath === "" ||
|
|
79
|
+
(!relativePath.startsWith("..") && !path.isAbsolute(relativePath))
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Apply the trust boundary between cdxgen and the directory it is scanning.
|
|
85
|
+
*
|
|
86
|
+
* A config file lives in the tree under analysis, so it is attacker-controlled
|
|
87
|
+
* whenever that tree is. Path options are therefore confined to the config's
|
|
88
|
+
* own directory - a scanned project may choose where in itself the BOM lands,
|
|
89
|
+
* but not write outside it - and options that redirect data off the host or
|
|
90
|
+
* widen what cdxgen executes are announced on the console.
|
|
91
|
+
*
|
|
92
|
+
* @param {Object} config parsed config file contents
|
|
93
|
+
* @param {string} configDir directory the config file was read from
|
|
94
|
+
* @returns {{config: Object, rejected: string[], announced: string[]}} sanitized config and what it did
|
|
95
|
+
*/
|
|
96
|
+
export function sanitizeProjectConfig(config, configDir) {
|
|
97
|
+
if (!config || typeof config !== "object") {
|
|
98
|
+
return { announced: [], config: {}, rejected: [] };
|
|
99
|
+
}
|
|
100
|
+
const sanitized = { ...config };
|
|
101
|
+
const rejected = [];
|
|
102
|
+
const announced = [];
|
|
103
|
+
for (const option of PATH_OPTIONS) {
|
|
104
|
+
for (const key of optionSpellings(option)) {
|
|
105
|
+
if (sanitized[key] === undefined) {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (!isContainedPath(configDir, sanitized[key])) {
|
|
109
|
+
rejected.push(`${key}=${sanitized[key]}`);
|
|
110
|
+
delete sanitized[key];
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
for (const option of ANNOUNCED_OPTIONS) {
|
|
115
|
+
for (const key of optionSpellings(option)) {
|
|
116
|
+
if (sanitized[key] !== undefined) {
|
|
117
|
+
announced.push(key);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
return { announced, config: sanitized, rejected };
|
|
122
|
+
}
|