@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,1291 @@
|
|
|
1
|
+
import localeCompareFactory from "@isaacs/string-locale-compare";
|
|
2
|
+
|
|
3
|
+
const localeCompare = localeCompareFactory("en");
|
|
4
|
+
|
|
5
|
+
import { readdir, readFile, readlink, stat } from "node:fs/promises";
|
|
6
|
+
import { basename, relative, resolve } from "node:path";
|
|
7
|
+
|
|
8
|
+
import nameFromFolder from "@npmcli/name-from-folder";
|
|
9
|
+
import pkgJson from "@npmcli/package-json";
|
|
10
|
+
import npa from "npm-package-arg";
|
|
11
|
+
import parseJSON from "parse-conflict-json";
|
|
12
|
+
|
|
13
|
+
import consistentResolve from "./consistent-resolve.js";
|
|
14
|
+
import { overrideResolves } from "./override-resolves.js";
|
|
15
|
+
import { log } from "./proc-log.js";
|
|
16
|
+
import relpath from "./relpath.js";
|
|
17
|
+
import specFromLock from "./spec-from-lock.js";
|
|
18
|
+
import versionFromTgz from "./version-from-tgz.js";
|
|
19
|
+
import YarnLock from "./yarn-lock.js";
|
|
20
|
+
|
|
21
|
+
// a module that manages a lockfile (package-lock.json).
|
|
22
|
+
|
|
23
|
+
// Increment whenever the lockfile version updates
|
|
24
|
+
// v1 - npm <=6
|
|
25
|
+
// v2 - arborist v1, npm v7, backwards compatible with v1, add 'packages'
|
|
26
|
+
// v3 will drop the 'dependencies' field, backwards comp with v2, not v1
|
|
27
|
+
//
|
|
28
|
+
// We cannot bump to v3 until npm v6 is out of common usage, and
|
|
29
|
+
// definitely not before npm v8.
|
|
30
|
+
|
|
31
|
+
const defaultLockfileVersion = 3;
|
|
32
|
+
// Bumped to 4 only when a node carries a patch record, so older clients abort.
|
|
33
|
+
const patchedLockfileVersion = 4;
|
|
34
|
+
// packageExtensions provenance also forces lockfileVersion 4 so older clients abort rather than silently dropping the repaired graph.
|
|
35
|
+
// Both features share version 4: they are root-owned graph repairs an old npm must not drop.
|
|
36
|
+
const packageExtensionsLockfileVersion = 4;
|
|
37
|
+
const maxLockfileVersion = 4;
|
|
38
|
+
|
|
39
|
+
// for comparing nodes to yarn.lock entries
|
|
40
|
+
const mismatch = (a, b) => a && b && a !== b;
|
|
41
|
+
|
|
42
|
+
// this.tree => the root node for the tree (ie, same path as this)
|
|
43
|
+
// - Set the first time we do `this.add(node)` for a path matching this.path
|
|
44
|
+
//
|
|
45
|
+
// this.add(node) =>
|
|
46
|
+
// - decorate the node with the metadata we have, if we have it, and it matches
|
|
47
|
+
// - add to the map of nodes needing to be committed, so that subsequent
|
|
48
|
+
// changes are captured when we commit that location's metadata.
|
|
49
|
+
//
|
|
50
|
+
// this.commit() =>
|
|
51
|
+
// - commit all nodes awaiting update to their metadata entries
|
|
52
|
+
// - re-generate this.data and this.yarnLock based on this.tree
|
|
53
|
+
//
|
|
54
|
+
// Note that between this.add() and this.commit(), `this.data` will be out of
|
|
55
|
+
// date! Always call `commit()` before relying on it.
|
|
56
|
+
//
|
|
57
|
+
// After calling this.commit(), any nodes not present in the tree will have
|
|
58
|
+
// been removed from the shrinkwrap data as well.
|
|
59
|
+
|
|
60
|
+
const swKeyOrder = [
|
|
61
|
+
"name",
|
|
62
|
+
"version",
|
|
63
|
+
"lockfileVersion",
|
|
64
|
+
"resolved",
|
|
65
|
+
"integrity",
|
|
66
|
+
"requires",
|
|
67
|
+
"packages",
|
|
68
|
+
"dependencies",
|
|
69
|
+
];
|
|
70
|
+
|
|
71
|
+
// used to rewrite from yarn registry to npm registry
|
|
72
|
+
const yarnRegRe = /^https?:\/\/registry\.yarnpkg\.com\//;
|
|
73
|
+
const npmRegRe = /^https?:\/\/registry\.npmjs\.org\//;
|
|
74
|
+
|
|
75
|
+
// sometimes resolved: is weird or broken, or something npa can't handle
|
|
76
|
+
const specFromResolved = (resolved) => {
|
|
77
|
+
try {
|
|
78
|
+
return npa(resolved);
|
|
79
|
+
} catch (er) {
|
|
80
|
+
return {};
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
const pkgMetaKeys = [
|
|
85
|
+
// note: name is included if necessary, for alias packages
|
|
86
|
+
"version",
|
|
87
|
+
"dependencies",
|
|
88
|
+
"peerDependencies",
|
|
89
|
+
"peerDependenciesMeta",
|
|
90
|
+
"optionalDependencies",
|
|
91
|
+
"bundleDependencies",
|
|
92
|
+
"acceptDependencies",
|
|
93
|
+
"funding",
|
|
94
|
+
"engines",
|
|
95
|
+
"os",
|
|
96
|
+
"cpu",
|
|
97
|
+
"libc",
|
|
98
|
+
"_integrity",
|
|
99
|
+
"license",
|
|
100
|
+
"hasInstallScript",
|
|
101
|
+
"bin",
|
|
102
|
+
"deprecated",
|
|
103
|
+
"workspaces",
|
|
104
|
+
];
|
|
105
|
+
|
|
106
|
+
const nodeMetaKeys = [
|
|
107
|
+
"integrity",
|
|
108
|
+
"inBundle",
|
|
109
|
+
"hasInstallScript",
|
|
110
|
+
"patched",
|
|
111
|
+
"packageExtensionsApplied",
|
|
112
|
+
"npmExtensionApplied",
|
|
113
|
+
];
|
|
114
|
+
|
|
115
|
+
const metaFieldFromPkg = (pkg, key) => {
|
|
116
|
+
const val = pkg[key];
|
|
117
|
+
if (val) {
|
|
118
|
+
// get only the license type, not the full object
|
|
119
|
+
if (key === "license" && typeof val === "object" && val.type) {
|
|
120
|
+
return val.type;
|
|
121
|
+
}
|
|
122
|
+
// skip empty objects and falsey values
|
|
123
|
+
if (typeof val !== "object" || Object.keys(val).length) {
|
|
124
|
+
return val;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// check to make sure that there are no packages newer than or missing from the hidden lockfile
|
|
131
|
+
const assertNoNewer = async (path, data, lockTime, dir, seen) => {
|
|
132
|
+
const base = basename(dir);
|
|
133
|
+
const isNM = dir !== path && base === "node_modules";
|
|
134
|
+
const isScope = dir !== path && base.startsWith("@");
|
|
135
|
+
const isParent = dir === path || isNM || isScope;
|
|
136
|
+
|
|
137
|
+
const parent = isParent ? dir : resolve(dir, "node_modules");
|
|
138
|
+
const rel = relpath(path, dir);
|
|
139
|
+
seen.add(rel);
|
|
140
|
+
let entries;
|
|
141
|
+
if (dir === path) {
|
|
142
|
+
entries = [{ name: "node_modules", isDirectory: () => true }];
|
|
143
|
+
} else {
|
|
144
|
+
const { mtime: dirTime } = await stat(dir);
|
|
145
|
+
if (dirTime > lockTime) {
|
|
146
|
+
throw new Error(`out of date, updated: ${rel}`);
|
|
147
|
+
}
|
|
148
|
+
if (!isScope && !isNM && !data.packages[rel]) {
|
|
149
|
+
throw new Error(`missing from lockfile: ${rel}`);
|
|
150
|
+
}
|
|
151
|
+
entries = await readdir(parent, { withFileTypes: true }).catch(() => []);
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
// TODO limit concurrency here, this is recursive
|
|
155
|
+
await Promise.all(
|
|
156
|
+
entries.map(async (dirent) => {
|
|
157
|
+
const child = resolve(parent, dirent.name);
|
|
158
|
+
if (dirent.isDirectory() && !dirent.name.startsWith(".")) {
|
|
159
|
+
await assertNoNewer(path, data, lockTime, child, seen);
|
|
160
|
+
} else if (dirent.isSymbolicLink()) {
|
|
161
|
+
const target = resolve(parent, await readlink(child));
|
|
162
|
+
const tstat = await stat(target).catch(
|
|
163
|
+
/* istanbul ignore next - windows */ () => null,
|
|
164
|
+
);
|
|
165
|
+
seen.add(relpath(path, child));
|
|
166
|
+
/* istanbul ignore next - windows cannot do this */
|
|
167
|
+
if (tstat?.isDirectory() && !seen.has(relpath(path, target))) {
|
|
168
|
+
await assertNoNewer(path, data, lockTime, target, seen);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
|
|
174
|
+
if (dir !== path) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// The walk above can't reach two linked-strategy layouts: a store package's sibling deps under .store/<key>/node_modules (.store is a skipped dot-dir), and an undeclared workspace not symlinked into root node_modules. Walk those dirs, derived from the lockfile entries.
|
|
179
|
+
// A dir reachable through a link entry is skipped: it was already reached (or, if the symlink is stale, correctly stays unseen so the lockfile is rejected). This keeps the hoisted strategy's stale-symlink detection intact, since there every workspace is a link target.
|
|
180
|
+
const linkTargets = new Set();
|
|
181
|
+
for (const loc in data.packages) {
|
|
182
|
+
const { link, resolved } = data.packages[loc];
|
|
183
|
+
if (link && resolved) {
|
|
184
|
+
linkTargets.add(resolved.replace(/\\/g, "/"));
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
const extraDirs = new Set();
|
|
188
|
+
for (const loc in data.packages) {
|
|
189
|
+
const store = loc.match(/^(.*\/\.store\/.+?)\/node_modules\//);
|
|
190
|
+
if (store) {
|
|
191
|
+
// .store/<key> is never walked but has no entry, so mark it seen.
|
|
192
|
+
seen.add(store[1]);
|
|
193
|
+
extraDirs.add(`${store[1]}/node_modules`);
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
// A workspace/fsChild dir outside node_modules, e.g. packages/a.
|
|
197
|
+
const i = loc.indexOf("/node_modules/");
|
|
198
|
+
const root = i === -1 ? loc : loc.slice(0, i);
|
|
199
|
+
if (
|
|
200
|
+
root &&
|
|
201
|
+
!/(^|\/)node_modules(\/|$)/.test(root) &&
|
|
202
|
+
!linkTargets.has(root)
|
|
203
|
+
) {
|
|
204
|
+
extraDirs.add(root);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
for (const rel of extraDirs) {
|
|
208
|
+
await assertNoNewer(path, data, lockTime, resolve(path, rel), seen);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// assert that all the entries in the lockfile were seen
|
|
212
|
+
for (const loc in data.packages) {
|
|
213
|
+
if (!seen.has(loc)) {
|
|
214
|
+
throw new Error(`missing from node_modules: ${loc}`);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
};
|
|
218
|
+
|
|
219
|
+
class Shrinkwrap {
|
|
220
|
+
static get defaultLockfileVersion() {
|
|
221
|
+
return defaultLockfileVersion;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
static load(options) {
|
|
225
|
+
return new Shrinkwrap(options).load();
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
static get keyOrder() {
|
|
229
|
+
return swKeyOrder;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
static async reset(options) {
|
|
233
|
+
// still need to know if it was loaded from the disk, but don't
|
|
234
|
+
// bother reading it if we're gonna just throw it away.
|
|
235
|
+
const s = new Shrinkwrap(options);
|
|
236
|
+
s.reset();
|
|
237
|
+
|
|
238
|
+
const [lock] = await s.resetFiles;
|
|
239
|
+
|
|
240
|
+
if (s.hiddenLockfile) {
|
|
241
|
+
s.filename = resolve(s.path, "node_modules/.package-lock.json");
|
|
242
|
+
} else {
|
|
243
|
+
s.filename = resolve(s.path, "package-lock.json");
|
|
244
|
+
}
|
|
245
|
+
s.loadedFromDisk = !!lock;
|
|
246
|
+
// TODO what uses this?
|
|
247
|
+
s.type = basename(s.filename);
|
|
248
|
+
|
|
249
|
+
return s;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
static metaFromNode(node, path, options = {}) {
|
|
253
|
+
if (node.isLink) {
|
|
254
|
+
return {
|
|
255
|
+
resolved: relpath(path, node.realpath),
|
|
256
|
+
link: true,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const meta = {};
|
|
261
|
+
for (const key of pkgMetaKeys) {
|
|
262
|
+
const val = metaFieldFromPkg(node.package, key);
|
|
263
|
+
if (val) {
|
|
264
|
+
meta[key.replace(/^_/, "")] = val;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
// we only include name if different from the node path name, and for the
|
|
268
|
+
// root to help prevent churn based on the name of the directory the
|
|
269
|
+
// project is in
|
|
270
|
+
const pname = node.packageName;
|
|
271
|
+
// when Target package name and Target node share the same name, we include the name, target node should have name as per realpath.
|
|
272
|
+
if (
|
|
273
|
+
pname &&
|
|
274
|
+
(node === node.root ||
|
|
275
|
+
pname !== node.name ||
|
|
276
|
+
nameFromFolder(node.realpath) !== pname)
|
|
277
|
+
) {
|
|
278
|
+
meta.name = pname;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
if (node.isTop && node.package.devDependencies) {
|
|
282
|
+
meta.devDependencies = node.package.devDependencies;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
for (const key of nodeMetaKeys) {
|
|
286
|
+
if (node[key]) {
|
|
287
|
+
meta[key] = node[key];
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
const resolved = consistentResolve(node.resolved, node.path, path, true);
|
|
292
|
+
// hide resolved from registry dependencies.
|
|
293
|
+
if (!resolved) {
|
|
294
|
+
// no-op
|
|
295
|
+
} else if (node.isRegistryDependency) {
|
|
296
|
+
meta.resolved = overrideResolves(resolved, options);
|
|
297
|
+
} else {
|
|
298
|
+
meta.resolved = resolved;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
if (node.extraneous) {
|
|
302
|
+
meta.extraneous = true;
|
|
303
|
+
} else {
|
|
304
|
+
if (node.peer) {
|
|
305
|
+
meta.peer = true;
|
|
306
|
+
}
|
|
307
|
+
if (node.dev) {
|
|
308
|
+
meta.dev = true;
|
|
309
|
+
}
|
|
310
|
+
if (node.optional) {
|
|
311
|
+
meta.optional = true;
|
|
312
|
+
}
|
|
313
|
+
if (node.devOptional && !node.dev && !node.optional) {
|
|
314
|
+
meta.devOptional = true;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
return meta;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
#awaitingUpdate = new Map();
|
|
321
|
+
|
|
322
|
+
constructor(options = {}) {
|
|
323
|
+
const {
|
|
324
|
+
path,
|
|
325
|
+
indent = 2,
|
|
326
|
+
newline = "\n",
|
|
327
|
+
hiddenLockfile = false,
|
|
328
|
+
lockfileVersion,
|
|
329
|
+
resolveOptions = {},
|
|
330
|
+
} = options;
|
|
331
|
+
|
|
332
|
+
if (hiddenLockfile) {
|
|
333
|
+
this.lockfileVersion = 3;
|
|
334
|
+
} else if (lockfileVersion) {
|
|
335
|
+
this.lockfileVersion = Number.parseInt(lockfileVersion, 10);
|
|
336
|
+
} else {
|
|
337
|
+
this.lockfileVersion = null;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
this.tree = null;
|
|
341
|
+
this.path = resolve(path || ".");
|
|
342
|
+
this.filename = null;
|
|
343
|
+
this.data = null;
|
|
344
|
+
this.indent = indent;
|
|
345
|
+
this.newline = newline;
|
|
346
|
+
this.loadedFromDisk = false;
|
|
347
|
+
this.type = null;
|
|
348
|
+
this.yarnLock = null;
|
|
349
|
+
this.hiddenLockfile = hiddenLockfile;
|
|
350
|
+
this.loadingError = null;
|
|
351
|
+
this.resolveOptions = resolveOptions;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// check to see if a spec is present in the yarn.lock file, and if so,
|
|
355
|
+
// if we should use it, and what it should resolve to. This is only
|
|
356
|
+
// done when we did not load a shrinkwrap from disk. Also, decorate
|
|
357
|
+
// the options object if provided with the resolved and integrity that
|
|
358
|
+
// we expect.
|
|
359
|
+
checkYarnLock(spec, options = {}) {
|
|
360
|
+
spec = npa(spec);
|
|
361
|
+
const { yarnLock, loadedFromDisk } = this;
|
|
362
|
+
const useYarnLock = yarnLock && !loadedFromDisk;
|
|
363
|
+
const fromYarn = useYarnLock && yarnLock.entries.get(spec.raw);
|
|
364
|
+
if (fromYarn && fromYarn.version) {
|
|
365
|
+
// if it's the yarn or npm default registry, use the version as
|
|
366
|
+
// our effective spec. if it's any other kind of thing, use that.
|
|
367
|
+
const { resolved, version, integrity } = fromYarn;
|
|
368
|
+
const isYarnReg = spec.registry && yarnRegRe.test(resolved);
|
|
369
|
+
const isnpmReg = spec.registry && !isYarnReg && npmRegRe.test(resolved);
|
|
370
|
+
const isReg = isnpmReg || isYarnReg;
|
|
371
|
+
// don't use the simple version if the "registry" url is
|
|
372
|
+
// something else entirely!
|
|
373
|
+
const tgz = (isReg && versionFromTgz(spec.name, resolved)) || {};
|
|
374
|
+
let yspec = resolved;
|
|
375
|
+
if (tgz.name === spec.name && tgz.version === version) {
|
|
376
|
+
yspec = version;
|
|
377
|
+
} else if (isReg && tgz.name && tgz.version) {
|
|
378
|
+
yspec = `npm:${tgz.name}@${tgz.version}`;
|
|
379
|
+
}
|
|
380
|
+
if (yspec) {
|
|
381
|
+
options.resolved = resolved.replace(
|
|
382
|
+
yarnRegRe,
|
|
383
|
+
"https://registry.npmjs.org/",
|
|
384
|
+
);
|
|
385
|
+
options.integrity = integrity;
|
|
386
|
+
return npa(`${spec.name}@${yspec}`);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
return spec;
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// throw away the shrinkwrap data so we can start fresh
|
|
393
|
+
// still worth doing a load() first so we know which files to write.
|
|
394
|
+
reset() {
|
|
395
|
+
this.tree = null;
|
|
396
|
+
this.#awaitingUpdate = new Map();
|
|
397
|
+
this.packageExtensionsHash = null;
|
|
398
|
+
this.npmExtensionHash = null;
|
|
399
|
+
const lockfileVersion = this.lockfileVersion || defaultLockfileVersion;
|
|
400
|
+
this.originalLockfileVersion = lockfileVersion;
|
|
401
|
+
|
|
402
|
+
this.data = {
|
|
403
|
+
lockfileVersion,
|
|
404
|
+
requires: true,
|
|
405
|
+
packages: {},
|
|
406
|
+
dependencies: {},
|
|
407
|
+
};
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
// files to potentially read from and write to, in order of priority
|
|
411
|
+
get #filenameSet() {
|
|
412
|
+
if (this.hiddenLockfile) {
|
|
413
|
+
return [`${this.path}/node_modules/.package-lock.json`];
|
|
414
|
+
}
|
|
415
|
+
return [`${this.path}/package-lock.json`, `${this.path}/yarn.lock`];
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
get loadFiles() {
|
|
419
|
+
return Promise.all(
|
|
420
|
+
this.#filenameSet.map(
|
|
421
|
+
(file) =>
|
|
422
|
+
file &&
|
|
423
|
+
readFile(file, "utf8").then(
|
|
424
|
+
(d) => d,
|
|
425
|
+
(er) => {
|
|
426
|
+
/* istanbul ignore else - can't test without breaking module itself */
|
|
427
|
+
if (er.code === "ENOENT") {
|
|
428
|
+
return "";
|
|
429
|
+
} else {
|
|
430
|
+
throw er;
|
|
431
|
+
}
|
|
432
|
+
},
|
|
433
|
+
),
|
|
434
|
+
),
|
|
435
|
+
);
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
get resetFiles() {
|
|
439
|
+
// slice out yarn, we only care about the package-lock when checking
|
|
440
|
+
// this way, since we're not actually loading the full lock metadata
|
|
441
|
+
return Promise.all(
|
|
442
|
+
this.#filenameSet.slice(0, 1).map(
|
|
443
|
+
(file) =>
|
|
444
|
+
file &&
|
|
445
|
+
stat(file).then(
|
|
446
|
+
(st) => st.isFile(),
|
|
447
|
+
(er) => {
|
|
448
|
+
/* istanbul ignore else - can't test without breaking module itself */
|
|
449
|
+
if (er.code === "ENOENT") {
|
|
450
|
+
return null;
|
|
451
|
+
} else {
|
|
452
|
+
throw er;
|
|
453
|
+
}
|
|
454
|
+
},
|
|
455
|
+
),
|
|
456
|
+
),
|
|
457
|
+
);
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
inferFormattingOptions(packageJSONData) {
|
|
461
|
+
const { [Symbol.for("indent")]: indent, [Symbol.for("newline")]: newline } =
|
|
462
|
+
packageJSONData;
|
|
463
|
+
if (indent !== undefined) {
|
|
464
|
+
this.indent = indent;
|
|
465
|
+
}
|
|
466
|
+
if (newline !== undefined) {
|
|
467
|
+
this.newline = newline;
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
async load() {
|
|
472
|
+
let data;
|
|
473
|
+
try {
|
|
474
|
+
const [lock, yarn] = await this.loadFiles;
|
|
475
|
+
data = lock || "{}";
|
|
476
|
+
|
|
477
|
+
if (this.hiddenLockfile) {
|
|
478
|
+
this.filename = resolve(this.path, "node_modules/.package-lock.json");
|
|
479
|
+
} else {
|
|
480
|
+
this.filename = resolve(this.path, "package-lock.json");
|
|
481
|
+
}
|
|
482
|
+
this.type = basename(this.filename);
|
|
483
|
+
this.loadedFromDisk = Boolean(lock);
|
|
484
|
+
|
|
485
|
+
if (yarn) {
|
|
486
|
+
this.yarnLock = new YarnLock();
|
|
487
|
+
// ignore invalid yarn data. we'll likely clobber it later anyway.
|
|
488
|
+
try {
|
|
489
|
+
this.yarnLock.parse(yarn);
|
|
490
|
+
} catch {
|
|
491
|
+
// ignore errors
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
data = parseJSON(data);
|
|
496
|
+
this.inferFormattingOptions(data);
|
|
497
|
+
|
|
498
|
+
if (this.hiddenLockfile && data.packages) {
|
|
499
|
+
// add a few ms just to account for jitter
|
|
500
|
+
const lockTime = +(await stat(this.filename)).mtime + 10;
|
|
501
|
+
await assertNoNewer(this.path, data, lockTime, this.path, new Set());
|
|
502
|
+
}
|
|
503
|
+
|
|
504
|
+
// all good! hidden lockfile is the newest thing in here.
|
|
505
|
+
} catch (er) {
|
|
506
|
+
/* istanbul ignore else */
|
|
507
|
+
if (typeof this.filename === "string") {
|
|
508
|
+
const rel = relpath(this.path, this.filename);
|
|
509
|
+
log.verbose("shrinkwrap", `failed to load ${rel}`, er.message);
|
|
510
|
+
} else {
|
|
511
|
+
log.verbose("shrinkwrap", `failed to load ${this.path}`, er.message);
|
|
512
|
+
}
|
|
513
|
+
this.loadingError = er;
|
|
514
|
+
this.loadedFromDisk = false;
|
|
515
|
+
this.ancientLockfile = false;
|
|
516
|
+
data = {};
|
|
517
|
+
}
|
|
518
|
+
// refuse lockfiles newer than we understand so we never drop a patched or repaired graph we cannot read
|
|
519
|
+
if (data.lockfileVersion > maxLockfileVersion) {
|
|
520
|
+
throw Object.assign(
|
|
521
|
+
new Error(
|
|
522
|
+
`Unsupported lockfileVersion ${data.lockfileVersion}. This npm only supports up to ${maxLockfileVersion}. Please upgrade npm.`,
|
|
523
|
+
),
|
|
524
|
+
{ code: "ELOCKFILEVERSION" },
|
|
525
|
+
);
|
|
526
|
+
}
|
|
527
|
+
// auto convert v1 lockfiles to v3
|
|
528
|
+
// leave v2 in place unless configured
|
|
529
|
+
// v3 by default
|
|
530
|
+
let lockfileVersion = defaultLockfileVersion;
|
|
531
|
+
if (this.lockfileVersion) {
|
|
532
|
+
lockfileVersion = this.lockfileVersion;
|
|
533
|
+
} else if (data.lockfileVersion && data.lockfileVersion !== 1) {
|
|
534
|
+
lockfileVersion = data.lockfileVersion;
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
this.data = {
|
|
538
|
+
...data,
|
|
539
|
+
lockfileVersion,
|
|
540
|
+
requires: true,
|
|
541
|
+
packages: data.packages || {},
|
|
542
|
+
dependencies: data.dependencies || {},
|
|
543
|
+
};
|
|
544
|
+
|
|
545
|
+
this.originalLockfileVersion = data.lockfileVersion;
|
|
546
|
+
|
|
547
|
+
// the canonical packageExtensions hash, if the lockfile recorded one on its root entry
|
|
548
|
+
this.packageExtensionsHash =
|
|
549
|
+
data.packages?.[""]?.packageExtensionsHash || null;
|
|
550
|
+
// the .npm-extension file hash, if the lockfile recorded one on its root entry
|
|
551
|
+
this.npmExtensionHash = data.packages?.[""]?.npmExtensionHash || null;
|
|
552
|
+
|
|
553
|
+
// use default if it wasn't explicitly set, and the current file is
|
|
554
|
+
// less than our default. otherwise, keep whatever is in the file,
|
|
555
|
+
// unless we had an explicit setting already.
|
|
556
|
+
if (!this.lockfileVersion) {
|
|
557
|
+
this.lockfileVersion = this.data.lockfileVersion = lockfileVersion;
|
|
558
|
+
}
|
|
559
|
+
this.ancientLockfile =
|
|
560
|
+
this.loadedFromDisk && !(data.lockfileVersion >= 2) && !data.requires;
|
|
561
|
+
|
|
562
|
+
// load old lockfile deps into the packages listing
|
|
563
|
+
if (data.dependencies && !data.packages) {
|
|
564
|
+
let pkg;
|
|
565
|
+
try {
|
|
566
|
+
pkg = await pkgJson.normalize(this.path);
|
|
567
|
+
pkg = pkg.content;
|
|
568
|
+
} catch {
|
|
569
|
+
pkg = {};
|
|
570
|
+
}
|
|
571
|
+
this.#loadAll("", null, this.data);
|
|
572
|
+
this.#fixDependencies(pkg);
|
|
573
|
+
}
|
|
574
|
+
return this;
|
|
575
|
+
}
|
|
576
|
+
|
|
577
|
+
#loadAll(location, name, lock) {
|
|
578
|
+
// migrate a v1 package lock to the new format.
|
|
579
|
+
const meta = this.#metaFromLock(location, name, lock);
|
|
580
|
+
// dependencies nested under a link are actually under the link target
|
|
581
|
+
if (meta.link) {
|
|
582
|
+
location = meta.resolved;
|
|
583
|
+
}
|
|
584
|
+
if (lock.dependencies) {
|
|
585
|
+
for (const name in lock.dependencies) {
|
|
586
|
+
const loc = location + (location ? "/" : "") + "node_modules/" + name;
|
|
587
|
+
this.#loadAll(loc, name, lock.dependencies[name]);
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// v1 lockfiles track the optional/dev flags, but they don't tell us
|
|
593
|
+
// which thing had what kind of dep on what other thing, so we need
|
|
594
|
+
// to correct that now, or every link will be considered prod
|
|
595
|
+
#fixDependencies(pkg) {
|
|
596
|
+
// we need the root package.json because legacy shrinkwraps just
|
|
597
|
+
// have requires:true at the root level, which is even less useful
|
|
598
|
+
// than merging all dep types into one object.
|
|
599
|
+
const root = this.data.packages[""];
|
|
600
|
+
for (const key of pkgMetaKeys) {
|
|
601
|
+
const val = metaFieldFromPkg(pkg, key);
|
|
602
|
+
if (val) {
|
|
603
|
+
root[key.replace(/^_/, "")] = val;
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
for (const loc in this.data.packages) {
|
|
608
|
+
const meta = this.data.packages[loc];
|
|
609
|
+
if (!meta.requires || !loc) {
|
|
610
|
+
continue;
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
// resolve each require to a meta entry
|
|
614
|
+
// if this node isn't optional, but the dep is, then it's an optionalDep
|
|
615
|
+
// likewise for dev deps.
|
|
616
|
+
// This isn't perfect, but it's a pretty good approximation, and at
|
|
617
|
+
// least gets us out of having all 'prod' edges, which throws off the
|
|
618
|
+
// buildIdealTree process
|
|
619
|
+
for (const name in meta.requires) {
|
|
620
|
+
const dep = this.#resolveMetaNode(loc, name);
|
|
621
|
+
// this overwrites the false value set above
|
|
622
|
+
// default to dependencies if the dep just isn't in the tree, which
|
|
623
|
+
// maybe should be an error, since it means that the shrinkwrap is
|
|
624
|
+
// invalid, but we can't do much better without any info.
|
|
625
|
+
let depType = "dependencies";
|
|
626
|
+
/* istanbul ignore else - dev deps are only for the root level */
|
|
627
|
+
if (dep?.optional && !meta.optional) {
|
|
628
|
+
depType = "optionalDependencies";
|
|
629
|
+
} else if (dep?.dev && !meta.dev) {
|
|
630
|
+
// XXX is this even reachable?
|
|
631
|
+
depType = "devDependencies";
|
|
632
|
+
}
|
|
633
|
+
if (!meta[depType]) {
|
|
634
|
+
meta[depType] = {};
|
|
635
|
+
}
|
|
636
|
+
meta[depType][name] = meta.requires[name];
|
|
637
|
+
}
|
|
638
|
+
delete meta.requires;
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
#resolveMetaNode(loc, name) {
|
|
643
|
+
for (let path = loc; true; path = path.replace(/(^|\/)[^/]*$/, "")) {
|
|
644
|
+
const check = `${path}${path ? "/" : ""}node_modules/${name}`;
|
|
645
|
+
if (this.data.packages[check]) {
|
|
646
|
+
return this.data.packages[check];
|
|
647
|
+
}
|
|
648
|
+
|
|
649
|
+
if (!path) {
|
|
650
|
+
break;
|
|
651
|
+
}
|
|
652
|
+
}
|
|
653
|
+
return null;
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
#lockFromLoc(lock, path, i = 0) {
|
|
657
|
+
if (!lock) {
|
|
658
|
+
return null;
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
if (path[i] === "") {
|
|
662
|
+
i++;
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
if (i >= path.length) {
|
|
666
|
+
return lock;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
if (!lock.dependencies) {
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
return this.#lockFromLoc(lock.dependencies[path[i]], path, i + 1);
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
// pass in a path relative to the root path, or an absolute path,
|
|
677
|
+
// get back a /-normalized location based on root path.
|
|
678
|
+
#pathToLoc(path) {
|
|
679
|
+
return relpath(this.path, resolve(this.path, path));
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
delete(nodePath) {
|
|
683
|
+
if (!this.data) {
|
|
684
|
+
throw new Error("run load() before getting or setting data");
|
|
685
|
+
}
|
|
686
|
+
const location = this.#pathToLoc(nodePath);
|
|
687
|
+
this.#awaitingUpdate.delete(location);
|
|
688
|
+
|
|
689
|
+
delete this.data.packages[location];
|
|
690
|
+
const path = location.split(/(?:^|\/)node_modules\//);
|
|
691
|
+
const name = path.pop();
|
|
692
|
+
const pLock = this.#lockFromLoc(this.data, path);
|
|
693
|
+
if (pLock && pLock.dependencies) {
|
|
694
|
+
delete pLock.dependencies[name];
|
|
695
|
+
}
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
get(nodePath) {
|
|
699
|
+
if (!this.data) {
|
|
700
|
+
throw new Error("run load() before getting or setting data");
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
const location = this.#pathToLoc(nodePath);
|
|
704
|
+
if (this.#awaitingUpdate.has(location)) {
|
|
705
|
+
this.#updateWaitingNode(location);
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
// first try to get from the newer spot, which we know has
|
|
709
|
+
// all the things we need.
|
|
710
|
+
if (this.data.packages[location]) {
|
|
711
|
+
return this.data.packages[location];
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
// otherwise, fall back to the legacy metadata, and hope for the best
|
|
715
|
+
// get the node in the shrinkwrap corresponding to this spot
|
|
716
|
+
const path = location.split(/(?:^|\/)node_modules\//);
|
|
717
|
+
const name = path[path.length - 1];
|
|
718
|
+
const lock = this.#lockFromLoc(this.data, path);
|
|
719
|
+
|
|
720
|
+
return this.#metaFromLock(location, name, lock);
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
#metaFromLock(location, name, lock) {
|
|
724
|
+
// This function tries as hard as it can to figure out the metadata
|
|
725
|
+
// from a lockfile which may be outdated or incomplete. Since v1
|
|
726
|
+
// lockfiles used the "version" field to contain a variety of
|
|
727
|
+
// different possible types of data, this gets a little complicated.
|
|
728
|
+
if (!lock) {
|
|
729
|
+
return {};
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
// try to figure out a npm-package-arg spec from the lockfile entry
|
|
733
|
+
// This will return null if we could not get anything valid out of it.
|
|
734
|
+
const spec = specFromLock(name, lock, this.path);
|
|
735
|
+
|
|
736
|
+
if (spec.type === "directory") {
|
|
737
|
+
// the "version" was a file: url to a non-tarball path
|
|
738
|
+
// this is a symlink dep. We don't store much metadata
|
|
739
|
+
// about symlinks, just the target.
|
|
740
|
+
const target = relpath(this.path, spec.fetchSpec);
|
|
741
|
+
this.data.packages[location] = {
|
|
742
|
+
link: true,
|
|
743
|
+
resolved: target,
|
|
744
|
+
};
|
|
745
|
+
// also save the link target, omitting version since we don't know
|
|
746
|
+
// what it is, but we know it isn't a link to itself!
|
|
747
|
+
if (!this.data.packages[target]) {
|
|
748
|
+
this.#metaFromLock(target, name, { ...lock, version: null });
|
|
749
|
+
}
|
|
750
|
+
return this.data.packages[location];
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
const meta = {};
|
|
754
|
+
// when calling loadAll we'll change these into proper dep objects
|
|
755
|
+
if (lock.requires && typeof lock.requires === "object") {
|
|
756
|
+
meta.requires = lock.requires;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
if (lock.optional) {
|
|
760
|
+
meta.optional = true;
|
|
761
|
+
}
|
|
762
|
+
if (lock.dev) {
|
|
763
|
+
meta.dev = true;
|
|
764
|
+
}
|
|
765
|
+
|
|
766
|
+
// the root will typically have a name from the root project's
|
|
767
|
+
// package.json file.
|
|
768
|
+
if (location === "") {
|
|
769
|
+
meta.name = lock.name;
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
// if we have integrity, save it now.
|
|
773
|
+
if (lock.integrity) {
|
|
774
|
+
meta.integrity = lock.integrity;
|
|
775
|
+
}
|
|
776
|
+
|
|
777
|
+
if (lock.version && !lock.integrity) {
|
|
778
|
+
// this is usually going to be a git url or symlink, but it could
|
|
779
|
+
// also be a registry dependency that did not have integrity at
|
|
780
|
+
// the time it was saved.
|
|
781
|
+
// Symlinks were already handled above, so that leaves git.
|
|
782
|
+
//
|
|
783
|
+
// For git, always save the full SSH url. we'll actually fetch the
|
|
784
|
+
// tgz most of the time, since it's faster, but it won't work for
|
|
785
|
+
// private repos, and we can't get back to the ssh from the tgz,
|
|
786
|
+
// so we store the ssh instead.
|
|
787
|
+
// For unknown git hosts, just resolve to the raw spec in lock.version
|
|
788
|
+
if (spec.type === "git") {
|
|
789
|
+
meta.resolved = consistentResolve(spec, this.path, this.path);
|
|
790
|
+
|
|
791
|
+
// return early because there is nothing else we can do with this
|
|
792
|
+
return (this.data.packages[location] = meta);
|
|
793
|
+
} else if (spec.registry) {
|
|
794
|
+
// registry dep that didn't save integrity. grab the version, and
|
|
795
|
+
// fall through to pick up the resolved and potentially name.
|
|
796
|
+
meta.version = lock.version;
|
|
797
|
+
}
|
|
798
|
+
// only other possible case is a tarball without integrity.
|
|
799
|
+
// fall through to do what we can with the filename later.
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// at this point, we know that the spec is either a registry dep
|
|
803
|
+
// (ie, version, because locking, which means a resolved url),
|
|
804
|
+
// or a remote dep, or file: url. Remote deps and file urls
|
|
805
|
+
// have a fetchSpec equal to the fully resolved thing.
|
|
806
|
+
// Registry deps, we take what's in the lockfile.
|
|
807
|
+
if (lock.resolved || (spec.type && !spec.registry)) {
|
|
808
|
+
if (spec.registry) {
|
|
809
|
+
meta.resolved = lock.resolved;
|
|
810
|
+
} else if (spec.type === "file") {
|
|
811
|
+
meta.resolved = consistentResolve(spec, this.path, this.path, true);
|
|
812
|
+
} else if (spec.fetchSpec) {
|
|
813
|
+
meta.resolved = spec.fetchSpec;
|
|
814
|
+
}
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
// at this point, if still we don't have a version, do our best to
|
|
818
|
+
// infer it from the tarball url/file. This works a surprising
|
|
819
|
+
// amount of the time, even though it's not guaranteed.
|
|
820
|
+
if (!meta.version) {
|
|
821
|
+
if (spec.type === "file" || spec.type === "remote") {
|
|
822
|
+
const fromTgz =
|
|
823
|
+
versionFromTgz(spec.name, spec.fetchSpec) ||
|
|
824
|
+
versionFromTgz(spec.name, meta.resolved);
|
|
825
|
+
if (fromTgz) {
|
|
826
|
+
meta.version = fromTgz.version;
|
|
827
|
+
if (fromTgz.name !== name) {
|
|
828
|
+
meta.name = fromTgz.name;
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
} else if (spec.type === "alias") {
|
|
832
|
+
meta.name = spec.subSpec.name;
|
|
833
|
+
meta.version = spec.subSpec.fetchSpec;
|
|
834
|
+
} else if (spec.type === "version") {
|
|
835
|
+
meta.version = spec.fetchSpec;
|
|
836
|
+
}
|
|
837
|
+
// ok, I did my best! good luck!
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
if (lock.bundled) {
|
|
841
|
+
meta.inBundle = true;
|
|
842
|
+
}
|
|
843
|
+
|
|
844
|
+
// save it for next time
|
|
845
|
+
return (this.data.packages[location] = meta);
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
add(node) {
|
|
849
|
+
if (!this.data) {
|
|
850
|
+
throw new Error("run load() before getting or setting data");
|
|
851
|
+
}
|
|
852
|
+
|
|
853
|
+
// will be actually updated on read
|
|
854
|
+
const loc = relpath(this.path, node.path);
|
|
855
|
+
if (node.path === this.path) {
|
|
856
|
+
this.tree = node;
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
// if we have metadata about this node, and it's a match, then
|
|
860
|
+
// try to decorate it.
|
|
861
|
+
if (node.resolved === null || node.integrity === null) {
|
|
862
|
+
const { resolved, integrity, version } = this.get(node.path);
|
|
863
|
+
|
|
864
|
+
let pathFixed = null;
|
|
865
|
+
if (resolved) {
|
|
866
|
+
if (!/^file:/.test(resolved)) {
|
|
867
|
+
pathFixed = resolved;
|
|
868
|
+
} else {
|
|
869
|
+
pathFixed = `file:${resolve(this.path, resolved.slice(5))}`;
|
|
870
|
+
}
|
|
871
|
+
}
|
|
872
|
+
|
|
873
|
+
// if we have one, only set the other if it matches
|
|
874
|
+
// otherwise it could be for a completely different thing.
|
|
875
|
+
const resolvedOk =
|
|
876
|
+
!resolved || !node.resolved || node.resolved === pathFixed;
|
|
877
|
+
const integrityOk =
|
|
878
|
+
!integrity || !node.integrity || node.integrity === integrity;
|
|
879
|
+
const versionOk = !version || !node.version || version === node.version;
|
|
880
|
+
|
|
881
|
+
const allOk =
|
|
882
|
+
(resolved || integrity || version) &&
|
|
883
|
+
resolvedOk &&
|
|
884
|
+
integrityOk &&
|
|
885
|
+
versionOk;
|
|
886
|
+
|
|
887
|
+
if (allOk) {
|
|
888
|
+
node.resolved = node.resolved || pathFixed || null;
|
|
889
|
+
node.integrity = node.integrity || integrity || null;
|
|
890
|
+
} else {
|
|
891
|
+
// try to read off the package or node itself
|
|
892
|
+
const { resolved, integrity } = Shrinkwrap.metaFromNode(
|
|
893
|
+
node,
|
|
894
|
+
this.path,
|
|
895
|
+
this.resolveOptions,
|
|
896
|
+
);
|
|
897
|
+
node.resolved = node.resolved || resolved || null;
|
|
898
|
+
node.integrity = node.integrity || integrity || null;
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
this.#awaitingUpdate.set(loc, node);
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
addEdge(edge) {
|
|
905
|
+
if (!this.yarnLock || !edge.valid) {
|
|
906
|
+
return;
|
|
907
|
+
}
|
|
908
|
+
|
|
909
|
+
const { to: node } = edge;
|
|
910
|
+
|
|
911
|
+
// if it's already set up, nothing to do
|
|
912
|
+
if (node.resolved !== null && node.integrity !== null) {
|
|
913
|
+
return;
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
// if the yarn lock is empty, nothing to do
|
|
917
|
+
if (!this.yarnLock.entries || !this.yarnLock.entries.size) {
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
|
|
921
|
+
// we relativize the path here because that's how it shows up in the lock
|
|
922
|
+
// XXX why is this different from pathFixed in this.add??
|
|
923
|
+
let pathFixed = null;
|
|
924
|
+
if (node.resolved) {
|
|
925
|
+
if (!/file:/.test(node.resolved)) {
|
|
926
|
+
pathFixed = node.resolved;
|
|
927
|
+
} else {
|
|
928
|
+
pathFixed = consistentResolve(
|
|
929
|
+
node.resolved,
|
|
930
|
+
node.path,
|
|
931
|
+
this.path,
|
|
932
|
+
true,
|
|
933
|
+
);
|
|
934
|
+
}
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
const spec = npa(`${node.name}@${edge.spec}`);
|
|
938
|
+
const entry = this.yarnLock.entries.get(`${node.name}@${edge.spec}`);
|
|
939
|
+
|
|
940
|
+
if (
|
|
941
|
+
!entry ||
|
|
942
|
+
mismatch(node.version, entry.version) ||
|
|
943
|
+
mismatch(node.integrity, entry.integrity) ||
|
|
944
|
+
mismatch(pathFixed, entry.resolved)
|
|
945
|
+
) {
|
|
946
|
+
return;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
if (entry.resolved && yarnRegRe.test(entry.resolved) && spec.registry) {
|
|
950
|
+
entry.resolved = entry.resolved.replace(
|
|
951
|
+
yarnRegRe,
|
|
952
|
+
"https://registry.npmjs.org/",
|
|
953
|
+
);
|
|
954
|
+
}
|
|
955
|
+
|
|
956
|
+
node.integrity = node.integrity || entry.integrity || null;
|
|
957
|
+
node.resolved =
|
|
958
|
+
node.resolved ||
|
|
959
|
+
consistentResolve(entry.resolved, this.path, node.path) ||
|
|
960
|
+
null;
|
|
961
|
+
|
|
962
|
+
this.#awaitingUpdate.set(relpath(this.path, node.path), node);
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
#updateWaitingNode(loc) {
|
|
966
|
+
const node = this.#awaitingUpdate.get(loc);
|
|
967
|
+
this.#awaitingUpdate.delete(loc);
|
|
968
|
+
this.data.packages[loc] = Shrinkwrap.metaFromNode(
|
|
969
|
+
node,
|
|
970
|
+
this.path,
|
|
971
|
+
this.resolveOptions,
|
|
972
|
+
);
|
|
973
|
+
}
|
|
974
|
+
|
|
975
|
+
commit() {
|
|
976
|
+
if (this.tree) {
|
|
977
|
+
if (this.yarnLock) {
|
|
978
|
+
this.yarnLock.fromTree(this.tree);
|
|
979
|
+
}
|
|
980
|
+
const root = Shrinkwrap.metaFromNode(
|
|
981
|
+
this.tree.target,
|
|
982
|
+
this.path,
|
|
983
|
+
this.resolveOptions,
|
|
984
|
+
);
|
|
985
|
+
// record the canonical packageExtensions hash on the root entry so npm ci can detect stale extension state
|
|
986
|
+
if (this.packageExtensionsHash) {
|
|
987
|
+
root.packageExtensionsHash = this.packageExtensionsHash;
|
|
988
|
+
}
|
|
989
|
+
// record the .npm-extension file hash on the root entry for the same reason
|
|
990
|
+
if (this.npmExtensionHash) {
|
|
991
|
+
root.npmExtensionHash = this.npmExtensionHash;
|
|
992
|
+
}
|
|
993
|
+
this.data.packages = {};
|
|
994
|
+
if (Object.keys(root).length) {
|
|
995
|
+
this.data.packages[""] = root;
|
|
996
|
+
}
|
|
997
|
+
for (const node of this.tree.root.inventory.values()) {
|
|
998
|
+
// only way this.tree is not root is if the root is a link to it
|
|
999
|
+
if (node === this.tree || node.isRoot || node.location === "") {
|
|
1000
|
+
continue;
|
|
1001
|
+
}
|
|
1002
|
+
const loc = relpath(this.path, node.path);
|
|
1003
|
+
// Drop lockfile entries for extraneous nodes outside node_modules that
|
|
1004
|
+
// are direct fsChildren of the root (or detached link targets). These
|
|
1005
|
+
// are stale top-level entries: a workspace or file: dep removed from
|
|
1006
|
+
// the root manifest, or whose directory was deleted. Extraneous
|
|
1007
|
+
// fsChildren nested under another package (e.g. a file: dep of another
|
|
1008
|
+
// file: dep) are kept so `npm ci` can resolve the parent's dependency.
|
|
1009
|
+
if (
|
|
1010
|
+
node.extraneous &&
|
|
1011
|
+
!/(^|\/)node_modules\//.test(loc) &&
|
|
1012
|
+
loc !== "node_modules" &&
|
|
1013
|
+
(!node.fsParent || node.fsParent.isRoot)
|
|
1014
|
+
) {
|
|
1015
|
+
continue;
|
|
1016
|
+
}
|
|
1017
|
+
const meta = Shrinkwrap.metaFromNode(
|
|
1018
|
+
node,
|
|
1019
|
+
this.path,
|
|
1020
|
+
this.resolveOptions,
|
|
1021
|
+
);
|
|
1022
|
+
// Skip inert nodes — these are optional deps that failed to load
|
|
1023
|
+
// (e.g. 404 from a proxy registry that hasn't cached the package,
|
|
1024
|
+
// or incomplete manifest missing version field).
|
|
1025
|
+
// #pruneFailedOptional marks them inert so they won't be reified;
|
|
1026
|
+
// writing them to the lockfile produces invalid entries like
|
|
1027
|
+
// {"optional": true} that cause "Invalid Version:" errors.
|
|
1028
|
+
if (node.inert && !node.package.version) {
|
|
1029
|
+
continue;
|
|
1030
|
+
}
|
|
1031
|
+
this.data.packages[loc] = meta;
|
|
1032
|
+
}
|
|
1033
|
+
} else if (this.#awaitingUpdate.size > 0) {
|
|
1034
|
+
for (const loc of this.#awaitingUpdate.keys()) {
|
|
1035
|
+
this.#updateWaitingNode(loc);
|
|
1036
|
+
}
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
// if we haven't set it by now, use the default
|
|
1040
|
+
if (!this.lockfileVersion) {
|
|
1041
|
+
this.lockfileVersion = defaultLockfileVersion;
|
|
1042
|
+
}
|
|
1043
|
+
// patched nodes force lockfileVersion 4 so older clients abort the install
|
|
1044
|
+
// the hidden lockfile is an internal cache pinned to version 3, so it never drives this upgrade
|
|
1045
|
+
const hasPatched =
|
|
1046
|
+
!this.hiddenLockfile &&
|
|
1047
|
+
Object.values(this.data.packages).some((p) => p.patched);
|
|
1048
|
+
if (hasPatched && this.lockfileVersion < patchedLockfileVersion) {
|
|
1049
|
+
log.warn(
|
|
1050
|
+
"shrinkwrap",
|
|
1051
|
+
`patchedDependencies requires lockfileVersion ${patchedLockfileVersion}; upgrading the lockfile from version ${this.lockfileVersion}.`,
|
|
1052
|
+
);
|
|
1053
|
+
this.lockfileVersion = patchedLockfileVersion;
|
|
1054
|
+
}
|
|
1055
|
+
// packageExtensions and .npm-extension state likewise force lockfileVersion 4 so older clients abort instead of dropping the repaired graph
|
|
1056
|
+
const hasExtensionState =
|
|
1057
|
+
!this.hiddenLockfile &&
|
|
1058
|
+
(this.packageExtensionsHash ||
|
|
1059
|
+
this.npmExtensionHash ||
|
|
1060
|
+
Object.values(this.data.packages).some(
|
|
1061
|
+
(p) => p.packageExtensionsApplied || p.npmExtensionApplied,
|
|
1062
|
+
));
|
|
1063
|
+
if (
|
|
1064
|
+
hasExtensionState &&
|
|
1065
|
+
this.lockfileVersion < packageExtensionsLockfileVersion
|
|
1066
|
+
) {
|
|
1067
|
+
log.warn(
|
|
1068
|
+
"shrinkwrap",
|
|
1069
|
+
`manifest extensions require lockfileVersion ${packageExtensionsLockfileVersion}; upgrading the lockfile from version ${this.lockfileVersion}.`,
|
|
1070
|
+
);
|
|
1071
|
+
this.lockfileVersion = packageExtensionsLockfileVersion;
|
|
1072
|
+
}
|
|
1073
|
+
this.data.lockfileVersion = this.lockfileVersion;
|
|
1074
|
+
|
|
1075
|
+
// hidden lockfiles don't include legacy metadata or a root entry
|
|
1076
|
+
if (this.hiddenLockfile) {
|
|
1077
|
+
delete this.data.packages[""];
|
|
1078
|
+
delete this.data.dependencies;
|
|
1079
|
+
} else if (this.tree && this.lockfileVersion <= 3) {
|
|
1080
|
+
this.#buildLegacyLockfile(this.tree, this.data);
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
// lf version 1 = dependencies only
|
|
1084
|
+
// lf version 2 = dependencies and packages
|
|
1085
|
+
// lf version 3 = packages only
|
|
1086
|
+
if (this.lockfileVersion >= 3) {
|
|
1087
|
+
const { dependencies, ...data } = this.data;
|
|
1088
|
+
return data;
|
|
1089
|
+
} else if (this.lockfileVersion < 2) {
|
|
1090
|
+
const { packages, ...data } = this.data;
|
|
1091
|
+
return data;
|
|
1092
|
+
} else {
|
|
1093
|
+
return { ...this.data };
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
#buildLegacyLockfile(node, lock, path = []) {
|
|
1098
|
+
if (node === this.tree) {
|
|
1099
|
+
// the root node
|
|
1100
|
+
lock.name = node.packageName || node.name;
|
|
1101
|
+
if (node.version) {
|
|
1102
|
+
lock.version = node.version;
|
|
1103
|
+
}
|
|
1104
|
+
}
|
|
1105
|
+
|
|
1106
|
+
// npm v6 and before tracked 'from', meaning "the request that led
|
|
1107
|
+
// to this package being installed". However, that's inherently
|
|
1108
|
+
// racy and non-deterministic in a world where deps are deduped
|
|
1109
|
+
// ahead of fetch time. In order to maintain backwards compatibility
|
|
1110
|
+
// with v6 in the lockfile, we do this trick where we pick a valid
|
|
1111
|
+
// dep link out of the edgesIn set. Choose the edge with the fewest
|
|
1112
|
+
// number of `node_modules` sections in the requestor path, and then
|
|
1113
|
+
// lexically sort afterwards.
|
|
1114
|
+
const edge = [...node.edgesIn]
|
|
1115
|
+
.filter((e) => e.valid)
|
|
1116
|
+
.sort((a, b) => {
|
|
1117
|
+
const aloc = a.from.location.split("node_modules");
|
|
1118
|
+
const bloc = b.from.location.split("node_modules");
|
|
1119
|
+
/* istanbul ignore next - sort calling order is indeterminate */
|
|
1120
|
+
if (aloc.length > bloc.length) {
|
|
1121
|
+
return 1;
|
|
1122
|
+
}
|
|
1123
|
+
if (bloc.length > aloc.length) {
|
|
1124
|
+
return -1;
|
|
1125
|
+
}
|
|
1126
|
+
return localeCompare(aloc[aloc.length - 1], bloc[bloc.length - 1]);
|
|
1127
|
+
})[0];
|
|
1128
|
+
|
|
1129
|
+
const res = consistentResolve(node.resolved, this.path, this.path, true);
|
|
1130
|
+
const rSpec = specFromResolved(res);
|
|
1131
|
+
|
|
1132
|
+
// if we don't have anything (ie, it's extraneous) then use the resolved
|
|
1133
|
+
// value as if that was where we got it from, since at least it's true.
|
|
1134
|
+
// if we don't have either, just an empty object so nothing matches below.
|
|
1135
|
+
// This will effectively just save the version and resolved, as if it's
|
|
1136
|
+
// a standard version/range dep, which is a reasonable default.
|
|
1137
|
+
let spec = rSpec;
|
|
1138
|
+
if (edge) {
|
|
1139
|
+
spec = npa.resolve(node.name, edge.spec, edge.from.realpath);
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
if (node.isLink) {
|
|
1143
|
+
lock.version = `file:${relpath(this.path, node.realpath)}`;
|
|
1144
|
+
} else if (spec && (spec.type === "file" || spec.type === "remote")) {
|
|
1145
|
+
lock.version = spec.saveSpec;
|
|
1146
|
+
} else if ((spec && spec.type === "git") || rSpec.type === "git") {
|
|
1147
|
+
lock.version = node.resolved;
|
|
1148
|
+
/* istanbul ignore else - don't think there are any cases where a git
|
|
1149
|
+
* spec (or indeed, ANY npa spec) doesn't have a .raw member */
|
|
1150
|
+
if (spec.raw) {
|
|
1151
|
+
lock.from = spec.raw;
|
|
1152
|
+
}
|
|
1153
|
+
} else if (
|
|
1154
|
+
!node.isRoot &&
|
|
1155
|
+
node.package &&
|
|
1156
|
+
node.packageName &&
|
|
1157
|
+
node.packageName !== node.name
|
|
1158
|
+
) {
|
|
1159
|
+
lock.version = `npm:${node.packageName}@${node.version}`;
|
|
1160
|
+
} else if (node.package && node.version) {
|
|
1161
|
+
lock.version = node.version;
|
|
1162
|
+
}
|
|
1163
|
+
|
|
1164
|
+
if (node.inDepBundle) {
|
|
1165
|
+
lock.bundled = true;
|
|
1166
|
+
}
|
|
1167
|
+
|
|
1168
|
+
// when we didn't resolve to git, file, or dir, and didn't request
|
|
1169
|
+
// git, file, dir, or remote, then the resolved value is necessary.
|
|
1170
|
+
if (
|
|
1171
|
+
node.resolved &&
|
|
1172
|
+
!node.isLink &&
|
|
1173
|
+
rSpec.type !== "git" &&
|
|
1174
|
+
rSpec.type !== "file" &&
|
|
1175
|
+
rSpec.type !== "directory" &&
|
|
1176
|
+
spec.type !== "directory" &&
|
|
1177
|
+
spec.type !== "git" &&
|
|
1178
|
+
spec.type !== "file" &&
|
|
1179
|
+
spec.type !== "remote"
|
|
1180
|
+
) {
|
|
1181
|
+
lock.resolved = overrideResolves(node.resolved, this.resolveOptions);
|
|
1182
|
+
}
|
|
1183
|
+
|
|
1184
|
+
if (node.integrity) {
|
|
1185
|
+
lock.integrity = node.integrity;
|
|
1186
|
+
}
|
|
1187
|
+
|
|
1188
|
+
if (node.extraneous) {
|
|
1189
|
+
lock.extraneous = true;
|
|
1190
|
+
} else if (!node.isLink) {
|
|
1191
|
+
if (node.peer) {
|
|
1192
|
+
lock.peer = true;
|
|
1193
|
+
}
|
|
1194
|
+
|
|
1195
|
+
if (node.devOptional && !node.dev && !node.optional) {
|
|
1196
|
+
lock.devOptional = true;
|
|
1197
|
+
}
|
|
1198
|
+
|
|
1199
|
+
if (node.dev) {
|
|
1200
|
+
lock.dev = true;
|
|
1201
|
+
}
|
|
1202
|
+
|
|
1203
|
+
if (node.optional) {
|
|
1204
|
+
lock.optional = true;
|
|
1205
|
+
}
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
const depender = node.target;
|
|
1209
|
+
if (depender.edgesOut.size > 0) {
|
|
1210
|
+
if (node !== this.tree) {
|
|
1211
|
+
const entries = [...depender.edgesOut.entries()];
|
|
1212
|
+
lock.requires = entries.reduce((set, [k, v]) => {
|
|
1213
|
+
// omit peer deps from legacy lockfile requires field, because
|
|
1214
|
+
// npm v6 doesn't handle peer deps, and this triggers some bad
|
|
1215
|
+
// behavior if the dep can't be found in the dependencies list.
|
|
1216
|
+
const { spec, peer } = v;
|
|
1217
|
+
if (peer) {
|
|
1218
|
+
return set;
|
|
1219
|
+
}
|
|
1220
|
+
if (spec.startsWith("file:")) {
|
|
1221
|
+
// turn absolute file: paths into relative paths from the node
|
|
1222
|
+
// this especially shows up with workspace edges when the root
|
|
1223
|
+
// node is also a workspace in the set.
|
|
1224
|
+
const p = resolve(node.realpath, spec.slice("file:".length));
|
|
1225
|
+
set[k] = `file:${relpath(node.realpath, p)}`;
|
|
1226
|
+
} else {
|
|
1227
|
+
set[k] = spec;
|
|
1228
|
+
}
|
|
1229
|
+
return set;
|
|
1230
|
+
}, {});
|
|
1231
|
+
} else {
|
|
1232
|
+
lock.requires = true;
|
|
1233
|
+
}
|
|
1234
|
+
}
|
|
1235
|
+
|
|
1236
|
+
// now we walk the children, putting them in the 'dependencies' object
|
|
1237
|
+
const { children } = node.target;
|
|
1238
|
+
if (!children.size) {
|
|
1239
|
+
delete lock.dependencies;
|
|
1240
|
+
} else {
|
|
1241
|
+
const kidPath = [...path, node.realpath];
|
|
1242
|
+
const dependencies = {};
|
|
1243
|
+
// skip any that are already in the descent path, so cyclical link
|
|
1244
|
+
// dependencies don't blow up with ELOOP.
|
|
1245
|
+
let found = false;
|
|
1246
|
+
for (const [name, kid] of children.entries()) {
|
|
1247
|
+
if (path.includes(kid.realpath)) {
|
|
1248
|
+
continue;
|
|
1249
|
+
}
|
|
1250
|
+
dependencies[name] = this.#buildLegacyLockfile(kid, {}, kidPath);
|
|
1251
|
+
found = true;
|
|
1252
|
+
}
|
|
1253
|
+
if (found) {
|
|
1254
|
+
lock.dependencies = dependencies;
|
|
1255
|
+
}
|
|
1256
|
+
}
|
|
1257
|
+
return lock;
|
|
1258
|
+
}
|
|
1259
|
+
|
|
1260
|
+
toJSON() {
|
|
1261
|
+
if (!this.data) {
|
|
1262
|
+
throw new Error("run load() before getting or setting data");
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
return this.commit();
|
|
1266
|
+
}
|
|
1267
|
+
|
|
1268
|
+
save(options = {}) {
|
|
1269
|
+
if (!this.data) {
|
|
1270
|
+
throw new Error("run load() before saving data");
|
|
1271
|
+
}
|
|
1272
|
+
|
|
1273
|
+
// commit() sets properties, so it must run before the lockfile conversion
|
|
1274
|
+
// check below.
|
|
1275
|
+
this.commit();
|
|
1276
|
+
if (
|
|
1277
|
+
!this.hiddenLockfile &&
|
|
1278
|
+
this.originalLockfileVersion !== undefined &&
|
|
1279
|
+
this.originalLockfileVersion !== this.lockfileVersion
|
|
1280
|
+
) {
|
|
1281
|
+
log.warn(
|
|
1282
|
+
"shrinkwrap",
|
|
1283
|
+
`Converting lock file (${relative(process.cwd(), this.filename)}) from v${this.originalLockfileVersion} -> v${this.lockfileVersion}`,
|
|
1284
|
+
);
|
|
1285
|
+
}
|
|
1286
|
+
|
|
1287
|
+
return Promise.resolve([]);
|
|
1288
|
+
}
|
|
1289
|
+
}
|
|
1290
|
+
|
|
1291
|
+
export default Shrinkwrap;
|