Files
actions/eslint-fix/action.yml

185 lines
5.6 KiB
YAML

# yaml-language-server: $schema=https://json.schemastore.org/github-action.json
# permissions:
# - contents: write # Required for pushing fixes back to repository
---
name: ESLint Fix
description: Fixes ESLint violations in a project.
author: 'Ismo Vuorinen'
branding:
icon: 'code'
color: 'blue'
inputs:
token:
description: 'GitHub token for authentication'
required: false
default: ${{ github.token }}
username:
description: 'GitHub username for commits'
required: false
default: 'github-actions'
email:
description: 'GitHub email for commits'
required: false
default: 'github-actions@github.com'
max-retries:
description: 'Maximum number of retry attempts for npm install operations'
required: false
default: '3'
outputs:
files_changed:
description: 'Number of files changed by ESLint'
value: ${{ steps.lint.outputs.files_changed }}
lint_status:
description: 'Linting status (success/failure)'
value: ${{ steps.lint.outputs.status }}
errors_fixed:
description: 'Number of errors fixed'
value: ${{ steps.lint.outputs.errors_fixed }}
runs:
using: composite
steps:
- name: Validate Inputs
id: validate
uses: ivuorinen/actions/validate-inputs@0fa9a68f07a1260b321f814202658a6089a43d42
with:
action-type: 'eslint-fix'
token: ${{ inputs.token }}
email: ${{ inputs.email }}
username: ${{ inputs.username }}
max-retries: ${{ inputs.max-retries }}
- name: Checkout Repository
uses: actions/checkout@71cf2267d89c5cb81562390fa70a37fa40b1305e # v6-beta
with:
token: ${{ inputs.token }}
- name: Set Git Config
uses: ivuorinen/actions/set-git-config@0fa9a68f07a1260b321f814202658a6089a43d42
with:
token: ${{ inputs.token }}
username: ${{ inputs.username }}
email: ${{ inputs.email }}
- name: Node Setup
id: node-setup
uses: ivuorinen/actions/node-setup@0fa9a68f07a1260b321f814202658a6089a43d42
- name: Cache Node Dependencies
id: cache
uses: ivuorinen/actions/common-cache@0fa9a68f07a1260b321f814202658a6089a43d42
with:
type: 'npm'
paths: 'node_modules'
key-files: 'package-lock.json,yarn.lock,pnpm-lock.yaml,bun.lockb'
key-prefix: 'eslint-fix-${{ steps.node-setup.outputs.package-manager }}'
- name: Install Dependencies
if: steps.cache.outputs.cache-hit != 'true'
shell: bash
env:
PACKAGE_MANAGER: ${{ steps.node-setup.outputs.package-manager }}
MAX_RETRIES: ${{ inputs.max-retries }}
run: |
set -euo pipefail
echo "Installing dependencies using $PACKAGE_MANAGER..."
for attempt in $(seq 1 "$MAX_RETRIES"); do
echo "Attempt $attempt of $MAX_RETRIES"
case "$PACKAGE_MANAGER" in
"pnpm")
if pnpm install --frozen-lockfile; then
echo "✅ Dependencies installed successfully with pnpm"
exit 0
fi
;;
"yarn")
if [ -f ".yarnrc.yml" ]; then
if yarn install --immutable; then
echo "✅ Dependencies installed successfully with Yarn Berry"
exit 0
fi
else
if yarn install --frozen-lockfile; then
echo "✅ Dependencies installed successfully with Yarn Classic"
exit 0
fi
fi
;;
"bun")
if bun install --frozen-lockfile; then
echo "✅ Dependencies installed successfully with Bun"
exit 0
fi
;;
"npm"|*)
if npm ci; then
echo "✅ Dependencies installed successfully with npm"
exit 0
fi
;;
esac
if [ $attempt -lt "$MAX_RETRIES" ]; then
echo "❌ Installation failed, retrying in 5 seconds..."
sleep 5
fi
done
echo "::error::Failed to install dependencies after $MAX_RETRIES attempts"
exit 1
- name: Run ESLint Fix
id: lint
shell: bash
env:
PACKAGE_MANAGER: ${{ steps.node-setup.outputs.package-manager }}
run: |
set -euo pipefail
echo "Running ESLint fix with $PACKAGE_MANAGER..."
# Count files before fix
files_before=$(git status --porcelain | wc -l || echo "0")
# Run ESLint fix based on package manager
case "$PACKAGE_MANAGER" in
"pnpm")
pnpm exec eslint . --fix || true
;;
"yarn")
yarn eslint . --fix || true
;;
"bun")
bunx eslint . --fix || true
;;
"npm"|*)
npx eslint . --fix || true
;;
esac
# Count files after fix
files_after=$(git status --porcelain | wc -l || echo "0")
files_changed=$((files_after - files_before))
# Get number of staged changes
errors_fixed=$(git diff --cached --numstat | wc -l || echo "0")
echo "files_changed=$files_changed" >> $GITHUB_OUTPUT
echo "errors_fixed=$errors_fixed" >> $GITHUB_OUTPUT
echo "status=success" >> $GITHUB_OUTPUT
echo "✅ ESLint fix completed. Files changed: $files_changed, Errors fixed: $errors_fixed"
- name: Push Fixes
if: always()
uses: stefanzweifel/git-auto-commit-action@28e16e81777b558cc906c8750092100bbb34c5e3 # v7.0.0
with:
commit_message: 'style: autofix ESLint violations'
add_options: '-u'