@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,280 @@
|
|
|
1
|
+
import { Console } from "node:console";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { Writable } from "node:stream";
|
|
5
|
+
import { isMainThread } from "node:worker_threads";
|
|
6
|
+
|
|
7
|
+
// Environment variables here are read with raw `process.env` rather than
|
|
8
|
+
// `readEnvironmentVariable`: that helper lives in activity.js, which imports
|
|
9
|
+
// this module, so routing these through it would form an import cycle.
|
|
10
|
+
|
|
11
|
+
// Stream contract: human-readable diagnostics default to stderr so stdout
|
|
12
|
+
// carries only the BOM payload. CDXGEN_LOG_STREAM=stdout restores the
|
|
13
|
+
// pre-v13 behaviour for callers that scraped cdxgen's stdout.
|
|
14
|
+
const logStream =
|
|
15
|
+
process.env.CDXGEN_LOG_STREAM === "stdout" ? process.stdout : process.stderr;
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* The stream every human-readable diagnostic is written to.
|
|
19
|
+
*
|
|
20
|
+
* Exported so that the live region and the table renderer resolve the same
|
|
21
|
+
* destination as the loggers do. A caller that sets `CDXGEN_LOG_STREAM=stdout`
|
|
22
|
+
* gets the pre-v13 behaviour for all of it, not just for the thought and trace
|
|
23
|
+
* logs.
|
|
24
|
+
*
|
|
25
|
+
* @type {NodeJS.WritableStream}
|
|
26
|
+
*/
|
|
27
|
+
export const diagnosticStream = logStream;
|
|
28
|
+
|
|
29
|
+
// Custom lightweight colors formatting helper replacing yoctocolors
|
|
30
|
+
const colors = {
|
|
31
|
+
cyanBright: (text) => `\x1b[96m${text}\x1b[39m`,
|
|
32
|
+
dim: (text) => `\x1b[2m${text}\x1b[22m`,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** True when thought/reasoning logging is enabled (CDXGEN_THOUGHT_LOG, CDXGEN_THINK_MODE, or verbose debug mode). */
|
|
36
|
+
export const THINK_MODE =
|
|
37
|
+
process.env.CDXGEN_THOUGHT_LOG ||
|
|
38
|
+
["true", "1"].includes(process.env.CDXGEN_THINK_MODE) ||
|
|
39
|
+
process.env.CDXGEN_DEBUG_MODE === "verbose";
|
|
40
|
+
|
|
41
|
+
// Log files are written synchronously rather than through
|
|
42
|
+
// `fs.createWriteStream`. A write stream buffers, so anything still queued when
|
|
43
|
+
// the process exits is lost, leaving readers that tail these files a truncated
|
|
44
|
+
// log with no closing `</think>` marker. Writing through one shared descriptor
|
|
45
|
+
// per path also keeps the two Console channels from interleaving at
|
|
46
|
+
// independent file offsets.
|
|
47
|
+
const syncFileWriters = new Map();
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Open a synchronous writer for a log file path.
|
|
51
|
+
*
|
|
52
|
+
* `Console` requires a real stream, so this is a `Writable` whose `_write`
|
|
53
|
+
* completes synchronously: bytes reach the descriptor as each record is
|
|
54
|
+
* logged, and nothing is left queued for an event loop turn that a process
|
|
55
|
+
* exit may never take.
|
|
56
|
+
*
|
|
57
|
+
* @param {string} filePath Destination path
|
|
58
|
+
* @returns {Writable} Writer, or the diagnostic stream when the path is unwritable
|
|
59
|
+
*/
|
|
60
|
+
function openSyncFileWriter(filePath) {
|
|
61
|
+
const existing = syncFileWriters.get(filePath);
|
|
62
|
+
if (existing) {
|
|
63
|
+
return existing;
|
|
64
|
+
}
|
|
65
|
+
let fd;
|
|
66
|
+
try {
|
|
67
|
+
// Worker threads log to the same path through their own instance of this
|
|
68
|
+
// module, so the descriptor is opened in append mode: O_APPEND lands every
|
|
69
|
+
// write at the end of the file no matter how many writers share it, where
|
|
70
|
+
// a truncating open gives each writer its own offset and they punch holes
|
|
71
|
+
// through each other's records. The main thread truncates once so a run
|
|
72
|
+
// still starts from an empty log.
|
|
73
|
+
if (isMainThread) {
|
|
74
|
+
try {
|
|
75
|
+
fs.truncateSync(filePath, 0);
|
|
76
|
+
} catch {
|
|
77
|
+
// No file yet: the append open below creates it.
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
fd = fs.openSync(filePath, "a");
|
|
81
|
+
} catch {
|
|
82
|
+
// An unwritable path must not take the whole run down: fall back to the
|
|
83
|
+
// diagnostic stream so the records stay visible somewhere.
|
|
84
|
+
return logStream;
|
|
85
|
+
}
|
|
86
|
+
const writer = new Writable({
|
|
87
|
+
write(chunk, _encoding, callback) {
|
|
88
|
+
if (fd !== undefined) {
|
|
89
|
+
try {
|
|
90
|
+
fs.writeSync(fd, chunk);
|
|
91
|
+
} catch {
|
|
92
|
+
// A full disk or a revoked descriptor must not abort BOM generation.
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
callback();
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
writer.closeSync = () => {
|
|
99
|
+
if (fd === undefined) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
fs.closeSync(fd);
|
|
104
|
+
} finally {
|
|
105
|
+
fd = undefined;
|
|
106
|
+
syncFileWriters.delete(filePath);
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
syncFileWriters.set(filePath, writer);
|
|
110
|
+
return writer;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const thinkOutput = process.env.CDXGEN_THOUGHT_LOG
|
|
114
|
+
? openSyncFileWriter(process.env.CDXGEN_THOUGHT_LOG)
|
|
115
|
+
: logStream;
|
|
116
|
+
const thinkErrorOutput = process.env.CDXGEN_THOUGHT_LOG
|
|
117
|
+
? thinkOutput
|
|
118
|
+
: process.stderr;
|
|
119
|
+
const thinkLogger = new Console({
|
|
120
|
+
stdout: thinkOutput,
|
|
121
|
+
stderr: thinkErrorOutput,
|
|
122
|
+
colorMode: process.env.CDXGEN_THOUGHT_LOG ? false : "auto",
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
/** True when structured command/HTTP trace logging is enabled (CDXGEN_TRACE_LOG, CDXGEN_TRACE_ID, CDXGEN_TRACE_MODE, or verbose debug mode). */
|
|
126
|
+
export const TRACE_MODE =
|
|
127
|
+
process.env.CDXGEN_TRACE_LOG ||
|
|
128
|
+
process.env.CDXGEN_TRACE_ID ||
|
|
129
|
+
["true", "1"].includes(process.env.CDXGEN_TRACE_MODE) ||
|
|
130
|
+
process.env.CDXGEN_DEBUG_MODE === "verbose";
|
|
131
|
+
|
|
132
|
+
const traceOutput = process.env.CDXGEN_TRACE_LOG
|
|
133
|
+
? openSyncFileWriter(process.env.CDXGEN_TRACE_LOG)
|
|
134
|
+
: logStream;
|
|
135
|
+
const traceErrorOutput = process.env.CDXGEN_TRACE_LOG
|
|
136
|
+
? traceOutput
|
|
137
|
+
: process.stderr;
|
|
138
|
+
const traceLogger = new Console({
|
|
139
|
+
stdout: traceOutput,
|
|
140
|
+
stderr: traceErrorOutput,
|
|
141
|
+
colorMode: process.env.CDXGEN_TRACE_LOG ? false : "auto",
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
if (THINK_MODE) {
|
|
145
|
+
thinkLogger.group(colorizeText("<think>"));
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Logs a thought message to the think logger if THINK_MODE is enabled.
|
|
149
|
+
* Automatically appends a period to the message if it lacks terminal punctuation.
|
|
150
|
+
*
|
|
151
|
+
* @param {string} s The thought message to log
|
|
152
|
+
* @param {Object} [args] Optional additional arguments to log alongside the message
|
|
153
|
+
* @returns {void}
|
|
154
|
+
*/
|
|
155
|
+
export function thoughtLog(s, args) {
|
|
156
|
+
if (!THINK_MODE) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (!s?.endsWith(".") && !s?.endsWith("?") && !s?.endsWith("!")) {
|
|
160
|
+
s = `${s}.`;
|
|
161
|
+
}
|
|
162
|
+
s = s.replaceAll("'.'", "'<project dir>'");
|
|
163
|
+
if (args) {
|
|
164
|
+
thinkLogger.log(colorizeText(`${s}`), args);
|
|
165
|
+
} else {
|
|
166
|
+
thinkLogger.log(colorizeText(`${s}`));
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
let thoughtBlockClosed = false;
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Closes the think log group by emitting the closing `</think>` marker.
|
|
173
|
+
* Has no effect if THINK_MODE is not enabled, and emits the marker at most
|
|
174
|
+
* once so an explicit call followed by the exit handler cannot produce two.
|
|
175
|
+
*
|
|
176
|
+
* @returns {void}
|
|
177
|
+
*/
|
|
178
|
+
export function thoughtEnd() {
|
|
179
|
+
if (THINK_MODE && !thoughtBlockClosed) {
|
|
180
|
+
thoughtBlockClosed = true;
|
|
181
|
+
thinkLogger.groupEnd();
|
|
182
|
+
thinkLogger.log(colorizeText("</think>"));
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function colorizeText(s) {
|
|
187
|
+
// Only colorize for an interactive terminal stream; piped/CI/file output
|
|
188
|
+
// stays free of escape bytes so the diagnostic stream is grep-safe.
|
|
189
|
+
if (process.env.CDXGEN_THOUGHT_LOG || !logStream.isTTY) {
|
|
190
|
+
return s;
|
|
191
|
+
}
|
|
192
|
+
s = s.replace(/(\d+)/g, colors.cyanBright("$1"));
|
|
193
|
+
return colors.dim(s);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Fields serialized for each trace type. The allow-list is per-type because a
|
|
197
|
+
// single shared list either drops the fields a type exists to carry or leaks
|
|
198
|
+
// unbounded caller objects into the stream: `activity` and `phase` records
|
|
199
|
+
// carry no field in common with `spawn` and `http`.
|
|
200
|
+
const TRACE_FIELDS = {
|
|
201
|
+
activity: [
|
|
202
|
+
"identifier",
|
|
203
|
+
"kind",
|
|
204
|
+
"status",
|
|
205
|
+
"target",
|
|
206
|
+
"reason",
|
|
207
|
+
"networkIntent",
|
|
208
|
+
"command",
|
|
209
|
+
"cwd",
|
|
210
|
+
],
|
|
211
|
+
phase: ["phase", "state", "detail", "note", "done", "total", "elapsedMs"],
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
const DEFAULT_TRACE_FIELDS = [
|
|
215
|
+
"command",
|
|
216
|
+
"cwd",
|
|
217
|
+
"protocol",
|
|
218
|
+
"host",
|
|
219
|
+
"path",
|
|
220
|
+
"pathname",
|
|
221
|
+
];
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Log trace messages
|
|
225
|
+
*
|
|
226
|
+
* @param {String} traceType Trace type
|
|
227
|
+
* @param {Object} args Additional arguments
|
|
228
|
+
*/
|
|
229
|
+
export function traceLog(traceType, args) {
|
|
230
|
+
if (!TRACE_MODE || !traceType || !args) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const traceId = process.env.CDXGEN_TRACE_ID;
|
|
234
|
+
const message = {};
|
|
235
|
+
if (traceId) {
|
|
236
|
+
message.traceId = traceId;
|
|
237
|
+
}
|
|
238
|
+
message["timestamp"] = new Date().toISOString();
|
|
239
|
+
if (traceType) {
|
|
240
|
+
message.type = traceType;
|
|
241
|
+
}
|
|
242
|
+
if (args) {
|
|
243
|
+
for (const k of TRACE_FIELDS[traceType] || DEFAULT_TRACE_FIELDS) {
|
|
244
|
+
// Numeric progress counters are meaningful at zero, so presence is
|
|
245
|
+
// tested rather than truthiness.
|
|
246
|
+
if (args[k] !== undefined && args[k] !== null && args[k] !== "") {
|
|
247
|
+
message[k] = args[k];
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
if (Object.keys(message).length) {
|
|
252
|
+
traceLogger.log(JSON.stringify(message, null, null));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
let logStreamsClosed = false;
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Terminate the think block and close the log file descriptors.
|
|
260
|
+
*
|
|
261
|
+
* Readers tail these files as a live feed, so a run that ends without the
|
|
262
|
+
* closing `</think>` marker leaves the consumer holding an unterminated block.
|
|
263
|
+
* Registered on process exit and safe to call more than once.
|
|
264
|
+
*
|
|
265
|
+
* @returns {void}
|
|
266
|
+
*/
|
|
267
|
+
export function closeLogStreams() {
|
|
268
|
+
if (logStreamsClosed) {
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
logStreamsClosed = true;
|
|
272
|
+
thoughtEnd();
|
|
273
|
+
for (const writer of [...syncFileWriters.values()]) {
|
|
274
|
+
writer.closeSync();
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// The writers are synchronous, so this handler only has to emit the terminator
|
|
279
|
+
// and release the descriptors — work that is legal during `exit`.
|
|
280
|
+
process.on("exit", closeLogStreams);
|
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded concurrency utilities for CPU-bound and I/O-bound parallel work.
|
|
3
|
+
*
|
|
4
|
+
* Two primitives live here:
|
|
5
|
+
*
|
|
6
|
+
* - {@link mapWithConcurrency} — a promise pool for async I/O work (file
|
|
7
|
+
* hashing, registry fetches). Tasks are async; results preserve input order.
|
|
8
|
+
*
|
|
9
|
+
* - {@link mapInWorkers} — a worker-thread pool for synchronous CPU work (AST
|
|
10
|
+
* parsing). Below a configurable threshold tasks run inline; above it they
|
|
11
|
+
* are distributed across `worker_threads` workers. Any failure of the thread
|
|
12
|
+
* machinery itself — an unavailable `worker_threads`, a worker entry that
|
|
13
|
+
* will not load, a worker that dies mid-task — falls back to running the
|
|
14
|
+
* remaining tasks inline, so the result is the same whether or not threads
|
|
15
|
+
* were usable.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import { availableParallelism } from "node:os";
|
|
19
|
+
|
|
20
|
+
import { readEnvironmentVariable } from "./activity.js";
|
|
21
|
+
|
|
22
|
+
const _isDeno = globalThis.Deno?.version?.deno !== undefined;
|
|
23
|
+
const _isBun = globalThis.Bun?.version !== undefined;
|
|
24
|
+
|
|
25
|
+
const DEFAULT_HASH_CONCURRENCY = Math.min(
|
|
26
|
+
Math.max(availableParallelism(), 4),
|
|
27
|
+
16,
|
|
28
|
+
);
|
|
29
|
+
|
|
30
|
+
const WORKER_THRESHOLD = Number.parseInt(
|
|
31
|
+
readEnvironmentVariable("CDXGEN_WORKER_THRESHOLD") || "24",
|
|
32
|
+
10,
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
const MAX_WORKERS = Number.parseInt(
|
|
36
|
+
readEnvironmentVariable("CDXGEN_MAX_WORKERS") ||
|
|
37
|
+
String(Math.min(availableParallelism() || 4, 8)),
|
|
38
|
+
10,
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Run an async mapper over an array with bounded concurrency.
|
|
43
|
+
*
|
|
44
|
+
* Results are placed at their original index so order is preserved regardless
|
|
45
|
+
* of completion order. Below the concurrency limit tasks start immediately;
|
|
46
|
+
* above it they queue in FIFO order.
|
|
47
|
+
*
|
|
48
|
+
* The bound is per call, so two pools running at once can together hold twice
|
|
49
|
+
* the limit open. Every caller today awaits its pool before the next phase
|
|
50
|
+
* begins, so the effective bound is the limit; a caller that starts a pool
|
|
51
|
+
* without awaiting it should pass a smaller `concurrency`.
|
|
52
|
+
*
|
|
53
|
+
* @template T, R
|
|
54
|
+
* @param {Array<T>} items
|
|
55
|
+
* @param {(item: T, index: number) => Promise<R>|R} mapper
|
|
56
|
+
* @param {number} [concurrency]
|
|
57
|
+
* @returns {Promise<Array<R>>}
|
|
58
|
+
*/
|
|
59
|
+
export async function mapWithConcurrency(items, mapper, concurrency) {
|
|
60
|
+
const limit = Math.max(1, concurrency || DEFAULT_HASH_CONCURRENCY);
|
|
61
|
+
const results = new Array(items.length);
|
|
62
|
+
let nextIndex = 0;
|
|
63
|
+
|
|
64
|
+
async function runner() {
|
|
65
|
+
while (true) {
|
|
66
|
+
const i = nextIndex;
|
|
67
|
+
nextIndex++;
|
|
68
|
+
if (i >= items.length) return;
|
|
69
|
+
results[i] = await mapper(items[i], i);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const runners = [];
|
|
74
|
+
for (let i = 0; i < Math.min(limit, items.length); i++) {
|
|
75
|
+
runners.push(runner());
|
|
76
|
+
}
|
|
77
|
+
await Promise.all(runners);
|
|
78
|
+
return results;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Maximum number of worker threads the pool will create for a single call.
|
|
83
|
+
*
|
|
84
|
+
* @returns {number}
|
|
85
|
+
*/
|
|
86
|
+
export function getMaxWorkers() {
|
|
87
|
+
return Math.max(1, MAX_WORKERS);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* The task count at or above which {@link mapInWorkers} dispatches to threads
|
|
92
|
+
* instead of running inline.
|
|
93
|
+
*
|
|
94
|
+
* @returns {number}
|
|
95
|
+
*/
|
|
96
|
+
export function getWorkerThreshold() {
|
|
97
|
+
return WORKER_THRESHOLD;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let _workerSupported = null;
|
|
101
|
+
let lastWorkerCount = 0;
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* Workers created by the most recent {@link mapInWorkers} call. Scoped to that
|
|
105
|
+
* one call rather than to the process, so a batch that ran inline reports 0
|
|
106
|
+
* rather than the widest earlier batch.
|
|
107
|
+
*
|
|
108
|
+
* @returns {number}
|
|
109
|
+
*/
|
|
110
|
+
export function lastWorkerPoolSize() {
|
|
111
|
+
return lastWorkerCount;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function checkWorkerSupport() {
|
|
115
|
+
if (_workerSupported !== null) return _workerSupported;
|
|
116
|
+
if (_isDeno || _isBun) {
|
|
117
|
+
_workerSupported = false;
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
try {
|
|
121
|
+
await import("node:worker_threads");
|
|
122
|
+
_workerSupported = true;
|
|
123
|
+
} catch {
|
|
124
|
+
_workerSupported = false;
|
|
125
|
+
}
|
|
126
|
+
return _workerSupported;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* A task failed inside a worker, as opposed to the worker itself failing. The
|
|
131
|
+
* two are handled differently: the first belongs to one task, the second means
|
|
132
|
+
* threads cannot be used at all.
|
|
133
|
+
*/
|
|
134
|
+
class TaskError extends Error {}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Apply `inlineFn` to the tasks at the given indices on the calling thread.
|
|
138
|
+
*
|
|
139
|
+
* @template T, R
|
|
140
|
+
* @param {Array<T>} tasks
|
|
141
|
+
* @param {(task: T) => R} inlineFn
|
|
142
|
+
* @param {Array<R|null>} results Filled in place at each index.
|
|
143
|
+
* @param {Iterable<number>} indices
|
|
144
|
+
* @param {boolean} swallowErrors
|
|
145
|
+
* @param {R|null} errorResult
|
|
146
|
+
*/
|
|
147
|
+
function runInline(
|
|
148
|
+
tasks,
|
|
149
|
+
inlineFn,
|
|
150
|
+
results,
|
|
151
|
+
indices,
|
|
152
|
+
swallowErrors,
|
|
153
|
+
errorResult,
|
|
154
|
+
) {
|
|
155
|
+
for (const i of indices) {
|
|
156
|
+
try {
|
|
157
|
+
results[i] = inlineFn(tasks[i]);
|
|
158
|
+
} catch (err) {
|
|
159
|
+
if (!swallowErrors) {
|
|
160
|
+
throw err;
|
|
161
|
+
}
|
|
162
|
+
results[i] = errorResult;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Run synchronous CPU-bound tasks across worker threads.
|
|
169
|
+
*
|
|
170
|
+
* Below the threshold (default 24), tasks run inline on the calling thread,
|
|
171
|
+
* because starting a worker costs more than a small batch saves. Above it,
|
|
172
|
+
* tasks are distributed to a pool of ephemeral workers that are terminated
|
|
173
|
+
* before the call returns, so a completed scan does not hold the event loop
|
|
174
|
+
* open.
|
|
175
|
+
*
|
|
176
|
+
* Results are always returned in the original task order.
|
|
177
|
+
*
|
|
178
|
+
* Two kinds of failure are distinguished. A task that fails inside the worker
|
|
179
|
+
* is reported by the worker as `{error}` and is treated as that one task
|
|
180
|
+
* failing: it yields `options.errorResult` when `options.swallowErrors` is set,
|
|
181
|
+
* and rejects otherwise. A failure of the thread machinery — `worker_threads`
|
|
182
|
+
* missing, the entry module refusing to load, a worker exiting mid-task — is
|
|
183
|
+
* not a property of any task, so the tasks that had not completed are run
|
|
184
|
+
* inline instead. That keeps the result independent of whether threads were
|
|
185
|
+
* usable, which matters because callers of this function treat an empty result
|
|
186
|
+
* as "nothing found" rather than as an error.
|
|
187
|
+
*
|
|
188
|
+
* @template T, R
|
|
189
|
+
* @param {URL|string} workerUrl - Resolved URL of the worker entry module
|
|
190
|
+
* @param {Array<T>} tasks - Structured-cloneable task descriptors
|
|
191
|
+
* @param {(task: T) => R} inlineFn - Called per task when running inline
|
|
192
|
+
* @param {Object} [options]
|
|
193
|
+
* @param {number} [options.threshold] - Minimum task count to use threads
|
|
194
|
+
* @param {number} [options.maxWorkers] - Cap on thread count
|
|
195
|
+
* @param {boolean} [options.swallowErrors] - Return errorResult instead of rejecting
|
|
196
|
+
* @param {R} [options.errorResult] - Value used when an error is swallowed
|
|
197
|
+
* @returns {Promise<Array<R|null>>}
|
|
198
|
+
*/
|
|
199
|
+
export async function mapInWorkers(workerUrl, tasks, inlineFn, options = {}) {
|
|
200
|
+
const threshold = options.threshold ?? WORKER_THRESHOLD;
|
|
201
|
+
const swallowErrors = Boolean(options.swallowErrors);
|
|
202
|
+
const errorResult = options.errorResult ?? null;
|
|
203
|
+
const results = new Array(tasks.length).fill(null);
|
|
204
|
+
const useWorkers = tasks.length >= threshold && (await checkWorkerSupport());
|
|
205
|
+
|
|
206
|
+
lastWorkerCount = 0;
|
|
207
|
+
if (!useWorkers) {
|
|
208
|
+
runInline(
|
|
209
|
+
tasks,
|
|
210
|
+
inlineFn,
|
|
211
|
+
results,
|
|
212
|
+
tasks.keys(),
|
|
213
|
+
swallowErrors,
|
|
214
|
+
errorResult,
|
|
215
|
+
);
|
|
216
|
+
return results;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const maxWorkers = Math.min(options.maxWorkers ?? MAX_WORKERS, tasks.length);
|
|
220
|
+
const done = new Set();
|
|
221
|
+
let nextTask = 0;
|
|
222
|
+
let workersUsable = true;
|
|
223
|
+
|
|
224
|
+
const { Worker } = await import("node:worker_threads");
|
|
225
|
+
const workers = [];
|
|
226
|
+
|
|
227
|
+
function runOnWorker(worker, task) {
|
|
228
|
+
return new Promise((resolve, reject) => {
|
|
229
|
+
const cleanup = () => {
|
|
230
|
+
worker.removeListener("message", onMessage);
|
|
231
|
+
worker.removeListener("error", onError);
|
|
232
|
+
worker.removeListener("exit", onExit);
|
|
233
|
+
};
|
|
234
|
+
const onMessage = (msg) => {
|
|
235
|
+
cleanup();
|
|
236
|
+
if (msg?.error) {
|
|
237
|
+
reject(new TaskError(msg.error));
|
|
238
|
+
} else {
|
|
239
|
+
resolve(msg?.result);
|
|
240
|
+
}
|
|
241
|
+
};
|
|
242
|
+
const onError = (err) => {
|
|
243
|
+
cleanup();
|
|
244
|
+
reject(err);
|
|
245
|
+
};
|
|
246
|
+
// A worker can end without ever emitting `error` — it can be terminated,
|
|
247
|
+
// call `process.exit`, or be killed for running out of memory. Without
|
|
248
|
+
// this the pending request would never settle and the scan would hang.
|
|
249
|
+
const onExit = (code) => {
|
|
250
|
+
cleanup();
|
|
251
|
+
reject(new Error(`Worker exited with code ${code} before replying`));
|
|
252
|
+
};
|
|
253
|
+
worker.on("message", onMessage);
|
|
254
|
+
worker.on("error", onError);
|
|
255
|
+
worker.on("exit", onExit);
|
|
256
|
+
worker.postMessage(task);
|
|
257
|
+
});
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
async function workerLoop() {
|
|
261
|
+
let worker;
|
|
262
|
+
try {
|
|
263
|
+
worker = new Worker(workerUrl);
|
|
264
|
+
} catch {
|
|
265
|
+
workersUsable = false;
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
workers.push(worker);
|
|
269
|
+
lastWorkerCount = workers.length;
|
|
270
|
+
try {
|
|
271
|
+
while (workersUsable) {
|
|
272
|
+
const i = nextTask;
|
|
273
|
+
nextTask++;
|
|
274
|
+
if (i >= tasks.length) {
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
try {
|
|
278
|
+
results[i] = await runOnWorker(worker, tasks[i]);
|
|
279
|
+
done.add(i);
|
|
280
|
+
} catch (err) {
|
|
281
|
+
if (err instanceof TaskError) {
|
|
282
|
+
if (!swallowErrors) {
|
|
283
|
+
throw err;
|
|
284
|
+
}
|
|
285
|
+
results[i] = errorResult;
|
|
286
|
+
done.add(i);
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
// The worker, not the task, failed. Stop the pool and let the
|
|
290
|
+
// caller finish the outstanding tasks inline.
|
|
291
|
+
workersUsable = false;
|
|
292
|
+
return;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
} finally {
|
|
296
|
+
await worker.terminate().catch(() => {
|
|
297
|
+
/* already exited */
|
|
298
|
+
});
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
try {
|
|
303
|
+
const loops = [];
|
|
304
|
+
for (let i = 0; i < maxWorkers; i++) {
|
|
305
|
+
loops.push(workerLoop());
|
|
306
|
+
}
|
|
307
|
+
await Promise.all(loops);
|
|
308
|
+
} finally {
|
|
309
|
+
await Promise.allSettled(workers.map((w) => w.terminate()));
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (!workersUsable) {
|
|
313
|
+
const pending = [];
|
|
314
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
315
|
+
if (!done.has(i)) {
|
|
316
|
+
pending.push(i);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
runInline(tasks, inlineFn, results, pending, swallowErrors, errorResult);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
return results;
|
|
323
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Repo-root resolution, shared by every helper that loads a file from `data/`.
|
|
3
|
+
*
|
|
4
|
+
* This lives in its own leaf module — importing nothing from `utils.js` — because
|
|
5
|
+
* the value is consumed at *module-evaluation* time (`JSON.parse(readFileSync(
|
|
6
|
+
* join(dirNameStr, "data", …)))`). A module in a cycle with `utils.js` that reads
|
|
7
|
+
* `dirNameStr` while `utils.js` is still evaluating gets the binding in its
|
|
8
|
+
* temporal dead zone and throws `ReferenceError: Cannot access 'dirNameStr'
|
|
9
|
+
* before initialization`. Keeping the definition in a leaf guarantees it is
|
|
10
|
+
* initialized before any consumer runs.
|
|
11
|
+
*
|
|
12
|
+
* The `file://` normalization below is load-bearing, not defensive noise:
|
|
13
|
+
* `jsr.json` publishes `lib/cli/index.js` to JSR, so `import.meta.url` can be an
|
|
14
|
+
* `https://` URL, and `fileURLToPath` throws `ERR_INVALID_URL_SCHEME` on those.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { platform } from "node:os";
|
|
18
|
+
import { dirname } from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
|
|
21
|
+
let url = import.meta?.url;
|
|
22
|
+
if (url && !url.startsWith("file://")) {
|
|
23
|
+
url = new URL(`file://${import.meta.url}`).toString();
|
|
24
|
+
}
|
|
25
|
+
// TODO: verify if this is a good method (Prabhu)
|
|
26
|
+
// this is due to dirNameStr being "cdxgen/lib/helpers" which causes errors
|
|
27
|
+
/** Absolute path to the cdxgen repository root, resolved from the module URL. */
|
|
28
|
+
export const dirNameStr = url
|
|
29
|
+
? dirname(dirname(dirname(fileURLToPath(url))))
|
|
30
|
+
: __dirname;
|
|
31
|
+
|
|
32
|
+
/** True when running on Windows. */
|
|
33
|
+
export const isWin = platform() === "win32";
|
|
34
|
+
/** True when running on macOS. */
|
|
35
|
+
export const isMac = platform() === "darwin";
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Validate that a string is a Windows drive root such as `C:\`.
|
|
39
|
+
*
|
|
40
|
+
* @param {string} root Candidate drive root string.
|
|
41
|
+
* @returns {boolean} True when the string is a valid Windows drive root.
|
|
42
|
+
*/
|
|
43
|
+
export function isValidDriveRoot(root) {
|
|
44
|
+
if (root.length > 3) {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
const driveLetter = root.charAt(0);
|
|
48
|
+
const colon = root.charAt(1);
|
|
49
|
+
const backslash = root.charAt(2);
|
|
50
|
+
const charCode = driveLetter.charCodeAt(0);
|
|
51
|
+
const isAsciiLetter =
|
|
52
|
+
(charCode >= 65 && charCode <= 90) || (charCode >= 97 && charCode <= 122);
|
|
53
|
+
if (!isAsciiLetter) {
|
|
54
|
+
return false;
|
|
55
|
+
}
|
|
56
|
+
if (colon.charCodeAt(0) !== 0x3a) {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
return !(backslash && backslash.charCodeAt(0) !== 0x5c);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Convert a kebab-case string to camelCase.
|
|
64
|
+
*
|
|
65
|
+
* @param {string} str Kebab-case input string.
|
|
66
|
+
* @returns {string} camelCase representation of the input.
|
|
67
|
+
*/
|
|
68
|
+
export function toCamel(str) {
|
|
69
|
+
return str.replace(/-([a-z])/g, (_, g) => g.toUpperCase());
|
|
70
|
+
}
|