npm audit fix --force しても直らない!〜TypeScriptとReact/Next.js本5章で発生した問題を解決する
TypeScriptとReact/Next.jsでつくる実践Webアプリケーション開発
5章で環境構築中に発生した警告が気になったので解決メモです。
問題のpackage.json(5章最後)
{
"name": "can-badge-market-nextjs",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint --dir src",
"format": "next lint --fix --dir src",
"storybook": "start-storybook -p 6006",
"build-storybook": "build-storybook",
"test": "jest"
},
"dependencies": {
"@emotion/react": "^11.10.0",
"@emotion/styled": "^11.10.0",
"@mui/icons-material": "^5.8.4",
"@mui/material": "^5.10.1",
"next": "12.2.5",
"react": "18.2.0",
"react-content-loader": "^6.2.0",
"react-dom": "18.2.0",
"react-hook-form": "^7.34.2",
"swr": "^1.3.0"
},
"devDependencies": {
"@babel/core": "^7.18.10",
"@babel/plugin-proposal-class-properties": "^7.18.6",
"@babel/plugin-proposal-private-methods": "^7.18.6",
"@babel/plugin-proposal-private-property-in-object": "^7.18.6",
"@mdx-js/react": "^2.1.3",
"@storybook/addon-actions": "^6.5.10",
"@storybook/addon-docs": "^6.3.12",
"@storybook/addon-essentials": "^6.4.22",
"@storybook/addon-interactions": "^6.5.10",
"@storybook/addon-links": "^6.5.10",
"@storybook/addon-postcss": "^2.0.0",
"@storybook/builder-webpack5": "^6.5.10",
"@storybook/manager-webpack5": "^6.5.10",
"@storybook/react": "^6.1.21",
"@storybook/testing-library": "^0.0.13",
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.3.0",
"@types/node": "18.7.8",
"@types/react": "18.0.17",
"@types/react-content-loader": "^4.0.0",
"@types/react-dom": "18.0.6",
"@typescript-eslint/eslint-plugin": "^5.33.1",
"@typescript-eslint/parser": "^5.33.1",
"autoprefixer": "^10.4.8",
"babel-loader": "^8.2.5",
"eslint": "^8.22.0",
"eslint-config-next": "12.2.5",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
"eslint-plugin-prettier": "^4.2.1",
"eslint-plugin-react": "^7.30.1",
"eslint-plugin-react-hooks": "^4.6.0",
"eslint-plugin-storybook": "^0.6.4",
"jest": "^28.1.3",
"jest-environment-jsdom": "^28.1.3",
"postcss": "^8.4.16",
"prettier": "^2.7.1",
"tailwindcss": "^3.1.8",
"tsconfig-paths-webpack-plugin": "^4.0.0",
"typescript": "4.7.4",
"typescript-eslint": "^0.0.1-alpha.0"
}
}
#npm installするたびに警告される。
22 high severity vulnerabilities
To address issues that do not require attention, run:
npm audit fix
Some issues need review, and may require choosing
a different dependency.
22件の深刻度の高い脆弱性
注意を払う必要のない問題に対処するために、実行します。
npm audit fix
いくつかの問題はレビューが必要であり、別の依存関係を選択する必要があるかもしれません。
別の依存関係を選択する必要があるかもしれません。(DeepL翻訳)
npm audit fix
しても
npm audit fix --force
しても
解決できなかったので、調べたことや解決策をメモっておきます。
経緯:
そもそも何が起きているの?
↓↓間違っていたらご指摘ください。↓↓
npmとは、
Javascriptのパッケージを管理するシステム。
Node.jsをいれたらついてきます。
パッケージ(ライブラリと言ったりもする)とは、
他のプログラムから利用することを目的としたプログラム
(モジュールと言ったりもする)を一纏めにしたもの。
パッケージやモジュールは
node_modules/ ディレクトリに入っていきます。
ちなみに、npm
と似たような
パッケージ管理できるものに
yarn
やpnpm
があります。
本書ではnpm
を使っていた、という理由だけで
今のところnpm
を採用しています。
package.jsonとは、
npm
が理解できるように、
あなたのプロジェクトのパッケージの
「依存関係」を記述したJSONファイルのこと。
npm -i (パッケージ名)
みたいに、新しいパッケージを
プロジェクトにインストールするたびに
このファイルの記述が増えるイメージです。
なので、あなたが、使うパッケージの
バージョンを上げたい/下げたい などあったら
package.jsonを編集します。記述方法は割愛。
ぼくのプロジェクトでは
@storybook/addon-docs
や
@storybook/addon-essentials
や
その他もろもろたくさん必要なんだけど、
package.jsonをみていい感じにお願いしますね!
と、npm
さんに丸投げするためのファイルです。
Githubなどからpackage.jsonをもってきた場合、
動かす前に
npm install
をしてpackage.jsonに記述されてる
モジュール/パッケージを全部インスコする必要があります。
package-lock.jsonとは、
前述の通りpackage.jsonには、
あなたのプロジェクトに必要な依存モジュール/パッケージが
記述されてます。
一方、package-lock.json
には、
依存モジュール/パッケージが、依存するモジュール/パッケージも、
自動的に記述されます。
ぼくのプロジェクトでは、
@storybook/addon-docs
を使うんだけど、
それには@storybook/core-common
が必要で、
それにはwebpack
が必要なんだけど、
それが動くにはwatchpack
ってやつが必要で、
それにはchokidar
が必要で
それにはglob-parent
が必要なんだ・・・
みたいなことが延々と記述されてます。
(ぼくのプロジェクト)
├─┬ @storybook/addon-docs@6.5.10
│ └─┬ @storybook/core-common@6.5.10
│ └─┬ webpack@4.46.0
│ └─┬ watchpack@1.7.5
│ └─┬ watchpack-chokidar2@2.0.1
│ └─┬ chokidar@2.1.8
│ └── glob-parent@3.1.0
依存関係でいうと、子、孫、ひ孫、やしゃご、、、
みたいな複雑かつ深い関係が発生するのが通常です。
glob-parent
なんてパッケージ、
インストールした覚えがないんだけどな、
って思ってたけど、そのパッケージで今回警告がでました。
それはこういう理由からだったんですね。
package-lock.jsonは、基本的には開発者が編集してはいけません
(ま、今回、いじっちゃうんだけど)
package-lock.jsonは、Git管理化におくべきです
node_modulesとは、
package.json
、そして
package-lock.json
を元にして
インストールされる各種モジュール/パッケージの
保存ディレクトリ。
通常は.gitignoreして、Git管理下に置きません
npm install
すればおなじことが起きるから不要です。
正確に言うと、
モジュール・パッケージのマイナーバージョンアップなどは
日々発生しています。
npm installするたびに、package.json
で
許されている範囲でパッケージ/モジュールの
バージョンアップが行われます。
その差異はプロジェクトの変更ではない、検出すべきでない差異だからです。
で、今回の警告の原因は?
モジュール/パッケージで脆弱性が報告されることがあります。
大抵、すぐに修正されたバージョンがリリースされるので
そのバージョンを使えばOKなのですが、
どこかの子パッケージ、孫パッケージ、ひ孫パッケージが
「前のバージョンの、このパッケージ使いたい」
と依存関係を記述したままのことがあります。
(新しいバージョンのパッケージが
仕様変更してしまう可能性は常にあるから、
マイナーバージョンアップだけゆるす、みたいな
指定をしていることがほとんどです)
カンタンなものなら
npm audit fix
npm audit fix --force
で直せるのですが、
storybook
の依存関係はややこしいのか、
今回それでは直せない警告が発生してしまった、ということです、多分。
↑↑間違っていたらご指摘ください。↑↑
直し方、参考にした記事
神。
package-lock.jsonを直接直して、
node_modulesを全部消して
npm install
をしなおす、という方法。
①まず、npm audit
npm audit
# npm audit report
glob-parent <5.1.2
Severity: high
glob-parent before 5.1.2 vulnerable to Regular Expression Denial of Service in enclosure regex - https://github.com/advisories/GHSA-ww39-953v-wcq6
No fix available
node_modules/cpy/node_modules/glob-parent
node_modules/watchpack-chokidar2/node_modules/glob-parent
chokidar 1.0.0-rc1 - 2.1.8
Depends on vulnerable versions of glob-parent
node_modules/watchpack-chokidar2/node_modules/chokidar
watchpack-chokidar2 *
Depends on vulnerable versions of chokidar
node_modules/watchpack-chokidar2
watchpack 1.7.2 - 1.7.5
Depends on vulnerable versions of watchpack-chokidar2
node_modules/@storybook/core-common/node_modules/watchpack
webpack 4.44.0 - 4.46.0
Depends on vulnerable versions of watchpack
node_modules/@storybook/core-common/node_modules/webpack
fast-glob <=2.2.7
Depends on vulnerable versions of glob-parent
node_modules/cpy/node_modules/fast-glob
globby 8.0.0 - 9.2.0
Depends on vulnerable versions of fast-glob
node_modules/cpy/node_modules/globby
cpy 7.0.0 - 8.1.2
Depends on vulnerable versions of globby
node_modules/cpy
@storybook/core-server <=7.0.0-alpha.6
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of cpy
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs/node_modules/@storybook/core/node_modules/@storybook/core-server
node_modules/@storybook/addon-essentials/node_modules/@storybook/react/node_modules/@storybook/core/node_modules/@storybook/core-server
node_modules/@storybook/core-server
@storybook/core >=6.2.0-alpha.0
Depends on vulnerable versions of @storybook/core-server
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs/node_modules/@storybook/core
node_modules/@storybook/addon-essentials/node_modules/@storybook/react/node_modules/@storybook/core
node_modules/@storybook/core
@storybook/addon-docs *
Depends on vulnerable versions of @mdx-js/mdx
Depends on vulnerable versions of @storybook/core
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of @storybook/mdx1-csf
Depends on vulnerable versions of @storybook/react
node_modules/@storybook/addon-docs
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs
@storybook/addon-essentials <=5.3.0-rc.14 || 6.0.0-alpha.0 - 6.5.0-rc.1
Depends on vulnerable versions of @storybook/addon-docs
node_modules/@storybook/addon-essentials
@storybook/react 6.2.0-alpha.0 - 6.5.11-alpha.0
Depends on vulnerable versions of @storybook/core
node_modules/@storybook/addon-essentials/node_modules/@storybook/react
node_modules/@storybook/react
trim <0.0.3
Severity: high
Regular Expression Denial of Service in trim - https://github.com/advisories/GHSA-w5p7-h5w8-2hfq
No fix available
node_modules/trim
remark-parse <=8.0.3
Depends on vulnerable versions of trim
node_modules/remark-parse
@mdx-js/mdx <=1.6.22
Depends on vulnerable versions of remark-mdx
Depends on vulnerable versions of remark-parse
node_modules/@mdx-js/mdx
@mdx-js/loader 0.15.5 - 1.6.22
Depends on vulnerable versions of @mdx-js/mdx
node_modules/@mdx-js/loader
@storybook/addon-docs *
Depends on vulnerable versions of @mdx-js/mdx
Depends on vulnerable versions of @storybook/core
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of @storybook/mdx1-csf
Depends on vulnerable versions of @storybook/react
node_modules/@storybook/addon-docs
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs
@storybook/addon-essentials <=5.3.0-rc.14 || 6.0.0-alpha.0 - 6.5.0-rc.1
Depends on vulnerable versions of @storybook/addon-docs
node_modules/@storybook/addon-essentials
@storybook/csf-tools <=6.5.11-alpha.0
Depends on vulnerable versions of @mdx-js/mdx
Depends on vulnerable versions of @storybook/mdx1-csf
node_modules/@storybook/addon-essentials/node_modules/@storybook/csf-tools
node_modules/@storybook/csf-tools
@storybook/core-server <=7.0.0-alpha.6
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of @storybook/csf-tools
Depends on vulnerable versions of cpy
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs/node_modules/@storybook/core/node_modules/@storybook/core-server
node_modules/@storybook/addon-essentials/node_modules/@storybook/react/node_modules/@storybook/core/node_modules/@storybook/core-server
node_modules/@storybook/core-server
@storybook/core >=6.2.0-alpha.0
Depends on vulnerable versions of @storybook/core-server
node_modules/@storybook/addon-essentials/node_modules/@storybook/addon-docs/node_modules/@storybook/core
node_modules/@storybook/addon-essentials/node_modules/@storybook/react/node_modules/@storybook/core
node_modules/@storybook/core
@storybook/react 6.2.0-alpha.0 - 6.5.11-alpha.0
Depends on vulnerable versions of @storybook/core
node_modules/@storybook/addon-essentials/node_modules/@storybook/react
node_modules/@storybook/react
@storybook/mdx1-csf *
Depends on vulnerable versions of @mdx-js/mdx
node_modules/@storybook/mdx1-csf
remark-mdx <=1.6.22
Depends on vulnerable versions of remark-parse
node_modules/remark-mdx
trim-newlines <3.0.1
Severity: high
Uncontrolled Resource Consumption in trim-newlines - https://github.com/advisories/GHSA-7p7h-4mm5-852v
fix available via `npm audit fix`
node_modules/trim-newlines
meow 3.4.0 - 5.0.0
Depends on vulnerable versions of trim-newlines
node_modules/meow
22 high severity vulnerabilities
To address issues that do not require attention, run:
npm audit fix
Some issues need review, and may require choosing
a different dependency.
まとめると、
glob-parent <5.1.2
trim <0.0.3
trim-newlines <3.0.1
の3つにhighな脆弱性が見つかっている、ということらしい。
②ひとつずつ、npm ls する
npm auditのログだとみずらいので、npm ls (パッケージ名)
で依存関係をみてみる
npm ls glob-parent
can-badge-market-nextjs@0.1.0 /Users/kugyu10/work/practice/can-badge-market-nextjs
├─┬ @storybook/addon-docs@6.5.10
│ └─┬ @storybook/core-common@6.5.10
│ └─┬ webpack@4.46.0
│ └─┬ watchpack@1.7.5
│ └─┬ watchpack-chokidar2@2.0.1
│ └─┬ chokidar@2.1.8
│ └── glob-parent@3.1.0
├─┬ @storybook/react@6.5.10
│ └─┬ @storybook/core@6.5.10
│ └─┬ @storybook/core-server@6.5.10
│ └─┬ cpy@8.1.2
│ └─┬ globby@9.2.0
│ └─┬ fast-glob@2.2.7
│ └── glob-parent@3.1.0
├─┬ eslint@8.22.0
│ └── glob-parent@6.0.2
└─┬ tailwindcss@3.1.8
├─┬ chokidar@3.5.3
│ └── glob-parent@5.1.2
├─┬ fast-glob@3.2.11
│ └── glob-parent@5.1.2
└── glob-parent@6.0.2 deduped
npm ls trim
can-badge-market-nextjs@0.1.0 /Users/kugyu10/work/practice/can-badge-market-nextjs
└─┬ @storybook/addon-docs@6.5.10
└─┬ @storybook/mdx1-csf@0.0.1
└─┬ @mdx-js/mdx@1.6.22
└─┬ remark-parse@8.0.3
└── trim@0.0.1
npm ls trim-newlines
can-badge-market-nextjs@0.1.0 /Users/kugyu10/work/practice/can-badge-market-nextjs
└─┬ @storybook/react@6.5.10
└─┬ @storybook/core@6.5.10
└─┬ @storybook/core-server@6.5.10
└─┬ x-default-browser@0.4.0
└─┬ default-browser-id@1.0.4
└─┬ meow@3.7.0
└── trim-newlines@1.0.0
③package-lock.jsonをいじる
前述したとおり、直接編集は推奨されないファイルなので、
依存関係を壊してしまう可能性があります。
現バージョンをコミットしておいたり、
退避したりしておくといいです。
とりあえず、何も考えずに
指摘されたバージョンを最新版に置き換えてみます。
(最新じゃないけど、脆弱でもないバージョンは放置)
ライブラリ | 脆弱性のあるバージョン | 2022.8.22時のLatest |
---|---|---|
glob-parent | <5.1.2 | 6.0.2 |
trim | <0.0.3 | 1.0.1 |
trim-newlines | <3.0.1 | 4.0.2 |
全部で10箇所以上あったけど
- "trim-newlines": "^1.0.0"
+ "trim-newlines": "^4.0.2"
などのように、書き換えました。
④node_modulesを削除
ゴリッと削除するコマンドなので注意。
sudo rm -rf node_modules/
30秒くらい待つ
⑤npm install しなおし
npm install
5分以上待ったのでコーヒーでも。
14 high severity vulnerabilities
ここでまたseverity vulnerabilities
警告でてしまいました。
もう一度npm audit fix
からやり直します。
npm audit fix
npm ERR! code ERESOLVE
npm ERR! ERESOLVE unable to resolve dependency tree
...
だめか、
npm audit fix --force
npm WARN using --force Recommended protections disabled.
npm WARN audit No fix available for @storybook/addon-docs@*
added 6 packages, removed 513 packages, changed 3 packages, and audited 2229 packages in 31s
288 packages are looking for funding
run `npm fund` for details
found 0 vulnerabilities
お?
消えた?
⑥起動確認
npm run test
npm run dev
npm run storybook
一通り問題なかったので解決!
結論
-
package-lock.json
を直接直して、 -
node_modules/
を全部消して、 -
npm install
して、 -
npm audit fix --force
する
で、ぼくの環境では解決しました。
Discussion