name: Generate Client Library + Publish 📦 to npmjs + Publish to GitHub Releases

on:
  workflow_dispatch:
    inputs:
      version:
        required: true

defaults:
  run:
    shell: bash

permissions:
  contents: read
  id-token: write

env:
  GENERATOR_VERSION: 3.0.54
  GENERATOR_NAME: swagger-codegen-cli.jar
  JAR_ASANA: codegen/swagger/target/AsanaClientCodegen-swagger-codegen-1.0.0.jar
  ACTUAL_LANG: com.asana.codegen.JavascriptClientCodegenGenerator
  NAME: asana-preview

jobs:
  generate-javascript-library:
    name: Generate JavaScript client library
    runs-on: ubuntu-latest
    steps:
      - name: Authenticate to AWS
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: us-east-1
          role-to-assume: arn:aws:iam::403483446840:role/autogen_role_beta_github_actions_release_asana_client_libraries
      - name: Get GitHub app token
        uses: asana/get-github-app-token@v1
        id: get-token
        with:
          github-app-name: asana-publish-client-libraries
      - name: Checkout repo files and set the git token
        uses: actions/checkout@v4
        with:
          token: ${{ steps.get-token.outputs.app-token }}
      - uses: actions/setup-java@v4
        with:
          distribution: "temurin"
          java-version: "17"
      - name: Download generator
        run: |
          wget -q -O $GENERATOR_NAME https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/${{ env.GENERATOR_VERSION }}/swagger-codegen-cli-${{ env.GENERATOR_VERSION }}.jar
      - name: Build custom code
        run: |
          pushd codegen/swagger >/dev/null
          mvn package
          popd >/dev/null
      - name: Generate library
        run: >-
          java -cp "${{ env.JAR_ASANA }}:${{ env.GENERATOR_NAME }}"
          io.swagger.codegen.v3.cli.SwaggerCodegen
          generate
          --input-spec https://raw.githubusercontent.com/Asana/openapi/master/defs/asana_sdk_oas.yaml
          --template-dir "codegen/templates"
          --lang "${{ env.ACTUAL_LANG }}"
          -DpackageName=${{ env.NAME }}
          --additional-properties "projectVersion=${{ inputs.version }},projectName=${{ env.NAME }},packageName=${{ env.NAME }},usePromises=true,useES6=true"
      - name: Clean up generator
        run: rm -rf codegen/swagger/target ${{ env.GENERATOR_NAME }}
      - name: Push changes to main branch
        run: |
          git config user.name asana-publish-client-libraries[bot]
          git config user.email 159857493+asana-publish-client-libraries[bot]@users.noreply.github.com
          git add .
          git commit -m 'Updated JavaScript SDK: v${{ inputs.version }}'
          git push origin main
          git pull
          git tag 'v${{ inputs.version }}' --force
          git push origin --tags --force
  publish-to-npmjs:
    needs: generate-javascript-library
    name: Build and publish 📦 to npmjs
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: main
      - uses: actions/setup-node@v4
        with:
          node-version: "18.x"
          registry-url: "https://registry.npmjs.com"
      - name: Build distribution
        run: |
          npm pkg set 'main'='dist/index.js'
          npm pkg set 'scripts.build'='babel src -d dist'
          npm pkg set 'scripts.prepare'='npm run build'
          npm install
          npm publish
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_PREVIEW_TOKEN }}
  publish-to-github:
    needs: publish-to-npmjs
    name: Build and publish to GitHub Releases
    runs-on: ubuntu-latest
    steps:
      - name: Authenticate to AWS
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: us-east-1
          role-to-assume: arn:aws:iam::403483446840:role/autogen_role_beta_github_actions_release_asana_client_libraries
      - name: Get GitHub app token
        uses: asana/get-github-app-token@v1
        id: get-token
        with:
          github-app-name: asana-publish-client-libraries
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          ref: main
      - uses: actions/setup-node@v4
        with:
          node-version: "18.x"
          registry-url: "https://registry.npmjs.com"
      - name: Build distribution
        run: |
          npm pkg set 'main'='dist/index.js'
          npm pkg set 'scripts.build'='babel src -d dist'
          npm pkg set 'scripts.prepare'='npm run build'
          npm install
      - name: Bundle code for browser
        run: |
          npm install -g browserify
          npm install -g uglify-js
          browserify dist/index.js -s AsanaPreview | uglifyjs > dist/asana-min.js
          browserify dist/index.js -s AsanaPreview > dist/asana.js
      - name: Publish to GitHub Releases
        run: gh release create v${{ inputs.version }} dist/asana.js dist/asana-min.js
        env:
          GH_TOKEN: ${{ steps.get-token.outputs.app-token }}
