narrowdb 0.3.2

A lightweight columnar database engine for log and time-series data
Documentation
name: Publish @narrowdb/node

on:
  push:
    tags:
      - "v*"
  workflow_dispatch:

permissions:
  contents: read

defaults:
  run:
    working-directory: crates/narrow-napi

jobs:
  build:
    strategy:
      fail-fast: false
      matrix:
        include:
          - target: aarch64-apple-darwin
            os: macos-latest
          - target: x86_64-apple-darwin
            os: macos-latest
          - target: x86_64-unknown-linux-gnu
            os: ubuntu-latest
          - target: aarch64-unknown-linux-gnu
            os: ubuntu-latest
          - target: x86_64-pc-windows-msvc
            os: windows-latest
    runs-on: ${{ matrix.os }}
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: 1.94.1
          targets: ${{ matrix.target }}

      - name: Install cross-compiler
        if: matrix.target == 'aarch64-unknown-linux-gnu'
        run: |
          sudo apt-get update
          sudo apt-get install -y gcc-aarch64-linux-gnu

      - run: npm install
      - name: Build
        env:
          CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: ${{ matrix.target == 'aarch64-unknown-linux-gnu' && 'aarch64-linux-gnu-gcc' || '' }}
        run: npx napi build --platform --release --target ${{ matrix.target }}

      - uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.target }}
          path: crates/narrow-napi/*.node
          if-no-files-found: error

      - name: Upload JS bindings
        if: matrix.target == 'x86_64-unknown-linux-gnu'
        uses: actions/upload-artifact@v4
        with:
          name: bindings-js
          path: |
            crates/narrow-napi/index.js
            crates/narrow-napi/index.d.ts
          if-no-files-found: error

  publish:
    needs: build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          registry-url: https://registry.npmjs.org

      - run: npm install
        working-directory: crates/narrow-napi

      - uses: actions/download-artifact@v4
        with:
          path: crates/narrow-napi/artifacts

      - name: Copy JS bindings
        run: cp artifacts/bindings-js/index.js artifacts/bindings-js/index.d.ts .
        working-directory: crates/narrow-napi

      - name: Move artifacts
        run: npx napi artifacts --output-dir ./artifacts --npm-dir ./npm
        working-directory: crates/narrow-napi

      - name: Verify platform package artifacts
        working-directory: crates/narrow-napi
        run: |
          node -e '
            const fs = require("node:fs");
            const path = require("node:path");

            const npmDir = path.resolve("npm");
            const packageDirs = fs
              .readdirSync(npmDir, { withFileTypes: true })
              .filter((entry) => entry.isDirectory())
              .map((entry) => path.join(npmDir, entry.name));

            const failures = [];

            for (const dir of packageDirs) {
              const packageJsonPath = path.join(dir, "package.json");
              const pkg = JSON.parse(fs.readFileSync(packageJsonPath, "utf8"));

              if (!pkg.main) {
                failures.push(`${path.relative(process.cwd(), dir)} is missing a main field`);
                continue;
              }

              const artifactPath = path.join(dir, pkg.main);
              if (!fs.existsSync(artifactPath)) {
                failures.push(
                  `${path.relative(process.cwd(), dir)} is missing ${pkg.main}`
                );
              }
            }

            if (failures.length > 0) {
              console.error("Refusing to publish incomplete platform packages:");
              for (const failure of failures) {
                console.error(`- ${failure}`);
              }
              process.exit(1);
            }

            console.log(`Verified ${packageDirs.length} platform package artifacts.`);
          '

      - name: List packages
        run: ls -R npm/
        working-directory: crates/narrow-napi

      - name: Publish platform packages
        working-directory: crates/narrow-napi
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: |
          for pkg in npm/*/; do
            npm publish "$pkg" --access public
          done

      - name: Publish main package
        working-directory: crates/narrow-napi
        env:
          NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
        run: npm publish --access public