# This workflow will do an install of node dependencies, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions

name: Node.js CI

on:
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]
  workflow_call:

jobs:
  build:

    runs-on: ubuntu-latest

    strategy:
      matrix:
        # Testing multiple Node versions makes CI take forever, and basically
        # never actually finds anything we care about. Testing one is enough.
        #
        # This number should be left at the oldest Node LTS version capable of
        # running Node without errors (it doesn't matter if it's unsupported).
        # Please freely bump this version (and the check in `pokemon-showdown`
        # and `server/index.ts`) if you want to use features from newer versions;
        # this is purely for our own reference, not to constrain programmers.
        node-version: ['18.x']

    steps:
    - uses: actions/checkout@v6
      with:
        fetch-depth: 100 # assumes PR/push to master is no larger than 100 commits. Other solutions are needlessly complex.

    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v6
      with:
        node-version: ${{ matrix.node-version }}
        cache: 'npm'

    - run: npm ci

    - name: Determine which files to lint (if pull request)
      if: ${{ github.event_name == 'pull_request' }}
      id: changed-files
      uses: tj-actions/changed-files@v47
      with:
        files: |
          ./config/*.ts
          ./data/**/*.ts
          ./lib/*.ts
          ./server/**/*.ts
          ./server/**/*.tsx
          ./sim/**/*.ts
          ./tools/set-import/*.ts
        files_ignore: |
          ./logs/
          ./node_modules/
          ./dist/
          ./data/**/learnsets.ts
          ./tools/set-import/importer.js
          ./tools/set-import/sets
          ./tools/modlog/converter.js
          ./server/global-variables.d.ts

    - name: Determine whether test/sim or test/random-battles need to run (if pull request)
      if: ${{ github.event_name == 'pull_request' }}
      id: changed-directories
      uses: tj-actions/changed-files@v47
      with:
        files: |
          config/formats.ts
          data/**
          sim/**

    - name: Run selective lint & necessary tests (if pull request)
      if: ${{ github.event_name == 'pull_request' }}
      run: npm run full-test-ci
      env:
        CI: true
        FILES: ${{ steps.changed-files.outputs.all_changed_and_modified_files }}
        SKIPSIMTESTS: ${{ steps.changed-directories.outputs.all_changed_and_modified_files == '' }}

    - name: Run full lint & test (if push to master)
      run: npm run full-test
      if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' }}
      env:
        CI: true
