name: Publish npm packages

# # Npm packages are published for every new tag
on:
  push:
    tags:
      - 'v*.*.*'

jobs:
  build-and-pack:
    runs-on: ubuntu-latest
    name: Build and pack npm packages
    steps:
      - uses: actions/checkout@v4

      - name: Set up environment
        uses: ./.github/actions/setup

      - name: Build Web
        run: yarn build:server

      - name: Pack the web and server packages
        run: |
          yarn workspace @actual-app/web pack --filename @actual-app/web.tgz
          yarn workspace @actual-app/sync-server pack --filename @actual-app/sync-server.tgz

      - name: Build API
        run: yarn build:api

      - name: Pack the api package
        run: |
          yarn workspace @actual-app/api pack --filename @actual-app/api.tgz

      - name: Upload package artifacts
        uses: actions/upload-artifact@v4
        with:
          name: npm-packages
          path: |
            packages/desktop-client/@actual-app/web.tgz
            packages/sync-server/@actual-app/sync-server.tgz
            packages/api/@actual-app/api.tgz

  publish:
    runs-on: ubuntu-latest
    name: Publish npm packages
    needs: build-and-pack
    permissions:
      contents: read
      packages: write
    steps:
      - name: Download the artifacts
        uses: actions/download-artifact@v4
        with:
          name: npm-packages

      - name: Setup node and npm registry
        uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: 'https://registry.npmjs.org'

      - name: Publish Web
        run: |
          npm publish desktop-client/@actual-app/web.tgz --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Publish Sync-Server
        run: |
          npm publish sync-server/@actual-app/sync-server.tgz --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

      - name: Publish API
        run: |
          npm publish api/@actual-app/api.tgz --access public
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
