name: Zig-Cross-Compile

env:
  DEBUG: 'napi:*'

on:
  push:
    branches:
      - main
  pull_request:

jobs:
  build:
    name: Zig-Cross-Compile-On-Linux
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        target:
          [
            'x86_64-apple-darwin',
            'x86_64-unknown-linux-musl',
            'aarch64-unknown-linux-musl',
          ]

    steps:
      - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          # Testing for compatibility with node v12.x
          node-version: 12
          check-latest: true
          cache: 'yarn'
      - name: Install
        uses: actions-rs/toolchain@v1
        with:
          toolchain: stable
          profile: minimal
          override: true
          target: ${{ matrix.target }}
      - name: Cache cargo
        uses: actions/cache@v3
        with:
          path: |
            ~/.cargo/registry
            ~/.cargo/git
            target
          key: stable-zig-${{ matrix.target }}-cargo-cache
      - name: Install aarch64 toolchain
        run: rustup target add aarch64-unknown-linux-gnu
      - name: Install ziglang
        uses: goto-bus-stop/setup-zig@v1
        with:
          version: 0.9.1
      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: .yarn/cache
          key: npm-cache-ubuntu-latest-gnu-node@16
      - name: Install dependencies
        run: yarn install --immutable --mode=skip-build
      - name: 'Build TypeScript'
        run: yarn build
      - name: Cross build native tests
        run: |
          yarn workspace compat-mode-examples build --target ${{ matrix.target }} --zig
          yarn workspace examples build --target ${{ matrix.target }} --zig
      - name: Upload artifacts
        uses: actions/upload-artifact@v2
        with:
          name: compat-${{ matrix.target }}
          path: ./examples/napi-compat-mode/index.node
          if-no-files-found: error
      - name: Upload artifacts
        uses: actions/upload-artifact@v2
        with:
          name: napi-${{ matrix.target }}
          path: ./examples/napi/index.node
          if-no-files-found: error

  test:
    name: Test Zig Cross Compiled ${{ matrix.settings.target }}
    runs-on: ${{ matrix.settings.host }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: ubuntu-latest
            target: x86_64-unknown-linux-musl
          - host: macos-latest
            target: x86_64-apple-darwin
          - host: ubuntu-latest
            target: aarch64-unknown-linux-musl

    steps:
      - run: docker run --rm --privileged multiarch/qemu-user-static:register --reset
        if: matrix.settings.host == 'ubuntu-latest'
      - uses: actions/checkout@v3
      - name: Setup node
        uses: actions/setup-node@v3
        with:
          node-version: 16
          check-latest: true
          cache: 'yarn'
      - name: Cache NPM dependencies
        uses: actions/cache@v3
        with:
          path: .yarn/cache
          key: npm-cache-${{ matrix.settings.host }}-node@16
      - name: Install dependencies
        run: yarn install --immutable --mode=skip-build
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: napi-${{ matrix.settings.target }}
          path: ./examples/napi/
      - name: Download artifacts
        uses: actions/download-artifact@v3
        with:
          name: compat-${{ matrix.settings.target }}
          path: ./examples/napi-compat-mode/
      - name: List files
        run: |
          ls ./examples/napi
          ls ./examples/napi-compat-mode
      - name: Test
        run: yarn test --verbose
        if: matrix.settings.host == 'macos-latest'
      - name: Test
        uses: docker://multiarch/alpine:aarch64-latest-stable
        if: matrix.settings.target == 'aarch64-unknown-linux-musl'
        with:
          args: >
            sh -c "
              apk add nodejs yarn && \
              yarn test
            "
      - name: Test
        uses: addnab/docker-run-action@v3
        if: matrix.settings.target == 'x86_64-unknown-linux-musl'
        with:
          image: ghcr.io/${{ github.repository }}/nodejs-rust:lts-alpine
          options: -v ${{ github.workspace }}:/napi-rs -w /napi-rs
          run: yarn test