npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2025 – Pkg Stats / Ryan Hefner

napi-rs

v0.3.10

Published

A minimal library for building compiled Node add-ons in Rust.

Readme

napi-rs

This project was initialized from xray

A minimal library for building compiled NodeJS add-ons in Rust.

Platform Support

Lint Linux N-API@3 Linux musl macOS/Windows/Linux x64 Linux-aarch64 Windows i686 FreeBSD

Operating Systems

| Linux | macOS | Windows MSVC | FreeBSD | | ----- | ----- | ------------ | ------- | | ✓ | ✓ | ✓ | ✓ |

NodeJS

| Node10 | Node 12 | Node14 | | ------ | ------- | ------ | | ✓ | ✓ | ✓ |

This library depends on N-API and requires [email protected] or later.

We already have some packages written by napi-rs: node-rs

One nice feature is that this crate allows you to build add-ons purely with the Rust toolchain and without involving node-gyp.

Taste

You can start from package-template to play with napi-rs

Define JavaScript functions

#[js_function(1)] // ------> arguments length, omit for zero
fn fibonacci(ctx: CallContext) -> Result<JsNumber> {
  let n = ctx.get::<JsNumber>(0)?.try_into()?;
  ctx.env.create_int64(fibonacci_native(n))
}

#[inline]
fn fibonacci_native(n: i64) -> i64 {
  match n {
    1 | 2 => 1,
    _ => fibonacci_native(n - 1) + fibonacci_native(n - 2),
  }
}

Register module

/// test_module is Module name
register_module!(test_module, init);

/// Module is `module` object in NodeJS
fn init(module: &mut Module) -> Result<()> {
  module.create_named_method("fibonacci", fibonacci)?;
}

Building

This repository is a Cargo crate. Any napi-based add-on should contain Cargo.toml to make it a Cargo crate.

In your Cargo.toml you need to set the crate-type to "cdylib" so that cargo builds a C-style shared library that can be dynamically loaded by the Node executable. You'll also need to add this crate as a dependency.

[lib]
crate-type = ["cdylib"]

[dependencies]
napi = "0.5"
napi-derive = "0.5"

[build-dependencies]
napi-build = "0.2"

And create build.rs in your own project:

// build.rs
extern crate napi_build;

fn main() {
  napi_build::setup();
}

So far, the napi build script has only been tested on macOS Linux and Windows x64 MSVC.

See the included test_module for an example add-on.

Run cargo build to produce the Dynamic lib file. And install the napi-rs to help you copy Dynamic lib file to .node file in case you can require it in your program.

{
  "package": "your pkg",
  "devDependencies": {
    "napi-rs": "latest"
  },
  "scripts": {
    "build": "cargo build && napi build",
    "build-release": "cargo build --release && napi build --release"
  }
}

Then you can require your native binding:

require('./target/debug|release/[module_name].node')

The module_name would be your package name in your Cargo.toml.

xxx => ./target/debug|release/xxx.node

xxx-yyy => ./target/debug|release/xxx_yyy.node

You can also copy Dynamic lib file to an appointed location:

napi build [--release] .
napi build [--release] ./mylib

Testing

Because libraries that depend on this crate must be loaded into a Node executable in order to resolve symbols, all tests are written in JavaScript in the test_module subdirectory.

To run tests:

yarn build:test
yarn test

Features table

Create JavaScript values

