@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,730 @@
|
|
|
1
|
+
import { Buffer } from "node:buffer";
|
|
2
|
+
import process from "node:process";
|
|
3
|
+
import { brotliDecompressSync, gunzipSync, inflateSync } from "node:zlib";
|
|
4
|
+
|
|
5
|
+
import {
|
|
6
|
+
Agent,
|
|
7
|
+
EnvHttpProxyAgent,
|
|
8
|
+
interceptors,
|
|
9
|
+
request as undiciRequest,
|
|
10
|
+
} from "undici";
|
|
11
|
+
|
|
12
|
+
// Environment variables here are read with raw `process.env` rather than
|
|
13
|
+
// `readEnvironmentVariable`: that helper lives in activity.js, which imports
|
|
14
|
+
// this module, so routing these through it would form an import cycle.
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A tiny, `got`-compatible HTTP client built on top of undici.
|
|
18
|
+
*
|
|
19
|
+
* cdxgen historically relied on the `got` library. `got` keeps a per-request
|
|
20
|
+
* HTTP cache backed by an EventEmitter which, during large `--deep` scans that
|
|
21
|
+
* issue thousands of parallel license/metadata lookups, leaks "error" listeners
|
|
22
|
+
* and floods the console with `MaxListenersExceededWarning` messages. undici
|
|
23
|
+
* uses a pooled dispatcher and does not exhibit this behaviour.
|
|
24
|
+
*
|
|
25
|
+
* This module intentionally implements only the subset of the `got` surface
|
|
26
|
+
* that cdxgen consumes:
|
|
27
|
+
*
|
|
28
|
+
* - Callable form: `client(url, options)` and the verb helpers `client.get`,
|
|
29
|
+
* `client.post`, `client.put` and `client.head`.
|
|
30
|
+
* - `client.extend(defaults)` to derive a new client with merged defaults.
|
|
31
|
+
* - Request options: `method`, `headers`, `body`, `json`, `responseType`
|
|
32
|
+
* (`"json"` | `"buffer"` | `"text"`), `throwHttpErrors`, `followRedirect`,
|
|
33
|
+
* `timeout` (number of milliseconds or a `got`-style phase object), `retry`
|
|
34
|
+
* (accepted for API compatibility; no automatic retries are performed),
|
|
35
|
+
* `https.rejectUnauthorized` and `context`.
|
|
36
|
+
* - `beforeRequest`, `afterResponse` and `beforeError` hooks with the same
|
|
37
|
+
* calling conventions cdxgen uses today. These hooks continue to power
|
|
38
|
+
* cdxgen's dry-run enforcement, host allow-listing, network-activity
|
|
39
|
+
* recording and HTTP trace logging.
|
|
40
|
+
* - Automatic response decompression (`gzip`, `deflate`, `br`) driven by the
|
|
41
|
+
* `Content-Encoding` header, matching `got`'s transparent decoding.
|
|
42
|
+
* - Proxy support via the standard `HTTP_PROXY`/`HTTPS_PROXY`/`NO_PROXY`
|
|
43
|
+
* environment variables (through undici's `EnvHttpProxyAgent`).
|
|
44
|
+
* - An in-memory GET response cache (enabled by default, disabled by setting
|
|
45
|
+
* the `CDXGEN_NO_CACHE` environment variable) that replaces the got + Keyv
|
|
46
|
+
* cache cdxgen previously relied on.
|
|
47
|
+
* - Response objects exposing `statusCode`, `headers`, `body`, `rawBody`,
|
|
48
|
+
* `url` and `request.options`.
|
|
49
|
+
* - A lazily-resolved `.json()` method on the returned promise, mirroring
|
|
50
|
+
* `got`'s `client(url).json()` usage.
|
|
51
|
+
*
|
|
52
|
+
* @module httpClient
|
|
53
|
+
*/
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Error thrown when the server responds with a non 2xx/3xx status code and
|
|
57
|
+
* `throwHttpErrors` has not been disabled. Shaped like `got`'s `HTTPError` so
|
|
58
|
+
* that existing `error.response.statusCode` and `error.options.context` checks
|
|
59
|
+
* keep working.
|
|
60
|
+
*/
|
|
61
|
+
export class HTTPError extends Error {
|
|
62
|
+
/**
|
|
63
|
+
* @param {Object} response Response object produced by this client.
|
|
64
|
+
* @param {Object} options Merged request options for the failed request.
|
|
65
|
+
*/
|
|
66
|
+
constructor(response, options) {
|
|
67
|
+
super(
|
|
68
|
+
`Response code ${response.statusCode} (${response.statusMessage || "Request failed"})`,
|
|
69
|
+
);
|
|
70
|
+
this.name = "HTTPError";
|
|
71
|
+
this.response = response;
|
|
72
|
+
this.options = options;
|
|
73
|
+
this.code = "ERR_NON_2XX_3XX_RESPONSE";
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Error thrown for transport-level failures (DNS, connection reset, timeouts).
|
|
79
|
+
* Carries the merged request `options` so `beforeError` hooks can inspect the
|
|
80
|
+
* request context.
|
|
81
|
+
*/
|
|
82
|
+
export class RequestError extends Error {
|
|
83
|
+
/**
|
|
84
|
+
* @param {Error} cause Underlying error thrown by undici.
|
|
85
|
+
* @param {Object} options Merged request options for the failed request.
|
|
86
|
+
*/
|
|
87
|
+
constructor(cause, options) {
|
|
88
|
+
super(cause.message);
|
|
89
|
+
this.name = "RequestError";
|
|
90
|
+
this.options = options;
|
|
91
|
+
this.code = cause.code;
|
|
92
|
+
this.cause = cause;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Merge two option objects one level deep. `headers`, `hooks` and `context`
|
|
98
|
+
* are merged recursively so per-call overrides do not discard the client
|
|
99
|
+
* defaults.
|
|
100
|
+
*
|
|
101
|
+
* @param {Object} base Base (default) options.
|
|
102
|
+
* @param {Object} override Per-call options.
|
|
103
|
+
* @returns {Object} Merged options object.
|
|
104
|
+
*/
|
|
105
|
+
function mergeOptions(base = {}, override = {}) {
|
|
106
|
+
const merged = { ...base, ...override };
|
|
107
|
+
merged.headers = mergeHeaders(base.headers, override.headers);
|
|
108
|
+
merged.context = { ...(base.context || {}), ...(override.context || {}) };
|
|
109
|
+
merged.hooks = mergeHooks(base.hooks, override.hooks);
|
|
110
|
+
return merged;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Merge two header objects, skipping `undefined` values so callers can pass
|
|
115
|
+
* `headers: undefined` without clobbering the client defaults.
|
|
116
|
+
*
|
|
117
|
+
* @param {Object} [base] Default headers.
|
|
118
|
+
* @param {Object} [override] Per-call headers.
|
|
119
|
+
* @returns {Object} Merged headers.
|
|
120
|
+
*/
|
|
121
|
+
function mergeHeaders(base = {}, override = {}) {
|
|
122
|
+
const headers = { ...(base || {}) };
|
|
123
|
+
for (const [key, value] of Object.entries(override || {})) {
|
|
124
|
+
if (value !== undefined) {
|
|
125
|
+
headers[key] = value;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return headers;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Concatenate hook arrays from the defaults and per-call options so both run.
|
|
133
|
+
*
|
|
134
|
+
* @param {Object} [base] Default hooks.
|
|
135
|
+
* @param {Object} [override] Per-call hooks.
|
|
136
|
+
* @returns {Object} Merged hooks with `beforeRequest`, `afterResponse` and
|
|
137
|
+
* `beforeError` arrays.
|
|
138
|
+
*/
|
|
139
|
+
function mergeHooks(base = {}, override = {}) {
|
|
140
|
+
const hookNames = ["beforeRequest", "afterResponse", "beforeError"];
|
|
141
|
+
const merged = {};
|
|
142
|
+
for (const name of hookNames) {
|
|
143
|
+
merged[name] = [...(base?.[name] || []), ...(override?.[name] || [])];
|
|
144
|
+
}
|
|
145
|
+
return merged;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// Default per-request timeout (ms). undici (unlike got) applies no request
|
|
149
|
+
// timeout by default, so an unresponsive host would hang a scan indefinitely.
|
|
150
|
+
// 15s is generous for metadata/registry lookups; raise it for slow networks or
|
|
151
|
+
// large downloads via CDXGEN_HTTP_TIMEOUT_MS. Capped at 1h so a typo cannot
|
|
152
|
+
// effectively disable the timeout.
|
|
153
|
+
const DEFAULT_HTTP_TIMEOUT_MS = 15000;
|
|
154
|
+
const MAX_HTTP_TIMEOUT_MS = 3600000;
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Resolve the default HTTP request timeout, honoring the validated
|
|
158
|
+
* CDXGEN_HTTP_TIMEOUT_MS environment variable when set to a positive integer.
|
|
159
|
+
*
|
|
160
|
+
* @returns {number} Timeout in milliseconds
|
|
161
|
+
*/
|
|
162
|
+
export function getDefaultHttpTimeoutMs() {
|
|
163
|
+
const raw = process.env.CDXGEN_HTTP_TIMEOUT_MS;
|
|
164
|
+
if (raw === undefined || raw === "") {
|
|
165
|
+
return DEFAULT_HTTP_TIMEOUT_MS;
|
|
166
|
+
}
|
|
167
|
+
const parsed = Number.parseInt(raw, 10);
|
|
168
|
+
if (!Number.isInteger(parsed) || parsed <= 0) {
|
|
169
|
+
return DEFAULT_HTTP_TIMEOUT_MS;
|
|
170
|
+
}
|
|
171
|
+
return Math.min(parsed, MAX_HTTP_TIMEOUT_MS);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Translate a `got`-style timeout option into a single total-request timeout in
|
|
176
|
+
* milliseconds suitable for `AbortSignal.timeout`. A plain number is used
|
|
177
|
+
* verbatim. A phase object (e.g. `{ connect, send, response }`, or `{ request }`)
|
|
178
|
+
* is reduced to the sum of its numeric phases, which provides a sensible upper
|
|
179
|
+
* bound for the whole request.
|
|
180
|
+
*
|
|
181
|
+
* @param {number|Object} [timeout] `got`-style timeout option.
|
|
182
|
+
* @returns {number|undefined} Total timeout in milliseconds, or `undefined`.
|
|
183
|
+
*/
|
|
184
|
+
export function resolveTimeout(timeout) {
|
|
185
|
+
if (timeout === undefined || timeout === null) {
|
|
186
|
+
return undefined;
|
|
187
|
+
}
|
|
188
|
+
if (typeof timeout === "number") {
|
|
189
|
+
return timeout;
|
|
190
|
+
}
|
|
191
|
+
if (typeof timeout === "object") {
|
|
192
|
+
if (typeof timeout.request === "number") {
|
|
193
|
+
return timeout.request;
|
|
194
|
+
}
|
|
195
|
+
const phases = [
|
|
196
|
+
timeout.connect,
|
|
197
|
+
timeout.secureConnect,
|
|
198
|
+
timeout.send,
|
|
199
|
+
timeout.response,
|
|
200
|
+
timeout.socket,
|
|
201
|
+
].filter((value) => typeof value === "number");
|
|
202
|
+
if (phases.length) {
|
|
203
|
+
return phases.reduce((total, value) => total + value, 0);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
return undefined;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/**
|
|
210
|
+
* Decompress a response body buffer according to its `Content-Encoding`. undici
|
|
211
|
+
* performs no automatic decompression, so we replicate the behaviour `got` gave
|
|
212
|
+
* us for `gzip`, `deflate` and `br` encoded responses. Multiple, comma-separated
|
|
213
|
+
* encodings are applied in reverse order. Unknown encodings and decompression
|
|
214
|
+
* failures fall back to returning the buffer untouched.
|
|
215
|
+
*
|
|
216
|
+
* @param {Buffer} rawBody Raw response bytes.
|
|
217
|
+
* @param {string} [contentEncoding] Value of the Content-Encoding header.
|
|
218
|
+
* @returns {Buffer} Decompressed (or original) buffer.
|
|
219
|
+
*/
|
|
220
|
+
function decompressBody(rawBody, contentEncoding) {
|
|
221
|
+
if (!contentEncoding || rawBody.length === 0) {
|
|
222
|
+
return rawBody;
|
|
223
|
+
}
|
|
224
|
+
const encodings = contentEncoding
|
|
225
|
+
.split(",")
|
|
226
|
+
.map((encoding) => encoding.trim().toLowerCase())
|
|
227
|
+
.filter(Boolean);
|
|
228
|
+
let buffer = rawBody;
|
|
229
|
+
for (const encoding of encodings.reverse()) {
|
|
230
|
+
try {
|
|
231
|
+
if (encoding === "gzip" || encoding === "x-gzip") {
|
|
232
|
+
buffer = gunzipSync(buffer);
|
|
233
|
+
} else if (encoding === "deflate") {
|
|
234
|
+
buffer = inflateSync(buffer);
|
|
235
|
+
} else if (encoding === "br") {
|
|
236
|
+
buffer = brotliDecompressSync(buffer);
|
|
237
|
+
} else if (encoding === "identity") {
|
|
238
|
+
// no-op
|
|
239
|
+
} else {
|
|
240
|
+
// Unknown encoding; leave the buffer as-is.
|
|
241
|
+
return buffer;
|
|
242
|
+
}
|
|
243
|
+
} catch {
|
|
244
|
+
// Decompression failed (e.g. body was not actually encoded); return what
|
|
245
|
+
// we have so callers can attempt to parse it.
|
|
246
|
+
return buffer;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
return buffer;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Read and decode an undici response body according to the requested
|
|
254
|
+
* `responseType`.
|
|
255
|
+
*
|
|
256
|
+
* @param {Object} undiciResponse Response returned by `undici.request`.
|
|
257
|
+
* @param {string} [responseType] One of `"json"`, `"buffer"` or `"text"`.
|
|
258
|
+
* @returns {Promise<{body: any, rawBody: Buffer}>} Decoded body and raw bytes.
|
|
259
|
+
*/
|
|
260
|
+
async function readBody(undiciResponse, responseType) {
|
|
261
|
+
const arrayBuffer = await undiciResponse.body.arrayBuffer();
|
|
262
|
+
let rawBody = Buffer.from(arrayBuffer);
|
|
263
|
+
// undici (unlike got) does not transparently decompress response bodies, so
|
|
264
|
+
// honor the Content-Encoding header ourselves. Some registries (e.g. the
|
|
265
|
+
// nuget registration5-gz-semver2 endpoint) always return gzip-encoded JSON.
|
|
266
|
+
rawBody = decompressBody(
|
|
267
|
+
rawBody,
|
|
268
|
+
undiciResponse.headers?.["content-encoding"],
|
|
269
|
+
);
|
|
270
|
+
let body;
|
|
271
|
+
if (responseType === "buffer") {
|
|
272
|
+
body = rawBody;
|
|
273
|
+
} else if (responseType === "json") {
|
|
274
|
+
const text = rawBody.toString("utf-8");
|
|
275
|
+
body = text.length ? JSON.parse(text) : undefined;
|
|
276
|
+
} else {
|
|
277
|
+
body = rawBody.toString("utf-8");
|
|
278
|
+
}
|
|
279
|
+
return { body, rawBody };
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Convert a body into the `[body, headers]` pair to hand to undici. When the
|
|
284
|
+
* `json` option is present it is serialized and a JSON `content-type` is added
|
|
285
|
+
* unless the caller already set one.
|
|
286
|
+
*
|
|
287
|
+
* @param {Object} options Merged request options.
|
|
288
|
+
* @returns {{body: (string|Buffer|undefined), headers: Object}} Request body
|
|
289
|
+
* and (possibly augmented) headers.
|
|
290
|
+
*/
|
|
291
|
+
function resolveRequestBody(options) {
|
|
292
|
+
const headers = { ...(options.headers || {}) };
|
|
293
|
+
if (options.json !== undefined) {
|
|
294
|
+
const hasContentType = Object.keys(headers).some(
|
|
295
|
+
(key) => key.toLowerCase() === "content-type",
|
|
296
|
+
);
|
|
297
|
+
if (!hasContentType) {
|
|
298
|
+
headers["content-type"] = "application/json";
|
|
299
|
+
}
|
|
300
|
+
return { body: JSON.stringify(options.json), headers };
|
|
301
|
+
}
|
|
302
|
+
return { body: options.body, headers };
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// In-memory cache of successful GET responses, mirroring the HTTP cache cdxgen
|
|
306
|
+
// historically kept via got + Keyv. Repeated metadata/license lookups during a
|
|
307
|
+
// scan are served from here instead of hitting the network again. Set the
|
|
308
|
+
// CDXGEN_NO_CACHE environment variable to "true" or "1" to disable it.
|
|
309
|
+
const responseCache = new Map();
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Determine whether the in-memory HTTP response cache is disabled via the
|
|
313
|
+
* CDXGEN_NO_CACHE environment variable. Evaluated per request so tests and
|
|
314
|
+
* callers can toggle it at runtime.
|
|
315
|
+
*
|
|
316
|
+
* @returns {boolean} True when caching should be skipped.
|
|
317
|
+
*/
|
|
318
|
+
export function isCacheDisabled() {
|
|
319
|
+
const value = process.env.CDXGEN_NO_CACHE;
|
|
320
|
+
return value === "true" || value === "1";
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/**
|
|
324
|
+
* Clear the in-memory HTTP response cache. Primarily useful for tests.
|
|
325
|
+
*
|
|
326
|
+
* @returns {void}
|
|
327
|
+
*/
|
|
328
|
+
export function clearHttpCache() {
|
|
329
|
+
responseCache.clear();
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// ---------------------------------------------------------------------------
|
|
333
|
+
// Test cassette interceptor — the single network seam.
|
|
334
|
+
//
|
|
335
|
+
// `createHttpClient()` is the only factory that produces HTTP clients in the
|
|
336
|
+
// entire cdxgen codebase (confirmed by grep). By intercepting inside
|
|
337
|
+
// `doRequest`, every outbound request — whether from `cdxgenAgent` in utils.js,
|
|
338
|
+
// the OCI image manager, or the source analyzer — flows through one choke
|
|
339
|
+
// point. The golden test harness installs an interceptor that either replays
|
|
340
|
+
// a recorded response (cassette) or throws a loud `CassetteMissError` so an
|
|
341
|
+
// unmatched request can never silently reach the live network in CI.
|
|
342
|
+
//
|
|
343
|
+
// In record mode the interceptor returns `null`, letting the real request
|
|
344
|
+
// proceed; a wrapper around the returned promise captures the response for
|
|
345
|
+
// later commit to the cassette file.
|
|
346
|
+
// ---------------------------------------------------------------------------
|
|
347
|
+
|
|
348
|
+
/**
|
|
349
|
+
* Error thrown when a cassette replay session encounters a request with no
|
|
350
|
+
* matching recorded interaction. This is loud-by-design: a silent fall-
|
|
351
|
+
* through to the live network would make offline golden tests meaningless.
|
|
352
|
+
*/
|
|
353
|
+
export class CassetteMissError extends Error {
|
|
354
|
+
/**
|
|
355
|
+
* @param {string} method HTTP method.
|
|
356
|
+
* @param {string} url Request URL.
|
|
357
|
+
*/
|
|
358
|
+
constructor(method, url) {
|
|
359
|
+
super(
|
|
360
|
+
`Cassette miss: no recorded response for ${method} ${url}. Record with UPDATE_GOLDEN=1 or CDXGEN_CASSETTE_MODE=record.`,
|
|
361
|
+
);
|
|
362
|
+
this.name = "CassetteMissError";
|
|
363
|
+
this.method = method;
|
|
364
|
+
this.url = url;
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/**
|
|
369
|
+
* Currently-installed interceptor function, or null when no interceptor is
|
|
370
|
+
* active (normal cdxgen operation).
|
|
371
|
+
* @type {((req: Object) => Promise<Object|null>) | null}
|
|
372
|
+
*/
|
|
373
|
+
let httpInterceptor = null;
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Install an HTTP interceptor that acts as the single network seam for test
|
|
377
|
+
* cassettes. The interceptor receives a request descriptor and must return
|
|
378
|
+
* either a `got`-like response object (replay hit) or `null` (pass-through /
|
|
379
|
+
* record mode).
|
|
380
|
+
*
|
|
381
|
+
* @param {(req: { method: string, url: URL, headers: Object, body: *, responseType?: string, options: Object }) => Promise<Object|null>} fn
|
|
382
|
+
* Interceptor function.
|
|
383
|
+
* @returns {void}
|
|
384
|
+
*/
|
|
385
|
+
export function setHttpInterceptor(fn) {
|
|
386
|
+
httpInterceptor = fn;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Remove the currently-installed HTTP interceptor, restoring normal network
|
|
391
|
+
* behaviour.
|
|
392
|
+
*
|
|
393
|
+
* @returns {void}
|
|
394
|
+
*/
|
|
395
|
+
export function clearHttpInterceptor() {
|
|
396
|
+
httpInterceptor = null;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Build the cache key for a request. Only the method and normalized URL are
|
|
401
|
+
* used, matching got's default cache key behaviour.
|
|
402
|
+
*
|
|
403
|
+
* @param {string} method Uppercased HTTP method.
|
|
404
|
+
* @param {URL} url Request URL.
|
|
405
|
+
* @returns {string} Cache key.
|
|
406
|
+
*/
|
|
407
|
+
function cacheKeyFor(method, url) {
|
|
408
|
+
return `${method}:${url.toString()}`;
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// The maximum number of redirects to follow when `followRedirect` is enabled.
|
|
412
|
+
const MAX_REDIRECTIONS = 10;
|
|
413
|
+
|
|
414
|
+
// Bun ships its own bundled implementation of the `undici` module which, as of
|
|
415
|
+
// Bun 1.2, does not expose the `Agent.prototype.compose` composition API nor the
|
|
416
|
+
// `interceptors.redirect` interceptor that undici v7 uses for redirect handling
|
|
417
|
+
// (see cdxgen issue #4245). Detect the Bun runtime so we can fall back to plain
|
|
418
|
+
// dispatchers and follow redirects manually instead of crashing at module load.
|
|
419
|
+
const isBun = typeof globalThis.Bun !== "undefined";
|
|
420
|
+
|
|
421
|
+
// Reusable pooled dispatchers. On Node.js, undici composes redirect handling as
|
|
422
|
+
// an interceptor (there is no per-request `maxRedirections` option in undici v7),
|
|
423
|
+
// so we pre-build the small set of dispatcher variants we need instead of
|
|
424
|
+
// allocating a fresh Agent per request (which would defeat connection pooling).
|
|
425
|
+
// On Bun, `compose`/`interceptors.redirect` are unavailable, so the redirect
|
|
426
|
+
// dispatchers are just the plain agents and redirects are handled in
|
|
427
|
+
// `requestWithRedirects` below.
|
|
428
|
+
// Whether standard proxy environment variables are set. When they are, requests
|
|
429
|
+
// must be routed through the proxy. Because this client always passes an
|
|
430
|
+
// explicit per-request `dispatcher`, it overrides Node's global (potentially
|
|
431
|
+
// proxy-aware) dispatcher, so we have to build proxy-aware dispatchers here or
|
|
432
|
+
// HTTP_PROXY/HTTPS_PROXY/NO_PROXY (documented in docs/ENV.md) are silently
|
|
433
|
+
// ignored. `EnvHttpProxyAgent` reads those variables itself, including NO_PROXY
|
|
434
|
+
// bypass handling, per request.
|
|
435
|
+
function hasProxyEnv() {
|
|
436
|
+
return Boolean(
|
|
437
|
+
process.env.HTTP_PROXY ||
|
|
438
|
+
process.env.http_proxy ||
|
|
439
|
+
process.env.HTTPS_PROXY ||
|
|
440
|
+
process.env.https_proxy ||
|
|
441
|
+
process.env.ALL_PROXY ||
|
|
442
|
+
process.env.all_proxy,
|
|
443
|
+
);
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Build a base dispatcher, honoring proxy environment variables when present.
|
|
447
|
+
// `EnvHttpProxyAgent` is unavailable in Bun's bundled undici, so fall back to a
|
|
448
|
+
// plain Agent there (matching pre-existing behaviour: no proxy support on Bun).
|
|
449
|
+
function createBaseAgent(agentOptions = {}) {
|
|
450
|
+
if (hasProxyEnv() && typeof EnvHttpProxyAgent === "function" && !isBun) {
|
|
451
|
+
try {
|
|
452
|
+
return new EnvHttpProxyAgent(agentOptions);
|
|
453
|
+
} catch {
|
|
454
|
+
// Fall through to a plain Agent if the proxy agent cannot be constructed.
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
return new Agent(agentOptions);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
const defaultAgent = createBaseAgent();
|
|
461
|
+
const insecureAgent = createBaseAgent({
|
|
462
|
+
connect: { rejectUnauthorized: false },
|
|
463
|
+
});
|
|
464
|
+
const redirectDispatcher = isBun
|
|
465
|
+
? defaultAgent
|
|
466
|
+
: defaultAgent.compose(
|
|
467
|
+
interceptors.redirect({ maxRedirections: MAX_REDIRECTIONS }),
|
|
468
|
+
);
|
|
469
|
+
const insecureRedirectDispatcher = isBun
|
|
470
|
+
? insecureAgent
|
|
471
|
+
: insecureAgent.compose(
|
|
472
|
+
interceptors.redirect({ maxRedirections: MAX_REDIRECTIONS }),
|
|
473
|
+
);
|
|
474
|
+
|
|
475
|
+
/**
|
|
476
|
+
* Pick the undici dispatcher matching the request's redirect and TLS
|
|
477
|
+
* verification preferences.
|
|
478
|
+
*
|
|
479
|
+
* @param {boolean} followRedirect Whether HTTP redirects should be followed.
|
|
480
|
+
* @param {boolean} insecure Whether TLS certificate verification is disabled.
|
|
481
|
+
* @returns {import("undici").Dispatcher} The dispatcher to use for the request.
|
|
482
|
+
*/
|
|
483
|
+
function selectDispatcher(followRedirect, insecure) {
|
|
484
|
+
if (insecure) {
|
|
485
|
+
return followRedirect ? insecureRedirectDispatcher : insecureAgent;
|
|
486
|
+
}
|
|
487
|
+
return followRedirect ? redirectDispatcher : defaultAgent;
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
// HTTP status codes that represent a redirect with a `location` header.
|
|
491
|
+
const REDIRECT_STATUS_CODES = new Set([301, 302, 303, 307, 308]);
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Issue an undici request, following redirects manually when running under Bun.
|
|
495
|
+
*
|
|
496
|
+
* On Node.js the redirect-following interceptor baked into the dispatcher does
|
|
497
|
+
* the work, so this simply forwards to `undiciRequest`. On Bun (where the
|
|
498
|
+
* interceptor API is unavailable) we loop on 3xx responses, draining each
|
|
499
|
+
* intermediate body and resolving relative `location` headers, up to
|
|
500
|
+
* `MAX_REDIRECTIONS` hops.
|
|
501
|
+
*
|
|
502
|
+
* @param {URL} url Request URL.
|
|
503
|
+
* @param {Object} requestOptions Options passed to `undiciRequest`.
|
|
504
|
+
* @param {boolean} followRedirect Whether redirects should be followed.
|
|
505
|
+
* @returns {Promise<Object>} The final undici response.
|
|
506
|
+
*/
|
|
507
|
+
async function requestWithRedirects(url, requestOptions, followRedirect) {
|
|
508
|
+
if (!isBun || !followRedirect) {
|
|
509
|
+
return await undiciRequest(url, requestOptions);
|
|
510
|
+
}
|
|
511
|
+
let currentUrl = url;
|
|
512
|
+
let redirections = 0;
|
|
513
|
+
while (true) {
|
|
514
|
+
const response = await undiciRequest(currentUrl, requestOptions);
|
|
515
|
+
const location = response.headers?.location;
|
|
516
|
+
if (
|
|
517
|
+
!REDIRECT_STATUS_CODES.has(response.statusCode) ||
|
|
518
|
+
!location ||
|
|
519
|
+
redirections >= MAX_REDIRECTIONS
|
|
520
|
+
) {
|
|
521
|
+
return response;
|
|
522
|
+
}
|
|
523
|
+
// Drain the intermediate response body so the connection can be reused.
|
|
524
|
+
try {
|
|
525
|
+
await response.body.dump();
|
|
526
|
+
} catch {
|
|
527
|
+
// Ignore drain failures; the socket will be discarded.
|
|
528
|
+
}
|
|
529
|
+
currentUrl = new URL(location, currentUrl);
|
|
530
|
+
redirections += 1;
|
|
531
|
+
// 303, and 301/302 for anything other than GET/HEAD, must switch to GET
|
|
532
|
+
// without a body, matching how undici's redirect interceptor behaves.
|
|
533
|
+
const method = (requestOptions.method || "GET").toUpperCase();
|
|
534
|
+
if (
|
|
535
|
+
response.statusCode === 303 ||
|
|
536
|
+
((response.statusCode === 301 || response.statusCode === 302) &&
|
|
537
|
+
method !== "GET" &&
|
|
538
|
+
method !== "HEAD")
|
|
539
|
+
) {
|
|
540
|
+
requestOptions.method = "GET";
|
|
541
|
+
requestOptions.body = undefined;
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* Perform a single HTTP request and return a `got`-like response object,
|
|
548
|
+
* running the configured hooks along the way.
|
|
549
|
+
*
|
|
550
|
+
* @param {Object} mergedOptions Fully merged request options including `url`.
|
|
551
|
+
* @returns {Promise<Object>} Response object with `statusCode`, `headers`,
|
|
552
|
+
* `body`, `rawBody`, `url` and `request.options`.
|
|
553
|
+
*/
|
|
554
|
+
async function doRequest(mergedOptions) {
|
|
555
|
+
const options = mergedOptions;
|
|
556
|
+
const url =
|
|
557
|
+
options.url instanceof URL ? options.url : new URL(String(options.url));
|
|
558
|
+
options.url = url;
|
|
559
|
+
|
|
560
|
+
// --- Test cassette layer (single network seam) ---
|
|
561
|
+
// When an interceptor is installed (see setHttpInterceptor), it is the
|
|
562
|
+
// authority for every request: a replay hit short-circuits the network
|
|
563
|
+
// call; an unmatched request throws a loud CassetteMissError so offline
|
|
564
|
+
// tests never silently reach the live network. Returns null in
|
|
565
|
+
// pass-through (record) mode to let the real request proceed.
|
|
566
|
+
if (httpInterceptor) {
|
|
567
|
+
const cassetteResponse = await httpInterceptor({
|
|
568
|
+
method: (options.method || "GET").toUpperCase(),
|
|
569
|
+
url,
|
|
570
|
+
headers: options.headers || {},
|
|
571
|
+
body: options.body,
|
|
572
|
+
responseType: options.responseType,
|
|
573
|
+
options,
|
|
574
|
+
});
|
|
575
|
+
if (cassetteResponse) {
|
|
576
|
+
return cassetteResponse;
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
// beforeRequest hooks may mutate options (e.g. set context) or throw to abort
|
|
581
|
+
// the request (dry-run mode). Return values are ignored, matching how cdxgen
|
|
582
|
+
// uses these hooks with got.
|
|
583
|
+
for (const hook of options.hooks?.beforeRequest || []) {
|
|
584
|
+
await hook(options);
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
const { body, headers } = resolveRequestBody(options);
|
|
588
|
+
const method = (options.method || "GET").toUpperCase();
|
|
589
|
+
|
|
590
|
+
// Serve cacheable GET requests from the in-memory cache when enabled.
|
|
591
|
+
const cacheable = method === "GET" && !isCacheDisabled();
|
|
592
|
+
const cacheKey = cacheable ? cacheKeyFor(method, url) : undefined;
|
|
593
|
+
if (cacheable && responseCache.has(cacheKey)) {
|
|
594
|
+
return responseCache.get(cacheKey);
|
|
595
|
+
}
|
|
596
|
+
|
|
597
|
+
const timeoutMs = resolveTimeout(options.timeout);
|
|
598
|
+
const signal = timeoutMs ? AbortSignal.timeout(timeoutMs) : undefined;
|
|
599
|
+
|
|
600
|
+
const followRedirect = options.followRedirect !== false;
|
|
601
|
+
const insecure = options.https?.rejectUnauthorized === false;
|
|
602
|
+
const requestOptions = {
|
|
603
|
+
method,
|
|
604
|
+
headers,
|
|
605
|
+
body: method === "GET" || method === "HEAD" ? undefined : body,
|
|
606
|
+
dispatcher: selectDispatcher(followRedirect, insecure),
|
|
607
|
+
signal,
|
|
608
|
+
};
|
|
609
|
+
|
|
610
|
+
let undiciResponse;
|
|
611
|
+
try {
|
|
612
|
+
undiciResponse = await requestWithRedirects(
|
|
613
|
+
url,
|
|
614
|
+
requestOptions,
|
|
615
|
+
followRedirect,
|
|
616
|
+
);
|
|
617
|
+
} catch (err) {
|
|
618
|
+
const requestError = new RequestError(err, options);
|
|
619
|
+
for (const hook of options.hooks?.beforeError || []) {
|
|
620
|
+
await hook(requestError);
|
|
621
|
+
}
|
|
622
|
+
throw requestError;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
const { body: decodedBody, rawBody } = await readBody(
|
|
626
|
+
undiciResponse,
|
|
627
|
+
options.responseType,
|
|
628
|
+
);
|
|
629
|
+
|
|
630
|
+
const response = {
|
|
631
|
+
statusCode: undiciResponse.statusCode,
|
|
632
|
+
headers: undiciResponse.headers,
|
|
633
|
+
body: decodedBody,
|
|
634
|
+
rawBody,
|
|
635
|
+
url: url.toString(),
|
|
636
|
+
request: { options },
|
|
637
|
+
};
|
|
638
|
+
|
|
639
|
+
const throwHttpErrors = options.throwHttpErrors !== false;
|
|
640
|
+
if (throwHttpErrors && response.statusCode >= 400) {
|
|
641
|
+
const httpError = new HTTPError(response, options);
|
|
642
|
+
for (const hook of options.hooks?.beforeError || []) {
|
|
643
|
+
await hook(httpError);
|
|
644
|
+
}
|
|
645
|
+
throw httpError;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
let finalResponse = response;
|
|
649
|
+
for (const hook of options.hooks?.afterResponse || []) {
|
|
650
|
+
finalResponse = (await hook(finalResponse)) || finalResponse;
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
// Only successful responses are cached, matching HTTP cache semantics.
|
|
654
|
+
if (cacheable && finalResponse.statusCode < 400) {
|
|
655
|
+
responseCache.set(cacheKey, finalResponse);
|
|
656
|
+
}
|
|
657
|
+
return finalResponse;
|
|
658
|
+
}
|
|
659
|
+
|
|
660
|
+
/**
|
|
661
|
+
* Kick off a request and return a promise augmented with a lazy `.json()`
|
|
662
|
+
* helper, mirroring `got`'s `client(url).json()` convenience.
|
|
663
|
+
*
|
|
664
|
+
* @param {Object} mergedOptions Fully merged request options including `url`.
|
|
665
|
+
* @returns {Promise<Object> & {json: function(): Promise<any>}} Response promise.
|
|
666
|
+
*/
|
|
667
|
+
function requestWithHelpers(mergedOptions) {
|
|
668
|
+
const promise = doRequest(mergedOptions);
|
|
669
|
+
promise.json = () =>
|
|
670
|
+
promise.then((response) => {
|
|
671
|
+
if (typeof response.body === "string") {
|
|
672
|
+
return response.body.length ? JSON.parse(response.body) : undefined;
|
|
673
|
+
}
|
|
674
|
+
if (Buffer.isBuffer(response.body)) {
|
|
675
|
+
const text = response.body.toString("utf-8");
|
|
676
|
+
return text.length ? JSON.parse(text) : undefined;
|
|
677
|
+
}
|
|
678
|
+
return response.body;
|
|
679
|
+
});
|
|
680
|
+
return promise;
|
|
681
|
+
}
|
|
682
|
+
|
|
683
|
+
/**
|
|
684
|
+
* Create a `got`-compatible HTTP client bound to the supplied defaults.
|
|
685
|
+
*
|
|
686
|
+
* @param {Object} [defaults] Default request options merged into every call.
|
|
687
|
+
* @returns {Function} Callable client exposing `get`/`post`/`put`/`head`,
|
|
688
|
+
* `extend`, `defaults` and `hooks`.
|
|
689
|
+
*/
|
|
690
|
+
export function createHttpClient(defaults = {}) {
|
|
691
|
+
const clientDefaults = {
|
|
692
|
+
...defaults,
|
|
693
|
+
headers: { ...(defaults.headers || {}) },
|
|
694
|
+
hooks: mergeHooks(defaults.hooks),
|
|
695
|
+
context: { ...(defaults.context || {}) },
|
|
696
|
+
};
|
|
697
|
+
|
|
698
|
+
const client = (url, options = {}) =>
|
|
699
|
+
requestWithHelpers(mergeOptions(clientDefaults, { ...options, url }));
|
|
700
|
+
|
|
701
|
+
const verb =
|
|
702
|
+
(method) =>
|
|
703
|
+
(url, options = {}) =>
|
|
704
|
+
requestWithHelpers(
|
|
705
|
+
mergeOptions(clientDefaults, { ...options, method, url }),
|
|
706
|
+
);
|
|
707
|
+
|
|
708
|
+
client.get = verb("GET");
|
|
709
|
+
client.post = verb("POST");
|
|
710
|
+
client.put = verb("PUT");
|
|
711
|
+
client.head = verb("HEAD");
|
|
712
|
+
client.delete = verb("DELETE");
|
|
713
|
+
|
|
714
|
+
/**
|
|
715
|
+
* Derive a new client whose defaults are this client's defaults merged with
|
|
716
|
+
* the supplied options.
|
|
717
|
+
*
|
|
718
|
+
* @param {Object} [moreDefaults] Additional defaults to merge.
|
|
719
|
+
* @returns {Function} A new client instance.
|
|
720
|
+
*/
|
|
721
|
+
client.extend = (moreDefaults = {}) =>
|
|
722
|
+
createHttpClient(mergeOptions(clientDefaults, moreDefaults));
|
|
723
|
+
|
|
724
|
+
// Expose the resolved defaults and hooks the same way got does, so existing
|
|
725
|
+
// code and tests can reach `client.defaults.options.hooks` and `client.hooks`.
|
|
726
|
+
client.defaults = { options: clientDefaults };
|
|
727
|
+
client.hooks = clientDefaults.hooks;
|
|
728
|
+
|
|
729
|
+
return client;
|
|
730
|
+
}
|