colors.js, faker.js 等を使用しているか調べる簡易チェッカー

先日ショッキングな commit が push されたというニュースを知りました。そこで念のため colors や faker の開発者が開発したパッケージを自分のプロジェクトが使用しているかを調べる簡易チェッカーを作ってみました。

経緯

やろうと思えばできてしまうのがオープンソース界隈のエコシステムの怖いところではあります。

詳細は上述の記事をご参照ください。

それよりも、目下気になるのは自分のプロジェクトでこれらの npmパッケージ を使用していないかどうか。

colors や faker を開発した方がメンテナーになっているパッケージ一覧をazu氏が作ってくださったので、このリストを元にパッケージの使用を確認する簡易チェッカーを作ってみました。

成果物

コード (要点のみ)

const path          = require('path');
const request       = require('request');
const { spawnSync } = require('child_process');
const fs            = require('fs');
const marakOwnedUrl = 'https://gist.githubusercontent.com/azu/11b105a9e35dc9d5f07312c24a35c82b/raw/000a0c728ac1748b6fb3c80c8a0753fb1f6a57e8/marak-packages.md';

// 略

request.get({
    url: marakOwnedUrl,
}, function (error, response, body) {
    const mdStream = body.split("\n");
    const packageNamesArray = mdStream.filter((val) => {
        return val.length > 0 && !val.startsWith('http');
    });
    let cnt = {
        found: 0,
        notfound: 0,
    }
    let resultStr = `Project: ${projectPathStr}
`;
    for (let i = 0; i < packageNamesArray.length; i++) {
        console.log(`yarn why ${packageNamesArray[i]}`);
        resultStr += `Package "${packageNamesArray[i]}":  ${i + 1} / ${packageNamesArray.length}
> yarn why ${packageNamesArray[i]}
`;
        console.log(`package "${packageNamesArray[i]}":  ${i + 1} / ${packageNamesArray.length}`);
        const spawn = spawnSync(`yarn why ${packageNamesArray[i]} --cwd ${projectPathStr}`, { shell: true });
        console.log(spawn.stdout.toString());
        resultStr += `${spawn.stdout.toString()}
`;
        console.log(spawn.stderr.toString());
        resultStr += `${spawn.stderr.toString()}
`;
        spawn.stderr.toString().length > 0 ? cnt.notfound++ : cnt.found++;
    }
    const cntMsg = `
Found packages: ${cnt.found}
Not found packages: ${cnt.notfound}`;
    console.log(cntMsg);
    resultStr += cntMsg;
    try{
        fs.writeFileSync(path.join(path.join('.', 'dist'), `scan-result-${projectName}.log`), resultStr);
      }
      catch(e){
        console.log(e.message);
      }
});
  • 先程の mdファイル をHTTPリクエストで取得し、パッケージ名の行のみ(1行の文字列が0(改行のみ)とhttp始まりを除外)処理します
  • パッケージ名分ループして、 child_processspawn を使用し、 yarn why {パッケージ名} --cwd {プロジェクトのパス} コマンドを実行 (npm は今回は見ていません)
    • コマンドライン引数でプロジェクトのパスを指定することで、該当プロジェクトのディレクトリで yarn why をしています
  • 実行結果を console.log で表示しつつ、メモリに格納。全ての確認が終わるとテキストファイルにダンプします
    • 標準出力エラー(パッケージが見付からなかった)と成功(パッケージが見付かった)をカウントして出力に付与しています
    • 標準出力エラーを使うために spawn を使用

スピード重視でざっくり作りました。ひとまず自分の手元で動いて予期する動作になったので公開しました。

参考

きっかけ

経緯

前兆

パッケージ一覧

HTTPクライアント

コマンド実行

path

コマンドライン引数

ファイル・ディレクトリ存在確認

ファイル書き込み

標準出力

別ディレクトリで yarn 実行

(未使用) 現在ディレクトリの取得

(未使用) OS判別

(未使用) 文字化け

ARRAy.filter()

(未使用) (コマンド) 現在ディレクトリの確認

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。