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