npm モジュールのセキュリティアップデート(2)

GitHubに脆弱性警告が通知されていた。pug-code-gen を 2.0.2 → 2.0.3、pug を 2.0.2 → 3.0.1 にアップデートせよとのお達しである。

f:id:xlc:20210305011307p:plain:w360:right

pug を 2.0.2 → 3.0.1 にアップデートすれば pug-code-gen も 3.0.x にアップデートされるようなので、pug だけアップデートすればよさそうなのだが、この2つのモジュールを使っている pug-cli がアップデートされていない*1。こういうときは npm audit fix を使って package-lock.json を直すが定番だが、さすがにメジャーバージョンのアップデートは対応できない。

以前、npm モジュールのセキュリティアップデート - koba::blog のやり方で修復したことがあるのだが、これはどうやらたまたまうまくいっただけのようである。そこでネットを調べると package.json の resolutions を使って依存パッケージのバージョンを指定する - 30歳からのプログラミング というページを発見したので、これを参考にバージョンアップを試みた。

packegae-lock.json は使用するモジュールのバージョンを1つ1つ全て指定するファイルだが、rpm i が自動生成するため、人間が修正するには向いていない。けれど npm-force-resolutions というモジュールを使用することでバージョンを指定した修正が可能になるようである。

まず、package.json に以下のセクションを追加する。*2

@@ -5,6 +5,7 @@
   "main": "src/js/majiang.js",
   "private": true,
   "scripts": {
+    "preinstall": "npx npm-force-resolutions",
     "build:html": "pug -o www -P src/html/page/",
     "build:js": "webpack --mode development --devtool inline-source-map",
     "build:css": "stylus src/css/index.styl -o www/css/majiang-1.5.0.css",
@@ -32,6 +33,9 @@
     "webpack": "^4.40.2",
     "webpack-cli": "^3.3.9"
   },
+  "resolutions": {
+    "pug": "^3.0.1"
+  },
   "dependencies": {
     "jquery": "^3.5.1",
     "jquery-ui": "^1.12.1"

続いて npm i を実行する。

$ npm i

これで ./node_modules/ と package-lock.json が更新される。ただしこの段階では npm ls で確認した時にエラーが表示される。npm-force-resolutions の README に「package-lock.json が更新されたのち再度実行せよ」とあるので、今度は npm ci を実行する。

$ npm ci

これで npm ls の際のエラーも表示されなくなる。一時的に修正した package.json を元に戻せばOK。

$ git checkout package.json

*1:1.0.0-alpha6 というなんともやる気のないバージョンのまま

*2:このセクションは npm は理解しないが npm-force-resolutions が使用する。将来的には npm も理解するようになるのではないかと思う