Open2

TypeScriptの型定義ファイルを自動でinstallしてくれるtypesync

rena-hrena-h

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.jsondependencies に対して未インストールの型定義package(@types/package ) があれば、インストールしてくれる
  • Semver ^~ を使っている場合、同じ接頭辞のものをインストールしてくれる
  • 未使用の型定義 package は、自動で削除してくれる

環境

  • TypeScript
  • Github Actions を使用
    • テストを回している
    • .github/workflow では、npm install ではなく npm ci を利用している。
- name: Install dependencies
   run: npm ci

参考記事

rena-hrena-h

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 の前に実行され、postinstallinstall の後に実行される (名前通り)
npm ci でも preinstallpostinstall は実行される(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 でできるなら、なんとなくそっちがいいなぁ。