@smarlhens/npm-check-engines 1.0.0 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,55 @@
1
+ # Blue Oak Model License
2
+
3
+ Version 1.0.0
4
+
5
+ ## Purpose
6
+
7
+ This license gives everyone as much permission to work with
8
+ this software as possible, while protecting contributors
9
+ from liability.
10
+
11
+ ## Acceptance
12
+
13
+ In order to receive this license, you must agree to its
14
+ rules. The rules of this license are both obligations
15
+ under that agreement and conditions to your license.
16
+ You must not do anything with this software that triggers
17
+ a rule that you cannot or will not follow.
18
+
19
+ ## Copyright
20
+
21
+ Each contributor licenses you to do everything with this
22
+ software that would otherwise infringe that contributor's
23
+ copyright in it.
24
+
25
+ ## Notices
26
+
27
+ You must ensure that everyone who gets a copy of
28
+ any part of this software from you, with or without
29
+ changes, also gets the text of this license or a link to
30
+ <https://blueoakcouncil.org/license/1.0.0>.
31
+
32
+ ## Excuse
33
+
34
+ If anyone notifies you in writing that you have not
35
+ complied with [Notices](#notices), you can keep your
36
+ license by taking all practical steps to comply within 30
37
+ days after the notice. If you do not do so, your license
38
+ ends immediately.
39
+
40
+ ## Patent
41
+
42
+ Each contributor licenses you to do everything with this
43
+ software that would otherwise infringe any patent claims
44
+ they can license or become able to license.
45
+
46
+ ## Reliability
47
+
48
+ No contributor can revoke this license.
49
+
50
+ ## No Liability
51
+
52
+ **_As far as the law allows, this software comes as is,
53
+ without any warranty or condition, and no contributor
54
+ will be liable to anyone for any damages related to this
55
+ software or this license, under any kind of legal claim._**
package/README.md ADDED
@@ -0,0 +1,246 @@
1
+ # NPM check engines
2
+
3
+ [![CI](https://github.com/smarlhens/riri-node-tools/actions/workflows/ci.yml/badge.svg)](https://github.com/smarlhens/riri-node-tools/actions/workflows/ci.yml)
4
+ [![napi-nce](https://github.com/smarlhens/riri-node-tools/actions/workflows/napi-nce.yml/badge.svg)](https://github.com/smarlhens/riri-node-tools/actions/workflows/napi-nce.yml)
5
+ ![node-current (scoped)](https://img.shields.io/node/v/@smarlhens/npm-check-engines)
6
+ [![license](https://img.shields.io/github/license/smarlhens/riri-node-tools)](https://github.com/smarlhens/riri-node-tools/blob/main/LICENSE.md)
7
+ [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)
8
+
9
+ **npm-check-engines upgrades your package.json node engines constraint to the most restrictive used by your dependencies.**
10
+
11
+ This package ships a native Rust core via [NAPI-RS](https://napi.rs/) as part of the [riri-node-tools](https://github.com/smarlhens/riri-node-tools) monorepo.
12
+
13
+ ---
14
+
15
+ ## Table of Contents
16
+
17
+ - [Prerequisites](#prerequisites)
18
+ - [Installation](#installation)
19
+ - [Usage](#usage)
20
+ - [CLI](#cli)
21
+ - [Node API](#node-api)
22
+ - [CLI Options](#cli-options)
23
+ - [Debug](#debug)
24
+ - [Thanks](#thanks)
25
+
26
+ ---
27
+
28
+ ## Prerequisites
29
+
30
+ - [Node.js](https://nodejs.org/en/download/) **version `^20.17.0 || ^22.13.0 || >=23.5.0`**
31
+
32
+ Supported platforms:
33
+
34
+ | OS | Arch |
35
+ |---------|---------------------------|
36
+ | Linux | x64 (glibc/musl), arm64 (glibc/musl) |
37
+ | macOS | x64, arm64 |
38
+ | Windows | x64 |
39
+
40
+ ---
41
+
42
+ ## Installation
43
+
44
+ Install globally:
45
+
46
+ ```sh
47
+ npm install -g @smarlhens/npm-check-engines
48
+ ```
49
+
50
+ Or run with [npx](https://docs.npmjs.com/cli/v8/commands/npx):
51
+
52
+ ```sh
53
+ npx @smarlhens/npm-check-engines
54
+ ```
55
+
56
+ ---
57
+
58
+ ## Usage
59
+
60
+ ### CLI
61
+
62
+ Compute the most restrictive `engines.node` constraint for the project in the current directory based on the lockfile (`package-lock.json`, `yarn.lock`, or `pnpm-lock.yaml`):
63
+
64
+ ```sh
65
+ nce
66
+ ```
67
+
68
+ Sample output (against `fixtures/nce-policy-supported-eol-bump`):
69
+
70
+ ```text
71
+ node >=18.0.0 → ^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0
72
+ npm * → >=10.5.1
73
+
74
+ Run nce -u to upgrade package.json.
75
+ ```
76
+
77
+ Update `package.json` (and lockfile, when relevant) with the computed ranges:
78
+
79
+ ```sh
80
+ nce -u
81
+ ```
82
+
83
+ Emit machine-readable JSON:
84
+
85
+ ```sh
86
+ nce --json
87
+ ```
88
+
89
+ ### Node API
90
+
91
+ ```typescript
92
+ import { checkEngines } from '@smarlhens/npm-check-engines';
93
+
94
+ const packageJson = '...'; // stringified package.json
95
+ const lockfileContent = '...'; // stringified lockfile
96
+
97
+ const { computedEngines, changes } = checkEngines({
98
+ packageJson,
99
+ lockfileContent,
100
+ lockfileType: 'npm', // optional: 'npm' | 'yarn' | 'pnpm' — auto-detected when omitted
101
+ filterEngines: ['node'], // optional: restrict which engines to compute
102
+ precision: 'patch', // optional: 'major' | 'minor' | 'patch'
103
+ });
104
+
105
+ console.log(computedEngines); // { node: '^20.17.0 || ^22.13.0 || >=23.5.0', ... }
106
+ for (const { engine, from, to } of changes) {
107
+ console.log(`${engine}: "${from}" → "${to}"`);
108
+ }
109
+ ```
110
+
111
+ Additional helpers exported by the package:
112
+
113
+ ```typescript
114
+ import {
115
+ humanizeRange,
116
+ intersects,
117
+ isSubsetOf,
118
+ restrictiveRange,
119
+ satisfies,
120
+ runCli,
121
+ } from '@smarlhens/npm-check-engines';
122
+ ```
123
+
124
+ - `humanizeRange(input, precision?)` — trim trailing zero components per precision rule
125
+ - `intersects(a, b)` — do two ranges overlap
126
+ - `isSubsetOf(a, b)` — is `a` fully contained in `b`
127
+ - `restrictiveRange(a, b)` — return the most restrictive of two ranges
128
+ - `satisfies(range, version)` — does a concrete version satisfy a range
129
+ - `runCli(argv)` — run the `nce` CLI in-process; `argv[0]` must be the program name. Returns exit code.
130
+
131
+ ---
132
+
133
+ ## CLI Options
134
+
135
+ ```text
136
+ Check and update Node.js engine constraints in package.json based on the dependency tree from the lockfile
137
+
138
+ Usage: nce [OPTIONS]
139
+
140
+ Options:
141
+ -q, --quiet
142
+ Silent mode — no output
143
+
144
+ -v, --verbose
145
+ Verbose output
146
+
147
+ -d, --debug
148
+ Debug mode — detailed logging
149
+
150
+ -e, --engines <ENGINES>
151
+ Engine keys to check (e.g. node, npm, yarn). Defaults to all
152
+
153
+ -u, --update
154
+ Update package.json (and lockfile) with computed ranges
155
+
156
+ --enable-engine-strict
157
+ Create or update .npmrc with engine-strict=true
158
+
159
+ --json
160
+ Output results as JSON
161
+
162
+ --sort
163
+ Sort package.json keys on write (uses sort-package-json conventions)
164
+
165
+ --precision <PRECISION>
166
+ Version precision in output: major (e.g. >=24), minor (e.g. >=24.0), or patch (e.g. >=24.0.0). Trailing .0 components are trimmed accordingly. Non-zero components are never dropped
167
+
168
+ Possible values:
169
+ - major: Trim all trailing .0 (minimum 1 component)
170
+ - minor: Trim trailing .0 patch only (minimum 2 components)
171
+ - patch: Always show major.minor.patch
172
+
173
+ [default: patch]
174
+
175
+ --node-policy <NODE_POLICY>
176
+ Node.js lifecycle policy gate for engines.node
177
+
178
+ [default: supported]
179
+ [possible values: any, stable, supported, lts, maintenance]
180
+
181
+ --allow-eol
182
+ Suppress EOL warnings (does not widen the policy)
183
+
184
+ --bump-npm
185
+ Bump engines.npm floor to match the lowest node major in range
186
+
187
+ --no-bump-npm
188
+ Disable the npm coupling pass
189
+
190
+ --npm-precision <NPM_PRECISION>
191
+ Precision applied to the npm bump floor
192
+
193
+ Possible values:
194
+ - major: Trim all trailing .0 (minimum 1 component)
195
+ - minor: Trim trailing .0 patch only (minimum 2 components)
196
+ - patch: Always show major.minor.patch
197
+
198
+ [default: major]
199
+
200
+ --refresh
201
+ Fetch fresh lifecycle data from upstream and update the user cache. Continues with the rest of the run after writing the cache
202
+
203
+ -h, --help
204
+ Print help (see a summary with '-h')
205
+
206
+ -V, --version
207
+ Print version
208
+ ```
209
+
210
+ ---
211
+
212
+ ## Debug
213
+
214
+ ```sh
215
+ nce -d
216
+ ```
217
+
218
+ The `-d/--debug` flag enables detailed logging to stderr. No environment variable is required.
219
+
220
+ <details>
221
+ <summary>Sample debug output (against <code>fixtures/nce-policy-supported-eol-bump</code>)</summary>
222
+
223
+ ```text
224
+ ▸ Detecting lockfile......
225
+ ✓ Detected package-lock.json
226
+ ▸ Reading package.json......
227
+ ✓ Read package.json
228
+ ▸ Parsing lockfile......
229
+ ✓ Parsed lockfile
230
+ ▸ Computing engine constraints......
231
+ ✓ Computed engine constraints
232
+ node >=18.0.0 → ^22.0.0 || ^24.0.0 || ^25.0.0 || >=26.0.0
233
+ npm * → >=10.5.1
234
+
235
+ Run nce -d -u to upgrade package.json.
236
+ ```
237
+
238
+ </details>
239
+
240
+ ---
241
+
242
+ ## Thanks
243
+
244
+ Originally inspired by [npm-check-updates](https://github.com/raineorshine/npm-check-updates).
245
+
246
+ ---
package/index.d.ts ADDED
@@ -0,0 +1,38 @@
1
+ /* auto-generated by NAPI-RS */
2
+ /* eslint-disable */
3
+ export declare function checkEngines(options: CheckEnginesOptions): CheckEnginesResult
4
+
5
+ export interface CheckEnginesOptions {
6
+ packageJson: string
7
+ lockfileContent: string
8
+ lockfileType?: string
9
+ filterEngines?: Array<string>
10
+ precision?: string
11
+ }
12
+
13
+ export interface CheckEnginesResult {
14
+ computedEngines: Record<string, string>
15
+ changes: Array<EngineChange>
16
+ }
17
+
18
+ export interface EngineChange {
19
+ engine: string
20
+ from: string
21
+ to: string
22
+ }
23
+
24
+ export declare function humanizeRange(input: string, precision?: string | undefined | null): string
25
+
26
+ export declare function intersects(range1: string, range2: string): boolean
27
+
28
+ export declare function isSubsetOf(range1: string, range2: string): boolean
29
+
30
+ export declare function restrictiveRange(range1: string, range2: string): string
31
+
32
+ /**
33
+ * Run the `nce` CLI in-process. `argv` must include the program name at
34
+ * index 0 (e.g. `["nce", "--json"]`). Returns the exit code.
35
+ */
36
+ export declare function runCli(argv: Array<string>): number
37
+
38
+ export declare function satisfies(range: string, version: string): boolean
package/index.js ADDED
@@ -0,0 +1,585 @@
1
+ // prettier-ignore
2
+ /* eslint-disable */
3
+ // @ts-nocheck
4
+ /* auto-generated by NAPI-RS */
5
+
6
+ const { readFileSync } = require('node:fs')
7
+ let nativeBinding = null
8
+ const loadErrors = []
9
+
10
+ const isMusl = () => {
11
+ let musl = false
12
+ if (process.platform === 'linux') {
13
+ musl = isMuslFromFilesystem()
14
+ if (musl === null) {
15
+ musl = isMuslFromReport()
16
+ }
17
+ if (musl === null) {
18
+ musl = isMuslFromChildProcess()
19
+ }
20
+ }
21
+ return musl
22
+ }
23
+
24
+ const isFileMusl = (f) => f.includes('libc.musl-') || f.includes('ld-musl-')
25
+
26
+ const isMuslFromFilesystem = () => {
27
+ try {
28
+ return readFileSync('/usr/bin/ldd', 'utf-8').includes('musl')
29
+ } catch {
30
+ return null
31
+ }
32
+ }
33
+
34
+ const isMuslFromReport = () => {
35
+ let report = null
36
+ if (typeof process.report?.getReport === 'function') {
37
+ process.report.excludeNetwork = true
38
+ report = process.report.getReport()
39
+ }
40
+ if (!report) {
41
+ return null
42
+ }
43
+ if (report.header && report.header.glibcVersionRuntime) {
44
+ return false
45
+ }
46
+ if (Array.isArray(report.sharedObjects)) {
47
+ if (report.sharedObjects.some(isFileMusl)) {
48
+ return true
49
+ }
50
+ }
51
+ return false
52
+ }
53
+
54
+ const isMuslFromChildProcess = () => {
55
+ try {
56
+ return require('child_process').execSync('ldd --version', { encoding: 'utf8' }).includes('musl')
57
+ } catch (e) {
58
+ // If we reach this case, we don't know if the system is musl or not, so is better to just fallback to false
59
+ return false
60
+ }
61
+ }
62
+
63
+ function requireNative() {
64
+ if (process.env.NAPI_RS_NATIVE_LIBRARY_PATH) {
65
+ try {
66
+ return require(process.env.NAPI_RS_NATIVE_LIBRARY_PATH);
67
+ } catch (err) {
68
+ loadErrors.push(err)
69
+ }
70
+ } else if (process.platform === 'android') {
71
+ if (process.arch === 'arm64') {
72
+ try {
73
+ return require('./npm-check-engines.android-arm64.node')
74
+ } catch (e) {
75
+ loadErrors.push(e)
76
+ }
77
+ try {
78
+ const binding = require('@smarlhens/npm-check-engines-android-arm64')
79
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-android-arm64/package.json').version
80
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
81
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
82
+ }
83
+ return binding
84
+ } catch (e) {
85
+ loadErrors.push(e)
86
+ }
87
+ } else if (process.arch === 'arm') {
88
+ try {
89
+ return require('./npm-check-engines.android-arm-eabi.node')
90
+ } catch (e) {
91
+ loadErrors.push(e)
92
+ }
93
+ try {
94
+ const binding = require('@smarlhens/npm-check-engines-android-arm-eabi')
95
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-android-arm-eabi/package.json').version
96
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
97
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
98
+ }
99
+ return binding
100
+ } catch (e) {
101
+ loadErrors.push(e)
102
+ }
103
+ } else {
104
+ loadErrors.push(new Error(`Unsupported architecture on Android ${process.arch}`))
105
+ }
106
+ } else if (process.platform === 'win32') {
107
+ if (process.arch === 'x64') {
108
+ if (process.config?.variables?.shlib_suffix === 'dll.a' || process.config?.variables?.node_target_type === 'shared_library') {
109
+ try {
110
+ return require('./npm-check-engines.win32-x64-gnu.node')
111
+ } catch (e) {
112
+ loadErrors.push(e)
113
+ }
114
+ try {
115
+ const binding = require('@smarlhens/npm-check-engines-win32-x64-gnu')
116
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-win32-x64-gnu/package.json').version
117
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
118
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
119
+ }
120
+ return binding
121
+ } catch (e) {
122
+ loadErrors.push(e)
123
+ }
124
+ } else {
125
+ try {
126
+ return require('./npm-check-engines.win32-x64-msvc.node')
127
+ } catch (e) {
128
+ loadErrors.push(e)
129
+ }
130
+ try {
131
+ const binding = require('@smarlhens/npm-check-engines-win32-x64-msvc')
132
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-win32-x64-msvc/package.json').version
133
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
134
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
135
+ }
136
+ return binding
137
+ } catch (e) {
138
+ loadErrors.push(e)
139
+ }
140
+ }
141
+ } else if (process.arch === 'ia32') {
142
+ try {
143
+ return require('./npm-check-engines.win32-ia32-msvc.node')
144
+ } catch (e) {
145
+ loadErrors.push(e)
146
+ }
147
+ try {
148
+ const binding = require('@smarlhens/npm-check-engines-win32-ia32-msvc')
149
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-win32-ia32-msvc/package.json').version
150
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
151
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
152
+ }
153
+ return binding
154
+ } catch (e) {
155
+ loadErrors.push(e)
156
+ }
157
+ } else if (process.arch === 'arm64') {
158
+ try {
159
+ return require('./npm-check-engines.win32-arm64-msvc.node')
160
+ } catch (e) {
161
+ loadErrors.push(e)
162
+ }
163
+ try {
164
+ const binding = require('@smarlhens/npm-check-engines-win32-arm64-msvc')
165
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-win32-arm64-msvc/package.json').version
166
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
167
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
168
+ }
169
+ return binding
170
+ } catch (e) {
171
+ loadErrors.push(e)
172
+ }
173
+ } else {
174
+ loadErrors.push(new Error(`Unsupported architecture on Windows: ${process.arch}`))
175
+ }
176
+ } else if (process.platform === 'darwin') {
177
+ try {
178
+ return require('./npm-check-engines.darwin-universal.node')
179
+ } catch (e) {
180
+ loadErrors.push(e)
181
+ }
182
+ try {
183
+ const binding = require('@smarlhens/npm-check-engines-darwin-universal')
184
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-darwin-universal/package.json').version
185
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
186
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
187
+ }
188
+ return binding
189
+ } catch (e) {
190
+ loadErrors.push(e)
191
+ }
192
+ if (process.arch === 'x64') {
193
+ try {
194
+ return require('./npm-check-engines.darwin-x64.node')
195
+ } catch (e) {
196
+ loadErrors.push(e)
197
+ }
198
+ try {
199
+ const binding = require('@smarlhens/npm-check-engines-darwin-x64')
200
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-darwin-x64/package.json').version
201
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
202
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
203
+ }
204
+ return binding
205
+ } catch (e) {
206
+ loadErrors.push(e)
207
+ }
208
+ } else if (process.arch === 'arm64') {
209
+ try {
210
+ return require('./npm-check-engines.darwin-arm64.node')
211
+ } catch (e) {
212
+ loadErrors.push(e)
213
+ }
214
+ try {
215
+ const binding = require('@smarlhens/npm-check-engines-darwin-arm64')
216
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-darwin-arm64/package.json').version
217
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
218
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
219
+ }
220
+ return binding
221
+ } catch (e) {
222
+ loadErrors.push(e)
223
+ }
224
+ } else {
225
+ loadErrors.push(new Error(`Unsupported architecture on macOS: ${process.arch}`))
226
+ }
227
+ } else if (process.platform === 'freebsd') {
228
+ if (process.arch === 'x64') {
229
+ try {
230
+ return require('./npm-check-engines.freebsd-x64.node')
231
+ } catch (e) {
232
+ loadErrors.push(e)
233
+ }
234
+ try {
235
+ const binding = require('@smarlhens/npm-check-engines-freebsd-x64')
236
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-freebsd-x64/package.json').version
237
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
238
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
239
+ }
240
+ return binding
241
+ } catch (e) {
242
+ loadErrors.push(e)
243
+ }
244
+ } else if (process.arch === 'arm64') {
245
+ try {
246
+ return require('./npm-check-engines.freebsd-arm64.node')
247
+ } catch (e) {
248
+ loadErrors.push(e)
249
+ }
250
+ try {
251
+ const binding = require('@smarlhens/npm-check-engines-freebsd-arm64')
252
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-freebsd-arm64/package.json').version
253
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
254
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
255
+ }
256
+ return binding
257
+ } catch (e) {
258
+ loadErrors.push(e)
259
+ }
260
+ } else {
261
+ loadErrors.push(new Error(`Unsupported architecture on FreeBSD: ${process.arch}`))
262
+ }
263
+ } else if (process.platform === 'linux') {
264
+ if (process.arch === 'x64') {
265
+ if (isMusl()) {
266
+ try {
267
+ return require('./npm-check-engines.linux-x64-musl.node')
268
+ } catch (e) {
269
+ loadErrors.push(e)
270
+ }
271
+ try {
272
+ const binding = require('@smarlhens/npm-check-engines-linux-x64-musl')
273
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-x64-musl/package.json').version
274
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
275
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
276
+ }
277
+ return binding
278
+ } catch (e) {
279
+ loadErrors.push(e)
280
+ }
281
+ } else {
282
+ try {
283
+ return require('./npm-check-engines.linux-x64-gnu.node')
284
+ } catch (e) {
285
+ loadErrors.push(e)
286
+ }
287
+ try {
288
+ const binding = require('@smarlhens/npm-check-engines-linux-x64-gnu')
289
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-x64-gnu/package.json').version
290
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
291
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
292
+ }
293
+ return binding
294
+ } catch (e) {
295
+ loadErrors.push(e)
296
+ }
297
+ }
298
+ } else if (process.arch === 'arm64') {
299
+ if (isMusl()) {
300
+ try {
301
+ return require('./npm-check-engines.linux-arm64-musl.node')
302
+ } catch (e) {
303
+ loadErrors.push(e)
304
+ }
305
+ try {
306
+ const binding = require('@smarlhens/npm-check-engines-linux-arm64-musl')
307
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-arm64-musl/package.json').version
308
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
309
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
310
+ }
311
+ return binding
312
+ } catch (e) {
313
+ loadErrors.push(e)
314
+ }
315
+ } else {
316
+ try {
317
+ return require('./npm-check-engines.linux-arm64-gnu.node')
318
+ } catch (e) {
319
+ loadErrors.push(e)
320
+ }
321
+ try {
322
+ const binding = require('@smarlhens/npm-check-engines-linux-arm64-gnu')
323
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-arm64-gnu/package.json').version
324
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
325
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
326
+ }
327
+ return binding
328
+ } catch (e) {
329
+ loadErrors.push(e)
330
+ }
331
+ }
332
+ } else if (process.arch === 'arm') {
333
+ if (isMusl()) {
334
+ try {
335
+ return require('./npm-check-engines.linux-arm-musleabihf.node')
336
+ } catch (e) {
337
+ loadErrors.push(e)
338
+ }
339
+ try {
340
+ const binding = require('@smarlhens/npm-check-engines-linux-arm-musleabihf')
341
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-arm-musleabihf/package.json').version
342
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
343
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
344
+ }
345
+ return binding
346
+ } catch (e) {
347
+ loadErrors.push(e)
348
+ }
349
+ } else {
350
+ try {
351
+ return require('./npm-check-engines.linux-arm-gnueabihf.node')
352
+ } catch (e) {
353
+ loadErrors.push(e)
354
+ }
355
+ try {
356
+ const binding = require('@smarlhens/npm-check-engines-linux-arm-gnueabihf')
357
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-arm-gnueabihf/package.json').version
358
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
359
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
360
+ }
361
+ return binding
362
+ } catch (e) {
363
+ loadErrors.push(e)
364
+ }
365
+ }
366
+ } else if (process.arch === 'loong64') {
367
+ if (isMusl()) {
368
+ try {
369
+ return require('./npm-check-engines.linux-loong64-musl.node')
370
+ } catch (e) {
371
+ loadErrors.push(e)
372
+ }
373
+ try {
374
+ const binding = require('@smarlhens/npm-check-engines-linux-loong64-musl')
375
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-loong64-musl/package.json').version
376
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
377
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
378
+ }
379
+ return binding
380
+ } catch (e) {
381
+ loadErrors.push(e)
382
+ }
383
+ } else {
384
+ try {
385
+ return require('./npm-check-engines.linux-loong64-gnu.node')
386
+ } catch (e) {
387
+ loadErrors.push(e)
388
+ }
389
+ try {
390
+ const binding = require('@smarlhens/npm-check-engines-linux-loong64-gnu')
391
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-loong64-gnu/package.json').version
392
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
393
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
394
+ }
395
+ return binding
396
+ } catch (e) {
397
+ loadErrors.push(e)
398
+ }
399
+ }
400
+ } else if (process.arch === 'riscv64') {
401
+ if (isMusl()) {
402
+ try {
403
+ return require('./npm-check-engines.linux-riscv64-musl.node')
404
+ } catch (e) {
405
+ loadErrors.push(e)
406
+ }
407
+ try {
408
+ const binding = require('@smarlhens/npm-check-engines-linux-riscv64-musl')
409
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-riscv64-musl/package.json').version
410
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
411
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
412
+ }
413
+ return binding
414
+ } catch (e) {
415
+ loadErrors.push(e)
416
+ }
417
+ } else {
418
+ try {
419
+ return require('./npm-check-engines.linux-riscv64-gnu.node')
420
+ } catch (e) {
421
+ loadErrors.push(e)
422
+ }
423
+ try {
424
+ const binding = require('@smarlhens/npm-check-engines-linux-riscv64-gnu')
425
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-riscv64-gnu/package.json').version
426
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
427
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
428
+ }
429
+ return binding
430
+ } catch (e) {
431
+ loadErrors.push(e)
432
+ }
433
+ }
434
+ } else if (process.arch === 'ppc64') {
435
+ try {
436
+ return require('./npm-check-engines.linux-ppc64-gnu.node')
437
+ } catch (e) {
438
+ loadErrors.push(e)
439
+ }
440
+ try {
441
+ const binding = require('@smarlhens/npm-check-engines-linux-ppc64-gnu')
442
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-ppc64-gnu/package.json').version
443
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
444
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
445
+ }
446
+ return binding
447
+ } catch (e) {
448
+ loadErrors.push(e)
449
+ }
450
+ } else if (process.arch === 's390x') {
451
+ try {
452
+ return require('./npm-check-engines.linux-s390x-gnu.node')
453
+ } catch (e) {
454
+ loadErrors.push(e)
455
+ }
456
+ try {
457
+ const binding = require('@smarlhens/npm-check-engines-linux-s390x-gnu')
458
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-linux-s390x-gnu/package.json').version
459
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
460
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
461
+ }
462
+ return binding
463
+ } catch (e) {
464
+ loadErrors.push(e)
465
+ }
466
+ } else {
467
+ loadErrors.push(new Error(`Unsupported architecture on Linux: ${process.arch}`))
468
+ }
469
+ } else if (process.platform === 'openharmony') {
470
+ if (process.arch === 'arm64') {
471
+ try {
472
+ return require('./npm-check-engines.openharmony-arm64.node')
473
+ } catch (e) {
474
+ loadErrors.push(e)
475
+ }
476
+ try {
477
+ const binding = require('@smarlhens/npm-check-engines-openharmony-arm64')
478
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-openharmony-arm64/package.json').version
479
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
480
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
481
+ }
482
+ return binding
483
+ } catch (e) {
484
+ loadErrors.push(e)
485
+ }
486
+ } else if (process.arch === 'x64') {
487
+ try {
488
+ return require('./npm-check-engines.openharmony-x64.node')
489
+ } catch (e) {
490
+ loadErrors.push(e)
491
+ }
492
+ try {
493
+ const binding = require('@smarlhens/npm-check-engines-openharmony-x64')
494
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-openharmony-x64/package.json').version
495
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
496
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
497
+ }
498
+ return binding
499
+ } catch (e) {
500
+ loadErrors.push(e)
501
+ }
502
+ } else if (process.arch === 'arm') {
503
+ try {
504
+ return require('./npm-check-engines.openharmony-arm.node')
505
+ } catch (e) {
506
+ loadErrors.push(e)
507
+ }
508
+ try {
509
+ const binding = require('@smarlhens/npm-check-engines-openharmony-arm')
510
+ const bindingPackageVersion = require('@smarlhens/npm-check-engines-openharmony-arm/package.json').version
511
+ if (bindingPackageVersion !== '1.1.0' && process.env.NAPI_RS_ENFORCE_VERSION_CHECK && process.env.NAPI_RS_ENFORCE_VERSION_CHECK !== '0') {
512
+ throw new Error(`Native binding package version mismatch, expected 1.1.0 but got ${bindingPackageVersion}. You can reinstall dependencies to fix this issue.`)
513
+ }
514
+ return binding
515
+ } catch (e) {
516
+ loadErrors.push(e)
517
+ }
518
+ } else {
519
+ loadErrors.push(new Error(`Unsupported architecture on OpenHarmony: ${process.arch}`))
520
+ }
521
+ } else {
522
+ loadErrors.push(new Error(`Unsupported OS: ${process.platform}, architecture: ${process.arch}`))
523
+ }
524
+ }
525
+
526
+ nativeBinding = requireNative()
527
+
528
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
529
+ let wasiBinding = null
530
+ let wasiBindingError = null
531
+ try {
532
+ wasiBinding = require('./npm-check-engines.wasi.cjs')
533
+ nativeBinding = wasiBinding
534
+ } catch (err) {
535
+ if (process.env.NAPI_RS_FORCE_WASI) {
536
+ wasiBindingError = err
537
+ }
538
+ }
539
+ if (!nativeBinding || process.env.NAPI_RS_FORCE_WASI) {
540
+ try {
541
+ wasiBinding = require('@smarlhens/npm-check-engines-wasm32-wasi')
542
+ nativeBinding = wasiBinding
543
+ } catch (err) {
544
+ if (process.env.NAPI_RS_FORCE_WASI) {
545
+ if (!wasiBindingError) {
546
+ wasiBindingError = err
547
+ } else {
548
+ wasiBindingError.cause = err
549
+ }
550
+ loadErrors.push(err)
551
+ }
552
+ }
553
+ }
554
+ if (process.env.NAPI_RS_FORCE_WASI === 'error' && !wasiBinding) {
555
+ const error = new Error('WASI binding not found and NAPI_RS_FORCE_WASI is set to error')
556
+ error.cause = wasiBindingError
557
+ throw error
558
+ }
559
+ }
560
+
561
+ if (!nativeBinding) {
562
+ if (loadErrors.length > 0) {
563
+ throw new Error(
564
+ `Cannot find native binding. ` +
565
+ `npm has a bug related to optional dependencies (https://github.com/npm/cli/issues/4828). ` +
566
+ 'Please try `npm i` again after removing both package-lock.json and node_modules directory.',
567
+ {
568
+ cause: loadErrors.reduce((err, cur) => {
569
+ cur.cause = err
570
+ return cur
571
+ }),
572
+ },
573
+ )
574
+ }
575
+ throw new Error(`Failed to load native binding`)
576
+ }
577
+
578
+ module.exports = nativeBinding
579
+ module.exports.checkEngines = nativeBinding.checkEngines
580
+ module.exports.humanizeRange = nativeBinding.humanizeRange
581
+ module.exports.intersects = nativeBinding.intersects
582
+ module.exports.isSubsetOf = nativeBinding.isSubsetOf
583
+ module.exports.restrictiveRange = nativeBinding.restrictiveRange
584
+ module.exports.runCli = nativeBinding.runCli
585
+ module.exports.satisfies = nativeBinding.satisfies
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@smarlhens/npm-check-engines",
3
- "version": "1.0.0",
3
+ "version": "1.1.0",
4
4
  "description": "Check and update Node.js engine constraints in package.json",
