Hacktoberfest 2026 : les issues que les mainteneurs ont marquées pour octobre, ouvertes et accessibles aux débutants. Parcourir les issues Hacktoberfest

Vendored npm refusal of a lockfileVersion 4 lock says to remove `patchedDependencies` and re-run `npm install`, but npm 12 keeps the lock at v4, so the advice loops and vendoring stays refused

Ouverte
#1,576 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Les mainteneurs répondent en général sous 1 jour

Personne n'a encore pris cette issue.

Évaluation

Difficulté
3/5
Temps estimé
Une demi-journée
Accessibilité débutants
62/100
Type d'issue
Bug
Clarté
Clairement spécifiée
Activité
Active
Stack technique
json, rust

Piste de recherche

Start in crates/socket-patch-core/src/vendor/npm_lock.rs: the lock_version_gate check on lockfileVersion 4 (around line 442) and the user-facing v4 refusal text (around lines 443-457). Reproduce with the steps in the issue, where npm 12 keeps a lock at v4 after npm patch rm. Done when either the remedy text names a working downgrade such as npm install --lockfile-version 3, or the gate accepts a v4 lock that has no patchedDependencies and no patched records, and vendoring then succeeds.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Description

agent:triaged bug bughunt pm:npm priority:p1

[agent] Found by the scheduled npm bug-hunt routine (ledger #302).

Summary

Vendored mode refuses an npm 12 lockfileVersion: 4 lock with vendor_lockfile_version_unsupported (the #711 fix). The refusal tells the user to "remove the patchedDependencies entries and regenerate the lock with npm install". That doesn't work. Once npm 12.1+ has written a v4 lock, npm patch rm, a plain npm install and an rm -rf node_modules && npm install all leave it at lockfileVersion: 4, even though package.json has no patchedDependencies and no entry carries a patched record. The next vendor / scan --mode vendored refuses again with the same text, so following the advice loops.

The gate's own comment (npm_lock.rs:443-446) already says "re-running npm install keeps it at 4", but the user-facing text recommends doing exactly that.

What does work is npm install --lockfile-version 3 (or deleting package-lock.json and reinstalling). With that, vendoring succeeds and a fresh npm ci installs the patched bytes.

Impact

A user who has ever used npm patch (npm >= 12.1) can't move to vendored mode by following the CLI's instructions. Each attempt exits 1 with the same refusal. This is the same "advice loops" class as #1072. The refusal also fires on a v4 lock that no longer has any native patch, and its text there ("would drop or break that patch") points at a patch that doesn't exist.

Repro (npm 12.2.0 or 12.1.0, Linux, main e76cb9b)

mkdir p && cd p
echo '{"name":"p","version":"0.0.0","private":true}' > package.json
npm install [email protected] [email protected]
npm patch ms --edit-dir ../edit && sed -i '1i /* NATIVE */' ../edit/index.js && npm patch commit ../edit
# package-lock.json: lockfileVersion 4
# stage a [email protected] patch in .socket/manifest.json (or use get/scan --mode vendored)
socket-patch vendor --json            # vendor_lockfile_version_unsupported (expected: a native patch is present)

# Follow the advice:
npm patch rm ms                        # package.json no longer has patchedDependencies
npm install                            # lockfileVersion is still 4
rm -rf node_modules && npm install     # still 4
socket-patch vendor --json            # vendor_lockfile_version_unsupported again, same text

# What actually works:
npm install --lockfile-version 3       # lockfileVersion 3
socket-patch vendor --json            # applied
rm -rf node_modules && npm ci          # left-pad installs the patched bytes

I drove vendor with the repo's prebuilt patch-service fixture (tests/prebuilt_common) over the real installed bytes. Every npm step is a real npm install.

Expected vs actual

  • Expected: a refusal's remedy, followed literally, clears the refusal. docs/testing/npm-compatibility.md ("npm 12 notes") documents the refusal as "naming npm patch". The remedy should name a step that downgrades the lock, such as npm install --lockfile-version 3 once patchedDependencies is gone. Alternatively, the gate could accept a v4 lock that has no patchedDependencies and no patched records, since that lock has the v3 shape.
  • Actual: the remedy ("remove the patchedDependencies entries and regenerate the lock with npm install") leaves the lock at v4, and vendoring refuses forever with the same text.

Matrix (Linux, Node 22.22, main e76cb9b)

npm lfv after npm patch after npm patch rm + npm install after rm -rf node_modules + npm install vendor after the advice after npm install --lockfile-version 3
12.2.0 4 4 4 refused (repro ×2) 3, vendor applied, npm ci patched
12.1.0 4 4 4 refused 3, vendor applied

npm <= 12.0 never writes v4, so it isn't affected. macOS and Windows weren't probed (the routine's probe branches are blocked); the behaviour is npm's lock writer plus a platform-independent text.

Suspect code

  • crates/socket-patch-core/src/vendor/npm_lock.rs:449-457 (lock_version_gate, the v4 detail text)
  • The gate keys only on lockfileVersion == 4 (npm_lock.rs:442), not on whether patchedDependencies / patched records still exist.

No probe runs: Linux only.

Langage dominant
Rust
Étoiles
8
Forks
1
Merge moyen
16 h 18 min
PR mergées (30 j)
587

Préparer son environnement

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Autres issues de SocketDev/socket-patch

Toutes les issues de SocketDev/socket-patch

Issues similaires

Plus d'issues Rust

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.