name: Markdown engine

on:
  push:
    paths:
      - 'src/**'
      - 'test/**'
      - 'doc/**'
      - 'script/**'
      - 'example/**'
      - 'jest.config.cjs'
      - 'tsconfig*.json'
      - 'eleventy.build.*'
      - 'webpack.config.ts'
      - 'webpack.markdown-test-worker.config.ts'
      - 'playwright.config.ts'
      - 'webpack.markdown.config.ts'
      - 'package.json'
      - 'package-lock.json'
      - '.github/workflows/markdown-engine.yml'
  pull_request:
    paths:
      - 'src/**'
      - 'test/**'
      - 'doc/**'
      - 'script/**'
      - 'example/**'
      - 'jest.config.cjs'
      - 'tsconfig*.json'
      - 'eleventy.build.*'
      - 'webpack.config.ts'
      - 'webpack.markdown-test-worker.config.ts'
      - 'playwright.config.ts'
      - 'webpack.markdown.config.ts'
      - 'package.json'
      - 'package-lock.json'
      - '.github/workflows/markdown-engine.yml'
  workflow_dispatch:

jobs:
  compatibility:
    runs-on: ubuntu-24.04
    timeout-minutes: 90
    strategy:
      fail-fast: false
      matrix:
        browser: [chromium, firefox, webkit]
    env:
      CI: 'true'
      MARKDOWN_BROWSER_PROJECTS: all
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - name: Install dependencies
        timeout-minutes: 10
        run: npm ci --ignore-scripts
      - name: Install selected browser engine
        timeout-minutes: 10
        run: npx playwright install --with-deps ${{ matrix.browser }}
      - name: Check types and run application unit tests
        run: npm test
      - name: Build browser test bundles and application
        run: npm run build:test-browser
      - name: Measure optional chunks
        run: npm run measure:markdown
      - name: Run browser compatibility tests
        timeout-minutes: 35
        run: npx playwright test --project=${{ matrix.browser }} --workers=1 --retries=0 --global-timeout=1800000
      - name: Upload browser diagnostics
        if: ${{ !cancelled() }}
        uses: actions/upload-artifact@v4
        with:
          name: markdown-playwright-diagnostics-${{ matrix.browser }}
          path: |
            playwright-report
            test/result/playwright
          if-no-files-found: ignore