5
5
  "license": "BlueOak-1.0.0",
6
6
  "author": "Samuel MARLHENS <samuel.marlhens@proton.me>",
@@ -27,7 +27,7 @@
27
27
  "artifacts": "napi artifacts",
28
28
  "build": "napi build --platform --release",
29
29
  "build:debug": "napi build --platform",
30
- "prepublishOnly": "napi prepublish -t npm",
30
+ "prepublishOnly": "napi prepublish -t npm --no-gh-release",
31
31
  "version": "napi version"
32
32
  },
33
33
  "devDependencies": {
@@ -49,12 +49,12 @@
49
49
  "node": "^20.17.0 || ^22.13.0 || >=23.5.0"
50
50
  },
51
51
  "optionalDependencies": {
52
- "@smarlhens/npm-check-engines-linux-x64-gnu": "1.0.0",
53
- "@smarlhens/npm-check-engines-linux-x64-musl": "1.0.0",
54
- "@smarlhens/npm-check-engines-linux-arm64-gnu": "1.0.0",
55
- "@smarlhens/npm-check-engines-linux-arm64-musl": "1.0.0",
56
- "@smarlhens/npm-check-engines-darwin-x64": "1.0.0",
57
- "@smarlhens/npm-check-engines-darwin-arm64": "1.0.0",
58
- "@smarlhens/npm-check-engines-win32-x64-msvc": "1.0.0"
52
+ "@smarlhens/npm-check-engines-linux-x64-gnu": "1.1.0",
53
+ "@smarlhens/npm-check-engines-linux-x64-musl": "1.1.0",
54
+ "@smarlhens/npm-check-engines-linux-arm64-gnu": "1.1.0",
55
+ "@smarlhens/npm-check-engines-linux-arm64-musl": "1.1.0",
56
+ "@smarlhens/npm-check-engines-darwin-x64": "1.1.0",
57
+ "@smarlhens/npm-check-engines-darwin-arm64": "1.1.0",
58
+ "@smarlhens/npm-check-engines-win32-x64-msvc": "1.1.0"
59
59
  }
60
60
  }