推移的依存関係が主な問題だね。例えば、バージョン1.0.0のパッケージP1がバージョン^1.0.0のD1に依存しているとする。この「^」は範囲クエリを示していて、セマンティックバージョニングの詳細には触れないけど、D1を自動的にマイナーパッチや非破壊的な機能追加のために更新するのに役立つんだ。プロジェクト内では、P1が1.0.0に固定されているから問題なさそうに見える。でも、D1を使っているP2をインストールすると、新しいパッチバージョンのD1(1.0.1)がリリースされて、パッケージマネージャーが自動的に1.0.1にアップグレードしちゃう。これはP1とP2の作者が指定した^1.0.0に合致するから。これが驚きにつながることもある。JSのパッケージマネージャーはインストール中の変更を防ぐためにロックファイルを使うけど、追加や手動のバージョンアップグレードのためにロックファイルは変わるし、バージョン範囲が合えば新しいマイナー依存関係に解決される。これはバグ修正やセキュリティアップデートには望ましいことが多いけど、こういう攻撃の隙を作ることにもなる。質問に答えると、はい、JSエコシステムは動きが早くて、パッケージマネージャーが小さなライブラリを簡単に作れるようにしている。その結果、推移的依存関係としてたくさんの「小さな」ライブラリが存在することになる。左パッドのような簡単なケースなら、自分のコードでこれらのライブラリを書き換えることはできるけど、たくさんの小さな推移的依存関係を持つウェブサーバーやビルドツールを再構築することはできないよ。例えば、chalkライブラリは多くのCLIツールでカラー出力を表示するために使われている。