napi-rs-bindings
napi-rs conventions for exposing a Rust core to Node.js: #[napi] macros, napi::Error mapping, auto-generated .d.ts types, async Promises, and CommonJS/ESM output. Load when generating or reviewing nap
SKILL.mdinternal/builtins/bindings/napi-rs/skills/napi-rs-bindings/SKILL.md
GitHub- Use
#[napi]macro for Node.js-visible functions and classes. Use#[napi(constructor)]for constructors. - Map Rust errors to JavaScript
Errorobjects vianapi::Error. ReturnResult<T>from all fallible functions. - Use
napi::bindgen_prelude::*for common type conversions. UseBufferfor binary data. - Support both CommonJS and ESM output. Generate
.d.tstype definitions automatically. - Use
#[napi(ts_return_type = "...")]for complex TypeScript types the macro can't infer. - Build with
napi build --release. Test from TypeScript/JavaScript using a JS test runner (e.g., Vitest or Jest). - Async: use
#[napi]onasync fnfor Promise-returning functions. UseAsyncTaskfor CPU-bound work. - Keep Node.js wrappers thin — business logic in Rust, JS provides idiomatic API.
- Handle
BigInt,Date, and other JS-specific types explicitly. - Anti-patterns: no panics in napi functions, no blocking the event loop, no manual
JsValuemanipulation.