TypeScriptの型定義ファイルを自動でinstallしてくれるtypesync
typesync
2021年12月現在では、 typesync version 0.8.0
Install missing TypeScript typings for dependencies in your package.json.
If you use a Semver ^ or ~ for a package, the same prefix will be used for the typings package.
If a typings package in your package.json is not used (has no corresponding code package in your package.json and does not contribute to the global namespace), TypeSync will automatically remove it.
-
package.json
のdependencies
に対して未インストールの型定義package(@types/package
) があれば、インストールしてくれる - Semver
^
や~
を使っている場合、同じ接頭辞のものをインストールしてくれる - 未使用の型定義 package は、自動で削除してくれる
環境
- TypeScript
- Github Actions を使用
- テストを回している
-
.github/workflow
では、npm install
ではなくnpm ci
を利用している。
- name: Install dependencies
run: npm ci
参考記事
Install typesync & npm install
$ npm install --save-dev typesync
Add .typesyncrc.yaml with ignorePackages option
typesync 自体の .typesyncrc.yaml
# These packages are dev tools and we don't need their typings.
ignorePackages:
- nodemon
- prettier
- rimraf
Add script in package.json
preinstall
を追加
preinstall
は、install
の前に実行され、postinstall
は install
の後に実行される (名前通り)
npm ci
でも preinstall
と postinstall
は実行される(npm-ci scripts)
"scripts": {
"preinstall": "typesync || :"
}
npm install してみる
$ npm install
> project@1.0.0 preinstall
> typesync || :
» TypeSync v0.8.0
✔ 1 new typings added.
📦 project — package.json (1 new typings added, 0 unused typings removed)
└─ + @types/hoge
✨ Go ahead and run npm install or yarn to install the packages that were added.
.... // 省略
=> 未install だった @types/hoge が追加されている 🎉
(未使用の型定義 package がある場合は、自動で削除してくれる)
おまけ
postinstall
も試してみる
こちらの記事を参考にして素直に、preinstall
=> postinstall
にしてみる
"scripts": {
"postinstall": "typesync && npm install --ignore-scripts"
}
=> これでできる 🎉
> typesync && npm install --ignore-scripts
» TypeSync v0.8.0
- Syncing type definitions in package.json...
✔ No new typings added, looks like you're all synced up!
npm install --ignore-scripts
とは?
npmとyarnの脆弱性とpostinstall こちらの記事によると、以下引用。
その中に、installとpostinstallがあります。 これらは利用者がパッケージをインストールする際に実行されるスクリプトです。 つまり、ただnpm installするだけでインストールしたパッケージに対して任意のスクリプト実行を許可していることになります。 そのため、結果的に悪意のあるパッケージが依存関係に含まれてしまった場合には、npm installするだけで悪意のあるスクリプトを実行されてしまいます。
つまり、今回のような脆弱性を利用せずとも悪意のあるパッケージはうまく依存関係に含まれることに成功すれば任意のスクリプトをユーザー環境で実行できます。 …。
そのための対策として、npm-scriptsの実行をしないための--ignore-scriptsというオプションがあります。
なるほどなるほど...。
他にも postinstall
でググると、危険性・脆弱性というワードで書かれた記事が多く見つかる。
だから解決策として --ignore-scripts
optionがあるのだろうけど、今回 preinstall
でできるなら、なんとなくそっちがいいなぁ。