name: test-node-addon-api

on:
  push:
    branches:
      - master
    paths:
      - '.github/workflows/test-nodejs-addon-api.yaml'
      - 'CMakeLists.txt'
      - 'cmake/**'
      - 'sherpa-onnx/csrc/*'
      - 'sherpa-onnx/c-api/*'
      - 'scripts/node-addon-api/**'

  pull_request:
    branches:
      - master
    paths:
      - '.github/workflows/test-nodejs-addon-api.yaml'
      - 'CMakeLists.txt'
      - 'cmake/**'
      - 'sherpa-onnx/csrc/*'
      - 'sherpa-onnx/c-api/*'
      - 'scripts/node-addon-api/**'

  workflow_dispatch:

concurrency:
  group: test-node-addon-api-${{ github.ref }}
  cancel-in-progress: true

permissions:
  contents: read

jobs:
  test-node-addon-api:
    name: ${{ matrix.os }} ${{ matrix.node-version }}
    runs-on: ${{ matrix.os }}
    strategy:
      fail-fast: false
      matrix:
        os: [macos-latest, ubuntu-latest, ubuntu-latest]
        node-version: ["16", "22"]
        python-version: ["3.8"]

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Setup Python ${{ matrix.python-version }}
        uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}

      - name: Install Python dependencies
        shell: bash
        run: |
          pip install ninja

      - name: Show ninja help
        shell: bash
        run: |
          ninja --help || true

      - uses: actions/setup-node@v4
        with:
          registry-url: 'https://registry.npmjs.org'
          node-version: ${{ matrix.node-version }}

      - name: Display node version
        shell: bash
        run: |
          node --version

      - name: Display npm help
        shell: bash
        run: |
          npm help

      - name: ccache
        uses: hendrikmuhs/ccache-action@v1.2
        with:
          key: ${{ matrix.os }}-release-shared

      - name: Build sherpa-onnx
        if: matrix.os == 'windows-latest'
        shell: bash
        run: |
          export CMAKE_CXX_COMPILER_LAUNCHER=ccache
          export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

          mkdir build
          cd build
          cmake \
            -DCMAKE_BUILD_TYPE=Release \
            -DCMAKE_INSTALL_PREFIX=./install \
            -DBUILD_SHARED_LIBS=ON \
            -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
            -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
            -DSHERPA_ONNX_ENABLE_BINARY=OFF \
            ..

          ls -lh  _deps/onnxruntime-src/lib/

          cmake --build . --config Release --target install -- -m:6

          ls -lh install/lib

          echo "----------"

          cp -v  _deps/onnxruntime-src/lib/*.lib ./install/lib

          echo "----------"

          ls -lh install/lib

      - name: Build sherpa-onnx
        if: matrix.os != 'windows-latest'
        shell: bash
        run: |
          export CMAKE_CXX_COMPILER_LAUNCHER=ccache
          export PATH="/usr/lib/ccache:/usr/local/opt/ccache/libexec:$PATH"

          mkdir build
          cd build
          cmake \
            -G Ninja \
            -DCMAKE_BUILD_TYPE=Release \
            -DCMAKE_INSTALL_PREFIX=./install \
            -DBUILD_SHARED_LIBS=ON \
            -DSHERPA_ONNX_ENABLE_WEBSOCKET=OFF \
            -DSHERPA_ONNX_ENABLE_PORTAUDIO=OFF \
            -DSHERPA_ONNX_ENABLE_BINARY=OFF \
            ..

          cmake --build . --config Release --target install -- -j 6

      - name: Build node-addon-api package
        shell: bash
        run: |
          d=$PWD
          export SHERPA_ONNX_INSTALL_DIR=$d/build/install

          cd scripts/node-addon-api

          echo $d/build/install

          ls -lh $d/build/install

          npm i

          ./node_modules/.bin/cmake-js compile --log-level verbose

      - name: Run tests
        shell: bash
        run: |
          export PATH=$PWD/build/install/lib:$PATH
          export LD_LIBRARY_PATH=$PWD/build/install/lib:$LD_LIBRARY_PATH
          d=nodejs-addon-examples
          cd $d
          files=$(ls *.js)
          echo $files
          for f in ${files[@]}; do
            echo $f
            sed -i.bak s%sherpa-onnx-node%./sherpa-onnx% ./$f
          done
          cd ..

          cp -v scripts/node-addon-api/build/Release/sherpa-onnx.node $d/
          cp -v scripts/node-addon-api/lib/*.js $d/
          cp -v ./build/install/lib/lib*  $d/

          .github/scripts/test-nodejs-addon-npm.sh
