name: Create release

on:
  push:
    branches:
     - main
    paths:
      - package.json

permissions:
  contents: read

jobs:
  check-release-version:
    runs-on: ubuntu-latest
    outputs:
      release-version: ${{ steps.set-release-version.outputs.result }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/github-script@v7
        id: set-release-version
        with:
          result-encoding: string
          script: |
            const { owner, repo } = context.repo
            const version = require("./package.json").version
            const versionTag = `v${version}`

            const { data: releases } = await github.rest.repos.listReleases({
              owner,
              repo
            })

            const previousRelease = releases.find((r) => r.tag_name.startsWith('v7'))

            if (versionTag !== previousRelease?.tag_name) {
              return versionTag
            }

  release:
    runs-on: ubuntu-latest
    needs: check-release-version
    if: ${{ startsWith(needs.check-release-version.outputs.release-version, 'v') }}

    permissions:
      contents: write
      id-token: write

    environment: release

    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '20'
          registry-url: 'https://registry.npmjs.org'
      - run: npm install -g npm@latest
      - run: npm install
      - name: Create NPM release
        run: npm publish --provenance --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
      - run: node scripts/generate-undici-types-package-json.js
      - run: npm publish --provenance
        working-directory: './types'
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
      - name: Create GitHub release
        uses: actions/github-script@v7
        with:
          script: |
            const defaultBranch = "${{ github.event.repository.default_branch }}"
            const versionTag = "${{ needs.check-release-version.outputs.release-version }}"
            await require('./scripts/release').release({ github, context, defaultBranch, versionTag })
