name: tests

on:
  push:
    branches: [master, v*]
  pull_request:
    branches: [master, v*]

jobs:
  node:
    name: Node.js
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x, 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 }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run docker compose
        run: docker compose up -d

      - name: Run node tests
        run: npm test

      - name: Run esbuild test
        run: npm run test:esbuild

  node-with-transformer:
    name: Node.js /w transformer
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        node-version: [18.x, 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 }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run docker compose
        run: docker compose up -d

      - name: Run node tests with transformer
        run: TEST_TRANSFORMER=1 npm test

  deno:
    name: Deno
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        deno-version: [1.x.x, 2.0.x]

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
          cache: 'npm'

      - name: Use Deno ${{ matrix.deno-version }}
        uses: denoland/setup-deno@v2
        with:
          deno-version: ${{ matrix.deno-version }}

      - name: Install dependencies
        run: npm ci

      - name: Run docker compose
        run: docker compose up -d

      - name: Build
        run: npm run build

      - name: Run deno tests
        run: npm run test:deno

  bun:
    name: Bun
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        bun-version: [1.1.26]

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Use Bun ${{ matrix.bun-version }}
        uses: oven-sh/setup-bun@v2
        with:
          bun-version: ${{ matrix.bun-version }}

      - name: Run docker compose
        run: docker compose up -d

      - name: Run bun tests
        run: npm run test:bun

  browser:
    name: Browser
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Install playwright
        run: npx playwright install chromium

      - name: Run browser tests
        run: npm run test:browser

  cloudflare-workers:
    name: Cloudflare Workers
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run docker compose
        run: docker compose up -d

      - name: Run cloudflare workers test
        run: npm run test:cloudflare-workers

  older-typescript-version:
    name: Older TypeScript version
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        typescript-version: [
            ^4.6, # 28.2.2022 https://devblogs.microsoft.com/typescript/announcing-typescript-4-6/
            ^4.7, # 24.5.2022 https://devblogs.microsoft.com/typescript/announcing-typescript-4-7/
            ^4.8, # 25.8.2022 https://devblogs.microsoft.com/typescript/announcing-typescript-4-8/
            ^4.9, # 15.11.2022 https://devblogs.microsoft.com/typescript/announcing-typescript-4-9/
            ^5.0, # 16.3.2023 https://devblogs.microsoft.com/typescript/announcing-typescript-5-0/
            ^5.2, # 24.8.2023 https://devblogs.microsoft.com/typescript/announcing-typescript-5-1/ https://devblogs.microsoft.com/typescript/announcing-typescript-5-2/
            ^5.3, # 20.11.2023 https://devblogs.microsoft.com/typescript/announcing-typescript-5-3/
            ^5.4, # 6.3.2024 https://devblogs.microsoft.com/typescript/announcing-typescript-5-4/
          ]

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 18.x
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run build with newer TypeScript
        run: npm run build

      - name: Install older TypeScript
        run: npm i -D typescript@${{ matrix.typescript-version }} tsd@${{ fromJson('{ "^4.6":"0.20.0", "^4.7":"0.22.0", "^4.8":"0.24.1", "^4.9":"0.27.0", "^5.0":"0.28.1", "^5.2":"0.29.0", "^5.3":"0.30.7", "^5.4":"0.31.2" }')[matrix.typescript-version] }}

      - name: Run tests with older TypeScript
        run: npm run test:typings && npm run test:node:build

  jsdocs:
    name: JSDocs
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 22.x
          cache: 'npm'

      - name: Use Deno
        uses: denoland/setup-deno@v2
        with:
          deno-version: 2.0.x

      - name: Install dependencies
        run: npm ci

      - name: Build
        run: npm run build

      - name: Type-check JSDocs code blocks
        run: npm run test:jsdocs