# This is a basic workflow to help you get started with Actions

name: CI

# Controls when the action will run. 
on:
  # Triggers the workflow on push or pull request events but only for the master branch
  push:
    branches: [ master ]
  pull_request:
    branches: [ master ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# https://stackoverflow.com/a/72408109/3443137
concurrency:
  group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
  cancel-in-progress: true

# A workflow run is made up of one or more jobs that can run sequentially or in parallel
jobs:
  # This workflow contains a single job called "build"
  base:
    # The type of runner that the job will run on
    runs-on: ubuntu-22.04

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v6
      - name: Setup Node.js environment
        uses: actions/setup-node@v4.4.0
        with:
          node-version-file: ".nvmrc"

      # https://docs.github.com/en/free-pro-team@latest/actions/guides/caching-dependencies-to-speed-up-workflows
      - name: Reuse npm cache folder
        uses: actions/cache@v5
        env:
          cache-name: cache-node-modules
        with:
          # reuse the npm-cache and some node_modules folders
          path: |
            ~/.npm
            ./node_modules
            ./test-electron/node_modules
          # invalidate cache when any package.json changes
          key: ${{ runner.os }}-npm-x3-${{ env.cache-name }}-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-x3-${{ env.cache-name }}-
            ${{ runner.os }}-npm-x3-
            ${{ runner.os }}-

      # install
      - name: install node modules
        run: npm install --legacy-peer-deps

      - name: build
        run: npm run build

      - name: check build size webpack
        run: npm run size:webpack

      - name: check build size browserify
        run: npm run size:browserify

      - name: check build size rollup
        run: npm run size:rollup

      - name: code format
        run: npm run lint

      - name: test typings
        run: npm run test:typings

      - name: test modules
        run: npm run test:modules

      - name: test browser
        uses: GabrielBB/xvfb-action@v1
        with:
          working-directory: ./ #optional
          run: npm run test:browser

      - name: test performance
        run: npm run test:performance

      - name: test e2e
        uses: GabrielBB/xvfb-action@v1
        with:
          working-directory: ./ #optional
          run: npm run test:e2e


  # run the node test in an own task, so we can use a node-version matrix.
  test-node:
    runs-on: ubuntu-22.04
    strategy:
      matrix:
        node: ['22.22.0', '24.13.0']
    steps:
      - uses: actions/checkout@v6
      - name: Setup Node.js environment
        uses: actions/setup-node@v4.4.0
        with:
          node-version: ${{ matrix.node }}

      # https://docs.github.com/en/free-pro-team@latest/actions/guides/caching-dependencies-to-speed-up-workflows
      - name: Reuse npm cache folder
        uses: actions/cache@v5
        env:
          cache-name: cache-node-modules
        with:
          path: |
            ~/.npm
            ./node_modules
            ./test-electron/node_modules
          # invalidate cache when any package.json changes
          key: ${{ runner.os }}-npm-test-node-x3-${{ matrix.node }}-${{ env.cache-name }}-${{ hashFiles('**/package.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-test-node-x3-${{ matrix.node }}-${{ env.cache-name }}-
            ${{ runner.os }}-npm-test-node
            ${{ runner.os }}-test-node

      - name: install node modules
        run: npm install --legacy-peer-deps

      - name: build
        run: npm run build

      - name: test node
        run: npm run test:node


  test-deno:
    runs-on: ubuntu-22.04
    steps:
      - uses: actions/checkout@v6
      - name: Setup Node.js environment
        uses: actions/setup-node@v4.4.0
        with:
          node-version-file: ".nvmrc"

# Caching here is disabled because deno corrupts the npm files for unknown reason
      # https://docs.github.com/en/free-pro-team@latest/actions/guides/caching-dependencies-to-speed-up-workflows
#      - name: Reuse npm cache folder
#        uses: actions/cache@v3
#        env:
#          cache-name: cache-node-deno-modules
#        with:
#          path: |
#            ~/.npm
#            ./node_modules
#            ./test-electron/node_modules
#          # invalidate cache when any package.json changes
#          key: ${{ runner.os }}-npm-test-deno-x3-${{ env.cache-name }}-${{ hashFiles('**/package.json') }}
#          restore-keys: |
#            ${{ runner.os }}-npm-test-deno-x3-${{ env.cache-name }}-
#            ${{ runner.os }}-npm-test-deno
#            ${{ runner.os }}-test-deno

      - name: install node modules
        run: npm install --legacy-peer-deps

      - name: build
        run: npm run build

      - name: Reuse deno cache folder
        uses: actions/cache@v5
        env:
          cache-name: cache-deno-modules
        with:
          path: |
            /home/runner/.cache/deno
          # do not cache based on package.json because deno install randomly fails
          # and it would then never succeed on the first run on dependency updateds
          key: ${{ runner.os }}-deno-x3-

      - uses: denoland/setup-deno@v1
        with:
          # https://github.com/denoland/deno/releases
          deno-version: "1.46.3"
      - name: run deno tests
        run: |
          sudo npm i -g cross-env
          deno info
          npm run test:deno


# TODO this does not work atm. fix this.
#      - name: test electron
#        uses: GabrielBB/xvfb-action@v1
#        with:
#          working-directory: ./test-electron
#          run: npm install --depth 0 --silent && npm run test
