name: Bedrock Node.js CI

on: [push]

jobs:
  lint:
    runs-on: ubuntu-latest
    timeout-minutes: 10
    strategy:
      matrix:
        node-version: [22.x]
    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm install
    - name: Run eslint
      run: npm run lint
  test-node:
    needs: [lint]
    runs-on: ubuntu-latest
    timeout-minutes: 10
    services:
      mongodb:
        image: mongo:8
        ports:
          - 27017:27017
    strategy:
      matrix:
        node-version: [20.x, 22.x]
    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
    - run: |
        npm install
        cd test
        npm install
    - name: Run test with Node.js ${{ matrix.node-version }}
      run: |
        cd test
        npm test
  coverage:
    needs: [test-node]
    runs-on: ubuntu-latest
    timeout-minutes: 10
    services:
      mongodb:
        image: mongo:8
        ports:
          - 27017:27017
    strategy:
      matrix:
        node-version: [22.x]
    steps:
    - uses: actions/checkout@v4
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v4
      with:
        node-version: ${{ matrix.node-version }}
    - run: |
        npm install
        cd test
        npm install
    - name: Generate coverage report
      run: |
        cd test
        npm run coverage-ci
    - name: Upload coverage to Codecov
      uses: codecov/codecov-action@v4
      with:
        file: ./test/coverage/lcov.info
        fail_ci_if_error: true
        token: ${{ secrets.CODECOV_TOKEN }}
