使用していないSvelteファイルを見つけて削除する方法

# はじめに
僕は普段、Svelte, SvelteKitを使って開発をしています。開発規模は大きくなっていくとどのSvelteファイルが使っていないのか見つけるのは困難です。不要なファイルなら削除すべきだと思うので今回はシェルスクリプトを実行するだけで自動的に使用していないSvelteファイルを削除してくれる方法を紹介します。

# 動作確認環境
- macOS Sonoma 14.5

# シェルスクリプトを作成
自分の環境で使用しているシェルスクリプトなので除外するファイル等は各自書き換えてつかってください。
```shell:find_unused_svelte_files.sh
#!/bin/bash

# RED: 赤色の出力コード（文字列を赤色にします）
# GREEN: 緑色の出力コード（文字列を緑色にします）
# RESET_COLOR: カラーリセットコード（文字列の色をデフォルトに戻します）
RED='\033[0;31m'
GREEN='\033[0;32m'
RESET_COLOR='\033[0m'

# 現在のスクリプトのディレクトリを取得
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )"

# 除外リストを作成(node_modulesフォルダを除外)
exclude_dirs=(
  -path './node_modules' -prune -o
)

# 除外リストを使用して、除外すべきファイルを除くすべての .svelte ファイルのリストを取得
svelte_files=$(find . "${exclude_dirs[@]}" -type f -path "*/src/*" -name "*.svelte" ! -name "*.stories.svelte" ! -name "*.test.svelte" -print)

# 未使用のファイルを保持する配列
declare -a unused_files

printf "${GREEN}.svelte ファイルを検索しています${RESET_COLOR}\n"
printf "${GREEN}.${RESET_COLOR} は .svelte が別のファイルでインポートされていることを意味します\n"
printf "${RED}x${RESET_COLOR} は .svelte がインポートされず、削除する必要がある可能性があることを意味します\n"

# 各 svelte ファイルをループします
for svelte_file in ${svelte_files[@]}
do
  # ファイル名を抽出
  filename=$(basename -- "$svelte_file")

  # '+'で始まるファイルをスキップ
  if [[ "$filename" == +* ]]
  then
    printf "${GREEN}.${RESET_COLOR}"
    continue
  fi

  # すべてのファイルでファイル名を検索
  found=$(grep -wrl --exclude-dir=node_modules "$filename" .)

  # 何も見つからなかった場合、ファイルは未使用です
  if [[ -z $found ]]
  then
    printf "${RED}x${RESET_COLOR}"
    unused_files+=("$svelte_file")
  else
    printf "${GREEN}.${RESET_COLOR}"
  fi
done

# 進行ドットの後に改行を出力
printf "\n\n"

# 未使用のファイルを出力
for file in "${unused_files[@]}"
do
  printf "${RED}未使用のSvelteファイル: $file${RESET_COLOR}\n"
done

# 未使用のコンポーネントが見つからない場合、メッセージを出力して終了
if [ ${#unused_files[@]} -eq 0 ]; then
  printf "${GREEN}未使用のコンポーネントは見つかりませんでした。${RESET_COLOR}\n"
  exit 0
fi

# ユーザーが確認した場合、ファイルを削除する
if [ ${#unused_files[@]} -gt 0 ]; then
  printf "${GREEN}これらの${#unused_files[@]}ファイルを削除しますか？ (Y/n) ${RESET_COLOR}"
  read answer

  if [ "$answer" != "${answer#[Yy]}" ] ;then
    for file in "${unused_files[@]}"
    do
      rm "$file"
      if [ $? -ne 0 ]; then
        printf "${RED}削除に失敗しました: $file${RESET_COLOR}\n"
      else
        printf "${RED}削除しました: $file${RESET_COLOR}\n"
      fi
    done
  elif [ "$answer" != "${answer#[Nn]}" ]; then
    printf "${GREEN}削除しませんでした。${RESET_COLOR}\n"
  else
    printf "${RED}無効な入力です。処理を中止しました。${RESET_COLOR}\n"
  fi
fi
```

# 実行
以下のコマンドでスクリプトを実行します。
```shell
$ sh ./find_unused_svelte_files.sh
.svelte ファイルを検索しています
. は .svelte が別のファイルでインポートされていることを意味します
x は .svelte がインポートされず、削除する必要がある可能性があることを意味します
...................................................................x..........................................................................................................................................................................................................................................................................................................................................................................................................................................................

未使用のSvelteファイル: ./src/lib/components/Test.svelte
これらの1ファイルを削除しますか？ (Y/n) 
削除しました: ./src/lib/components/Test.svelte
```

使用していない`Test.svelte`を見つけて削除することができました　:tada: 

# 最後に
このシェルスクリプトを使えば、プロジェクトが大規模になっても未使用のSvelteファイルを簡単に見つけ出して削除することができます。これにより、プロジェクトのクリーンアップが容易になり、保守性が向上します。ぜひ活用してみてください。

# 謝辞
以下の記事に触発されて作成しましたので感謝を表明します。

https://node-jz.medium.com/instantly-find-and-remove-svelte-component-orphans-9b2838ea2d99