name: CI
run-name: Build pipeline
on:
  push:
    branches:
      - 'develop'
      - 'release'
      - 'main'
    paths-ignore:
      - 'dist/**'
      - 'test/**'
      - 'image-tag.txt'
      - 'image.txt'
      - 'package-lock.json'
      - 'package.json'
  pull_request:
    branches:
      - 'develop'
      - 'release'
      - 'main'

env:
  GIT_TOKEN: ${{ secrets.GIT_TOKEN }}
  NPM_TOKEN: ${{ secrets.NPM_TOKEN }}

jobs:
  run-test:
    runs-on:
      ubuntu-latest
      # group: build
    timeout-minutes: 60

    # Commit message contains `run-test` keyword or pull request
    # The branch is protected
    if: |
      (
        contains(github.event.head_commit.message, 'run-test') ||
        github.event_name == 'pull_request'
      ) &&
      github.ref_protected == true

    steps:
      - name: Check out code
        uses: actions/checkout@v4

      - name: Test
        id: result
        run: |
          make test-ci

      - name: Upload artifact - Test
        uses: actions/upload-artifact@v4
        with:
          name: artifact-test
          path: |
            test

  run-build:
    runs-on:
      ubuntu-latest
      # group: build
    timeout-minutes: 60

    permissions:
      contents: write

    # NOT commit message contains `run-without-release` or `release-by-bot` keyword or pull request
    # The branch is protected
    if: |
      ! (
        contains(github.event.head_commit.message, 'run-without-release') ||
        contains(github.event.head_commit.message, '== release-by-bot ') ||
        github.event_name == 'pull_request'
      ) &&
      github.ref_protected == true

    steps:
      - name: Check out code
        uses: actions/checkout@v4
        with:
          token: ${{ env.GIT_TOKEN }}
          fetch-depth: 0

      - name: Bump prerelease version
        # Commit to develop branch and commit message contains `run-prerelease` keyword
        if: |
          github.ref_name == 'develop'
        run: |
          make version-prerelease
          echo "1" > BUMPED

      - name: Bump patch version
        # Commit to `main` or `release` branch and commit message contains `run-patch-release` keyword
        if: |
          (
            github.ref_name == 'main' ||
            github.ref_name == 'release'
          ) &&
          contains(github.event.head_commit.message, 'run-patch-release')
        run: |
          make version-patch
          echo "1" > BUMPED

      - name: Bump minor version
        # Commit to `main` or `release` branch and commit message contains `run-minor-release` keyword
        if: |
          (
            github.ref_name == 'main' ||
            github.ref_name == 'release'
          ) &&
          contains(github.event.head_commit.message, 'run-minor-release')
        run: |
          make version-minor
          echo "1" > BUMPED

      - name: Bump major version
        # Commit to `main` or `release` branch and commit message contains `run-major-release` keyword
        if: |
          (
            github.ref_name == 'main' ||
            github.ref_name == 'release'
          ) &&
          contains(github.event.head_commit.message, 'run-major-release')
        run: |
          make version-major
          echo "1" > BUMPED

      - name: Bump version flag
        id: bump-version-flag
        run: |
          echo "BUMPED=`cat BUMPED 2>/dev/null`" >> "$GITHUB_OUTPUT"

      - name: Bump version enforcement
        # Commit to `main` or `release` branch and no bumped version
        if: |
          (
            github.ref_name == 'main' ||
            github.ref_name == 'release'
          ) &&
          steps.bump-version-flag.outputs.BUMPED != '1'
        run: |
          make version-patch
          echo "1" > BUMPED

      - name: Image info
        id: image-info
        run: |
          make name > image-name.txt
          make version > image-tag.txt
          echo "`cat image-name.txt`:`cat image-tag.txt`" > image.txt
          echo "BUMPED=`cat BUMPED 2>/dev/null`" >> "$GITHUB_OUTPUT"
          echo "IMAGE_NAME=`cat image-name.txt`" >> "$GITHUB_OUTPUT"
          echo "IMAGE_TAG=`cat image-tag.txt`" >> "$GITHUB_OUTPUT"
          echo "IMAGE=`cat image.txt`" >> "$GITHUB_OUTPUT"
          rm -rf BUMPED

      - name: Validate
        # BUMPED version
        if: steps.image-info.outputs.BUMPED == '1'
        run: |
          make ci

      - name: Build ${{ steps.image-info.outputs.IMAGE }}
        # BUMPED version
        if: steps.image-info.outputs.BUMPED == '1'
        run: |
          echo "//registry.npmjs.org/:_authToken=${{ env.NPM_TOKEN }}" > ~/.npmrc
          make release

      - name: Commit ${{ steps.image-info.outputs.IMAGE_TAG }}
        # BUMPED version
        if: steps.image-info.outputs.BUMPED == '1'
        run: |
          git config user.name github-actions
          git config user.email github-actions@github.com
          git add -A
          git commit -m "${{ steps.image-info.outputs.IMAGE_TAG }}" -m "== release-by-bot (${{ github.sha }}) =="
          git tag -a "${{ steps.image-info.outputs.IMAGE_TAG }}" -m "${{ steps.image-info.outputs.IMAGE_TAG }}"
          git push
          git push --tags
