name: ci

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ${{ matrix.os }}
    name: Java ${{ matrix.java }} ${{ matrix.os }}
    strategy:
      matrix:
        java: [17]
        os: [macos-latest, ubuntu-latest, windows-latest]

    steps:
      - uses: actions/checkout@v3
      - uses: gradle/wrapper-validation-action@v1

      - name: Set up JDK ${{ matrix.java }}
        uses: actions/setup-java@v3
        with:
          java-version: ${{ matrix.java }}
          distribution: 'corretto'

      - name: clean and build
        run: ./gradlew clean build -Plog-tests

  lint-typescript:
    runs-on: ubuntu-latest
    name: TypeScript Lint
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: "yarn"
      - name: Install dependencies
        run: yarn
      - name: Run eslint
        run: yarn lint --concurrency=3

  test-typescript:
    runs-on: smithy-typescript_ubuntu-latest_8-core
    name: TypeScript Test
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 14
          cache: "yarn"
      - uses: gradle/wrapper-validation-action@v1
      - name: Set up JDK 17
        uses: actions/setup-java@v3
        with:
          java-version: '17'
          distribution: 'corretto'
      - name: Install dependencies
        run: yarn
      - name: Build packages
        run: yarn build
      - name: Run unit tests
        run: yarn test
      - name: Run integration tests
        run: |
          yarn config set enableImmutableInstalls false
          yarn test:integration

  ensure-typescript-formatted:
    runs-on: ubuntu-latest
    name: Ensure TypeScript is formatted
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: "yarn"
      - name: Install dependencies
        run: yarn
      - name: Run the code formatter
        run: yarn format
      # This checks the output of git diff. If it's not empty (i.e there were
      # changes) it'll return a non-zero error code.
      - name: Ensure there are no changes from running the formatter
        run: |
          git diff
          test -z "$(git diff)"

  ensure-typescript-packages-have-changesets:
    runs-on: ubuntu-latest
    name: Ensure TypeScript packages have changesets
    steps:
      - uses: actions/checkout@v3
        # Include full git history needed for `yarn changeset status`
        with:
          ref: ${{github.event.pull_request.head.sha}}
          fetch-depth: 0
      - uses: actions/setup-node@v3
        with:
          node-version: 16
          cache: "yarn"
      - name: Install
        run: yarn
      - name: Ensure changesets exist for each changed package
        run: yarn changeset status --since=origin/main
