@cdxgen/cdxgen 0.0.1 → 13.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +921 -87
- package/bin/audit.js +239 -0
- package/bin/cdxgen.js +2324 -0
- package/bin/convert.js +213 -0
- package/bin/evinse.js +353 -0
- package/bin/hbom.js +495 -0
- package/bin/repl.js +2224 -0
- package/bin/sign.js +195 -0
- package/bin/tracebom.js +295 -0
- package/bin/validate.js +268 -0
- package/bin/verify.js +189 -0
- package/data/README.md +307 -0
- package/data/bom-1.4.schema.json +1605 -0
- package/data/bom-1.5.schema.json +3660 -0
- package/data/bom-1.6.schema.json +5511 -0
- package/data/bom-1.7.schema.json +6700 -0
- package/data/cbomosdb-queries.json +68 -0
- package/data/component-tags.json +339 -0
- package/data/container-knowledge-index.json +125 -0
- package/data/cosdb-queries.json +17 -0
- package/data/crypto-oid.json +1998 -0
- package/data/cryptography-defs.json +3793 -0
- package/data/cryptography-defs.schema.json +576 -0
- package/data/cyclonedx-2.0-bundled.schema.json +7182 -0
- package/data/frameworks-list.json +219 -0
- package/data/glibc-stdlib.json +117 -0
- package/data/gtfobins-index.json +6296 -0
- package/data/helpers/init.gradle +71 -0
- package/data/jsf-0.82.schema.json +211 -0
- package/data/known-licenses.json +82 -0
- package/data/lic-mapping.json +338 -0
- package/data/license-aliases.json +6624 -0
- package/data/license-db.json +39059 -0
- package/data/license-deprecations.json +302 -0
- package/data/lolbas-index.json +150 -0
- package/data/predictive-audit-allowlist.json +11 -0
- package/data/pypi-pkg-aliases.json +1199 -0
- package/data/python-stdlib.json +308 -0
- package/data/queries-darwin.json +193 -0
- package/data/queries-win.json +257 -0
- package/data/queries.json +268 -0
- package/data/ruby-known-modules.json +281 -0
- package/data/rules/ai-agent-governance.yaml +323 -0
- package/data/rules/ai-bom.yaml +268 -0
- package/data/rules/ai-oversight.yaml +186 -0
- package/data/rules/ai-provenance.yaml +92 -0
- package/data/rules/asar-archives.yaml +150 -0
- package/data/rules/cbom-security.yaml +165 -0
- package/data/rules/chrome-extensions.yaml +248 -0
- package/data/rules/ci-permissions.yaml +802 -0
- package/data/rules/container-risk.yaml +353 -0
- package/data/rules/dependency-sources.yaml +236 -0
- package/data/rules/golem-go.yaml +229 -0
- package/data/rules/hbom-compliance.yaml +325 -0
- package/data/rules/hbom-performance.yaml +307 -0
- package/data/rules/hbom-security.yaml +248 -0
- package/data/rules/host-topology.yaml +165 -0
- package/data/rules/mcp-servers.yaml +388 -0
- package/data/rules/obom-runtime.yaml +1776 -0
- package/data/rules/package-integrity.yaml +364 -0
- package/data/rules/rootfs-hardening.yaml +179 -0
- package/data/rules/vscode-extensions.yaml +237 -0
- package/data/spdx-export.schema.json +6794 -0
- package/data/spdx-license-list.json +7449 -0
- package/data/spdx-licenses.json +759 -0
- package/data/spdx.schema.json +819 -0
- package/data/templates/README.md +3 -0
- package/data/templates/asvs-4.0.3.cdx.json +2943 -0
- package/data/templates/asvs-5.0.cdx.json +3046 -0
- package/data/templates/bsimm-v13.cdx.json +1008 -0
- package/data/templates/masvs-2.0.0.cdx.json +225 -0
- package/data/templates/nist-ssdf-1.1.cdx.json +828 -0
- package/data/templates/pcissc-secure-slc-1.1.cdx.json +1027 -0
- package/data/templates/scvs-1.0.0.cdx.json +813 -0
- package/data/templates/ssaf-DRAFT-2023-11.cdx.json +127 -0
- package/data/vendor-alias.json +41967 -0
- package/data/wrapdb-releases.json +4227 -0
- package/index.cjs +15 -0
- package/lib/audit/index.js +2800 -0
- package/lib/audit/progress.js +114 -0
- package/lib/audit/reporters.js +937 -0
- package/lib/audit/scoring.js +560 -0
- package/lib/audit/targets.js +798 -0
- package/lib/cli/bomAssembly.js +1833 -0
- package/lib/cli/cliOptions.js +513 -0
- package/lib/cli/index.js +2759 -0
- package/lib/cli/jsBom.js +2087 -0
- package/lib/cli/jvmBom.js +1858 -0
- package/lib/cli/managedBom.js +2083 -0
- package/lib/cli/nativeBom.js +2125 -0
- package/lib/core/activity.js +1087 -0
- package/lib/core/env.js +719 -0
- package/lib/core/fs.js +1058 -0
- package/lib/core/httpClient.js +730 -0
- package/lib/core/logger.js +142 -0
- package/lib/core/parallel.js +323 -0
- package/lib/core/paths.js +70 -0
- package/lib/core/projectConfig.js +122 -0
- package/lib/core/propertySanitizer.js +174 -0
- package/lib/core/spdx.js +5 -0
- package/lib/core/state.js +59 -0
- package/lib/core/text.js +207 -0
- package/lib/core/ui.js +876 -0
- package/lib/core/urls.js +84 -0
- package/lib/ecosystems/asarutils.js +1636 -0
- package/lib/ecosystems/bunutils.js +402 -0
- package/lib/ecosystems/caxa.js +77 -0
- package/lib/ecosystems/chromextutils.js +1174 -0
- package/lib/ecosystems/cmakeResolver.js +587 -0
- package/lib/ecosystems/cppEvidence.js +305 -0
- package/lib/ecosystems/denoutils.js +1094 -0
- package/lib/ecosystems/dotnetutils.js +132 -0
- package/lib/ecosystems/ecosystems.js +2772 -0
- package/lib/ecosystems/golem.js +1807 -0
- package/lib/ecosystems/gradleutils.js +1048 -0
- package/lib/ecosystems/jsEvidence.js +317 -0
- package/lib/ecosystems/npmutils.js +586 -0
- package/lib/ecosystems/parsers-bazel.js +875 -0
- package/lib/ecosystems/parsers-dotnet.js +1430 -0
- package/lib/ecosystems/parsers-gleam.js +302 -0
- package/lib/ecosystems/parsers-go.js +818 -0
- package/lib/ecosystems/parsers-js.js +4222 -0
- package/lib/ecosystems/parsers-jvm.js +948 -0
- package/lib/ecosystems/parsers-misc.js +3191 -0
- package/lib/ecosystems/parsers-python.js +2070 -0
- package/lib/ecosystems/parsers-rust.js +1294 -0
- package/lib/ecosystems/parsers-zig.js +861 -0
- package/lib/ecosystems/pep770.js +341 -0
- package/lib/ecosystems/pylockutils.js +427 -0
- package/lib/ecosystems/pythonutils.js +1281 -0
- package/lib/ecosystems/registryProvenance.js +1003 -0
- package/lib/ecosystems/remote/huggingface.js +1343 -0
- package/lib/ecosystems/rubyutils.js +1629 -0
- package/lib/ecosystems/rusi.js +820 -0
- package/lib/ecosystems/sbtutils.js +972 -0
- package/lib/ecosystems/tea.js +607 -0
- package/lib/ecosystems/utils.js +575 -0
- package/lib/ecosystems/zigResolver.js +410 -0
- package/lib/evinser/db.js +145 -0
- package/lib/evinser/evinser.js +2362 -0
- package/lib/evinser/scalasem.js +65 -0
- package/lib/evinser/swiftsem.js +767 -0
- package/lib/helpers/annotationFormatter.js +84 -0
- package/lib/helpers/bomSigner.js +312 -0
- package/lib/helpers/exportUtils.js +160 -0
- package/lib/helpers/remote/dependency-track.js +117 -0
- package/lib/helpers/versutils.js +202 -0
- package/lib/helpers/vsixutils.js +1069 -0
- package/lib/inventory/agentFormulationParser.js +322 -0
- package/lib/inventory/aiCollector.js +2140 -0
- package/lib/inventory/aiInventory.js +414 -0
- package/lib/inventory/aiModelVariants.js +121 -0
- package/lib/inventory/aiOversightCollector.js +661 -0
- package/lib/inventory/aiProvenanceCollector.js +822 -0
- package/lib/inventory/analyzer.js +6089 -0
- package/lib/inventory/analyzerScope.js +807 -0
- package/lib/inventory/astWorker.js +20 -0
- package/lib/inventory/atomUtils.js +1092 -0
- package/lib/inventory/auditCategories.js +192 -0
- package/lib/inventory/bomUtils.js +369 -0
- package/lib/inventory/cacheCommands.js +182 -0
- package/lib/inventory/cacheDir.js +104 -0
- package/lib/inventory/cbomutils.js +590 -0
- package/lib/inventory/cdxrs.js +434 -0
- package/lib/inventory/ciParsers/azurePipelines.js +295 -0
- package/lib/inventory/ciParsers/circleCi.js +286 -0
- package/lib/inventory/ciParsers/common.js +24 -0
- package/lib/inventory/ciParsers/githubActions.js +2434 -0
- package/lib/inventory/ciParsers/gitlabCi.js +213 -0
- package/lib/inventory/ciParsers/jenkins.js +180 -0
- package/lib/inventory/citations.js +234 -0
- package/lib/inventory/communityAiConfigParser.js +756 -0
- package/lib/inventory/containerRisk.js +204 -0
- package/lib/inventory/cryptoAlgorithmFamily.js +258 -0
- package/lib/inventory/deps.js +807 -0
- package/lib/inventory/depsUtils.js +588 -0
- package/lib/inventory/display.js +2128 -0
- package/lib/inventory/dosai.js +601 -0
- package/lib/inventory/dosaiParsers.js +154 -0
- package/lib/inventory/dynamic.js +145 -0
- package/lib/inventory/envcontext.js +1789 -0
- package/lib/inventory/evidenceUtils.js +774 -0
- package/lib/inventory/fetchBatch.js +779 -0
- package/lib/inventory/fetchRate.js +255 -0
- package/lib/inventory/forgeEnricher.js +300 -0
- package/lib/inventory/formulationParsers.js +422 -0
- package/lib/inventory/gtfobins.js +339 -0
- package/lib/inventory/hbom.js +719 -0
- package/lib/inventory/hbomAnalysis.js +310 -0
- package/lib/inventory/hbomLoader.js +35 -0
- package/lib/inventory/hostTopology.js +835 -0
- package/lib/inventory/inventoryStats.js +100 -0
- package/lib/inventory/jsonLike.js +121 -0
- package/lib/inventory/licenseEnhancer.js +918 -0
- package/lib/inventory/lolbas.js +285 -0
- package/lib/inventory/mcp.js +253 -0
- package/lib/inventory/mcpConfigParser.js +683 -0
- package/lib/inventory/mcpDiscovery.js +112 -0
- package/lib/inventory/mcpPinning.js +209 -0
- package/lib/inventory/osPackageResolver.js +493 -0
- package/lib/inventory/osinfo.js +277 -0
- package/lib/inventory/osqueryTransform.js +274 -0
- package/lib/inventory/plugins.js +466 -0
- package/lib/inventory/protobom.js +231 -0
- package/lib/inventory/protobomLoader.js +43 -0
- package/lib/inventory/provenanceUtils.js +224 -0
- package/lib/inventory/purl.js +749 -0
- package/lib/inventory/rustFormulationParser.js +339 -0
- package/lib/inventory/sbomDocument.js +340 -0
- package/lib/inventory/source.js +1488 -0
- package/lib/inventory/spdx.js +361 -0
- package/lib/inventory/spdxExpression.js +512 -0
- package/lib/inventory/spdxUtils.js +107 -0
- package/lib/inventory/table.js +263 -0
- package/lib/inventory/traceRunner.js +439 -0
- package/lib/inventory/unicodeScan.js +147 -0
- package/lib/managers/binary.js +3307 -0
- package/lib/managers/containerutils.js +125 -0
- package/lib/managers/docker.js +2145 -0
- package/lib/managers/dockerConnection.js +162 -0
- package/lib/managers/oci.js +704 -0
- package/lib/managers/piptree.js +267 -0
- package/lib/parsers/cmakeCache.js +199 -0
- package/lib/parsers/gguf.js +492 -0
- package/lib/parsers/gitAiNotes.js +233 -0
- package/lib/parsers/gitmodules.js +239 -0
- package/lib/parsers/htmlExtract.js +610 -0
- package/lib/parsers/huggingfaceManifest.js +551 -0
- package/lib/parsers/huggingfaceUtils.js +506 -0
- package/lib/parsers/iri.js +618 -0
- package/lib/parsers/npmrc.js +99 -0
- package/lib/parsers/ollama.js +101 -0
- package/lib/parsers/xml.js +841 -0
- package/lib/server/openapi.yaml +433 -0
- package/lib/server/server.js +616 -0
- package/lib/stages/postgen/annotator.js +977 -0
- package/lib/stages/postgen/auditBom.js +468 -0
- package/lib/stages/postgen/postgen.js +1239 -0
- package/lib/stages/postgen/ruleEngine.js +731 -0
- package/lib/stages/postgen/sortBom.js +195 -0
- package/lib/stages/postgen/spdxConverter.js +796 -0
- package/lib/stages/postgen/specVersionCompat.js +703 -0
- package/lib/stages/pregen/envAudit.js +388 -0
- package/lib/stages/pregen/pregen.js +637 -0
- package/lib/third-party/README.md +9 -0
- package/lib/third-party/arborist/CHANGELOG.md +1109 -0
- package/lib/third-party/arborist/LICENSE.md +20 -0
- package/lib/third-party/arborist/README.md +315 -0
- package/lib/third-party/arborist/lib/arborist/index.js +258 -0
- package/lib/third-party/arborist/lib/arborist/load-actual.js +605 -0
- package/lib/third-party/arborist/lib/arborist/load-virtual.js +300 -0
- package/lib/third-party/arborist/lib/bin-links.js +120 -0
- package/lib/third-party/arborist/lib/calc-dep-flags.js +130 -0
- package/lib/third-party/arborist/lib/case-insensitive-map.js +51 -0
- package/lib/third-party/arborist/lib/consistent-resolve.js +42 -0
- package/lib/third-party/arborist/lib/debug.js +50 -0
- package/lib/third-party/arborist/lib/dep-valid.js +190 -0
- package/lib/third-party/arborist/lib/edge.js +417 -0
- package/lib/third-party/arborist/lib/from-path.js +36 -0
- package/lib/third-party/arborist/lib/gather-dep-set.js +43 -0
- package/lib/third-party/arborist/lib/index.js +22 -0
- package/lib/third-party/arborist/lib/inventory.js +138 -0
- package/lib/third-party/arborist/lib/link.js +169 -0
- package/lib/third-party/arborist/lib/node.js +1673 -0
- package/lib/third-party/arborist/lib/npm-extension.js +45 -0
- package/lib/third-party/arborist/lib/override-resolves.js +11 -0
- package/lib/third-party/arborist/lib/override-set.js +319 -0
- package/lib/third-party/arborist/lib/package-extensions.js +289 -0
- package/lib/third-party/arborist/lib/printable.js +210 -0
- package/lib/third-party/arborist/lib/proc-log.js +30 -0
- package/lib/third-party/arborist/lib/realpath.js +100 -0
- package/lib/third-party/arborist/lib/relpath.js +4 -0
- package/lib/third-party/arborist/lib/shrinkwrap.js +1291 -0
- package/lib/third-party/arborist/lib/spec-from-lock.js +34 -0
- package/lib/third-party/arborist/lib/tree-check.js +165 -0
- package/lib/third-party/arborist/lib/validate-npm-package-name.js +107 -0
- package/lib/third-party/arborist/lib/version-from-tgz.js +51 -0
- package/lib/third-party/arborist/lib/yarn-lock.js +397 -0
- package/lib/validator/bomValidator.js +985 -0
- package/lib/validator/complianceEngine.js +241 -0
- package/lib/validator/complianceRules.js +1680 -0
- package/lib/validator/generated/runtime.mjs +17 -0
- package/lib/validator/generated/validate-1.6.mjs +21258 -0
- package/lib/validator/generated/validate-1.7.mjs +24803 -0
- package/lib/validator/generated/validate-2.0.mjs +22931 -0
- package/lib/validator/index.js +246 -0
- package/lib/validator/reporters/annotations.js +142 -0
- package/lib/validator/reporters/console.js +160 -0
- package/lib/validator/reporters/index.js +41 -0
- package/lib/validator/reporters/json.js +37 -0
- package/lib/validator/reporters/sarif.js +184 -0
- package/package.json +209 -26
- package/types/bin/audit.d.ts +3 -0
- package/types/bin/audit.d.ts.map +1 -0
- package/types/bin/cdxgen.d.ts +3 -0
- package/types/bin/cdxgen.d.ts.map +1 -0
- package/types/bin/convert.d.ts +3 -0
- package/types/bin/convert.d.ts.map +1 -0
- package/types/bin/evinse.d.ts +3 -0
- package/types/bin/evinse.d.ts.map +1 -0
- package/types/bin/hbom.d.ts +3 -0
- package/types/bin/hbom.d.ts.map +1 -0
- package/types/bin/repl.d.ts +3 -0
- package/types/bin/repl.d.ts.map +1 -0
- package/types/bin/sign.d.ts +3 -0
- package/types/bin/sign.d.ts.map +1 -0
- package/types/bin/tracebom.d.ts +3 -0
- package/types/bin/tracebom.d.ts.map +1 -0
- package/types/bin/validate.d.ts +14 -0
- package/types/bin/validate.d.ts.map +1 -0
- package/types/bin/verify.d.ts +3 -0
- package/types/bin/verify.d.ts.map +1 -0
- package/types/lib/audit/index.d.ts +153 -0
- package/types/lib/audit/index.d.ts.map +1 -0
- package/types/lib/audit/progress.d.ts +31 -0
- package/types/lib/audit/progress.d.ts.map +1 -0
- package/types/lib/audit/reporters.d.ts +62 -0
- package/types/lib/audit/reporters.d.ts.map +1 -0
- package/types/lib/audit/scoring.d.ts +36 -0
- package/types/lib/audit/scoring.d.ts.map +1 -0
- package/types/lib/audit/targets.d.ts +77 -0
- package/types/lib/audit/targets.d.ts.map +1 -0
- package/types/lib/cli/bomAssembly.d.ts +315 -0
- package/types/lib/cli/bomAssembly.d.ts.map +1 -0
- package/types/lib/cli/cliOptions.d.ts +156 -0
- package/types/lib/cli/cliOptions.d.ts.map +1 -0
- package/types/lib/cli/index.d.ts +107 -0
- package/types/lib/cli/index.d.ts.map +1 -0
- package/types/lib/cli/jsBom.d.ts +94 -0
- package/types/lib/cli/jsBom.d.ts.map +1 -0
- package/types/lib/cli/jvmBom.d.ts +54 -0
- package/types/lib/cli/jvmBom.d.ts.map +1 -0
- package/types/lib/cli/managedBom.d.ts +105 -0
- package/types/lib/cli/managedBom.d.ts.map +1 -0
- package/types/lib/cli/nativeBom.d.ts +143 -0
- package/types/lib/cli/nativeBom.d.ts.map +1 -0
- package/types/lib/core/activity.d.ts +178 -0
- package/types/lib/core/activity.d.ts.map +1 -0
- package/types/lib/core/env.d.ts +192 -0
- package/types/lib/core/env.d.ts.map +1 -0
- package/types/lib/core/fs.d.ts +158 -0
- package/types/lib/core/fs.d.ts.map +1 -0
- package/types/lib/core/httpClient.d.ts +149 -0
- package/types/lib/core/httpClient.d.ts.map +1 -0
- package/types/lib/core/logger.d.ts +28 -0
- package/types/lib/core/logger.d.ts.map +1 -0
- package/types/lib/core/parallel.d.ts +95 -0
- package/types/lib/core/parallel.d.ts.map +1 -0
- package/types/lib/core/paths.d.ts +36 -0
- package/types/lib/core/paths.d.ts.map +1 -0
- package/types/lib/core/projectConfig.d.ts +23 -0
- package/types/lib/core/projectConfig.d.ts.map +1 -0
- package/types/lib/core/propertySanitizer.d.ts +23 -0
- package/types/lib/core/propertySanitizer.d.ts.map +1 -0
- package/types/lib/core/spdx.d.ts +5 -0
- package/types/lib/core/spdx.d.ts.map +1 -0
- package/types/lib/core/state.d.ts +20 -0
- package/types/lib/core/state.d.ts.map +1 -0
- package/types/lib/core/text.d.ts +78 -0
- package/types/lib/core/text.d.ts.map +1 -0
- package/types/lib/core/ui.d.ts +87 -0
- package/types/lib/core/ui.d.ts.map +1 -0
- package/types/lib/core/urls.d.ts +43 -0
- package/types/lib/core/urls.d.ts.map +1 -0
- package/types/lib/ecosystems/asarutils.d.ts +71 -0
- package/types/lib/ecosystems/asarutils.d.ts.map +1 -0
- package/types/lib/ecosystems/bunutils.d.ts +38 -0
- package/types/lib/ecosystems/bunutils.d.ts.map +1 -0
- package/types/lib/ecosystems/caxa.d.ts +8 -0
- package/types/lib/ecosystems/caxa.d.ts.map +1 -0
- package/types/lib/ecosystems/chromextutils.d.ts +97 -0
- package/types/lib/ecosystems/chromextutils.d.ts.map +1 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts +176 -0
- package/types/lib/ecosystems/cmakeResolver.d.ts.map +1 -0
- package/types/lib/ecosystems/cppEvidence.d.ts +35 -0
- package/types/lib/ecosystems/cppEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/denoutils.d.ts +76 -0
- package/types/lib/ecosystems/denoutils.d.ts.map +1 -0
- package/types/lib/ecosystems/dotnetutils.d.ts +45 -0
- package/types/lib/ecosystems/dotnetutils.d.ts.map +1 -0
- package/types/lib/ecosystems/ecosystems.d.ts +279 -0
- package/types/lib/ecosystems/ecosystems.d.ts.map +1 -0
- package/types/lib/ecosystems/golem.d.ts +60 -0
- package/types/lib/ecosystems/golem.d.ts.map +1 -0
- package/types/lib/ecosystems/gradleutils.d.ts +139 -0
- package/types/lib/ecosystems/gradleutils.d.ts.map +1 -0
- package/types/lib/ecosystems/jsEvidence.d.ts +17 -0
- package/types/lib/ecosystems/jsEvidence.d.ts.map +1 -0
- package/types/lib/ecosystems/npmutils.d.ts +183 -0
- package/types/lib/ecosystems/npmutils.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts +36 -0
- package/types/lib/ecosystems/parsers-bazel.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts +116 -0
- package/types/lib/ecosystems/parsers-dotnet.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts +33 -0
- package/types/lib/ecosystems/parsers-gleam.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-go.d.ts +92 -0
- package/types/lib/ecosystems/parsers-go.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-js.d.ts +242 -0
- package/types/lib/ecosystems/parsers-js.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts +100 -0
- package/types/lib/ecosystems/parsers-jvm.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-misc.d.ts +450 -0
- package/types/lib/ecosystems/parsers-misc.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-python.d.ts +145 -0
- package/types/lib/ecosystems/parsers-python.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-rust.d.ts +56 -0
- package/types/lib/ecosystems/parsers-rust.d.ts.map +1 -0
- package/types/lib/ecosystems/parsers-zig.d.ts +83 -0
- package/types/lib/ecosystems/parsers-zig.d.ts.map +1 -0
- package/types/lib/ecosystems/pep770.d.ts +38 -0
- package/types/lib/ecosystems/pep770.d.ts.map +1 -0
- package/types/lib/ecosystems/pylockutils.d.ts +68 -0
- package/types/lib/ecosystems/pylockutils.d.ts.map +1 -0
- package/types/lib/ecosystems/pythonutils.d.ts +70 -0
- package/types/lib/ecosystems/pythonutils.d.ts.map +1 -0
- package/types/lib/ecosystems/registryProvenance.d.ts +26 -0
- package/types/lib/ecosystems/registryProvenance.d.ts.map +1 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts +31 -0
- package/types/lib/ecosystems/remote/huggingface.d.ts.map +1 -0
- package/types/lib/ecosystems/rubyutils.d.ts +182 -0
- package/types/lib/ecosystems/rubyutils.d.ts.map +1 -0
- package/types/lib/ecosystems/rusi.d.ts +40 -0
- package/types/lib/ecosystems/rusi.d.ts.map +1 -0
- package/types/lib/ecosystems/sbtutils.d.ts +179 -0
- package/types/lib/ecosystems/sbtutils.d.ts.map +1 -0
- package/types/lib/ecosystems/tea.d.ts +180 -0
- package/types/lib/ecosystems/tea.d.ts.map +1 -0
- package/types/lib/ecosystems/utils.d.ts +41 -0
- package/types/lib/ecosystems/utils.d.ts.map +1 -0
- package/types/lib/ecosystems/zigResolver.d.ts +70 -0
- package/types/lib/ecosystems/zigResolver.d.ts.map +1 -0
- package/types/lib/evinser/db.d.ts +17 -0
- package/types/lib/evinser/db.d.ts.map +1 -0
- package/types/lib/evinser/evinser.d.ts +354 -0
- package/types/lib/evinser/evinser.d.ts.map +1 -0
- package/types/lib/evinser/scalasem.d.ts +15 -0
- package/types/lib/evinser/scalasem.d.ts.map +1 -0
- package/types/lib/evinser/swiftsem.d.ts +103 -0
- package/types/lib/evinser/swiftsem.d.ts.map +1 -0
- package/types/lib/helpers/annotationFormatter.d.ts +23 -0
- package/types/lib/helpers/annotationFormatter.d.ts.map +1 -0
- package/types/lib/helpers/bomSigner.d.ts +28 -0
- package/types/lib/helpers/bomSigner.d.ts.map +1 -0
- package/types/lib/helpers/exportUtils.d.ts +52 -0
- package/types/lib/helpers/exportUtils.d.ts.map +1 -0
- package/types/lib/helpers/remote/dependency-track.d.ts +23 -0
- package/types/lib/helpers/remote/dependency-track.d.ts.map +1 -0
- package/types/lib/helpers/versutils.d.ts +8 -0
- package/types/lib/helpers/versutils.d.ts.map +1 -0
- package/types/lib/helpers/vsixutils.d.ts +130 -0
- package/types/lib/helpers/vsixutils.d.ts.map +1 -0
- package/types/lib/inventory/agentFormulationParser.d.ts +21 -0
- package/types/lib/inventory/agentFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/aiCollector.d.ts +61 -0
- package/types/lib/inventory/aiCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiInventory.d.ts +103 -0
- package/types/lib/inventory/aiInventory.d.ts.map +1 -0
- package/types/lib/inventory/aiModelVariants.d.ts +31 -0
- package/types/lib/inventory/aiModelVariants.d.ts.map +1 -0
- package/types/lib/inventory/aiOversightCollector.d.ts +28 -0
- package/types/lib/inventory/aiOversightCollector.d.ts.map +1 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts +13 -0
- package/types/lib/inventory/aiProvenanceCollector.d.ts.map +1 -0
- package/types/lib/inventory/analyzer.d.ts +157 -0
- package/types/lib/inventory/analyzer.d.ts.map +1 -0
- package/types/lib/inventory/analyzerScope.d.ts +106 -0
- package/types/lib/inventory/analyzerScope.d.ts.map +1 -0
- package/types/lib/inventory/astWorker.d.ts +9 -0
- package/types/lib/inventory/astWorker.d.ts.map +1 -0
- package/types/lib/inventory/atomUtils.d.ts +159 -0
- package/types/lib/inventory/atomUtils.d.ts.map +1 -0
- package/types/lib/inventory/auditCategories.d.ts +80 -0
- package/types/lib/inventory/auditCategories.d.ts.map +1 -0
- package/types/lib/inventory/bomUtils.d.ts +145 -0
- package/types/lib/inventory/bomUtils.d.ts.map +1 -0
- package/types/lib/inventory/cacheCommands.d.ts +28 -0
- package/types/lib/inventory/cacheCommands.d.ts.map +1 -0
- package/types/lib/inventory/cacheDir.d.ts +55 -0
- package/types/lib/inventory/cacheDir.d.ts.map +1 -0
- package/types/lib/inventory/cbomutils.d.ts +37 -0
- package/types/lib/inventory/cbomutils.d.ts.map +1 -0
- package/types/lib/inventory/cdxrs.d.ts +90 -0
- package/types/lib/inventory/cdxrs.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts +27 -0
- package/types/lib/inventory/ciParsers/azurePipelines.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts +27 -0
- package/types/lib/inventory/ciParsers/circleCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/common.d.ts +11 -0
- package/types/lib/inventory/ciParsers/common.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts +38 -0
- package/types/lib/inventory/ciParsers/githubActions.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts +26 -0
- package/types/lib/inventory/ciParsers/gitlabCi.d.ts.map +1 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts +26 -0
- package/types/lib/inventory/ciParsers/jenkins.d.ts.map +1 -0
- package/types/lib/inventory/citations.d.ts +90 -0
- package/types/lib/inventory/citations.d.ts.map +1 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts +14 -0
- package/types/lib/inventory/communityAiConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/containerRisk.d.ts +20 -0
- package/types/lib/inventory/containerRisk.d.ts.map +1 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts +37 -0
- package/types/lib/inventory/cryptoAlgorithmFamily.d.ts.map +1 -0
- package/types/lib/inventory/deps.d.ts +140 -0
- package/types/lib/inventory/deps.d.ts.map +1 -0
- package/types/lib/inventory/depsUtils.d.ts +74 -0
- package/types/lib/inventory/depsUtils.d.ts.map +1 -0
- package/types/lib/inventory/display.d.ts +227 -0
- package/types/lib/inventory/display.d.ts.map +1 -0
- package/types/lib/inventory/dosai.d.ts +130 -0
- package/types/lib/inventory/dosai.d.ts.map +1 -0
- package/types/lib/inventory/dosaiParsers.d.ts +59 -0
- package/types/lib/inventory/dosaiParsers.d.ts.map +1 -0
- package/types/lib/inventory/dynamic.d.ts +25 -0
- package/types/lib/inventory/dynamic.d.ts.map +1 -0
- package/types/lib/inventory/envcontext.d.ts +377 -0
- package/types/lib/inventory/envcontext.d.ts.map +1 -0
- package/types/lib/inventory/evidenceUtils.d.ts +74 -0
- package/types/lib/inventory/evidenceUtils.d.ts.map +1 -0
- package/types/lib/inventory/fetchBatch.d.ts +127 -0
- package/types/lib/inventory/fetchBatch.d.ts.map +1 -0
- package/types/lib/inventory/fetchRate.d.ts +118 -0
- package/types/lib/inventory/fetchRate.d.ts.map +1 -0
- package/types/lib/inventory/forgeEnricher.d.ts +31 -0
- package/types/lib/inventory/forgeEnricher.d.ts.map +1 -0
- package/types/lib/inventory/formulationParsers.d.ts +50 -0
- package/types/lib/inventory/formulationParsers.d.ts.map +1 -0
- package/types/lib/inventory/gtfobins.d.ts +27 -0
- package/types/lib/inventory/gtfobins.d.ts.map +1 -0
- package/types/lib/inventory/hbom.d.ts +58 -0
- package/types/lib/inventory/hbom.d.ts.map +1 -0
- package/types/lib/inventory/hbomAnalysis.d.ts +56 -0
- package/types/lib/inventory/hbomAnalysis.d.ts.map +1 -0
- package/types/lib/inventory/hbomLoader.d.ts +7 -0
- package/types/lib/inventory/hbomLoader.d.ts.map +1 -0
- package/types/lib/inventory/hostTopology.d.ts +47 -0
- package/types/lib/inventory/hostTopology.d.ts.map +1 -0
- package/types/lib/inventory/inventoryStats.d.ts +42 -0
- package/types/lib/inventory/inventoryStats.d.ts.map +1 -0
- package/types/lib/inventory/jsonLike.d.ts +23 -0
- package/types/lib/inventory/jsonLike.d.ts.map +1 -0
- package/types/lib/inventory/licenseEnhancer.d.ts +70 -0
- package/types/lib/inventory/licenseEnhancer.d.ts.map +1 -0
- package/types/lib/inventory/lolbas.d.ts +16 -0
- package/types/lib/inventory/lolbas.d.ts.map +1 -0
- package/types/lib/inventory/mcp.d.ts +29 -0
- package/types/lib/inventory/mcp.d.ts.map +1 -0
- package/types/lib/inventory/mcpConfigParser.d.ts +20 -0
- package/types/lib/inventory/mcpConfigParser.d.ts.map +1 -0
- package/types/lib/inventory/mcpDiscovery.d.ts +33 -0
- package/types/lib/inventory/mcpDiscovery.d.ts.map +1 -0
- package/types/lib/inventory/mcpPinning.d.ts +11 -0
- package/types/lib/inventory/mcpPinning.d.ts.map +1 -0
- package/types/lib/inventory/osPackageResolver.d.ts +49 -0
- package/types/lib/inventory/osPackageResolver.d.ts.map +1 -0
- package/types/lib/inventory/osinfo.d.ts +120 -0
- package/types/lib/inventory/osinfo.d.ts.map +1 -0
- package/types/lib/inventory/osqueryTransform.d.ts +84 -0
- package/types/lib/inventory/osqueryTransform.d.ts.map +1 -0
- package/types/lib/inventory/plugins.d.ts +58 -0
- package/types/lib/inventory/plugins.d.ts.map +1 -0
- package/types/lib/inventory/protobom.d.ts +71 -0
- package/types/lib/inventory/protobom.d.ts.map +1 -0
- package/types/lib/inventory/protobomLoader.d.ts +17 -0
- package/types/lib/inventory/protobomLoader.d.ts.map +1 -0
- package/types/lib/inventory/provenanceUtils.d.ts +98 -0
- package/types/lib/inventory/provenanceUtils.d.ts.map +1 -0
- package/types/lib/inventory/purl.d.ts +313 -0
- package/types/lib/inventory/purl.d.ts.map +1 -0
- package/types/lib/inventory/rustFormulationParser.d.ts +17 -0
- package/types/lib/inventory/rustFormulationParser.d.ts.map +1 -0
- package/types/lib/inventory/sbomDocument.d.ts +59 -0
- package/types/lib/inventory/sbomDocument.d.ts.map +1 -0
- package/types/lib/inventory/source.d.ts +163 -0
- package/types/lib/inventory/source.d.ts.map +1 -0
- package/types/lib/inventory/spdx.d.ts +66 -0
- package/types/lib/inventory/spdx.d.ts.map +1 -0
- package/types/lib/inventory/spdxExpression.d.ts +58 -0
- package/types/lib/inventory/spdxExpression.d.ts.map +1 -0
- package/types/lib/inventory/spdxUtils.d.ts +12 -0
- package/types/lib/inventory/spdxUtils.d.ts.map +1 -0
- package/types/lib/inventory/table.d.ts +19 -0
- package/types/lib/inventory/table.d.ts.map +1 -0
- package/types/lib/inventory/traceRunner.d.ts +80 -0
- package/types/lib/inventory/traceRunner.d.ts.map +1 -0
- package/types/lib/inventory/unicodeScan.d.ts +46 -0
- package/types/lib/inventory/unicodeScan.d.ts.map +1 -0
- package/types/lib/managers/binary.d.ts +76 -0
- package/types/lib/managers/binary.d.ts.map +1 -0
- package/types/lib/managers/containerutils.d.ts +30 -0
- package/types/lib/managers/containerutils.d.ts.map +1 -0
- package/types/lib/managers/docker.d.ts +157 -0
- package/types/lib/managers/docker.d.ts.map +1 -0
- package/types/lib/managers/dockerConnection.d.ts +42 -0
- package/types/lib/managers/dockerConnection.d.ts.map +1 -0
- package/types/lib/managers/oci.d.ts +21 -0
- package/types/lib/managers/oci.d.ts.map +1 -0
- package/types/lib/managers/piptree.d.ts +13 -0
- package/types/lib/managers/piptree.d.ts.map +1 -0
- package/types/lib/parsers/cmakeCache.d.ts +70 -0
- package/types/lib/parsers/cmakeCache.d.ts.map +1 -0
- package/types/lib/parsers/gguf.d.ts +39 -0
- package/types/lib/parsers/gguf.d.ts.map +1 -0
- package/types/lib/parsers/gitAiNotes.d.ts +15 -0
- package/types/lib/parsers/gitAiNotes.d.ts.map +1 -0
- package/types/lib/parsers/gitmodules.d.ts +88 -0
- package/types/lib/parsers/gitmodules.d.ts.map +1 -0
- package/types/lib/parsers/htmlExtract.d.ts +34 -0
- package/types/lib/parsers/htmlExtract.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts +153 -0
- package/types/lib/parsers/huggingfaceManifest.d.ts.map +1 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts +155 -0
- package/types/lib/parsers/huggingfaceUtils.d.ts.map +1 -0
- package/types/lib/parsers/iri.d.ts +68 -0
- package/types/lib/parsers/iri.d.ts.map +1 -0
- package/types/lib/parsers/npmrc.d.ts +33 -0
- package/types/lib/parsers/npmrc.d.ts.map +1 -0
- package/types/lib/parsers/ollama.d.ts +22 -0
- package/types/lib/parsers/ollama.d.ts.map +1 -0
- package/types/lib/parsers/xml.d.ts +47 -0
- package/types/lib/parsers/xml.d.ts.map +1 -0
- package/types/lib/server/server.d.ts +51 -0
- package/types/lib/server/server.d.ts.map +1 -0
- package/types/lib/stages/postgen/annotator.d.ts +36 -0
- package/types/lib/stages/postgen/annotator.d.ts.map +1 -0
- package/types/lib/stages/postgen/auditBom.d.ts +92 -0
- package/types/lib/stages/postgen/auditBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/postgen.d.ts +59 -0
- package/types/lib/stages/postgen/postgen.d.ts.map +1 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts +18 -0
- package/types/lib/stages/postgen/ruleEngine.d.ts.map +1 -0
- package/types/lib/stages/postgen/sortBom.d.ts +34 -0
- package/types/lib/stages/postgen/sortBom.d.ts.map +1 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts +11 -0
- package/types/lib/stages/postgen/spdxConverter.d.ts.map +1 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts +71 -0
- package/types/lib/stages/postgen/specVersionCompat.d.ts.map +1 -0
- package/types/lib/stages/pregen/envAudit.d.ts +14 -0
- package/types/lib/stages/pregen/envAudit.d.ts.map +1 -0
- package/types/lib/stages/pregen/pregen.d.ts +59 -0
- package/types/lib/stages/pregen/pregen.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts +47 -0
- package/types/lib/third-party/arborist/lib/arborist/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-actual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts +4 -0
- package/types/lib/third-party/arborist/lib/arborist/load-virtual.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/bin-links.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/calc-dep-flags.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts +9 -0
- package/types/lib/third-party/arborist/lib/case-insensitive-map.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/consistent-resolve.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/debug.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/dep-valid.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts +46 -0
- package/types/lib/third-party/arborist/lib/edge.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/from-path.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/gather-dep-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/index.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/index.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts +14 -0
- package/types/lib/third-party/arborist/lib/inventory.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/link.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/link.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/node.d.ts +112 -0
- package/types/lib/third-party/arborist/lib/node.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts +18 -0
- package/types/lib/third-party/arborist/lib/npm-extension.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/override-resolves.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts +27 -0
- package/types/lib/third-party/arborist/lib/override-set.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts +36 -0
- package/types/lib/third-party/arborist/lib/package-extensions.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/printable.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts +20 -0
- package/types/lib/third-party/arborist/lib/proc-log.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/realpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/relpath.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts +54 -0
- package/types/lib/third-party/arborist/lib/shrinkwrap.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/spec-from-lock.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts +3 -0
- package/types/lib/third-party/arborist/lib/tree-check.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts +13 -0
- package/types/lib/third-party/arborist/lib/validate-npm-package-name.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts +6 -0
- package/types/lib/third-party/arborist/lib/version-from-tgz.d.ts.map +1 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts +35 -0
- package/types/lib/third-party/arborist/lib/yarn-lock.d.ts.map +1 -0
- package/types/lib/validator/bomValidator.d.ts +40 -0
- package/types/lib/validator/bomValidator.d.ts.map +1 -0
- package/types/lib/validator/complianceEngine.d.ts +72 -0
- package/types/lib/validator/complianceEngine.d.ts.map +1 -0
- package/types/lib/validator/complianceRules.d.ts +61 -0
- package/types/lib/validator/complianceRules.d.ts.map +1 -0
- package/types/lib/validator/index.d.ts +101 -0
- package/types/lib/validator/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/annotations.d.ts +37 -0
- package/types/lib/validator/reporters/annotations.d.ts.map +1 -0
- package/types/lib/validator/reporters/console.d.ts +34 -0
- package/types/lib/validator/reporters/console.d.ts.map +1 -0
- package/types/lib/validator/reporters/index.d.ts +30 -0
- package/types/lib/validator/reporters/index.d.ts.map +1 -0
- package/types/lib/validator/reporters/json.d.ts +11 -0
- package/types/lib/validator/reporters/json.d.ts.map +1 -0
- package/types/lib/validator/reporters/sarif.d.ts +22 -0
- package/types/lib/validator/reporters/sarif.d.ts.map +1 -0
- package/mod.d.ts +0 -7
- package/mod.js +0 -22
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
// Local stub for npm-extension. Upstream discovers a root
|
|
2
|
+
// .npm-extension.{mjs,cjs} file and imports it, then calls its
|
|
3
|
+
// transformManifest export against every installed package's manifest. That
|
|
4
|
+
// is arbitrary project-local code execution during what is, for cdxgen, a
|
|
5
|
+
// read-only scan, so this stub reports that no extension file is present.
|
|
6
|
+
//
|
|
7
|
+
// The only part of the contract loadActual depends on is `present`:
|
|
8
|
+
// #applyNpmExtension() returns early when it is false, before load() or
|
|
9
|
+
// apply() can be reached. Those two methods therefore throw rather than
|
|
10
|
+
// return a plausible-looking result, so that an upstream change which reaches
|
|
11
|
+
// them fails loudly instead of silently producing a tree that differs from
|
|
12
|
+
// npm's.
|
|
13
|
+
//
|
|
14
|
+
// Consequence: on loadActual, a project carrying a .npm-extension file gets a
|
|
15
|
+
// tree without the dependency repairs npm would apply. loadVirtual is
|
|
16
|
+
// unaffected — npm bakes the repaired edges into the lockfile, so reading the
|
|
17
|
+
// lockfile already reflects them.
|
|
18
|
+
|
|
19
|
+
const REFUSED = "cdxgen does not execute .npm-extension code";
|
|
20
|
+
|
|
21
|
+
class NpmExtension {
|
|
22
|
+
constructor() {
|
|
23
|
+
this.present = false;
|
|
24
|
+
this.root = null;
|
|
25
|
+
this.path = null;
|
|
26
|
+
this.format = null;
|
|
27
|
+
this.hash = null;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
async load() {
|
|
31
|
+
throw new Error(REFUSED);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
apply() {
|
|
35
|
+
throw new Error(REFUSED);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const hasExtensionFile = () => false;
|
|
40
|
+
|
|
41
|
+
NpmExtension.NpmExtension = NpmExtension;
|
|
42
|
+
NpmExtension.hasExtensionFile = hasExtensionFile;
|
|
43
|
+
|
|
44
|
+
export default NpmExtension;
|
|
45
|
+
export { hasExtensionFile, NpmExtension };
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
import npa from "npm-package-arg";
|
|
2
|
+
import semver from "semver";
|
|
3
|
+
|
|
4
|
+
import { log } from "./proc-log.js";
|
|
5
|
+
|
|
6
|
+
class OverrideSet {
|
|
7
|
+
constructor({ overrides, key, parent }) {
|
|
8
|
+
this.parent = parent;
|
|
9
|
+
this.children = new Map();
|
|
10
|
+
|
|
11
|
+
if (typeof overrides === "string") {
|
|
12
|
+
overrides = { ".": overrides };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// change a literal empty string to * so we can use truthiness checks on
|
|
16
|
+
// the value property later
|
|
17
|
+
if (overrides["."] === "") {
|
|
18
|
+
overrides["."] = "*";
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if (parent) {
|
|
22
|
+
const spec = npa(key);
|
|
23
|
+
if (!spec.name) {
|
|
24
|
+
throw new Error(`Override without name: ${key}`);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
this.name = spec.name;
|
|
28
|
+
spec.name = "";
|
|
29
|
+
this.key = key;
|
|
30
|
+
this.keySpec = spec.toString();
|
|
31
|
+
this.value = overrides["."] || this.keySpec;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
for (const [key, childOverrides] of Object.entries(overrides)) {
|
|
35
|
+
if (key === ".") {
|
|
36
|
+
continue;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const child = new OverrideSet({
|
|
40
|
+
parent: this,
|
|
41
|
+
key,
|
|
42
|
+
overrides: childOverrides,
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
this.children.set(child.key, child);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
childrenAreEqual(other) {
|
|
50
|
+
if (this.children.size !== other.children.size) {
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
for (const [key] of this.children) {
|
|
54
|
+
if (!other.children.has(key)) {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
if (this.children.get(key).value !== other.children.get(key).value) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
if (!this.children.get(key).childrenAreEqual(other.children.get(key))) {
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
isEqual(other) {
|
|
68
|
+
if (this === other) {
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
if (!other) {
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
if (this.key !== other.key || this.value !== other.value) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (!this.childrenAreEqual(other)) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (!this.parent) {
|
|
81
|
+
return !other.parent;
|
|
82
|
+
}
|
|
83
|
+
return this.parent.isEqual(other.parent);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
getEdgeRule(edge) {
|
|
87
|
+
for (const rule of this.ruleset.values()) {
|
|
88
|
+
if (rule.name !== edge.name) {
|
|
89
|
+
continue;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// if keySpec is * we found our override
|
|
93
|
+
if (rule.keySpec === "*") {
|
|
94
|
+
return rule;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
// We need to use the rawSpec here, because the spec has the overrides applied to it already.
|
|
98
|
+
// rawSpec can be undefined, so we need to use the fallback value of spec if it is.
|
|
99
|
+
let spec = npa(`${edge.name}@${edge.rawSpec || edge.spec}`);
|
|
100
|
+
if (spec.type === "alias") {
|
|
101
|
+
spec = spec.subSpec;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (spec.type === "git") {
|
|
105
|
+
if (spec.gitRange && semver.intersects(spec.gitRange, rule.keySpec)) {
|
|
106
|
+
return rule;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (spec.type === "range" || spec.type === "version") {
|
|
113
|
+
if (semver.intersects(spec.fetchSpec, rule.keySpec)) {
|
|
114
|
+
return rule;
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
continue;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// if we got this far, the spec type is one of tag, directory or file
|
|
121
|
+
// which means we have no real way to make version comparisons, so we
|
|
122
|
+
// just accept the override
|
|
123
|
+
return rule;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return this;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
getNodeRule(node) {
|
|
130
|
+
for (const rule of this.ruleset.values()) {
|
|
131
|
+
if (rule.name !== node.name) {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (
|
|
136
|
+
semver.satisfies(node.version, rule.keySpec) ||
|
|
137
|
+
semver.satisfies(node.version, rule.value)
|
|
138
|
+
) {
|
|
139
|
+
return rule;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
return this;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
getMatchingRule(node) {
|
|
147
|
+
for (const rule of this.ruleset.values()) {
|
|
148
|
+
if (rule.name !== node.name) {
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (
|
|
153
|
+
semver.satisfies(node.version, rule.keySpec) ||
|
|
154
|
+
semver.satisfies(node.version, rule.value)
|
|
155
|
+
) {
|
|
156
|
+
return rule;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
*ancestry() {
|
|
164
|
+
for (let ancestor = this; ancestor; ancestor = ancestor.parent) {
|
|
165
|
+
yield ancestor;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
get isRoot() {
|
|
170
|
+
return !this.parent;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
get ruleset() {
|
|
174
|
+
const ruleset = new Map();
|
|
175
|
+
|
|
176
|
+
for (const override of this.ancestry()) {
|
|
177
|
+
for (const kid of override.children.values()) {
|
|
178
|
+
if (!ruleset.has(kid.key)) {
|
|
179
|
+
ruleset.set(kid.key, kid);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (!override.isRoot && !ruleset.has(override.key)) {
|
|
184
|
+
ruleset.set(override.key, override);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return ruleset;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
static findSpecificOverrideSet(first, second) {
|
|
192
|
+
for (
|
|
193
|
+
let overrideSet = second;
|
|
194
|
+
overrideSet;
|
|
195
|
+
overrideSet = overrideSet.parent
|
|
196
|
+
) {
|
|
197
|
+
if (overrideSet.isEqual(first)) {
|
|
198
|
+
return second;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
for (
|
|
202
|
+
let overrideSet = first;
|
|
203
|
+
overrideSet;
|
|
204
|
+
overrideSet = overrideSet.parent
|
|
205
|
+
) {
|
|
206
|
+
if (overrideSet.isEqual(second)) {
|
|
207
|
+
return first;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// The override sets are incomparable (e.g. siblings like the "react" and "react-dom" children of the root override set). Check if they have semantically conflicting rules before treating this as an error.
|
|
212
|
+
if (OverrideSet.haveConflictingRules(first, second)) {
|
|
213
|
+
log.silly("Conflicting override sets", first, second);
|
|
214
|
+
return undefined;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
// The override sets are structurally incomparable but have compatible rules. Fall back to their nearest common ancestor so the node still has a valid override set.
|
|
218
|
+
return OverrideSet.findCommonAncestor(first, second);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
static findCommonAncestor(first, second) {
|
|
222
|
+
const firstAncestors = [];
|
|
223
|
+
for (const ancestor of first.ancestry()) {
|
|
224
|
+
firstAncestors.push(ancestor);
|
|
225
|
+
}
|
|
226
|
+
for (const secondAnc of second.ancestry()) {
|
|
227
|
+
for (const firstAnc of firstAncestors) {
|
|
228
|
+
if (firstAnc.isEqual(secondAnc)) {
|
|
229
|
+
return firstAnc;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return null;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
static doOverrideSetsConflict(first, second) {
|
|
237
|
+
// If override sets contain one another then we can try to use the more specific one.
|
|
238
|
+
// If neither one is more specific, check for semantic conflicts.
|
|
239
|
+
const specificSet = OverrideSet.findSpecificOverrideSet(first, second);
|
|
240
|
+
if (specificSet !== undefined) {
|
|
241
|
+
// One contains the other, so no conflict
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// The override sets are structurally incomparable, but this doesn't necessarily
|
|
246
|
+
// mean they conflict. We need to check if they have conflicting version requirements
|
|
247
|
+
// for any package that appears in both rulesets.
|
|
248
|
+
return OverrideSet.haveConflictingRules(first, second);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
static haveConflictingRules(first, second) {
|
|
252
|
+
// Get all rules from both override sets
|
|
253
|
+
const firstRules = first.ruleset;
|
|
254
|
+
const secondRules = second.ruleset;
|
|
255
|
+
|
|
256
|
+
// Check each package that appears in both rulesets
|
|
257
|
+
for (const [key, firstRule] of firstRules) {
|
|
258
|
+
const secondRule = secondRules.get(key);
|
|
259
|
+
if (!secondRule) {
|
|
260
|
+
// Package only appears in one ruleset, no conflict
|
|
261
|
+
continue;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// Same rule object means no conflict
|
|
265
|
+
if (firstRule === secondRule || firstRule.isEqual(secondRule)) {
|
|
266
|
+
continue;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Both rulesets have rules for this package with different values.
|
|
270
|
+
// Check if the version requirements are actually incompatible.
|
|
271
|
+
const firstValue = firstRule.value;
|
|
272
|
+
const secondValue = secondRule.value;
|
|
273
|
+
|
|
274
|
+
// If either value is a reference (starts with $), we can't determine
|
|
275
|
+
// compatibility here - the reference might resolve to compatible versions.
|
|
276
|
+
// We defer to runtime resolution rather than failing early.
|
|
277
|
+
if (firstValue.startsWith("$") || secondValue.startsWith("$")) {
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
// Check if the version ranges are compatible using semver
|
|
282
|
+
// If both specify version ranges, they conflict only if they have no overlap
|
|
283
|
+
try {
|
|
284
|
+
const firstSpec = npa(`${firstRule.name}@${firstValue}`);
|
|
285
|
+
const secondSpec = npa(`${secondRule.name}@${secondValue}`);
|
|
286
|
+
|
|
287
|
+
// For range/version types, check if they intersect
|
|
288
|
+
if (
|
|
289
|
+
(firstSpec.type === "range" || firstSpec.type === "version") &&
|
|
290
|
+
(secondSpec.type === "range" || secondSpec.type === "version")
|
|
291
|
+
) {
|
|
292
|
+
// Check if the ranges intersect
|
|
293
|
+
const firstRange = firstSpec.fetchSpec;
|
|
294
|
+
const secondRange = secondSpec.fetchSpec;
|
|
295
|
+
|
|
296
|
+
// If the ranges don't intersect, we have a real conflict
|
|
297
|
+
if (!semver.intersects(firstRange, secondRange)) {
|
|
298
|
+
log.silly("Found conflicting override rules", {
|
|
299
|
+
package: firstRule.name,
|
|
300
|
+
first: firstValue,
|
|
301
|
+
second: secondValue,
|
|
302
|
+
});
|
|
303
|
+
return true;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
// For other types (git, file, directory, tag), we can't easily determine
|
|
307
|
+
// compatibility, so we conservatively assume no conflict
|
|
308
|
+
} catch {
|
|
309
|
+
// If we can't parse the specs, conservatively assume no conflict
|
|
310
|
+
// Real conflicts will be caught during dependency resolution
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
// No conflicting rules found
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
export default OverrideSet;
|
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
import semver from "semver";
|
|
2
|
+
import ssri from "ssri";
|
|
3
|
+
|
|
4
|
+
import validateName from "./validate-npm-package-name.js";
|
|
5
|
+
|
|
6
|
+
// Root-owned `packageExtensions`: declarative repairs to third-party manifests applied before Arborist reads a candidate's dependency edges.
|
|
7
|
+
// See RFC: https://github.com/npm/rfcs/pull/889
|
|
8
|
+
// This module is pure: it parses and validates the root rule set, matches a candidate manifest by name and version, and returns an extended manifest copy plus minimal provenance.
|
|
9
|
+
// It never mutates the input manifest or any shared cache object.
|
|
10
|
+
|
|
11
|
+
// The only manifest fields a package extension may add or correct, because they are the fields that affect dependency and peer resolution.
|
|
12
|
+
const EXTENSION_FIELDS = [
|
|
13
|
+
"dependencies",
|
|
14
|
+
"optionalDependencies",
|
|
15
|
+
"peerDependencies",
|
|
16
|
+
"peerDependenciesMeta",
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
// The two normal dependency fields; a name may exist in only one of them.
|
|
20
|
+
const NORMAL_DEP_FIELDS = ["dependencies", "optionalDependencies"];
|
|
21
|
+
|
|
22
|
+
const err = (message, code, extra = {}) =>
|
|
23
|
+
Object.assign(new Error(message), { code, ...extra });
|
|
24
|
+
|
|
25
|
+
// Parse a selector key into { name, range }, where range is null for a name-only key.
|
|
26
|
+
// Selectors are a package name with an optional semver range; dist-tags, git, file, directory, url, and alias specs are rejected.
|
|
27
|
+
const parseSelector = (key) => {
|
|
28
|
+
if (typeof key !== "string" || !key) {
|
|
29
|
+
throw err(
|
|
30
|
+
`Invalid packageExtensions selector: ${JSON.stringify(key)}`,
|
|
31
|
+
"EEXTENSIONSELECTOR",
|
|
32
|
+
);
|
|
33
|
+
}
|
|
34
|
+
// The separator @ is the first @ after a leading scope @.
|
|
35
|
+
const at = key.indexOf("@", key.startsWith("@") ? 1 : 0);
|
|
36
|
+
const name = at === -1 ? key : key.slice(0, at);
|
|
37
|
+
const range = at === -1 ? null : key.slice(at + 1);
|
|
38
|
+
|
|
39
|
+
const { validForOldPackages, validForNewPackages } = validateName(name);
|
|
40
|
+
if (!validForOldPackages && !validForNewPackages) {
|
|
41
|
+
throw err(
|
|
42
|
+
`Invalid package name in packageExtensions selector: "${key}"`,
|
|
43
|
+
"EEXTENSIONSELECTOR",
|
|
44
|
+
{ selector: key },
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
// A blank range such as "foo@" is malformed; the name-only form "foo" is how you match every version.
|
|
48
|
+
if (range !== null && range.trim() === "") {
|
|
49
|
+
throw err(
|
|
50
|
+
`Invalid packageExtensions selector: "${key}". Use the name only to match every version.`,
|
|
51
|
+
"EEXTENSIONSELECTOR",
|
|
52
|
+
{ selector: key },
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
// A versioned selector must be a valid semver range, which rejects dist-tags, git, file, url, and alias specs.
|
|
56
|
+
if (range !== null && semver.validRange(range, { loose: true }) === null) {
|
|
57
|
+
throw err(
|
|
58
|
+
`Invalid version range in packageExtensions selector: "${key}". Selectors accept a package name with an optional semver range only.`,
|
|
59
|
+
"EEXTENSIONSELECTOR",
|
|
60
|
+
{ selector: key },
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
return { name, range };
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
// A selector matches a candidate manifest by its own name and version.
|
|
67
|
+
// Name-only selectors match every version, including non-semver versions.
|
|
68
|
+
// Versioned selectors only match versions that parse as semver and satisfy the range.
|
|
69
|
+
const rangeMatches = (range, version) => {
|
|
70
|
+
if (range === null) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
return (
|
|
74
|
+
semver.valid(version, { loose: true }) !== null &&
|
|
75
|
+
semver.satisfies(version, range, { loose: true })
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
// Validate a single selector's extension object before it is ever applied.
|
|
80
|
+
const validateExtensionObject = (key, ext) => {
|
|
81
|
+
if (ext === null || typeof ext !== "object" || Array.isArray(ext)) {
|
|
82
|
+
throw err(
|
|
83
|
+
`packageExtensions["${key}"] must be an object`,
|
|
84
|
+
"EEXTENSIONVALUE",
|
|
85
|
+
{ selector: key },
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
for (const field of Object.keys(ext)) {
|
|
89
|
+
if (!EXTENSION_FIELDS.includes(field)) {
|
|
90
|
+
throw err(
|
|
91
|
+
`packageExtensions["${key}"] has unsupported field "${field}". Supported fields: ${EXTENSION_FIELDS.join(", ")}.`,
|
|
92
|
+
"EEXTENSIONFIELD",
|
|
93
|
+
{ selector: key, field },
|
|
94
|
+
);
|
|
95
|
+
}
|
|
96
|
+
const val = ext[field];
|
|
97
|
+
if (val === null || typeof val !== "object" || Array.isArray(val)) {
|
|
98
|
+
throw err(
|
|
99
|
+
`packageExtensions["${key}"].${field} must be an object`,
|
|
100
|
+
"EEXTENSIONVALUE",
|
|
101
|
+
{ selector: key, field },
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// Deletion is not supported in v1, so a null, false, or "-" value is an error.
|
|
106
|
+
for (const field of [...NORMAL_DEP_FIELDS, "peerDependencies"]) {
|
|
107
|
+
for (const [name, spec] of Object.entries(ext[field] || {})) {
|
|
108
|
+
if (spec === null || spec === false || spec === "-") {
|
|
109
|
+
throw err(
|
|
110
|
+
`packageExtensions["${key}"].${field}.${name} attempts deletion, which is not supported.`,
|
|
111
|
+
"EEXTENSIONDELETE",
|
|
112
|
+
{ selector: key, field, name },
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// Each peerDependenciesMeta entry must be a non-null metadata object, never a deletion sentinel or primitive.
|
|
118
|
+
for (const [name, meta] of Object.entries(ext.peerDependenciesMeta || {})) {
|
|
119
|
+
if (meta === null || typeof meta !== "object" || Array.isArray(meta)) {
|
|
120
|
+
throw err(
|
|
121
|
+
`packageExtensions["${key}"].peerDependenciesMeta.${name} must be an object`,
|
|
122
|
+
"EEXTENSIONVALUE",
|
|
123
|
+
{ selector: key, field: "peerDependenciesMeta", name },
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// Apply a matched extension to a manifest, returning { pkg, applied } where pkg is a copy with extended fields and applied is minimal provenance.
|
|
130
|
+
// The input manifest is never mutated.
|
|
131
|
+
const applyExtension = (pkg, { key, ext }) => {
|
|
132
|
+
const applied = { selector: key };
|
|
133
|
+
|
|
134
|
+
// Clone only the fields we may touch; the rest of the manifest is shared by reference since it is never mutated.
|
|
135
|
+
const next = { ...pkg };
|
|
136
|
+
for (const field of EXTENSION_FIELDS) {
|
|
137
|
+
if (pkg[field] && typeof pkg[field] === "object") {
|
|
138
|
+
next[field] =
|
|
139
|
+
field === "peerDependenciesMeta"
|
|
140
|
+
? Object.fromEntries(
|
|
141
|
+
Object.entries(pkg[field]).map(([n, m]) => [n, { ...m }]),
|
|
142
|
+
)
|
|
143
|
+
: { ...pkg[field] };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// dependencies and optionalDependencies add missing names only.
|
|
148
|
+
// A name already declared in either normal dependency field is an error, which also prevents moving a name between the fields.
|
|
149
|
+
for (const field of NORMAL_DEP_FIELDS) {
|
|
150
|
+
const adds = ext[field];
|
|
151
|
+
if (!adds) {
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
for (const [name, spec] of Object.entries(adds)) {
|
|
155
|
+
for (const existingField of NORMAL_DEP_FIELDS) {
|
|
156
|
+
if (next[existingField] && name in next[existingField]) {
|
|
157
|
+
throw err(
|
|
158
|
+
`packageExtensions["${key}"].${field}.${name} conflicts with the package's existing ${existingField}.${name}. Use overrides to change a dependency version; packageExtensions only adds missing dependencies.`,
|
|
159
|
+
"EEXTENSIONDUPDEP",
|
|
160
|
+
{ selector: key, field, name, existingField },
|
|
161
|
+
);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
next[field] = next[field] || {};
|
|
165
|
+
next[field][name] = spec;
|
|
166
|
+
(applied[field] = applied[field] || []).push(name);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
// peerDependencies shallow-merges by peer name, and the extension value replaces an existing range.
|
|
171
|
+
if (ext.peerDependencies) {
|
|
172
|
+
next.peerDependencies = next.peerDependencies || {};
|
|
173
|
+
for (const [name, spec] of Object.entries(ext.peerDependencies)) {
|
|
174
|
+
next.peerDependencies[name] = spec;
|
|
175
|
+
(applied.peerDependencies = applied.peerDependencies || []).push(name);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// peerDependenciesMeta merges by peer name, then shallow-merges each meta object so an extension can add optional without dropping other meta keys.
|
|
180
|
+
if (ext.peerDependenciesMeta) {
|
|
181
|
+
next.peerDependenciesMeta = next.peerDependenciesMeta || {};
|
|
182
|
+
for (const [name, meta] of Object.entries(ext.peerDependenciesMeta)) {
|
|
183
|
+
next.peerDependenciesMeta[name] = {
|
|
184
|
+
...next.peerDependenciesMeta[name],
|
|
185
|
+
...meta,
|
|
186
|
+
};
|
|
187
|
+
(applied.peerDependenciesMeta = applied.peerDependenciesMeta || []).push(
|
|
188
|
+
name,
|
|
189
|
+
);
|
|
190
|
+
// Every peerDependenciesMeta entry an extension adds must correspond to a peerDependencies entry present after extension application.
|
|
191
|
+
if (!next.peerDependencies || !(name in next.peerDependencies)) {
|
|
192
|
+
throw err(
|
|
193
|
+
`packageExtensions["${key}"].peerDependenciesMeta.${name} has no corresponding peerDependencies.${name} after extension application.`,
|
|
194
|
+
"EEXTENSIONORPHANMETA",
|
|
195
|
+
{ selector: key, name },
|
|
196
|
+
);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return { pkg: next, applied };
|
|
202
|
+
};
|
|
203
|
+
|
|
204
|
+
// Deterministic JSON for hashing: keys sorted lexicographically at every level, string and number values preserved exactly, no insignificant whitespace.
|
|
205
|
+
const canonicalStringify = (val) => {
|
|
206
|
+
if (Array.isArray(val)) {
|
|
207
|
+
return `[${val.map(canonicalStringify).join(",")}]`;
|
|
208
|
+
}
|
|
209
|
+
if (val && typeof val === "object") {
|
|
210
|
+
return `{${Object.keys(val)
|
|
211
|
+
.sort()
|
|
212
|
+
.map((k) => `${JSON.stringify(k)}:${canonicalStringify(val[k])}`)
|
|
213
|
+
.join(",")}}`;
|
|
214
|
+
}
|
|
215
|
+
return JSON.stringify(val);
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
// Hash the canonical form of the root packageExtensions object using npm's existing lockfile digest encoding.
|
|
219
|
+
const canonicalHash = (packageExtensions) =>
|
|
220
|
+
ssri
|
|
221
|
+
.fromData(canonicalStringify(packageExtensions), { algorithms: ["sha512"] })
|
|
222
|
+
.toString();
|
|
223
|
+
|
|
224
|
+
class PackageExtensions {
|
|
225
|
+
constructor(raw) {
|
|
226
|
+
this.raw = raw;
|
|
227
|
+
this.present = raw !== undefined;
|
|
228
|
+
this.selectors = [];
|
|
229
|
+
this.hash = null;
|
|
230
|
+
|
|
231
|
+
if (!this.present) {
|
|
232
|
+
return;
|
|
233
|
+
}
|
|
234
|
+
if (raw === null || typeof raw !== "object" || Array.isArray(raw)) {
|
|
235
|
+
throw err("packageExtensions must be an object", "EEXTENSIONROOT");
|
|
236
|
+
}
|
|
237
|
+
for (const [key, ext] of Object.entries(raw)) {
|
|
238
|
+
const { name, range } = parseSelector(key);
|
|
239
|
+
validateExtensionObject(key, ext);
|
|
240
|
+
this.selectors.push({ key, name, range, ext });
|
|
241
|
+
}
|
|
242
|
+
this.hash = canonicalHash(raw);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
// Non-throwing check used for warnings: whether any selector matches the candidate.
|
|
246
|
+
wouldMatch(name, version) {
|
|
247
|
+
return this.selectors.some(
|
|
248
|
+
(s) => s.name === name && rangeMatches(s.range, version),
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Return the single selector matching a candidate manifest, or null.
|
|
253
|
+
// Throws EEXTENSIONCONFLICT when more than one selector matches the same candidate.
|
|
254
|
+
match(name, version) {
|
|
255
|
+
const matches = this.selectors.filter(
|
|
256
|
+
(s) => s.name === name && rangeMatches(s.range, version),
|
|
257
|
+
);
|
|
258
|
+
if (matches.length > 1) {
|
|
259
|
+
const keys = matches.map((s) => `"${s.key}"`).join(", ");
|
|
260
|
+
throw err(
|
|
261
|
+
`Multiple packageExtensions selectors match ${name}@${version}: ${keys}. Narrow or remove one of the overlapping rules.`,
|
|
262
|
+
"EEXTENSIONCONFLICT",
|
|
263
|
+
{ name, version, selectors: matches.map((s) => s.key) },
|
|
264
|
+
);
|
|
265
|
+
}
|
|
266
|
+
return matches[0] || null;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Apply the matching extension to a manifest copy, returning { pkg, applied } or null when no selector matches.
|
|
270
|
+
// Throws on selector conflict or invalid merge.
|
|
271
|
+
apply(pkg) {
|
|
272
|
+
if (!this.present || !this.selectors.length || !pkg || !pkg.name) {
|
|
273
|
+
return null;
|
|
274
|
+
}
|
|
275
|
+
const sel = this.match(pkg.name, pkg.version);
|
|
276
|
+
return sel ? applyExtension(pkg, sel) : null;
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
export default PackageExtensions;
|
|
281
|
+
|
|
282
|
+
export {
|
|
283
|
+
canonicalHash,
|
|
284
|
+
canonicalStringify,
|
|
285
|
+
EXTENSION_FIELDS,
|
|
286
|
+
PackageExtensions,
|
|
287
|
+
parseSelector,
|
|
288
|
+
rangeMatches,
|
|
289
|
+
};
|