mirror of
https://github.com/pnpm/pnpm.git
synced 2026-07-20 12:42:38 -04:00
Add `pacquet-napi`, a napi-rs cdylib crate, plus its `@pnpm/napi` npm wrapper, exposing pacquet's programmatic engine surface to Node.js so programmatic pnpm consumers can drive the Rust engine instead of the TypeScript pnpm packages. Bit is the reference consumer. Exports: install (in-memory importers, single and multi-importer workspaces, a synchronous readPackage hook per resolved dependency manifest, build-script approval, and depsRequiringBuild), rebuild, resolveDependency, pack, parseBareSpecifier, engineVersion, and auth via authHeaderByUri. The install runs on a dedicated 32 MiB-stack worker thread with its own tokio runtime; the napi async fn awaits the result over a oneshot channel, so pacquet's borrowed State never crosses the FFI boundary. A reporter bridge forwards the engine's wire-compatible log events to a JS callback, and errors carry pnpm's ERR_PNPM_* code and hint through a structured envelope. Engine-core changes are minimal and inert for existing callers: PackageManifest::from_value, and two Option fields on Install (pnpmfile_hook_override and workspace_projects_override) defaulted to None everywhere. A new napi-release profile sets panic = "unwind" since the workspace release profile uses panic = "abort". getPeerDependencyIssues is stubbed pending pacquet's own peer-issue renderer. Distribution follows the @pnpm/exe.* model via scripts/generate-packages.mjs.