name: Continuous Integration (CI)

on:
  push:
    branches:
      - main
    paths:
      - src/**/*.*

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
      - uses: actions/setup-node@v3
        with:
          node-version: 19.x
          always-auth: true

      - name: Install dependencies
        run: yarn

      - name: Build source code
        run: yarn build

      - name: Run test suites
        run: yarn test
  release:
    permissions:
      contents: write
    needs: test
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Generate tag, release name, and body
        run: |
          TAG_NAME="v$(jq -r '.version' package.json)"
          RELEASE_NAME="Release $TAG_NAME"
          BODY=$(sed -n "/## Version $(jq -r '.version' package.json | sed 's/\./\\\./g')/,/##/p" CHANGELOG.md | sed '1d;/^##/d')
          echo "TAG_NAME=$TAG_NAME" >> $GITHUB_ENV
          echo "RELEASE_NAME=$RELEASE_NAME" >> $GITHUB_ENV
          echo "$BODY" >> release.md
      - name: Create release
        uses: ncipollo/release-action@v1.12.0
        with:
          allowUpdates: true
          tag: ${{ env.TAG_NAME }}
          name: ${{ env.RELEASE_NAME }}
          token: ${{ secrets.GITHUB_TOKEN }}
          bodyFile: release.md
          draft: false
          prerelease: false
  publish-npm:
    needs: release
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 19.x
          always-auth: true
      - name: Install dependencies
        run: yarn
      - name: Build code
        run: yarn build
      - name: Set access tokens
        run: |
          npm set //registry.npmjs.org/:_authToken ${{ secrets.NPM_AUTH_TOKEN }} 
      - name: Publish to NPM
        run: yarn publish --access public
  publish-gpr:
    needs: release
    permissions:
      packages: write
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v3
      - name: Set up Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 19.x
          always-auth: true
      - name: Install dependencies
        run: yarn
      - name: Build code
        run: yarn build
      - name: Set access tokens
        run: |
          npm set //npm.pkg.github.com/:_authToken ${{ secrets.GPR_AUTH_TOKEN }}
      - name: Get ready to publish to GPR
        run: |
          jq ".name = \"@$REPO\"" package.json > temp.json && mv temp.json package.json
        env:
          REPO: ${{ github.repository }}
      - name: Publish to GPR
        run: yarn publish --access public --registry https://npm.pkg.github.com/
