Hacktoberfest 2026:維護者為十月標記出來的 issue,仍然開放、適合新手。 瀏覽 Hacktoberfest issue

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

未關閉
#1,576 0 則留言 0 個 reaction 已指派 0 人 在 GitHub 檢視

維護者通常 1 天內回覆

還沒有人認領這個 Issue。

評估

難度
3/5
預估耗時
半天
新手友好度
62/100
Issue 類型
缺陷
描述清晰度
描述清楚
活躍度
活躍
技術堆疊
json, rust

研究方向

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.

由索引模型根據 Issue 內容生成。

描述

bug bughunt pm:npm

[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.

主要語言
Rust
星號
8
分支
1
平均合併
16 小時 35 分鐘
30 天內合併 PR
574

環境準備

  • 沒有 Dockerfile 或 Docker Compose 檔案
  • 沒有 Pull Request 範本
  • 閱讀貢獻指南

從這裡開始

  1. 先讀完整個 Issue,再讀專案的貢獻指南。
  2. 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
  3. Fork 儲存庫,在一個分支上完成修改。
  4. 送出 Pull Request,並在描述裡引用這個 Issue 編號。

SocketDev/socket-patch 的其他 Issue

查看 SocketDev/socket-patch 的全部 Issue

相似的 Issue

更多 Rust Issue

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。