name: Lint

on:
  pull_request:
    types: [opened, synchronize]
    branches-ignore:
      - 'l10n_master'
      - 'cf-pages'
    paths-ignore:
      - '.github/workflows/**'
  push:
    branches:
      - 'main'
      - 'rc'
      - 'hotfix-rc-*'
    paths-ignore:
      - '.github/workflows/**'
  workflow_dispatch:
    inputs: {}

defaults:
  run:
    shell: bash

permissions:
  contents: read

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-22.04
    steps:
      - name: Checkout repo
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Lint filenames (no capital characters)
        run: |
          find . -type f,d -name "*[[:upper:]]*" \
            ! -path "./node_modules/*" \
            ! -path "./coverage/*" \
            ! -path "*/dist/*" \
            ! -path "*/build/*" \
            ! -path "*/target/*" \
            ! -path "./.git/*" \
            ! -path "*/.DS_Store" \
            ! -path "*/*locales/*" \
            ! -path "./.github/*" \
            ! -path "*/README.md" \
            ! -path "*/Cargo.toml" \
            ! -path "*/Cargo.lock" \
            ! -path "./apps/desktop/macos/*" \
            ! -path "*/CLAUDE.md" \
            > tmp.txt
          diff <(sort .github/whitelist-capital-letters.txt) <(sort tmp.txt)

      - name: Get Node Version
        id: retrieve-node-version
        run: |
          NODE_NVMRC=$(cat .nvmrc)
          NODE_VERSION=${NODE_NVMRC/v/''}
          echo "node_version=$NODE_VERSION" >> $GITHUB_OUTPUT

      - name: Set up Node
        uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
        with:
          cache: 'npm'
          cache-dependency-path: '**/package-lock.json'
          node-version: ${{ steps.retrieve-node-version.outputs.node_version }}

      - name: Install Node dependencies
        run: npm ci

      - name: Lint unowned dependencies
        run: npm run lint:dep-ownership

      - name: Run linter
        run: npm run lint

  rust:
    name: Run Rust lint on ${{ matrix.os }}
    runs-on: ${{ matrix.os || 'ubuntu-24.04' }}

    strategy:
      matrix:
        os:
          - ubuntu-24.04
          - macos-14
          - windows-2022

    steps:
      - name: Checkout repo
        uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      - name: Check Rust version
        run: rustup --version

      - name: Run cargo fmt
        working-directory: ./apps/desktop/desktop_native
        run: cargo fmt --check

      - name: Run Clippy
        working-directory: ./apps/desktop/desktop_native
        run: cargo clippy --all-features --tests
        env:
          RUSTFLAGS: "-D warnings"

      - name: Install cargo-sort
        run: cargo install cargo-sort --locked --git https://github.com/DevinR528/cargo-sort.git --rev f5047967021cbb1f822faddc355b3b07674305a1

      - name: Cargo sort
        working-directory: ./apps/desktop/desktop_native
        run: cargo sort --workspace --check
