Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .yarnrc.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,9 @@ nodeLinker: node-modules
npmAuditRegistry: 'https://registry.npmjs.org'

yarnPath: .yarn/releases/yarn-4.18.0.cjs

npmPreapprovedPackages:
- '@napi-rs/*'
- '@oxc-node/*'
- oxlint
- '@oxlint/*'
12 changes: 2 additions & 10 deletions index.d.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
/* auto-generated by NAPI-RS */
/* eslint-disable */

export declare class AsyncEntry {
/**
* Create an entry for the given service and username.
Expand Down Expand Up @@ -228,13 +229,4 @@ export interface LinuxEntryOptions {
* Linux only; ignored on other platforms. Requiring a store that is
* unavailable on this machine throws instead of falling back.
*/
export type LinuxStore = /**
* The freedesktop Secret Service (D-Bus) as provided by gnome-keyring or
* KWallet. Persistent daemon-backed storage.
*/
'secret-service'|
/**
* The Linux kernel keyring via keyutils. In-memory only: credentials
* vanish on reboot.
*/
'keyutils';
export type LinuxStore = 'secret-service' | 'keyutils'
257 changes: 224 additions & 33 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,8 @@
// prettier-ignore
/* eslint-disable */
// @ts-nocheck
/* auto-generated by NAPI-RS */

const { createRequire } = require('node:module')
require = createRequire(__filename)

const { readFileSync } = require('node:fs')
const { readFileSync } = require('fs')
let nativeBinding = null
const loadErrors = []

Expand Down Expand Up @@ -36,7 +32,7 @@ const isMuslFromFilesystem = () => {

const isMuslFromReport = () => {
let report = null
if (typeof process.report?.getReport === 'function') {
if (process.report && typeof process.report.getReport === 'function') {
process.report.excludeNetwork = true
report = process.report.getReport()
}
Expand Down Expand Up @@ -66,7 +62,7 @@ const isMuslFromChildProcess = () => {
function requireNative() {
if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
try {
nativeBinding = require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH)
} catch (err) {
loadErrors.push(err)
}
Expand Down Expand Up @@ -108,20 +104,38 @@ function requireNative() {
}
} else if (process.platform === 'win32') {
if (process.arch === 'x64') {
try {
return require('./keyring.win32-x64-msvc.node')
} catch (e) {
loadErrors.push(e)
}
try {
const binding = require('@napi-rs/keyring-win32-x64-msvc')
const bindingPackageVersion = require('@napi-rs/keyring-win32-x64-msvc/package.json').version
if (bindingPackageVersion !== '2.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
throw new Error(`Native binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
if ((process.config && process.config.variables && process.config.variables.shlib_suffix === 'dll.a') || (process.config && process.config.variables && process.config.variables.node_target_type === 'shared_library')) {
try {
return require('./keyring.win32-x64-gnu.node')
} catch (e) {
loadErrors.push(e)
}
try {
const binding = require('@napi-rs/keyring-win32-x64-gnu')
const bindingPackageVersion = require('@napi-rs/keyring-win32-x64-gnu/package.json').version
if (bindingPackageVersion !== '2.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
throw new Error(`Native binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
}
return binding
} catch (e) {
loadErrors.push(e)
}
} else {
try {
return require('./keyring.win32-x64-msvc.node')
} catch (e) {
loadErrors.push(e)
}
try {
const binding = require('@napi-rs/keyring-win32-x64-msvc')
const bindingPackageVersion = require('@napi-rs/keyring-win32-x64-msvc/package.json').version
if (bindingPackageVersion !== '2.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
throw new Error(`Native binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
}
return binding
} catch (e) {
loadErrors.push(e)
}
return binding
} catch (e) {
loadErrors.push(e)
}
} else if (process.arch === 'ia32') {
try {
Expand Down Expand Up @@ -348,6 +362,40 @@ function requireNative() {
loadErrors.push(e)
}
}
} else if (process.arch === 'loong64') {
if (isMusl()) {
try {
return require('./keyring.linux-loong64-musl.node')
} catch (e) {
loadErrors.push(e)
}
try {
const binding = require('@napi-rs/keyring-linux-loong64-musl')
const bindingPackageVersion = require('@napi-rs/keyring-linux-loong64-musl/package.json').version
if (bindingPackageVersion !== '2.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
throw new Error(`Native binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
}
return binding
} catch (e) {
loadErrors.push(e)
}
} else {
try {
return require('./keyring.linux-loong64-gnu.node')
} catch (e) {
loadErrors.push(e)
}
try {
const binding = require('@napi-rs/keyring-linux-loong64-gnu')
const bindingPackageVersion = require('@napi-rs/keyring-linux-loong64-gnu/package.json').version
if (bindingPackageVersion !== '2.0.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
throw new Error(`Native binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
}
return binding
} catch (e) {
loadErrors.push(e)
}
}
} else if (process.arch === 'riscv64') {
if (isMusl()) {
try {
Expand Down Expand Up @@ -474,35 +522,178 @@ function requireNative() {
}
}

nativeBinding = requireNative()
function createLoadErrorChain(errors) {
return errors.reduce((previous, current) => {
let message
try {
message =
current && typeof current.message === 'string'
? current.message
: String(current)
} catch {
message = 'Unknown error'
}
const error = new Error(message)
error.cause = previous
return error
}, null)
}

if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
try {
nativeBinding = require('./keyring.wasi.cjs')
} catch (err) {
if (process.env.NAPI_RS_FORCE_WASI) {
loadErrors.push(err)
// NAPI_RS_FORCE_WASI is a tri-state flag:
// unset / any other value → native binding preferred, WASI is only a fallback
// 'true' → prefer WASI, but retain native as a lazy fallback
// 'error' → require WASI without initializing a native fallback
// Treating any non-empty string as truthy (the historical behavior) meant
// NAPI_RS_FORCE_WASI=false, NAPI_RS_FORCE_WASI=0, etc. inadvertently triggered
// the WASI path, causing ENOENT for packages shipped without a .wasi.cjs file.
//
// NAPI_RS_WASI_FLAVOR selects one exact generated flavor and implies strict
// WASI loading. It never crosses into another flavor or falls back to native.
const __napiWasiFlavors = ['wasm32-wasi']
const __napiWasiFlavor = process.env.NAPI_RS_WASI_FLAVOR
const __napiWasiFlavorRequested =
typeof __napiWasiFlavor === 'string' && __napiWasiFlavor.length > 0
if (
__napiWasiFlavorRequested &&
__napiWasiFlavors.indexOf(__napiWasiFlavor) === -1
) {
throw new Error(
'Unsupported WASI flavor "' +
__napiWasiFlavor +
'". Available flavors: ' +
__napiWasiFlavors.join(', '),
)
}
const forceWasiError = process.env.NAPI_RS_FORCE_WASI === 'error'
const forceWasi =
process.env.NAPI_RS_FORCE_WASI === 'true' ||
forceWasiError ||
__napiWasiFlavorRequested

if (!forceWasi) {
nativeBinding = requireNative()
}

if (!nativeBinding || forceWasi) {
let wasiBinding = null
let wasiBindingLoaded = false
const wasiBindingErrors = []
const __napiWasiResolveCandidate = (specifier, isPackage, localArtifacts) => {
try {
require.resolve(specifier)
} catch (resolveError) {
if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
throw resolveError
}
if (isPackage) {
try {
require.resolve(specifier + '/package.json')
} catch (packageError) {
if (packageError && packageError.code === 'MODULE_NOT_FOUND') {
return resolveError
}
// An exports restriction proves the package exists even when its
// package.json is not public. Preserve the root resolution failure.
throw resolveError
}
// The package exists but its main/export target is broken.
throw resolveError
}
return resolveError
}
if (localArtifacts) {
let artifactError = null
for (let i = 0; i < localArtifacts.length; i++) {
try {
require.resolve(localArtifacts[i])
return null
} catch (resolveError) {
if (!resolveError || resolveError.code !== 'MODULE_NOT_FOUND') {
throw resolveError
}
artifactError = resolveError
}
}
return artifactError
}
return null
}
if (!nativeBinding) {
if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === 'wasm32-wasi')) {
let candidateError = null
let candidateFailed = false
try {
nativeBinding = require('@napi-rs/keyring-wasm32-wasi')
candidateError = __napiWasiResolveCandidate('./keyring.wasi.cjs', false, ['./keyring.wasm32-wasi.debug.wasm', './keyring.wasm32-wasi.wasm'])
candidateFailed = candidateError !== null
if (!candidateFailed) {
wasiBinding = require('./keyring.wasi.cjs')
nativeBinding = wasiBinding
wasiBindingLoaded = true
}
} catch (err) {
if (process.env.NAPI_RS_FORCE_WASI) {
loadErrors.push(err)
candidateError = err
candidateFailed = true
}
if (candidateFailed) {
wasiBindingErrors.push(candidateError)
loadErrors.push(candidateError)
}
}
if (!wasiBindingLoaded && (!__napiWasiFlavorRequested || __napiWasiFlavor === 'wasm32-wasi')) {
let candidateError = null
let candidateFailed = false
try {
candidateError = __napiWasiResolveCandidate('@napi-rs/keyring-wasm32-wasi', true, undefined)
candidateFailed = candidateError !== null
if (!candidateFailed) {
if (process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
const bindingPackageVersion = require('@napi-rs/keyring-wasm32-wasi/package.json').version
if (bindingPackageVersion !== '2.0.0') {
throw new Error(`WASI binding package version mismatch, expected 2.0.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
}
}
wasiBinding = require('@napi-rs/keyring-wasm32-wasi')
nativeBinding = wasiBinding
wasiBindingLoaded = true
}
} catch (err) {
candidateError = err
candidateFailed = true
}
if (candidateFailed) {
wasiBindingErrors.push(candidateError)
loadErrors.push(candidateError)
}
}
if (
!wasiBindingLoaded &&
forceWasi &&
!forceWasiError &&
!__napiWasiFlavorRequested
) {
nativeBinding = requireNative()
}
if ((forceWasiError || __napiWasiFlavorRequested) && !wasiBindingLoaded) {
const error = new Error(
__napiWasiFlavorRequested
? 'WASI binding for flavor "' + __napiWasiFlavor + '" not found'
: 'WASI binding not found and NAPI_RS_FORCE_WASI is set to error',
)
error.cause = createLoadErrorChain(wasiBindingErrors)
throw error
}
}

if (!nativeBinding) {
if (loadErrors.length > 0) {
throw new Error(
const error = new Error(
`Cannot find native binding. ` +
`npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
{ cause: loadErrors }
)
// assign instead of the `new Error(message, { cause })` options form,
// which Node < 16.9 silently ignores
error.cause = createLoadErrorChain(loadErrors)
throw error
}
throw new Error(`Failed to load native binding`)
}
Expand Down
18 changes: 9 additions & 9 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -59,18 +59,18 @@
"version": "napi version"
},
"devDependencies": {
"@napi-rs/cli": "^3.1.5",
"@oxc-node/core": "^0.1.0",
"@napi-rs/cli": "^3.9.1",
"@oxc-node/core": "^0.1.1",
"@taplo/cli": "^0.7.0",
"@types/node": "^24.3.0",
"ava": "^8.0.0",
"@types/node": "^26.5.1",
"ava": "^8.0.1",
"chalk": "^6.0.0",
"husky": "^9.1.7",
"lint-staged": "^17.0.0",
"npm-run-all2": "^9.0.0",
"oxlint": "^1.13.0",
"prettier": "^3.6.2",
"typescript": "^7.0.0"
"lint-staged": "^17.5.1",
"npm-run-all2": "^9.0.3",
"oxlint": "^1.82.0",
"prettier": "^3.9.6",
"typescript": "^7.0.2"
},
"lint-staged": {
"*.@(js|ts|tsx)": [
Expand Down
Loading
Loading