name: CI
on:
  pull_request:

# Cancel in-progress runs for pull requests when developers push new changes
concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
jobs:
  test-terraform:
    name: Validate Terraform output
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Detect changed files
        uses: dorny/paths-filter@fbd0ab8f3e69293af611ebaee6363fc25e6d187d # v4.0.1
        id: filter
        with:
          list-files: shell
          filters: |
            shared:
              - 'test/**'
              - 'package.json'
              - 'bun.lock'
              - 'bunfig.toml'
              - 'tsconfig.json'
              - '.github/workflows/ci.yaml'
              - 'scripts/ts_test_auto.sh'
              - 'scripts/terraform_test_all.sh'
              - 'scripts/terraform_validate.sh'
              - 'scripts/shellcheck_validate.sh'
            modules:
              - 'registry/**/modules/**'
            shell:
              - '**/*.sh'
            all:
              - '**'
      - name: Set up Terraform
        uses: coder/coder/.github/actions/setup-tf@34584e909bbe6f501fb2cbdc994325b4d3f9e2ef # v2.32.0
      - name: Set up Bun
        uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
        with:
          # We're using the latest version of Bun for now, but it might be worth
          # reconsidering. They've pushed breaking changes in patch releases
          # that have broken our CI.
          # Our PR where issues started to pop up: https://github.com/coder/modules/pull/383
          # The Bun PR that broke things: https://github.com/oven-sh/bun/pull/16067
          bun-version: latest
      - name: Install dependencies
        run: bun install
      - name: Run TypeScript tests
        env:
          ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_files }}
          SHARED_CHANGED: ${{ steps.filter.outputs.shared }}
          MODULE_CHANGED_FILES: ${{ steps.filter.outputs.modules_files }}
        run: bun tstest
      - name: Run Terraform tests
        env:
          ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_files }}
          SHARED_CHANGED: ${{ steps.filter.outputs.shared }}
          MODULE_CHANGED_FILES: ${{ steps.filter.outputs.modules_files }}
        run: bun tftest
      - name: Run Terraform Validate
        env:
          ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_files }}
          SHARED_CHANGED: ${{ steps.filter.outputs.shared }}
          MODULE_CHANGED_FILES: ${{ steps.filter.outputs.modules_files }}
        run: bun terraform-validate
      - name: Run ShellCheck
        env:
          ALL_CHANGED_FILES: ${{ steps.filter.outputs.all_files }}
          SHARED_CHANGED: ${{ steps.filter.outputs.shared }}
          SHELL_CHANGED_FILES: ${{ steps.filter.outputs.shell_files }}
        run: bun shellcheck
      - name: Validate set -u ordering
        run: ./scripts/validate_set_u_order.sh
  validate-style:
    name: Check for typos and unformatted code
    runs-on: ubuntu-latest
    steps:
      - name: Check out code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Install Bun
        uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
        with:
          bun-version: latest
      # Need Terraform for its formatter
      - name: Install Terraform
        uses: coder/coder/.github/actions/setup-tf@34584e909bbe6f501fb2cbdc994325b4d3f9e2ef # v2.32.0
      - name: Install dependencies
        run: bun install
      - name: Validate formatting
        run: bun fmt:ci
      - name: Check for typos
        uses: crate-ci/typos@cf5f1c29a8ac336af8568821ec41919923b05a83 # v1.45.1
        with:
          config: .github/typos.toml
  validate-readme-files:
    name: Validate README files
    runs-on: ubuntu-latest
    # We want to do some basic README checks first before we try analyzing the
    # contents
    needs: validate-style
    steps:
      - name: Check out code
        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
      - name: Set up Go
        uses: actions/setup-go@4a3601121dd01d1626a1e23e37211e3254c1c06c # v6
        with:
          go-version: "1.24.0"
      - name: Validate contributors
        run: go build ./cmd/readmevalidation && ./readmevalidation
      - name: Remove build file artifact
        run: rm ./readmevalidation