| NAPI | NAPI Version | Minimal Node version | Status | | ------------------------------------------------------------------------------------------------------------ | ------------ | -------------------- | ------ | | napi_create_array | 1 | v8.0.0 | ✅ | | napi_create_array_with_length | 1 | v8.0.0 | ✅ | | napi_create_arraybuffer | 1 | v8.0.0 | ✅ | | napi_create_buffer | 1 | v8.0.0 | ✅ | | napi_create_buffer_copy | 1 | v8.0.0 | ✅ | | napi_create_date | 5 | v11.11.0 | ✅ | | napi_create_external | 1 | v8.0.0 | ✅ | | napi_create_external_arraybuffer | 1 | v8.0.0 | ✅ | | napi_create_external_buffer | 1 | v8.0.0 | ✅ | | napi_create_object | 1 | v8.0.0 | ✅ | | napi_create_symbol | 1 | v8.0.0 | ✅ | | napi_create_typedarray | 1 | v8.0.0 | ✅ | | napi_create_dataview | 1 | v8.3.0 | ✅ | | napi_create_int32 | 1 | v8.4.0 | ✅ | | napi_create_uint32 | 1 | v8.4.0 | ✅ | | napi_create_int64 | 1 | v8.4.0 | ✅ | | napi_create_double | 1 | v8.4.0 | ✅ | | napi_create_bigint_int64 | 6 | v10.7.0 | ✅ | | napi_create_bigint_uint64 | 6 | v10.7.0 | ✅ | | napi_create_bigint_words | 6 | v10.7.0 | ✅ | | napi_create_string_latin1 | 1 | v8.0.0 | ✅ | | napi_create_string_utf16 | 1 | v8.0.0 | ✅ | | napi_create_string_utf8 | 1 | v8.0.0 | ✅ |

Functions to convert from N-API to C types

| NAPI | NAPI Version | Minimal Node Version | Status | | ---------------------------------------------------------------------------------------------------- | ------------ | -------------------- | ------ | | napi_get_array_length | 1 | v8.0.0 | ✅ | | napi_get_arraybuffer_info | 1 | v8.0.0 | ✅ | | napi_get_buffer_info | 1 | v8.0.0 | ✅ | | napi_get_prototype | 1 | v8.0.0 | ✅ | | napi_get_typedarray_info | 1 | v8.0.0 | ✅ | | napi_get_dataview_info | 1 | v8.3.0 | ✅ | | napi_get_date_value | 5 | v11.11.0 | ✅ | | napi_get_value_bool | 1 | v8.0.0 | ✅ | | napi_get_value_double | 1 | v8.0.0 | ✅ | | napi_get_value_bigint_int64 | 6 | v10.7.0 | ✅ | | napi_get_value_bigint_uint64 | 6 | v10.7.0 | ✅ | | napi_get_value_bigint_words | 6 | v10.7.0 | ✅ | | napi_get_value_external | 1 | v8.0.0 | ✅ | | napi_get_value_int32 | 1 | v8.0.0 | ✅ | | napi_get_value_int64 | 1 | v8.0.0 | ✅ | | napi_get_value_string_latin1 | 1 | v8.0.0 | ✅ | | napi_get_value_string_utf8 | 1 | v8.0.0 | ✅ | | napi_get_value_string_utf16 | 1 | v8.0.0 | ✅ | | napi_get_value_uint32 | 1 | v8.0.0 | ✅ | | napi_get_boolean | 1 | v8.0.0 | ✅ | | napi_get_global | 1 | v8.0.0 | ✅ | | napi_get_null | 1 | v8.0.0 | ✅ | | napi_get_undefined | 1 | v8.0.0 | ✅ |

Working with JavaScript Values and Abstract Operations

| NAPI | NAPI Version | Minimal Node Version | Status | | ---------------------------------------------------------------------------------------------------- | ------------ | -------------------- | ------ | | napi_coerce_to_bool | 1 | v8.0.0 | ✅ | | napi_coerce_to_number | 1 | v8.0.0 | ✅ | | napi_coerce_to_object | 1 | v8.0.0 | ✅ | | napi_coerce_to_string | 1 | v8.0.0 | ✅ | | napi_typeof | 1 | v8.0.0 | ✅ | | napi_instanceof | 1 | v8.0.0 | ✅ | | napi_is_array | 1 | v8.0.0 | ✅ | | napi_is_arraybuffer | 1 | v8.0.0 | ✅ | | napi_is_buffer | 1 | v8.0.0 | ✅ | | napi_is_date | 1 | v8.0.0 | ✅ | | napi_is_error | 1 | v8.0.0 | ✅ | | napi_is_typedarray | 1 | v8.0.0 | ✅ | | napi_is_dataview | 1 | v8.3.0 | ✅ | | napi_strict_equals | 1 | v8.0.0 | ✅ | | napi_detach_arraybuffer | 7 | v13.3.0 | ✅ | | napi_is_detached_arraybuffer | 7 | v13.3.0 | ✅ |