Skip to content

chore(deps): bump the npm-non-major group across 1 directory with 9 updates #753

chore(deps): bump the npm-non-major group across 1 directory with 9 updates

chore(deps): bump the npm-non-major group across 1 directory with 9 updates #753

Workflow file for this run

name: Lint & Format Checks
on:
workflow_call:
push:
paths:
- "*.md"
- "docs/**"
- "app/**"
- "bootstrap/**"
- "config/**"
- "database/**"
- "lang/**"
- "resources/**"
- "routes/**"
- "tests/**"
- "composer.json"
- "composer.lock"
- "package.json"
- "package-lock.json"
- ".env.example"
- "vite.config.js"
- "tailwind.config.js"
- "postcss.config.js"
- "scripts/**"
- ".github/workflows/lint-checks.yml"
- ".github/workflows/pr-tests.yml"
- ".github/workflows/release-image.yml"
pull_request:
types: [opened, synchronize, reopened, ready_for_review]
paths:
- "*.md"
- "docs/**"
- "app/**"
- "bootstrap/**"
- "config/**"
- "database/**"
- "lang/**"
- "resources/**"
- "routes/**"
- "tests/**"
- "composer.json"
- "composer.lock"
- "package.json"
- "package-lock.json"
- ".env.example"
- "vite.config.js"
- "tailwind.config.js"
- "postcss.config.js"
- "scripts/**"
- ".github/workflows/lint-checks.yml"
- ".github/workflows/pr-tests.yml"
- ".github/workflows/release-image.yml"
permissions:
contents: read
concurrency:
group: lint-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
env:
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true"
jobs:
php-syntax:
name: PHP Syntax Check
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.4"
- name: Lint PHP files
run: |
find app bootstrap config database routes tests -type f -name '*.php' -print0 | xargs -0 -r -n1 -P4 php -l
pint-format:
name: Laravel Pint (format check)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Set up PHP
uses: shivammathur/setup-php@v2
with:
php-version: "8.4"
tools: composer:v2
- name: Get Composer cache directory
id: composer-cache
run: echo "dir=$(composer config cache-files-dir)" >> "$GITHUB_OUTPUT"
- name: Cache Composer downloads
uses: actions/cache@v5
with:
path: ${{ steps.composer-cache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('composer.lock') }}
restore-keys: |
${{ runner.os }}-composer-
- name: Install PHP dependencies (no scripts)
run: composer install --no-interaction --no-progress --prefer-dist --no-scripts
- name: Verify PHP platform requirements
run: composer check-platform-reqs
- name: Run Pint in test mode
run: |
./vendor/bin/pint --test
- name: Prepare Laravel runtime directories
run: |
mkdir -p bootstrap/cache
mkdir -p storage/framework/cache/data
mkdir -p storage/framework/sessions
mkdir -p storage/framework/views
mkdir -p storage/framework/testing
mkdir -p storage/logs
chmod -R u+rwX bootstrap/cache storage/framework storage/logs
- name: Verify PHP translation key parity
run: php artisan test --testsuite=Unit --filter=LocalizationCatalogParityTest
frontend-tests:
name: Frontend Unit Tests (Vitest)
runs-on: ubuntu-latest
timeout-minutes: 10
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Set up Node.js
uses: actions/setup-node@v6
with:
node-version: "24"
cache: npm
cache-dependency-path: package-lock.json
- name: Verify React major parity
run: npm run check:react-parity
- name: Install frontend dependencies
run: npm ci
- name: Verify frontend i18n key parity
run: npm run check:i18n
- name: Run Vitest suite
run: npx vitest run
docs-link-check:
name: Docs Link Check
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Check out repository
uses: actions/checkout@v6
- name: Validate local markdown links
run: |
python3 - <<'PY'
import re
import sys
from pathlib import Path
root = Path(".").resolve()
markdown_files = sorted(set(root.glob("*.md")) | set(root.glob("docs/**/*.md")))
pattern = re.compile(r"\[[^\]]+\]\(([^)]+)\)")
broken = []
for doc in markdown_files:
text = doc.read_text(encoding="utf-8")
for match in pattern.finditer(text):
raw_link = match.group(1).strip()
if raw_link.startswith("<") and raw_link.endswith(">"):
raw_link = raw_link[1:-1].strip()
if not raw_link:
continue
if re.match(r"^[a-zA-Z][a-zA-Z0-9+.-]*:", raw_link):
continue
if raw_link.startswith("#") or raw_link.startswith("/"):
continue
link_path = raw_link.split("#", 1)[0].split("?", 1)[0].strip()
if not link_path:
continue
target = (doc.parent / link_path).resolve()
if not target.exists():
broken.append((doc.relative_to(root), raw_link, doc.parent / link_path))
if broken:
print("Broken local markdown links:")
for source, raw_link, missing_target in broken:
print(f"- {source} -> {raw_link} (missing: {missing_target})")
sys.exit(1)
print(f"Validated {len(markdown_files)} markdown files. No broken local links.")
PY