✂️

pnpmやaubeの古くなったoverridesを検出・削除する「pnpm-override-prune」

に公開

脆弱性対応などで、依存パッケージの最低バージョンをpackage.jsonのoverridesに定義した場合、時が経って不要になったら削除したくなりませんか。

そんなときのために、古くなったバージョン定義を検出・削除できるツール「pnpm-override-prune」を作りました。

https://github.com/iwamot/pnpm-override-prune

以下、使い方のご紹介です。

検出

Prismaに、ちょうどよい例があったので題材にしてみます。

$ git clone https://github.com/prisma/prisma.git
$ cd prisma

$ pnpm dlx pnpm-override-prune
=== package.json:pnpm.overrides (10 entries) ===
[PRUNE] form-data >=4.0.4                          4.0.5
[KEEP]  hono >=4.12.14                             4.11.7
[KEEP]  @hono/node-server >=1.19.13                1.19.0
[KEEP]  jws >=4.0.1                                3.2.3
[PRUNE] tar-fs >=2.1.4                             2.1.4
[PRUNE] lodash >=4.17.23                           4.17.23
[KEEP]  @tootallnate/once >=3.0.1                  1.1.2
[SKIP]  ajv@^8.0.0 >=8.18.0                        (versioned key)
[SKIP]  @azure/core-rest-pipeline@^1.0.0 >=1.14.0  (versioned key)
[SKIP]  @azure/msal-node>uuid >=14.0.0             (nested key)

Run with --fix to prune entries marked [PRUNE].

[PRUNE] となったバージョン指定 (form-data >=4.0.4, tar-fs >=2.1.4, lodash >=4.17.23) は、いずれも推移的依存関係ツリーの更新により、もう書く必要がない状況です。

たとえば form-data >=4.0.4 の右側に表示されている 4.0.5 は、この指定を外した場合にインストールされるバージョンを示しています。

削除

不要になったバージョン指定は、--fix を付けることで削除できます。

$ pnpm dlx pnpm-override-prune --fix
=== package.json:pnpm.overrides (10 entries) ===
[PRUNE] form-data >=4.0.4                          4.0.5
[KEEP]  hono >=4.12.14                             4.11.7
[KEEP]  @hono/node-server >=1.19.13                1.19.0
[KEEP]  jws >=4.0.1                                3.2.3
[PRUNE] tar-fs >=2.1.4                             2.1.4
[PRUNE] lodash >=4.17.23                           4.17.23
[KEEP]  @tootallnate/once >=3.0.1                  1.1.2
[SKIP]  ajv@^8.0.0 >=8.18.0                        (versioned key)
[SKIP]  @azure/core-rest-pipeline@^1.0.0 >=1.14.0  (versioned key)
[SKIP]  @azure/msal-node>uuid >=14.0.0             (nested key)

Pruned 3 entries.
$ git diff
diff --git a/package.json b/package.json
index a0fce28..87027f6 100644
--- a/package.json
+++ b/package.json
@@ -161,12 +161,9 @@
   ],
   "pnpm": {
     "overrides": {
-      "form-data": ">=4.0.4",
       "hono": ">=4.12.14",
       "@hono/node-server": ">=1.19.13",
       "jws": ">=4.0.1",
-      "tar-fs": ">=2.1.4",
-      "lodash": ">=4.17.23",
       "@tootallnate/once": ">=3.0.1",
       "ajv@^8.0.0": ">=8.18.0",
       "@azure/core-rest-pipeline@^1.0.0": ">=1.14.0",

おわりに

サプライチェーン攻撃対策の一環でオーバーライドしたものの、いつ消せばよいかモヤモヤしている方は、ぜひお試しください。

Pythonのuv向けに、兄弟ツールの「uv-override-prune」もあります。

https://github.com/iwamot/uv-override-prune

Discussion