fuzzies 0.6.2

A fast, memory-mapped fuzzy search dictionary using FSTs and Levenshtein automata.
Documentation
name: NPM-Release

env:
  DEBUG: napi:*
  APP_NAME: fuzzies-node
  MACOSX_DEPLOYMENT_TARGET: '10.13'
  CARGO_INCREMENTAL: '1'

defaults:
  run:
    working-directory: bindings/node

'on':
  push:
    branches:
      - main
    tags-ignore:
      - '**'
    paths-ignore:
      - '**/*.md'
      - LICENSE
      - '**/*.gitignore'
      - .editorconfig
      - docs/**
  pull_request: null

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

jobs:
  release-please:
    name: Release Please
    runs-on: ubuntu-latest
    permissions:
      contents: write
      pull-requests: write
    outputs:
      release_created: ${{ steps.release.outputs['bindings/node--release_created'] }}
    steps:
      - uses: googleapis/release-please-action@v4
        id: release
        with:
          config-file: release-please-config.json
          manifest-file: .release-please-manifest.json

  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: 24
      - name: Setup bun
        uses: oven-sh/setup-bun@v2
      - name: Install
        uses: dtolnay/rust-toolchain@stable
        with:
          components: clippy, rustfmt
      - name: Install dependencies
        run: bun install
      - name: Oxlint
        run: bun run lint
      - name: Cargo fmt
        run: cargo fmt -- --check
      - name: Clippy
        run: cargo clippy

  build:
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: macos-latest
            target: x86_64-apple-darwin
            build: bun run build --target x86_64-apple-darwin
          - host: windows-latest
            build: bun run build --target x86_64-pc-windows-msvc
            target: x86_64-pc-windows-msvc
          - host: ubuntu-latest
            target: x86_64-unknown-linux-gnu
            build: bun run build --target x86_64-unknown-linux-gnu --use-napi-cross
          - host: macos-latest
            target: aarch64-apple-darwin
            build: bun run build --target aarch64-apple-darwin
          - host: ubuntu-latest
            target: aarch64-unknown-linux-gnu
            build: bun run build --target aarch64-unknown-linux-gnu --use-napi-cross
    name: stable - ${{ matrix.settings.target }} - node@24
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v7
      - name: Setup node
        uses: actions/setup-node@v7
        with:
          node-version: 24
      - name: Setup bun
        uses: oven-sh/setup-bun@v2
      - name: Install
        uses: dtolnay/rust-toolchain@stable
        with:
          toolchain: stable
          targets: ${{ matrix.settings.target }}
      - name: Cache cargo
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            ~/.napi-rs
            .cargo-cache
            target/
          key: ${{ matrix.settings.target }}-cargo-${{ matrix.settings.host }}
      - uses: mlugg/setup-zig@v1
        if: ${{ contains(matrix.settings.target, 'musl') }}
        with:
          version: 0.13.0
      - name: Install cargo-zigbuild
        uses: taiki-e/install-action@v2
        if: ${{ contains(matrix.settings.target, 'musl') }}
        env:
          GITHUB_TOKEN: ${{ github.token }}
        with:
          tool: cargo-zigbuild
      - name: Setup toolchain
        run: ${{ matrix.settings.setup }}
        if: ${{ matrix.settings.setup }}
        shell: bash
      - name: Install dependencies
        run: bun install
      - name: Build
        run: ${{ matrix.settings.build }}
        shell: bash
      - name: Upload artifact
        uses: actions/upload-artifact@v4
        with:
          name: bindings-${{ matrix.settings.target }}
          path: |
            bindings/node/${{ env.APP_NAME }}.*.node
            bindings/node/${{ env.APP_NAME }}.*.wasm
          if-no-files-found: error

  test-macOS-windows-binding:
    name: Test bindings on ${{ matrix.settings.target }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        settings:
          - host: windows-latest
            target: x86_64-pc-windows-msvc
            architecture: x64
          - host: macos-latest
            target: aarch64-apple-darwin
            architecture: arm64
          - host: macos-latest
            target: x86_64-apple-darwin
            architecture: x64
        node:
          - '22'
          - '24'
          - '26'
    runs-on: ${{ matrix.settings.host }}
    steps:
      - uses: actions/checkout@v7
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
          architecture: ${{ matrix.settings.architecture }}
      - name: Setup bun
        uses: oven-sh/setup-bun@v2
      - name: Install dependencies
        run: bun install
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: bindings-${{ matrix.settings.target }}
          path: bindings/node
      - name: List packages
        run: ls -R .
        shell: bash

  test-linux-binding:
    name: Test ${{ matrix.target }} - node@${{ matrix.node }}
    needs:
      - build
    strategy:
      fail-fast: false
      matrix:
        target:
          - x86_64-unknown-linux-gnu
          - aarch64-unknown-linux-gnu
        node:
          - '22'
          - '24'
          - '26'
        exclude:
          - target: armv7-unknown-linux-gnueabihf
            node: '24'
          - target: armv7-unknown-linux-gnueabihf
            node: '26'
    runs-on: ${{ contains(matrix.target, 'aarch64') && 'ubuntu-24.04-arm' || 'ubuntu-latest' }}
    steps:
      - uses: actions/checkout@v7
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - name: Setup bun
        uses: oven-sh/setup-bun@v2
      - name: Output docker params
        id: docker
        run: |
          node -e "
            if ('${{ matrix.target }}'.startsWith('aarch64')) {
              console.log('PLATFORM=linux/arm64')
            } else if ('${{ matrix.target }}'.startsWith('armv7')) {
              console.log('PLATFORM=linux/arm/v7')
            } else {
              console.log('PLATFORM=linux/amd64')
            }
          " >> $GITHUB_OUTPUT
          node -e "
            if ('${{ matrix.target }}'.endsWith('-musl')) {
              console.log('IMAGE=node:${{ matrix.node }}-alpine')
            } else {
              console.log('IMAGE=node:${{ matrix.node }}-slim')
            }
          " >> $GITHUB_OUTPUT
      - name: Install dependencies
        run: bun install
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: bindings-${{ matrix.target }}
          path: bindings/node
      - name: List packages
        run: ls -R .
        shell: bash
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
        if: ${{ contains(matrix.target, 'armv7') }}
        with:
          platforms: all
      - run: docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
        if: ${{ contains(matrix.target, 'armv7') }}
      - name: Test bindings
        uses: tj-actions/docker-run@v2
        with:
          image: ${{ steps.docker.outputs.IMAGE }}
          name: test-bindings-${{ matrix.target }}
          options: '-v ${{ github.workspace }}:${{ github.workspace }} -w ${{ github.workspace }}/bindings/node --platform ${{ steps.docker.outputs.PLATFORM }}'
          args: npm run test

  publish:
      name: Publish
      runs-on: ubuntu-latest
      permissions:
        contents: write
        id-token: write
      needs:
        - release-please
        - lint
        - test-macOS-windows-binding
        - test-linux-binding
      if: ${{ needs.release-please.outputs.release_created == 'true' }}
      steps:
        - uses: actions/checkout@v7
        - name: Setup node
          uses: actions/setup-node@v4
          with:
            node-version: 24
            registry-url: 'https://registry.npmjs.org'
        - name: Setup bun
          uses: oven-sh/setup-bun@v2
        - name: Install dependencies
          run: bun install
        - name: create npm dirs
          run: bun run napi create-npm-dirs
        - name: Download all artifacts
          uses: actions/download-artifact@v4
          with:
            path: bindings/node/artifacts
        - name: Move artifacts
          run: bun run artifacts
        - name: List packages
          run: ls -R ./npm
          shell: bash
        - name: Publish to NPM
          env:
            NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
          run: |
            npm config set provenance true
            npm publish --access public