name: ci
on:
  push:
    branches:
      - master
  pull_request:
    branches:
      - '**'

jobs:

  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
      with:
        node-version: lts/*
    - uses: ipfs/aegir/actions/cache-node-modules@master

  check:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/setup-node@v3
      with:
        node-version: lts/*
    - uses: ipfs/aegir/actions/cache-node-modules@master
    - run: npm run --if-present lint
    - run: npm run --if-present dep-check
    - run: npm run --if-present doc-check

  test-node:
    needs: build
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest, ubuntu-latest, macos-latest]
        node: [lts/*]
      fail-fast: true
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node }}
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:node
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: node

  test-chrome:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:chrome
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: chrome

  test-chrome-webworker:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:chrome-webworker
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: chrome-webworker

  test-firefox:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:firefox
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: firefox

  test-firefox-webworker:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:firefox-webworker
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: firefox-webworker

  test-webkit:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npx playwright install-deps
      - run: npm run --if-present test:webkit
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: webkit

  test-electron-main:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npx xvfb-maybe npm run --if-present test:electron-main
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: electron-main

  test-electron-renderer:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npx xvfb-maybe npm run --if-present test:electron-renderer
      - uses: codecov/codecov-action@f32b3a3741e1053eb607407145bc9619351dc93b # v2.1.0
        with:
          directory: ./.nyc_output
          flags: electron-renderer

  test-interop:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run test:interop -- --bail

  test-examples:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - run: npm run --if-present test:example

  multidim-interop:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - name: Build images
        run: (cd interop && make)
      - name: Save package-lock.json as artifact
        uses: actions/upload-artifact@v2
        with:
          name: package locks
          path: |
            package-lock.json
            interop/package-lock.json
      - uses: libp2p/test-plans/.github/actions/run-interop-ping-test@master
        with:
          test-filter: js-libp2p-head
          extra-versions: ${{ github.workspace }}/interop/node-version.json ${{ github.workspace }}/interop/chromium-version.json ${{ github.workspace }}/interop/firefox-version.json
          s3-cache-bucket: ${{ vars.S3_LIBP2P_BUILD_CACHE_BUCKET_NAME }}
          s3-access-key-id: ${{ vars.S3_LIBP2P_BUILD_CACHE_AWS_ACCESS_KEY_ID }}
          s3-secret-access-key: ${{ secrets.S3_LIBP2P_BUILD_CACHE_AWS_SECRET_ACCESS_KEY }}

  release:
    runs-on: ubuntu-latest
    needs: [
      test-node,
      test-chrome,
      test-chrome-webworker,
      test-firefox,
      test-firefox-webworker,
      test-electron-main,
      test-electron-renderer,
      test-interop,
      test-examples,
      multidim-interop
    ]
    if: github.event_name == 'push' && github.ref == 'refs/heads/master'
    steps:
      - uses: GoogleCloudPlatform/release-please-action@v2
        id: release
        with:
          token: ${{ secrets.GITHUB_TOKEN }}
          command: manifest
          release-type: node
          manifest-file: .release-please-manifest.json
          config-file: .release-please.json
          changelog-types: |
            [
              { "type": "feat", "section": "Features", "hidden": false },
              { "type": "fix", "section": "Bug Fixes", "hidden": false },
              { "type": "chore", "section": "Trivial Changes", "hidden": false },
              { "type": "docs", "section": "Documentation", "hidden": false },
              { "type": "deps", "section": "Dependencies", "hidden": false }
            ]
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v3
        with:
          node-version: lts/*
          registry-url: 'https://registry.npmjs.org'
      - uses: ipfs/aegir/actions/cache-node-modules@master
      - uses: ipfs/aegir/actions/docker-login@master
        with:
          docker-token: ${{ secrets.DOCKER_TOKEN }}
          docker-username: ${{ secrets.DOCKER_USERNAME }}
      - if: ${{ steps.release.outputs.releases_created }}
        name: Run release version
        run: |
          git update-index --assume-unchanged packages/libp2p/src/version.ts
          npm run --if-present release
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
      - if: ${{ !steps.release.outputs.releases_created }}
        name: Run release rc
        run: |
            git update-index --assume-unchanged packages/libp2p/src/version.ts
            npm run --if-present release:rc
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
