Revisa qué módulos de Node.js no estás usando con depcheck y Github Actions

¡Hola developer 👋🏻! Estas semanas he tenido que experimentar con varios módulos de Node.js y, después de varias pruebas, ya no tenía claro cuáles estaba usando y cuáles no 🥲 por lo que necesitaba saber qué debía de eliminar de mi proyecto para evitar tener más dependencias de las necesarias y evitar tanto inflar el tamaño de mi proyecto como exponerlo a vulnerabilidades innecesarias. Así que en este artículo quiero compartir contigo cómo usar el módulo depcheck, con más de 1 millón de descargas semanales 😱, el cual te puede ayudar en esta tarea. Pero no solo eso, sino que además te voy a mostrar cómo puedes crear un flujo de GitHub Actions que te permita ejecutar este periódicamente, generar PRs que eliminen las dependencias que no estás usando y así asegurarte de que el proyecto sólo tiene lo que necesita.

Cómo funciona el módulo depcheck

El funcionamiento de este módulo es súper sencillo. Lo único que tienes que hacer es ejecutar este comando:

npx depcheck -y

Y te dará un listado con todas aquellas dependencias que cree que están en desuso:

Con esto puedes asegurarte en local si tienes que eliminar algún módulo de los reportados.

Cómo automatizar el proceso con GitHub Actions

Sin embargo llevar a cabo esta tarea de forma manual puede suponer que a veces se te olvide 😇. Es por ello que he creado un flujo de Github Actions que no solo me permite detectar qué dependencias están potencialmente en desuso sino que me genere Pull Requests para poder eliminarlas fácilmente y que se integre con mi CI:

name: 🔎📦 Check for unused dependencies
on:
  push:
    branches:
      - main
  schedule:
    - cron: '0 0 * * 0'
  workflow_dispatch:
permissions:
  contents: write
  pull-requests: write
jobs:
  depcheck:
    runs-on: ubuntu-latest
    steps:
    - name: Checkout repository
      uses: actions/checkout@v4
    - name: Set up Node.js
      uses: actions/setup-node@v4
      with:
        node-version: '22'
    - name: Install dependencies
      run: npm install
    - name: Run depcheck
      continue-on-error: true
      id: depcheck
      run: |        
        npx depcheck -y --json > unused-deps.json
    - name: Add GitHub Action Summary     
      run: |
        echo "## Unused Dependencies" >> $GITHUB_STEP_SUMMARY
        echo "The following dependencies are unused:" >> $GITHUB_STEP_SUMMARY
        for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
          echo "- $dep" >> $GITHUB_STEP_SUMMARY
        done        
    - name: Create branches and PRs for unused dependencies
      run: |
        # Config git client
        git config user.name "GitHub Actions Bot"
        git config user.email "<>"
        git config pull.rebase true
        git config --global merge.ours.driver true
        echo "*.json merge=ours" >> .git/info/attributes
        for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
          echo "Processing dependency: $dep"          
          branch_name="remove-$dep"
          echo "Branch name: $branch_name"
          pr_exists=$(gh pr list --search "head:$branch_name" --json number -q '.[].number')
          echo "PR exists: $pr_exists"
          if [ -z "$pr_exists" ]; then
            git checkout -b "$branch_name"           
            npm uninstall $dep
            git add package.json package-lock.json
            git commit -m "Remove unused dependency: $dep"
            git push origin "$branch_name"
            gh label create "unused" --color "ff0000" || true
            gh label create "dependencies" --color "ff0000" || true
            gh pr create --title "Remove unused dependency: $dep" --body "This PR removes the unused dependency: $dep" --label dependencies --label unused
          else
            echo "PR already exists for $dep, skipping."
          fi
        done
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    - name: If failed delete the branches
      if: failure()
      run: |
        for dep in $(jq -r '.dependencies[]' < unused-deps.json); do
          branch_name="remove-$dep"
          echo "Deleting branch: $branch_name"
          git push origin --delete "$branch_name" || true
        done

El resultado será algo parecido a esto:

Si quieres saber más sobre Github Actions puedes echar un vistazo a mi serie en mi canal de YouTube:

¡Saludos 👋🏻!

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.