@cdxgen/cdxgen 0.0.1 → 13.0.1
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 +2335 -0
- package/bin/convert.js +220 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +504 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +303 -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 +1882 -0
- package/lib/cli/cliOptions.js +543 -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 +280 -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 +920 -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 +583 -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 +1793 -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 +383 -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 +267 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3459 -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 +329 -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 +50 -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 +201 -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 +22 -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 +147 -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,255 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-host rate policy for batched registry fetches.
|
|
3
|
+
*
|
|
4
|
+
* This is the single source of truth for the JS transport's concurrency and
|
|
5
|
+
* minimum-interval decisions. The numbers are shared with the Rust transport
|
|
6
|
+
* (`cdxgen-plugins-bin/thirdparty/cdxrs/src/fetch/rate.rs`); a change to one
|
|
7
|
+
* side must be reflected in the other, and `fetchRate.poku.js` pins them so a
|
|
8
|
+
* drift is visible.
|
|
9
|
+
*
|
|
10
|
+
* Why a per-host table rather than a single global interval: a single-registry
|
|
11
|
+
* project — which is to say, almost every npm project — has exactly one host,
|
|
12
|
+
* so a conservative per-host cap *is* the global cap. Applying crates.io's
|
|
13
|
+
* 250 ms to every host caps an npm run at 4 requests per second, which is
|
|
14
|
+
* slower than the serial JS path once connection reuse is taken into account.
|
|
15
|
+
* Hosts that publish a limit get an interval; hosts that do not are bounded by
|
|
16
|
+
* the per-host concurrency cap alone, and by whatever `Retry-After` they send.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { readEnvironmentVariable } from "../core/activity.js";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Whether a credential will be sent to the host.
|
|
23
|
+
*
|
|
24
|
+
* GitHub is the reason this exists: 60 requests an hour anonymously against
|
|
25
|
+
* 5000 with a token is not a difference of degree. Applying the anonymous
|
|
26
|
+
* budget to a token-bearing client throws away the point of having set
|
|
27
|
+
* `GITHUB_TOKEN`.
|
|
28
|
+
*
|
|
29
|
+
* @typedef {("anonymous"|"authenticated")} Credentials
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* The policy for one host: the minimum gap between two requests and the
|
|
34
|
+
* maximum number in flight.
|
|
35
|
+
*
|
|
36
|
+
* @typedef {Object} HostPolicy
|
|
37
|
+
* @property {number} minInterval Minimum gap between requests, in milliseconds.
|
|
38
|
+
* @property {number} maxConcurrency Maximum requests in flight to this host.
|
|
39
|
+
*/
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Hosts that publish a rate limit, and what they publish.
|
|
43
|
+
*
|
|
44
|
+
* Columns: host, anonymous interval (ms), anonymous concurrency, authenticated
|
|
45
|
+
* interval (ms), authenticated concurrency. A host whose limit does not change
|
|
46
|
+
* with a credential repeats the same pair.
|
|
47
|
+
*
|
|
48
|
+
* Suffix match is used so `index.crates.io` inherits `crates.io`.
|
|
49
|
+
*/
|
|
50
|
+
const HOST_POLICIES = [
|
|
51
|
+
// crates.io's published budget is per IP and does not improve with a token.
|
|
52
|
+
{
|
|
53
|
+
host: "crates.io",
|
|
54
|
+
anonInterval: 250,
|
|
55
|
+
anonConcurrency: 4,
|
|
56
|
+
authInterval: 250,
|
|
57
|
+
authConcurrency: 4,
|
|
58
|
+
},
|
|
59
|
+
// GitHub: 60 req/h anonymous, 5000 req/h authenticated. The limit is an
|
|
60
|
+
// hourly budget rather than a rate, so a batch of a few hundred lookups is
|
|
61
|
+
// well inside it once a token is present.
|
|
62
|
+
{
|
|
63
|
+
host: "api.github.com",
|
|
64
|
+
anonInterval: 250,
|
|
65
|
+
anonConcurrency: 4,
|
|
66
|
+
authInterval: 0,
|
|
67
|
+
authConcurrency: 8,
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
host: "github.com",
|
|
71
|
+
anonInterval: 250,
|
|
72
|
+
anonConcurrency: 4,
|
|
73
|
+
authInterval: 0,
|
|
74
|
+
authConcurrency: 8,
|
|
75
|
+
},
|
|
76
|
+
// GitLab: 2000 req/min authenticated against 500 unauthenticated.
|
|
77
|
+
{
|
|
78
|
+
host: "gitlab.com",
|
|
79
|
+
anonInterval: 250,
|
|
80
|
+
anonConcurrency: 4,
|
|
81
|
+
authInterval: 0,
|
|
82
|
+
authConcurrency: 8,
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
host: "pkg.go.dev",
|
|
86
|
+
anonInterval: 250,
|
|
87
|
+
anonConcurrency: 4,
|
|
88
|
+
authInterval: 250,
|
|
89
|
+
authConcurrency: 4,
|
|
90
|
+
},
|
|
91
|
+
];
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Concurrency allowed for a host with no published limit. Registries that are
|
|
95
|
+
* CDN-fronted document store fronts (npm, PyPI, RubyGems, NuGet, pub.dev) sit
|
|
96
|
+
* here; the global cap is what bounds them.
|
|
97
|
+
*/
|
|
98
|
+
export const DEFAULT_HOST_CONCURRENCY = 16;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Global cap on in-flight requests across every host. Per-host caps cannot
|
|
102
|
+
* sum past this; a 16-way global batch saturates a large npm run without
|
|
103
|
+
* putting any single host above its published allowance.
|
|
104
|
+
*/
|
|
105
|
+
export const DEFAULT_GLOBAL_CONCURRENCY = 16;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Resolve the credential class for a host based on the environment.
|
|
109
|
+
*
|
|
110
|
+
* Only token presence is considered, never its value. A host we hold no token
|
|
111
|
+
* for keeps the anonymous budget even if some other host has one. Today only
|
|
112
|
+
* GitHub tokens are honoured, matching the Rust client.
|
|
113
|
+
*
|
|
114
|
+
* @param {string} host The hostname to classify.
|
|
115
|
+
* @returns {Credentials}
|
|
116
|
+
*/
|
|
117
|
+
export function credentialsFor(host) {
|
|
118
|
+
const lower = host.toLowerCase();
|
|
119
|
+
const isGitHub =
|
|
120
|
+
lower === "api.github.com" ||
|
|
121
|
+
lower === "github.com" ||
|
|
122
|
+
lower.endsWith(".github.com");
|
|
123
|
+
if (isGitHub && readEnvironmentVariable("GITHUB_TOKEN")) {
|
|
124
|
+
return "authenticated";
|
|
125
|
+
}
|
|
126
|
+
return "anonymous";
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Resolve the published policy for a host, or the CDN default.
|
|
131
|
+
*
|
|
132
|
+
* @param {string} host The hostname.
|
|
133
|
+
* @param {Credentials} [credentials] Credential class; defaults to what the
|
|
134
|
+
* environment would actually send to this host.
|
|
135
|
+
* @returns {HostPolicy}
|
|
136
|
+
*/
|
|
137
|
+
export function policyFor(host, credentials) {
|
|
138
|
+
const lower = (host || "").toLowerCase();
|
|
139
|
+
const cred = credentials || credentialsFor(host);
|
|
140
|
+
for (const candidate of HOST_POLICIES) {
|
|
141
|
+
const matches =
|
|
142
|
+
lower === candidate.host || lower.endsWith(`.${candidate.host}`);
|
|
143
|
+
if (!matches) {
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
if (cred === "authenticated") {
|
|
147
|
+
return {
|
|
148
|
+
minInterval: candidate.authInterval,
|
|
149
|
+
maxConcurrency: candidate.authConcurrency,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
minInterval: candidate.anonInterval,
|
|
154
|
+
maxConcurrency: candidate.anonConcurrency,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
return { minInterval: 0, maxConcurrency: DEFAULT_HOST_CONCURRENCY };
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The table of published policies, exposed for the parity test. The shape is
|
|
162
|
+
* stable: changing an entry is a policy change that must be mirrored in
|
|
163
|
+
* `rate.rs`.
|
|
164
|
+
*/
|
|
165
|
+
export const PUBLISHED_HOST_POLICIES = HOST_POLICIES.map((entry) => ({
|
|
166
|
+
...entry,
|
|
167
|
+
}));
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Create a minimum-interval gate for one host.
|
|
171
|
+
*
|
|
172
|
+
* `wait()` queues the caller so that successive calls are at least
|
|
173
|
+
* `minInterval` apart. `externalDelay()` pushes the gate out by a server-side
|
|
174
|
+
* back-off (`Retry-After`, `X-RateLimit-Reset`) and is counted.
|
|
175
|
+
*/
|
|
176
|
+
export class RateLimiter {
|
|
177
|
+
/**
|
|
178
|
+
* @param {number} minInterval Minimum gap between requests, in milliseconds.
|
|
179
|
+
*/
|
|
180
|
+
constructor(minInterval) {
|
|
181
|
+
this._minInterval = minInterval;
|
|
182
|
+
this._nextAvailable = 0;
|
|
183
|
+
this._externalDelays = 0;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Wait until this host's gate opens, then reserve the next slot. Callers
|
|
188
|
+
* that arrive while the gate is closed queue up rather than all being
|
|
189
|
+
* released together.
|
|
190
|
+
*
|
|
191
|
+
* @returns {Promise<void>}
|
|
192
|
+
*/
|
|
193
|
+
async wait() {
|
|
194
|
+
const now = Date.now();
|
|
195
|
+
// The slot is reserved synchronously, before any await, so concurrent
|
|
196
|
+
// callers each take a distinct slot instead of all reading the same gate.
|
|
197
|
+
const slot = Math.max(this._nextAvailable, now);
|
|
198
|
+
this._nextAvailable = slot + this._minInterval;
|
|
199
|
+
const delay = slot - now;
|
|
200
|
+
if (delay > 0) {
|
|
201
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
/**
|
|
206
|
+
* Record a server-imposed delay and push the gate out to at least now plus
|
|
207
|
+
* the delay. The caller is still responsible for actually waiting before it
|
|
208
|
+
* retries; recording alone does not sleep.
|
|
209
|
+
*
|
|
210
|
+
* @param {number} delayMs Delay in milliseconds.
|
|
211
|
+
*/
|
|
212
|
+
externalDelay(delayMs) {
|
|
213
|
+
this._externalDelays += 1;
|
|
214
|
+
const target = Date.now() + delayMs;
|
|
215
|
+
if (target > this._nextAvailable) {
|
|
216
|
+
this._nextAvailable = target;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/** @returns {number} How many times this host asked us to slow down. */
|
|
221
|
+
get externalDelayCount() {
|
|
222
|
+
return this._externalDelays;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
/**
|
|
227
|
+
* Create a counting semaphore with a FIFO wait queue. Used both for the global
|
|
228
|
+
* concurrency cap and the per-host cap.
|
|
229
|
+
*
|
|
230
|
+
* @param {number} limit Maximum simultaneous holders.
|
|
231
|
+
* @returns {{acquire: () => Promise<() => void>}} An `acquire` function that
|
|
232
|
+
* resolves once a slot is free, with a `release` function as its value.
|
|
233
|
+
*/
|
|
234
|
+
export function makeSemaphore(limit) {
|
|
235
|
+
let available = Math.max(1, limit);
|
|
236
|
+
const waiters = [];
|
|
237
|
+
return {
|
|
238
|
+
async acquire() {
|
|
239
|
+
if (available > 0) {
|
|
240
|
+
available -= 1;
|
|
241
|
+
return release;
|
|
242
|
+
}
|
|
243
|
+
await new Promise((resolve) => waiters.push(resolve));
|
|
244
|
+
return release;
|
|
245
|
+
},
|
|
246
|
+
};
|
|
247
|
+
function release() {
|
|
248
|
+
const next = waiters.shift();
|
|
249
|
+
if (next) {
|
|
250
|
+
next();
|
|
251
|
+
} else {
|
|
252
|
+
available += 1;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
import { cdxgenAgent, readEnvironmentVariable } from "../core/activity.js";
|
|
2
|
+
import { getOriginUrl } from "./envcontext.js";
|
|
3
|
+
import { prefetchJson } from "./fetchBatch.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Fetch the commit-level lookups for a whole commit list in one round.
|
|
7
|
+
*
|
|
8
|
+
* Both forges answer "which pull/merge request contains this commit?" from a
|
|
9
|
+
* URL built entirely from the commit hash, so the whole list is knowable before
|
|
10
|
+
* the loop. The review and approval lookups that follow are not: their URL
|
|
11
|
+
* carries a number that only arrives with the response, so they stay serial.
|
|
12
|
+
*
|
|
13
|
+
* The requests carry a caller-supplied credential, which the cdxrs protocol has
|
|
14
|
+
* no field for, so `prefetchJson` routes them to the JS pool.
|
|
15
|
+
*
|
|
16
|
+
* @param {Array<string>} urls Commit-level URLs.
|
|
17
|
+
* @param {Object} headers Headers to send with each, including the credential.
|
|
18
|
+
* @returns {Promise<Map<string, {ok?: boolean, body?: *}>>} Map keyed by URL.
|
|
19
|
+
*/
|
|
20
|
+
async function prefetchCommitLookups(urls, headers) {
|
|
21
|
+
return await prefetchJson(
|
|
22
|
+
urls.map((url) => ({ headers, responseType: "json", url })),
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Read a prefetched commit lookup as the response shape the loop expects.
|
|
28
|
+
*
|
|
29
|
+
* The loop tests `statusCode === 200`, and a batch entry records only whether
|
|
30
|
+
* the request succeeded, so a hit becomes a 200 and anything else is left for
|
|
31
|
+
* the caller to fetch itself.
|
|
32
|
+
*
|
|
33
|
+
* @param {Map<string, {ok?: boolean, body?: *}>} prefetched
|
|
34
|
+
* @param {string} url
|
|
35
|
+
* @returns {{statusCode: number, body: *}|undefined}
|
|
36
|
+
*/
|
|
37
|
+
function prefetchedCommitLookup(prefetched, url) {
|
|
38
|
+
const entry = prefetched.get(url);
|
|
39
|
+
return entry?.ok ? { body: entry.body, statusCode: 200 } : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Only accept single path segments made of git-safe characters, and never the
|
|
43
|
+
// `.`/`..` traversal segments, so a malicious remote.origin.url cannot steer the
|
|
44
|
+
// authenticated request to a different GitHub/GitLab API path.
|
|
45
|
+
const SAFE_SEGMENT = /^[A-Za-z0-9._-]+$/;
|
|
46
|
+
function isSafeSegment(seg) {
|
|
47
|
+
return Boolean(seg) && seg !== "." && seg !== ".." && SAFE_SEGMENT.test(seg);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Parse a GitHub repository URL into its owner and repository name.
|
|
52
|
+
*
|
|
53
|
+
* Only accepts URLs where github.com is the actual host (rejecting spoofed
|
|
54
|
+
* hosts such as `https://evil.com/github.com/o/r`) and only git-safe path
|
|
55
|
+
* segments, so an untrusted remote URL cannot steer authenticated API requests.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} url The git origin url
|
|
58
|
+
* @returns {{owner: string, repo: string}|null} Object containing owner and repo, or null
|
|
59
|
+
*/
|
|
60
|
+
export function parseGitHubUrl(url) {
|
|
61
|
+
if (!url) return null;
|
|
62
|
+
// Require github.com to be the actual host (preceded by start, `//`, or `@`),
|
|
63
|
+
// so URLs like `https://evil.com/github.com/o/r` do not match.
|
|
64
|
+
const match = url.match(
|
|
65
|
+
/(?:^|@|\/\/)github\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?\/?$/,
|
|
66
|
+
);
|
|
67
|
+
if (match && isSafeSegment(match[1]) && isSafeSegment(match[2])) {
|
|
68
|
+
return { owner: match[1], repo: match[2] };
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Parses GitLab repository origin URL to extract project path/ID.
|
|
75
|
+
*
|
|
76
|
+
* @param {string} url The git origin url
|
|
77
|
+
* @returns {string|null} The project path (owner/repo) or null
|
|
78
|
+
*/
|
|
79
|
+
export function parseGitLabUrl(url) {
|
|
80
|
+
if (!url) return null;
|
|
81
|
+
const match = url.match(
|
|
82
|
+
/(?:^|@|\/\/)gitlab\.com[:/]([^/]+)\/([^/]+?)(?:\.git)?\/?$/,
|
|
83
|
+
);
|
|
84
|
+
if (match && isSafeSegment(match[1]) && isSafeSegment(match[2])) {
|
|
85
|
+
return `${match[1]}/${match[2]}`;
|
|
86
|
+
}
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Enriches AI commits with details from GitHub or GitLab API if tokens are present.
|
|
92
|
+
*
|
|
93
|
+
* @param {string} dir Root directory of the repository
|
|
94
|
+
* @param {Array<Object>} aiCommits List of AI commit objects
|
|
95
|
+
* @param {Object} options Options containing forgeToken or env context
|
|
96
|
+
* @returns {Promise<Object>} Object containing reviews list and authoritative flags
|
|
97
|
+
*/
|
|
98
|
+
export async function enrichFromForge(dir, aiCommits, options = {}) {
|
|
99
|
+
const result = {
|
|
100
|
+
dataSources: [],
|
|
101
|
+
prReviews: [], // Array of review states { commitHash, hasIndependentApproval, selfApproved, reviewLatencySeconds }
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const originUrl = getOriginUrl(dir);
|
|
105
|
+
if (!originUrl) {
|
|
106
|
+
return result;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const githubInfo = parseGitHubUrl(originUrl);
|
|
110
|
+
const gitlabProject = parseGitLabUrl(originUrl);
|
|
111
|
+
|
|
112
|
+
const githubToken =
|
|
113
|
+
options.forgeToken || readEnvironmentVariable("GITHUB_TOKEN");
|
|
114
|
+
const gitlabToken =
|
|
115
|
+
options.forgeToken || readEnvironmentVariable("GITLAB_TOKEN");
|
|
116
|
+
|
|
117
|
+
if (githubInfo && githubToken) {
|
|
118
|
+
result.dataSources.push("github-api");
|
|
119
|
+
const { owner, repo } = githubInfo;
|
|
120
|
+
|
|
121
|
+
// To avoid hitting API rate limits or spamming, limit to the most recent 5 AI commits
|
|
122
|
+
const commitsToQuery = aiCommits.slice(0, 5);
|
|
123
|
+
const githubHeaders = {
|
|
124
|
+
Accept: "application/vnd.github+json",
|
|
125
|
+
Authorization: `Bearer ${githubToken}`,
|
|
126
|
+
"User-Agent": "cdxgen-oversight",
|
|
127
|
+
};
|
|
128
|
+
const pullsUrlFor = (commit) =>
|
|
129
|
+
`https://api.github.com/repos/${owner}/${repo}/commits/${commit.hash}/pulls`;
|
|
130
|
+
const prefetchedPulls = await prefetchCommitLookups(
|
|
131
|
+
commitsToQuery.map(pullsUrlFor),
|
|
132
|
+
githubHeaders,
|
|
133
|
+
);
|
|
134
|
+
|
|
135
|
+
for (const commit of commitsToQuery) {
|
|
136
|
+
try {
|
|
137
|
+
const pullsUrl = pullsUrlFor(commit);
|
|
138
|
+
const pullsRes =
|
|
139
|
+
prefetchedCommitLookup(prefetchedPulls, pullsUrl) ||
|
|
140
|
+
(await cdxgenAgent.get(pullsUrl, {
|
|
141
|
+
headers: githubHeaders,
|
|
142
|
+
responseType: "json",
|
|
143
|
+
throwHttpErrors: false,
|
|
144
|
+
}));
|
|
145
|
+
|
|
146
|
+
if (
|
|
147
|
+
pullsRes?.statusCode === 200 &&
|
|
148
|
+
Array.isArray(pullsRes.body) &&
|
|
149
|
+
pullsRes.body.length > 0
|
|
150
|
+
) {
|
|
151
|
+
const pr = pullsRes.body[0];
|
|
152
|
+
const prNumber = pr.number;
|
|
153
|
+
const prAuthor = pr.user?.login;
|
|
154
|
+
|
|
155
|
+
// Fetch reviews
|
|
156
|
+
const reviewsRes = await cdxgenAgent.get(
|
|
157
|
+
`https://api.github.com/repos/${owner}/${repo}/pulls/${prNumber}/reviews`,
|
|
158
|
+
{
|
|
159
|
+
headers: githubHeaders,
|
|
160
|
+
responseType: "json",
|
|
161
|
+
throwHttpErrors: false,
|
|
162
|
+
},
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
if (
|
|
166
|
+
reviewsRes?.statusCode === 200 &&
|
|
167
|
+
Array.isArray(reviewsRes.body)
|
|
168
|
+
) {
|
|
169
|
+
let hasIndependentApproval = false;
|
|
170
|
+
let selfApproved = false;
|
|
171
|
+
let approvedTime = null;
|
|
172
|
+
|
|
173
|
+
for (const review of reviewsRes.body) {
|
|
174
|
+
if (review.state === "APPROVED") {
|
|
175
|
+
const reviewer = review.user?.login;
|
|
176
|
+
const isBot =
|
|
177
|
+
review.user?.type === "Bot" || /\[bot\]/i.test(reviewer);
|
|
178
|
+
|
|
179
|
+
if (reviewer === prAuthor) {
|
|
180
|
+
selfApproved = true;
|
|
181
|
+
} else if (!isBot) {
|
|
182
|
+
hasIndependentApproval = true;
|
|
183
|
+
approvedTime = new Date(review.submitted_at);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
let reviewLatencySeconds = null;
|
|
189
|
+
if (approvedTime && pr.created_at) {
|
|
190
|
+
const createdTime = new Date(pr.created_at);
|
|
191
|
+
reviewLatencySeconds = Math.max(
|
|
192
|
+
0,
|
|
193
|
+
Math.floor((approvedTime - createdTime) / 1000),
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
result.prReviews.push({
|
|
198
|
+
commitHash: commit.hash,
|
|
199
|
+
hasIndependentApproval,
|
|
200
|
+
selfApproved,
|
|
201
|
+
reviewLatencySeconds,
|
|
202
|
+
prNumber,
|
|
203
|
+
prAuthor,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
} catch (_err) {
|
|
208
|
+
// Degrade gracefully
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
} else if (gitlabProject && gitlabToken) {
|
|
212
|
+
result.dataSources.push("gitlab-api");
|
|
213
|
+
const projectEncoded = encodeURIComponent(gitlabProject);
|
|
214
|
+
const commitsToQuery = aiCommits.slice(0, 5);
|
|
215
|
+
const gitlabHeaders = {
|
|
216
|
+
"PRIVATE-TOKEN": gitlabToken,
|
|
217
|
+
"User-Agent": "cdxgen-oversight",
|
|
218
|
+
};
|
|
219
|
+
const mrUrlFor = (commit) =>
|
|
220
|
+
`https://gitlab.com/api/v4/projects/${projectEncoded}/repository/commits/${commit.hash}/merge_requests`;
|
|
221
|
+
const prefetchedMrs = await prefetchCommitLookups(
|
|
222
|
+
commitsToQuery.map(mrUrlFor),
|
|
223
|
+
gitlabHeaders,
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
for (const commit of commitsToQuery) {
|
|
227
|
+
try {
|
|
228
|
+
const mrUrl = mrUrlFor(commit);
|
|
229
|
+
const mrRes =
|
|
230
|
+
prefetchedCommitLookup(prefetchedMrs, mrUrl) ||
|
|
231
|
+
(await cdxgenAgent.get(mrUrl, {
|
|
232
|
+
headers: gitlabHeaders,
|
|
233
|
+
responseType: "json",
|
|
234
|
+
throwHttpErrors: false,
|
|
235
|
+
}));
|
|
236
|
+
|
|
237
|
+
if (
|
|
238
|
+
mrRes?.statusCode === 200 &&
|
|
239
|
+
Array.isArray(mrRes.body) &&
|
|
240
|
+
mrRes.body.length > 0
|
|
241
|
+
) {
|
|
242
|
+
const mr = mrRes.body[0];
|
|
243
|
+
const mrIid = mr.iid;
|
|
244
|
+
const mrAuthor = mr.author?.username;
|
|
245
|
+
|
|
246
|
+
// Fetch approvals/reviews
|
|
247
|
+
const approvalsRes = await cdxgenAgent.get(
|
|
248
|
+
`https://gitlab.com/api/v4/projects/${projectEncoded}/merge_requests/${mrIid}/approvals`,
|
|
249
|
+
{
|
|
250
|
+
headers: gitlabHeaders,
|
|
251
|
+
responseType: "json",
|
|
252
|
+
throwHttpErrors: false,
|
|
253
|
+
},
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
if (approvalsRes?.statusCode === 200 && approvalsRes.body) {
|
|
257
|
+
const approvals = approvalsRes.body;
|
|
258
|
+
let hasIndependentApproval = false;
|
|
259
|
+
let selfApproved = false;
|
|
260
|
+
|
|
261
|
+
const approvedBy = approvals.approved_by || [];
|
|
262
|
+
for (const approval of approvedBy) {
|
|
263
|
+
const approver = approval.user?.username;
|
|
264
|
+
const isBot = /\[bot\]/i.test(approver);
|
|
265
|
+
|
|
266
|
+
if (approver === mrAuthor) {
|
|
267
|
+
selfApproved = true;
|
|
268
|
+
} else if (!isBot) {
|
|
269
|
+
hasIndependentApproval = true;
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
let reviewLatencySeconds = null;
|
|
274
|
+
if (hasIndependentApproval && mr.created_at && mr.updated_at) {
|
|
275
|
+
const createdTime = new Date(mr.created_at);
|
|
276
|
+
const approvedTime = new Date(mr.updated_at);
|
|
277
|
+
reviewLatencySeconds = Math.max(
|
|
278
|
+
0,
|
|
279
|
+
Math.floor((approvedTime - createdTime) / 1000),
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
result.prReviews.push({
|
|
284
|
+
commitHash: commit.hash,
|
|
285
|
+
hasIndependentApproval,
|
|
286
|
+
selfApproved,
|
|
287
|
+
reviewLatencySeconds,
|
|
288
|
+
prNumber: mrIid,
|
|
289
|
+
prAuthor: mrAuthor,
|
|
290
|
+
});
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
} catch (_err) {
|
|
294
|
+
// Degrade gracefully
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
return result;
|
|
300
|
+
}
|