name: Main
on:
  push:
    branches:
      - 'develop'
      - 'feature/update*'
      - 'feature/server_esm*'
    paths-ignore:
      - 'docs/**'

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: ${{ github.repository }}

jobs:
  build_darwin-x64:
    name: Build macOS x86_64
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - run: |
          npm run update-build-info
          ./bin/build-mac-x64.sh
      - uses: actions/upload-artifact@v4
        with:
          name: trilium-mac-x64.zip
          path: dist/trilium-mac-x64*.zip
  build_darwin-arm64:
    name: Build macOS aarch64
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - run: |
          npm run update-build-info
          ./bin/build-mac-arm64.sh
      - uses: actions/upload-artifact@v4
        with:
          name: trilium-mac-arm64.zip
          path: dist/trilium-mac-arm64*.zip
  build_linux-x64:
    name: Build Linux x86_64
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - run: |
          npm run update-build-info
          ./bin/build-linux-x64.sh
      - uses: actions/upload-artifact@v4
        with:
          name: trilium-linux-x64.tar.xz
          path: dist/trilium-linux-x64-*.tar.xz
      - uses: actions/upload-artifact@v4
        with:
          name: trilium_amd64.deb
          path: dist/trilium_*.deb
  build_linux_server-x64:
    name: Build Linux Server x86_64
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - run: |
          npm run update-build-info
          ./bin/build-server.sh
      - uses: actions/upload-artifact@v4
        with:
          name: trilium-linux-x64-server.tar.xz
          path: dist/trilium-linux-x64-server-*.tar.xz
  build_windows-x64:
    name: Build Windows x86_64
    runs-on: ubuntu-latest
    steps:
      - name: Set up Wine
        run: |
          sudo dpkg --add-architecture i386
          wget -qO - https://dl.winehq.org/wine-builds/winehq.key | sudo apt-key add -
          sudo add-apt-repository ppa:cybermax-dexter/sdl2-backport
          sudo apt-add-repository "deb https://dl.winehq.org/wine-builds/ubuntu $(lsb_release -cs) main"
          sudo apt install --install-recommends winehq-stable
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - run: |
          npm run update-build-info
          ./bin/build-win-x64.sh DONTPACK
      - uses: actions/upload-artifact@v4
        with:
          name: trilium-windows-x64
          path: dist/trilium-windows-x64
  build_windows-installer:
    name: Build Windows x86_64 (Setup)
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci
      - name: Run installer build
        run: |
          npm run update-build-info
          npm run make-electron
      - name: Publish installer artifact
        uses: actions/upload-artifact@v4
        with:
          name: TriliumNext Notes for Windows (Setup)
          path: out/make/squirrel.windows/x64/*.exe
  build_docker:
    name: Build Docker image
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      attestations: write
      id-token: write
    steps:
      - uses: actions/checkout@v4
      - name: Log in to the Container registry
        uses: docker/login-action@65b78e6e13532edd9afa3aa52ac7964289d1a9c1
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@9ec57ed1fcdbf14dcef7dfbe97b2010124a938b7
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
      - name: Set up node & dependencies
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "npm"
      - run: npm ci    
      - name: Run the TypeScript build
        run: npx tsc
      - name: Create server-package.json
        run: cat package.json | grep -v electron > server-package.json
      - uses: docker/setup-buildx-action@v3
      - uses: docker/build-push-action@v6
        id: push
        with:
          context: .
          push: true
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v1
        with:
          subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true