@smarlhens/npm-check-engines 0.14.4 → 1.0.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/bin/nce.js ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ // Thin shim: forwards argv to the Rust CLI compiled as a NAPI addon.
3
+ // Output (stdout/stderr) is written by Rust directly to the host process.
4
+
5
+ const { runCli } = require('..');
6
+
7
+ const code = runCli(['nce', ...process.argv.slice(2)]);
8
+ process.exit(code);
package/package.json CHANGED
@@ -1,107 +1,60 @@
1
1
  {
2
2
  "name": "@smarlhens/npm-check-engines",
3
- "version": "0.14.4",
4
- "description": "Node.JS engines constraint checker written in TypeScript.",
5
- "keywords": [
6
- "engines",
7
- "node",
8
- "npm",
9
- "typescript"
10
- ],
11
- "homepage": "https://github.com/smarlhens/npm-check-engines#readme",
12
- "bugs": {
13
- "url": "https://github.com/smarlhens/npm-check-engines/issues"
14
- },
3
+ "version": "1.0.0",
4
+ "description": "Check and update Node.js engine constraints in package.json",
15
5
  "license": "BlueOak-1.0.0",
16
- "author": {
17
- "name": "Samuel MARLHENS",
18
- "email": "samuel.marlhens@proton.me",
19
- "url": "https://github.com/smarlhens"
20
- },
6
+ "author": "Samuel MARLHENS <samuel.marlhens@proton.me>",
21
7
  "repository": {
22
8
  "type": "git",
23
- "url": "git+https://github.com/smarlhens/npm-check-engines.git"
9
+ "url": "git+https://github.com/smarlhens/riri-node-tools.git"
24
10
  },
25
11
  "bin": {
26
- "nce": "dist/bin/nce.js",
27
- "npm-check-engines": "dist/bin/nce.js"
28
- },
29
- "directories": {
30
- "lib": "lib"
12
+ "nce": "bin/nce.js",
13
+ "npm-check-engines": "bin/nce.js"
31
14
  },
32
15
  "files": [
33
- "dist",
34
- "LICENSE.md"
16
+ "bin",
17
+ "index.d.ts",
18
+ "index.js"
35
19
  ],
36
- "type": "module",
37
- "main": "./dist/lib/nce.cjs",
38
- "module": "./dist/lib/nce.js",
39
- "types": "./dist/lib/nce.d.ts",
40
- "exports": {
41
- ".": {
42
- "types": {
43
- "require": "./dist/lib/nce.d.cts",
44
- "import": "./dist/lib/nce.d.ts"
45
- },
46
- "require": "./dist/lib/nce.cjs",
47
- "import": "./dist/lib/nce.js"
48
- }
20
+ "main": "index.js",
21
+ "types": "index.d.ts",
22
+ "publishConfig": {
23
+ "access": "public",
24
+ "registry": "https://registry.npmjs.org/"
49
25
  },
50
26
  "scripts": {
51
- "build": "tsdown",
52
- "dev": "node --experimental-specifier-resolution=node --loader ts-node/esm ./bin/nce.ts",
53
- "fmt:check": "oxfmt --check",
54
- "fmt:write": "oxfmt",
55
- "lint": "npm run fmt:check",
56
- "lint-staged": "lint-staged",
57
- "pre-commit": "npm run lint-staged",
58
- "prepare": "husky",
59
- "pretest": "npm run build",
60
- "test": "vitest run",
61
- "test:ci": "npm run test:coverage",
62
- "test:coverage": "npm run test -- --coverage",
63
- "test:snapshot": "npm run test -- -u",
64
- "test:watch": "vitest watch",
65
- "typecheck": "tsgo --noEmit"
66
- },
67
- "dependencies": {
68
- "ajv": "8.18.0",
69
- "cli-table": "0.3.11",
70
- "empathic": "2.0.0",
71
- "es-toolkit": "1.45.1",
72
- "listr2": "9.0.5",
73
- "obug": "2.1.1",
74
- "picocolors": "1.1.1",
75
- "semver": "7.7.4",
76
- "sort-package-json": "3.6.1",
77
- "update-notifier": "7.3.1",
78
- "yargs": "18.0.0"
27
+ "artifacts": "napi artifacts",
28
+ "build": "napi build --platform --release",
29
+ "build:debug": "napi build --platform",
30
+ "prepublishOnly": "napi prepublish -t npm",
31
+ "version": "napi version"
79
32
  },
80
33
  "devDependencies": {
81
- "@arethetypeswrong/core": "0.18.2",
82
- "@commitlint/cli": "20.5.0",
83
- "@commitlint/config-conventional": "20.5.0",
84
- "@types/cli-table": "0.3.4",
85
- "@types/node": "20.19.37",
86
- "@types/semver": "7.7.1",
87
- "@types/update-notifier": "6.0.8",
88
- "@types/yargs": "17.0.35",
89
- "@typescript/native-preview": "7.0.0-dev.20260401.1",
90
- "@vitest/coverage-v8": "4.1.2",
91
- "husky": "9.1.7",
92
- "knip": "6.2.0",
93
- "lint-staged": "16.4.0",
94
- "oxfmt": "0.43.0",
95
- "publint": "0.3.18",
96
- "tinyexec": "1.0.4",
97
- "ts-node": "10.9.2",
98
- "tsdown": "0.21.7",
99
- "tslib": "2.8.1",
100
- "typescript": "5.9.3",
101
- "vitest": "4.1.2"
34
+ "@napi-rs/cli": "3.6.2"
35
+ },
36
+ "napi": {
37
+ "binaryName": "npm-check-engines",
38
+ "targets": [
39
+ "x86_64-unknown-linux-gnu",
40
+ "x86_64-unknown-linux-musl",
41
+ "aarch64-unknown-linux-gnu",
42
+ "aarch64-unknown-linux-musl",
43
+ "x86_64-apple-darwin",
44
+ "aarch64-apple-darwin",
45
+ "x86_64-pc-windows-msvc"
46
+ ]
102
47
  },
103
48
  "engines": {
104
- "node": "^20.19.0 || ^22.12.0 || >=24.0.0",
105
- "npm": ">=10.0.0"
49
+ "node": "^20.17.0 || ^22.13.0 || >=23.5.0"
50
+ },
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"
106
59
  }
107
- }
60
+ }
package/LICENSE.md DELETED
@@ -1,55 +0,0 @@
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 DELETED
@@ -1,231 +0,0 @@
1
- # NPM check engines
2
-
3
- [![CodeQL](https://github.com/smarlhens/npm-check-engines/workflows/codeql/badge.svg)](https://github.com/smarlhens/npm-check-engines/actions/workflows/codeql.yml)
4
- [![GitHub CI](https://github.com/smarlhens/npm-check-engines/workflows/ci/badge.svg)](https://github.com/smarlhens/npm-check-engines/actions/workflows/ci.yml)
5
- ![node-current (scoped)](https://img.shields.io/node/v/@smarlhens/npm-check-engines)
6
- [![GitHub license](https://img.shields.io/github/license/smarlhens/npm-check-engines)](https://github.com/smarlhens/npm-check-engines)
7
- [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg)](https://github.com/prettier/prettier)
8
- [![Conventional Commits](https://img.shields.io/badge/Conventional%20Commits-1.0.0-yellow.svg)](https://conventionalcommits.org)
9
-
10
- **npm-check-engines upgrades your package.json node engines constraint to the most restrictive used by your dependencies.**
11
-
12
- ---
13
-
14
- ## Table of Contents
15
-
16
- - [Prerequisites](#prerequisites)
17
- - [Installation](#installation)
18
- - [Usage](#usage)
19
- - [CLI](#cli)
20
- - [Node](#node)
21
- - [CLI Options](#cli-options)
22
- - [Debug](#debug)
23
- - [Thanks](#thanks)
24
-
25
- ---
26
-
27
- ## Prerequisites
28
-
29
- - [Node.JS](https://nodejs.org/en/download/) **version ^20.19.0 || ^22.12.0 || >=24.0.0**
30
-
31
- ---
32
-
33
- ## Installation
34
-
35
- Install globally:
36
-
37
- ```sh
38
- npm install -g @smarlhens/npm-check-engines
39
- ```
40
-
41
- Or run with [npx](https://docs.npmjs.com/cli/v8/commands/npx):
42
-
43
- ```sh
44
- npx @smarlhens/npm-check-engines
45
- ```
46
-
47
- ---
48
-
49
- ## Usage
50
-
51
- ### CLI
52
-
53
- Show the most restrictive constraint (**opinionated**) of the node engine for the project in the current directory based on the npm `package-lock.json` file:
54
-
55
- ```sh
56
- $ nce
57
- ✔ Computed engines range constraints:
58
-
59
- node * → ^14.17.0 || ^16.10.0 || >=17.0.0
60
-
61
- Run nce -u to upgrade package.json.
62
- ```
63
-
64
- Upgrade a project's `package.json` file:
65
-
66
- ```sh
67
- $ nce -u
68
- ✔ Computed engines range constraints:
69
-
70
- node * → ^14.17.0 || ^16.10.0 || >=17.0.0
71
- ```
72
-
73
- ### Node
74
-
75
- ```typescript
76
- import { checkEnginesFromString, validatePackageJson, validatePackageLock } from '@smarlhens/npm-check-engines';
77
-
78
- let packageJsonString = ''; // load content of package.json as stringified JSON
79
- let packageLockString = ''; // load content of package-lock.json as stringified JSON
80
-
81
- validatePackageJson({ packageJsonString }); // can throw Errors if unexpected format
82
- validatePackageLock({ packageLockString }); // can throw Errors if unexpected format
83
-
84
- // packageJson is the content of your package.json with updated engines
85
- // packageLock is the content of your package-lock.json with updated engines of the root project in packages
86
- // enginesRangeToSet contains changes if you want to display them
87
- const { enginesRangeToSet, packageJson, packageLock } = checkEnginesFromString({
88
- packageJsonString,
89
- packageLockString,
90
- });
91
- console.log(packageJson);
92
- console.log(packageLock);
93
- console.log(
94
- enginesRangeToSet
95
- .map(({ engine, range, rangeToSet }) => `${engine} range "${range}" replaced by "${rangeToSet}"`)
96
- .join('\n'),
97
- );
98
- ```
99
-
100
- ---
101
-
102
- ## CLI Options
103
-
104
- ```text
105
- Usage: nce [options]
106
-
107
- Options:
108
- -q, --quiet Enable quiet mode. [boolean] [default: false]
109
- -d, --debug Enable debug mode. Can be used with environment variable DEBUG=nce.
110
- [boolean] [default: false]
111
- -v, --verbose A little more detailed than the default output. [boolean] [default: false]
112
- -e, --engines Select engines to check. Default will check all engines defined. [array]
113
- -u, --update Update engines in package.json and package-lock.json. [boolean] [default: false]
114
- --enableEngineStrict Enable engine strict. [boolean] [default: false]
115
- --help Show help [boolean]
116
- --version Show version number [boolean]
117
-
118
- Examples:
119
- nce Check package-lock.json file in current working directory.
120
-
121
- © 2023 Samuel MARLHENS
122
- ```
123
-
124
- ---
125
-
126
- ## Debug
127
-
128
- ```sh
129
- $ DEBUG=* nce -d
130
- ```
131
-
132
- <details>
133
-
134
- <summary>output with debug</summary>
135
-
136
- ```text
137
- [STARTED] Checking npm package engines range constraints in package-lock.json...
138
- [STARTED] Reading package-lock.json...
139
- [SUCCESS] Reading package-lock.json...
140
- [STARTED] Reading package.json...
141
- [SUCCESS] Reading package.json...
142
- [STARTED] Validating package-lock.json...
143
- [SUCCESS] Validating package-lock.json...
144
- [STARTED] Validating package.json...
145
- [SUCCESS] Validating package.json...
146
- [STARTED] Compute engines range constraints...
147
- nce:node Package has no constraints for current engine +0ms
148
- nce:node Final computed engine range constraint: * +1ms
149
- nce:node Package has no engines +0ms
150
- nce:node Compare: * and >=6.9.0 +1ms
151
- nce:node Range >=6.9.0 is a subset of * +1ms
152
- nce:node New most restrictive range: >=6.9.0 +0ms
153
- nce:node Compare: >=6.9.0 and >=12.22.0 +0ms
154
- nce:node Range >=12.22.0 is a subset of >=6.9.0 +0ms
155
- nce:node New most restrictive range: >=12.22.0 +0ms
156
- nce:node Ignored range: * +0ms
157
- nce:node Compare: >=12.22.0 and >=7.0.0 +1ms
158
- nce:node Range >=12.22.0 is a subset of >=7.0.0 +0ms
159
- nce:node Package node_modules/noengines has no engines +0ms
160
- nce:node Compare: >=12.22.0 and >=12.13.0 <13.0.0-0||>=14.15.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 +1ms
161
- nce:node Applying minimal version 12.22.0 to both ranges. +0ms
162
- nce:node Compare: >=12.22.0 and >=12.22.0 <13.0.0-0||>=14.15.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 +1ms
163
- nce:node Range >=12.22.0 <13.0.0-0||>=14.15.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 is a subset of >=12.22.0 +0ms
164
- nce:node New most restrictive range: >=12.22.0 <13.0.0-0||>=14.15.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 +0ms
165
- nce:node Compare: >=12.22.0 <13.0.0-0||>=14.15.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 and >=16.0.0||>=14.17.0 <15.0.0-0 +1ms
166
- nce:node Applying minimal version 14.17.0 to both ranges. +0ms
167
- nce:node Compare: >=14.17.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 and >=14.17.0 <15.0.0-0||>=16.0.0 +0ms
168
- nce:node Range >=14.17.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 is a subset of >=14.17.0 <15.0.0-0||>=16.0.0 +0ms
169
- nce:node New most restrictive range: >=14.17.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 +1ms
170
- nce:node Final computed engine range constraint: >=14.17.0 <15.0.0-0||>=16.10.0 <17.0.0-0||>=17.0.0 +0ms
171
- nce:npm Package has no constraints for current engine +0ms
172
- nce:npm Final computed engine range constraint: * +0ms
173
- nce:npm Package has no engines +0ms
174
- nce:npm Package node_modules/foo has no constraints for current engine +0ms
175
- nce:npm Compare: * and >=6.0.0 +1ms
176
- nce:npm Range >=6.0.0 is a subset of * +0ms
177
- nce:npm New most restrictive range: >=6.0.0 +0ms
178
- nce:npm Package node_modules/all has no constraints for current engine +0ms
179
- nce:npm Package node_modules/arr has no constraints for current engine +0ms
180
- nce:npm Package node_modules/noengines has no engines +0ms
181
- nce:npm Package node_modules/complex1 has no constraints for current engine +0ms
182
- nce:npm Package node_modules/complex2 has no constraints for current engine +0ms
183
- nce:npm Final computed engine range constraint: >=6.0.0 +0ms
184
- nce:yarn Package has no constraints for current engine +0ms
185
- nce:yarn Final computed engine range constraint: * +0ms
186
- nce:yarn Package has no engines +0ms
187
- nce:yarn Package node_modules/foo has no constraints for current engine +1ms
188
- nce:yarn Compare: * and >=1.22.4 <2.0.0-0 +0ms
189
- nce:yarn Range >=1.22.4 <2.0.0-0 is a subset of * +0ms
190
- nce:yarn New most restrictive range: >=1.22.4 <2.0.0-0 +0ms
191
- nce:yarn Package node_modules/all has no constraints for current engine +0ms
192
- nce:yarn Package node_modules/arr has no constraints for current engine +0ms
193
- nce:yarn Package node_modules/noengines has no engines +0ms
194
- nce:yarn Package node_modules/complex1 has no constraints for current engine +0ms
195
- nce:yarn Package node_modules/complex2 has no constraints for current engine +0ms
196
- nce:yarn Final computed engine range constraint: >=1.22.4 <2.0.0-0 +0ms
197
- [SUCCESS] Compute engines range constraints...
198
- [STARTED] Output computed engines range constraints...
199
- nce:node Simplified computed engine range constraint: ^14.17.0 || ^16.10.0 || >=17.0.0 +0ms
200
- nce:npm Simplified computed engine range constraint: >=6.0.0 +0ms
201
- nce:yarn Simplified computed engine range constraint: ^1.22.4 +0ms
202
- [TITLE] Computed engines range constraints:
203
- [TITLE]
204
- [TITLE] node * → ^14.17.0 || ^16.10.0 || >=17.0.0
205
- [TITLE] npm * → >=6.0.0
206
- [TITLE] yarn * → ^1.22.4
207
- [TITLE]
208
- [TITLE] Run nce -d -u to upgrade package.json.
209
- [SUCCESS] Output computed engines range constraints...
210
- [STARTED] Enabling engine-strict using .npmrc...
211
- [SKIPPED] Enabling engine-strict is disabled by default.
212
- [STARTED] Updating package.json...
213
- [SKIPPED] Update is disabled by default.
214
- [SUCCESS] Computed engines range constraints:
215
- [SUCCESS]
216
- [SUCCESS] node * → ^14.17.0 || ^16.10.0 || >=17.0.0
217
- [SUCCESS] npm * → >=6.0.0
218
- [SUCCESS] yarn * → ^1.22.4
219
- [SUCCESS]
220
- [SUCCESS] Run nce -d -u to upgrade package.json.
221
- ```
222
-
223
- </details>
224
-
225
- ---
226
-
227
- ## Thanks
228
-
229
- This project is heavily inspired by the following awesome project: [npm-check-updates](https://github.com/raineorshine/npm-check-updates).
230
-
231
- ---
package/dist/bin/nce.cjs DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- const e=require(`../chunk-Bmb41Sf3.cjs`),t=require(`../lib/nce.cjs`),n=require(`../lib/yargs.cjs`);let r=require(`empathic/find`);r=e.t(r);let i=require(`node:fs/promises`);i=e.t(i);let a=require(`node:path`),o=require(`node:url`),s=require(`update-notifier`);s=e.t(s),(async()=>{let e=r.file(`package.json`,{cwd:(0,a.dirname)((0,o.fileURLToPath)(require(`url`).pathToFileURL(__filename).href))}),c=JSON.parse(await i.default.readFile(e,`utf8`)),l=(0,s.default)({pkg:c,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});l.update&&l.update.latest!==c.version&&l.notify({defer:!1,isGlobal:!0}),await t.checkEnginesFromCLI(await n.cli)})();
package/dist/bin/nce.js DELETED
@@ -1,2 +0,0 @@
1
- #!/usr/bin/env node
2
- import{checkEnginesFromCLI as e}from"../lib/nce.js";import{cli as t}from"../lib/yargs.js";import*as n from"empathic/find";import r from"node:fs/promises";import{dirname as i}from"node:path";import{fileURLToPath as a}from"node:url";import o from"update-notifier";(async()=>{let s=n.file(`package.json`,{cwd:i(a(import.meta.url))}),c=JSON.parse(await r.readFile(s,`utf8`)),l=o({pkg:c,updateCheckInterval:1e3*60,shouldNotifyInNpmScript:!0});l.update&&l.update.latest!==c.version&&l.notify({defer:!1,isGlobal:!0}),await e(await t)})();export{};
@@ -1 +0,0 @@
1
- var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));Object.defineProperty(exports,`t`,{enumerable:!0,get:function(){return s}});
package/dist/lib/nce.cjs DELETED
@@ -1,5 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`);let t=require(`node:fs/promises`);t=e.t(t);let n=require(`node:path`),r=require(`ajv`);r=e.t(r);let i=require(`cli-table`);i=e.t(i);let a=require(`es-toolkit`),o=require(`listr2`),s=require(`obug`),c=require(`picocolors`);c=e.t(c);let l=require(`semver`);l=e.t(l);let u=require(`sort-package-json`);u=e.t(u);const d=[`node`,`npm`,`yarn`],f=(0,s.createDebug)(`nce`),p=()=>(0,s.disable)(),m=e=>(0,s.enable)(e),h=({debug:e,quiet:t,verbose:n},r=process.env)=>{if(t)return{renderer:`silent`};if(n)return{renderer:`verbose`};let i=r.TERM===`dumb`;return e||i?{renderer:`simple`}:r.NODE_ENV===`test`?{renderer:`test`}:{renderer:`default`,rendererOptions:{dateFormat:!1}}},g=async e=>{let t=e,r={workingDir:(0,n.normalize)(process.cwd()),update:t.update||!1,verbose:t.verbose||!1,quiet:t.quiet||!1,debug:t.debug||!1,engines:t.engines?.filter(e=>d.includes(e))||[],enableEngineStrict:t.enableEngineStrict||!1,packageLockPath:(0,n.join)(process.cwd(),`package-lock.json`),packageJsonPath:(0,n.join)(process.cwd(),`package.json`)},i={...h({quiet:r.quiet,debug:r.debug,verbose:r.verbose})},a=p();return r.debug&&m(a),P({options:r,context:i}).run()},_=new r.default,v={type:`object`,properties:{engines:{anyOf:[{type:`object`,additionalProperties:{type:`string`},oneOf:[{required:[`node`]},{required:[`npm`]},{required:[`yarn`]}]},{type:`array`,items:{type:`string`}},{type:`object`,not:{required:[`engines`]}}]}}},y={type:`object`,properties:{lockfileVersion:{type:`number`,enum:[1,2,3]},dependencies:{type:`object`,patternProperties:{"^.*$":v}},packages:{type:`object`,patternProperties:{"^.*$":v}}},required:[`lockfileVersion`],oneOf:[{properties:{lockfileVersion:{const:1}},required:[`dependencies`],not:{required:[`packages`]}},{properties:{lockfileVersion:{const:2}},required:[`dependencies`]},{properties:{lockfileVersion:{const:3}},required:[`packages`],not:{required:[`dependencies`]}}]},b={loose:!1},x=e=>[...e.map(e=>[...e])].sort((e,t)=>l.compare(e[0].semver,t[0].semver)),S=e=>new l.Range(e.map(e=>e.map(e=>e.value).join(` `)).join(`||`),b),C=(e,t)=>[...e.map(e=>[...e])].filter(e=>e[0].semver.major>=t.major).map(e=>(e[0].semver.major===t.major&&l.gte(t,e[0].semver,b)&&(e[0]=new l.Comparator(`${e[0].operator}${t.raw}`)),e)),w=(e,t,n,r)=>{if(r(`${c.default.white(`Compare:`)} ${c.default.blue(e.raw)} ${c.default.white(`and`)} ${c.default.blue(t.raw)}`),l.subset(e,t))return r(`${c.default.white(`Range`)} ${c.default.green(e.raw)} ${c.default.white(`is a subset of`)} ${c.default.blue(t.raw)}`),n.push(t.raw),e;if(l.subset(t,e))return r(`${c.default.white(`Range`)} ${c.default.green(t.raw)} ${c.default.white(`is a subset of`)} ${c.default.blue(e.raw)}`),n.push(e.raw),t;if(!e.intersects(t,b))return r(`${c.default.red(`No intersection`)} ${c.default.white(`between`)} ${c.default.blue(e.raw)} ${c.default.white(`and`)} ${c.default.blue(t.raw)}, ${c.default.white(`returning`)} ${c.default.green(e.raw)}`),e;if(!t.intersects(e,b))return r(`${c.default.red(`No intersection`)} ${c.default.white(`between`)} ${c.default.blue(t.raw)} ${c.default.white(`and`)} ${c.default.blue(e.raw)}, ${c.default.white(`returning`)} ${c.default.green(t.raw)}`),t;let i=l.minVersion(e,b)||new l.SemVer(`*`),a=l.minVersion(t,b)||new l.SemVer(`*`),o=x(e.set),s=x(t.set);for(;i.major!==a.major;)i.major>a.major?s=s.slice(1):o=o.slice(1),i=l.minVersion(S(o),b)||new l.SemVer(`*`),a=l.minVersion(S(s),b)||new l.SemVer(`*`);if(!l.eq(i,a,b)){let e=l.compare(i,a)===-1?a:i;r(`${c.default.white(`Applying minimal version`)} ${c.default.yellow(e.version)} ${c.default.white(`to both ranges.`)}`);let t=S(C(o,e)),u=S(C(s,e));return t.test(e.raw)?u.test(e.raw)?t.intersects(u,b)?w(t,u,n,r):u.intersects(t,b)?w(u,t,n,r):(r(`${c.default.white(`Unable to find intersection range`)}: ${c.default.blue(t.raw)} and ${c.default.blue(u.raw)}, returning ${c.default.green(t.raw)}`),t):(r(`${c.default.white(`Following range is not valid`)}: ${c.default.red(u.raw)}, returning ${c.default.green(t.raw)}`),t):(r(`${c.default.white(`Following range is not valid`)}: ${c.default.red(t.raw)}, returning ${c.default.green(u.raw)}`),u)}let u=o.shift(),d=s.shift(),f=u||d;if(!f)throw Error(`Not yet implemented :/`);let p=[f],m=w(S(o),S(s),n,r);return p.push(...x(m.set)),S(p)},T=e=>{if(!e||e.raw===`*`)return`*`;let t=[];return x(e.set).forEach(e=>{let[n,r]=e;e.length===2&&n.operator===`>=`&&r.operator===`<`&&n.semver.major+1===r.semver.major?t.push(`^${n.semver.version}`):e.length===1&&n.operator===`>=`?t.push(n.value):t.push(`${n.value} ${r?.value||``}`.trim())}),t.join(` || `)},E=(e,t)=>{if(typeof e==`object`&&t in e)return e[t];if(Array.isArray(e)&&e.some(e=>e.includes(t)))return e.find(e=>e.includes(t))?.replace(t,``)},D=({packages:e,constraintKey:t,debug:n})=>{let r=new l.Range(`*`),i=[],a=n.extend(t);for(let[n,o]of Object.entries(e)){let{engines:e}=o;if(!e){a(`${c.default.white(`Package`)} ${c.default.gray(n)} ${c.default.white(`has no engines`)}`);continue}let s=E(e,t);if(!s){a(`${c.default.white(`Package`)} ${c.default.gray(n)} ${c.default.white(`has no constraints for current engine`)}`);continue}let u=l.validRange(s);if(!u){a(`${c.default.red(s)} ${c.default.white(`is not a valid semver range`)}`);continue}if(i.indexOf(u)!==-1){a(`${c.default.white(`Ignored range:`)} ${c.default.gray(u)}`);continue}let d=new l.Range(u,b);if(!r){r=d,a(`${c.default.white(`New most restrictive range:`)} ${c.default.green(r.raw)}`);continue}let f=w(r,d,i,a);r.raw!==f.raw&&(r=f,a(`${c.default.white(`New most restrictive range:`)} ${c.default.green(r.raw)}`))}return a(r?`${c.default.white(`Final computed engine range constraint:`)} ${c.default.blue(r.raw)}`:`${c.default.white(`No computed engine range constraint`)}`),r},O=e=>new i.default({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:e,colAligns:[`left`,`left`,`left`,`left`],chars:{top:``,"top-mid":``,"top-left":``,"top-right":``,bottom:``,"bottom-mid":``,"bottom-left":``,"bottom-right":``,left:``,"left-mid":``,mid:``,"mid-mid":``,right:``,"right-mid":``,middle:``}}),k=e=>{let t=[`nce`];return e.engines&&t.push(...e.engines.map(e=>[`-e`,e]).flat()),e.quiet&&t.push(`-q`),e.debug&&t.push(`-d`),e.verbose&&t.push(`-v`),t.push(`-u`),t.join(` `)},A=e=>{let t=JSON.parse(e.packageLockString),n=JSON.parse(e.packageJsonString),r=e.engines,i=[],o=e=>d.indexOf(e)!==-1,s=[...d];r&&r.length>0&&(s=r.filter(o));let c;t.lockfileVersion===1?c=t.dependencies:t.lockfileVersion===2?c=t.packages?t.packages:t.dependencies:t.lockfileVersion===3&&(c=t.packages);for(let e of s){let r=D({packages:{"":{engines:n.engines||{}}},constraintKey:e,debug:f}),o=T(D({packages:(0,a.merge)((0,a.merge)({},{"":{engines:n.engines||{}}}),c),constraintKey:e,debug:f})),s=T(r);o!==s&&(i.push({engine:e,range:s,rangeToSet:o}),n.engines=(0,a.merge)((0,a.merge)({},n.engines??{}),{[e]:o}),(t.lockfileVersion===2||t.lockfileVersion===3)&&t.packages&&(t.packages[``].engines=(0,a.merge)((0,a.merge)({},t.packages[``].engines??{}),{[e]:o})))}return{packageJson:n,packageLock:t,enginesRangeToSet:i}},j=e=>{let t=_.compile(y),n=t(JSON.parse(e.packageLockString));if(!n)throw Error(`Invalid package-lock.json: ${_.errorsText(t.errors)}`);return n},M=e=>{let t=_.compile(v),n=t(JSON.parse(e.packageJsonString));if(!n)throw Error(`Invalid package.json: ${_.errorsText(t.errors)}`);return n},N=({options:e,parent:n})=>[{title:`Reading package-lock.json...`,task:async n=>{n.packageLockString=await t.default.readFile(e.packageLockPath,`utf8`)}},{title:`Reading package.json...`,task:async n=>{n.packageJsonString=await t.default.readFile(e.packageJsonPath,`utf8`)}},{title:`Validating package-lock.json...`,task:e=>{j(e)}},{title:`Validating package.json...`,task:e=>{M(e)}},{title:`Compute engines range constraints...`,task:t=>{Object.assign(t,A((0,a.merge)((0,a.merge)({},t),{engines:e.engines})))}},{title:`Output computed engines range constraints...`,task:t=>{let r=t.enginesRangeToSet,i=[2,2,2,2],a=[];for(let{engine:e,range:t,rangeToSet:n}of r)f.extend(e)(`${c.default.white(`Simplified computed engine range constraint:`)} ${c.default.blue(n)}`),i=[Math.max(i[0],e.length+2),Math.max(i[1],t.length+2),3,Math.max(i[3],n.length+2)],a.push([e,t,`→`,n]);if(r.length===0)n.title=`All computed engines range constraints are up-to-date ${c.default.green(`:)`)}`;else{let t=O(i);t.push(...a);let r=`Computed engines range constraints:\n\n${t.toString()}`;e.update||(r+=`\n\nRun ${c.default.cyan(k(e))} to upgrade package.json.`),n.title=r}}},{title:`Updating package.json...`,skip:()=>e.update?!e.update:`Update is disabled by default.`,task:n=>(f(`${c.default.white(`Write JSON to`)} ${c.default.blue(`package.json`)}`),Promise.all([t.default.writeFile(e.packageJsonPath,JSON.stringify((0,u.default)(n.packageJson),null,2)+`
2
- `),t.default.writeFile(e.packageLockPath,JSON.stringify(n.packageLock,null,2)+`
3
- `)]))},{title:`Enabling engine-strict using .npmrc...`,skip:()=>e.enableEngineStrict?!e.enableEngineStrict:`Enabling engine-strict is disabled by default.`,task:async()=>{let e=`.npmrc`;try{await t.default.access(e,t.default.constants.F_OK|t.default.constants.R_OK),(await t.default.readFile(e,`utf8`)).includes(`engine-strict=true`)?f(`.npmrc file already contains engine-strict=true`):(await t.default.appendFile(e,`engine-strict=true
4
- `),f(`.npmrc file has been updated to set engine-strict=true`))}catch{await t.default.writeFile(e,`engine-strict=true
5
- `),f(`.npmrc file has been created and set engine-strict=true`)}}}],P=({options:e,context:t})=>new o.Listr([{title:`Checking npm package engines range constraints in package-lock.json...`,task:(t,n)=>n.newListr(t=>N({parent:t,options:e}))}],t);exports.applyMinVersionToRangeSet=C,exports.checkEnginesFromCLI=g,exports.checkEnginesFromString=A,exports.humanizeRange=T,exports.rangeOptions=b,exports.restrictiveRange=w,exports.setToRange=S,exports.sortRangeSet=x,exports.validatePackageJson=M,exports.validatePackageLock=j;
@@ -1,72 +0,0 @@
1
- import * as semver from "semver";
2
-
3
- //#region lib/yargs.d.ts
4
- type CLIArgs = {
5
- [p: string]: unknown;
6
- update?: boolean;
7
- quiet?: boolean;
8
- verbose?: boolean;
9
- debug?: boolean;
10
- enableEngineStrict?: boolean;
11
- engines?: string[];
12
- _?: Array<string | number>;
13
- $0?: string;
14
- };
15
- //#endregion
16
- //#region lib/nce.d.ts
17
- declare const EngineConstraintKeys: readonly ['node', 'npm', 'yarn'];
18
- type EngineConstraintKeysType = typeof EngineConstraintKeys;
19
- type EngineConstraintKey = EngineConstraintKeysType[number];
20
- type LockPackageEnginesObject = Partial<Record<EngineConstraintKey, string>>;
21
- type LockPackageEnginesArray = string[];
22
- type LockPackageEngines = LockPackageEnginesObject | LockPackageEnginesArray;
23
- type OptionalEngines = {
24
- engines?: LockPackageEngines;
25
- };
26
- type PackageDependencies = {
27
- [dependencyName: string]: OptionalEngines;
28
- };
29
- type PackageLockDependencies = {
30
- dependencies: PackageDependencies;
31
- };
32
- type PackageLockPackages = {
33
- packages: PackageDependencies;
34
- };
35
- type PackageLockVersion1 = {
36
- lockfileVersion: 1;
37
- } & PackageLockDependencies;
38
- type PackageLockVersion2 = {
39
- lockfileVersion: 2;
40
- } & Partial<PackageLockPackages> & PackageLockDependencies;
41
- type PackageLockVersion3 = {
42
- lockfileVersion: 3;
43
- } & PackageLockPackages;
44
- type PackageLock = PackageLockVersion1 | PackageLockVersion2 | PackageLockVersion3;
45
- type EngineRangeToSet = {
46
- engine: EngineConstraintKey;
47
- range: string;
48
- rangeToSet: string;
49
- };
50
- type CheckEnginesInput = {
51
- engines?: EngineConstraintKey[] | undefined;
52
- packageLockString: string;
53
- packageJsonString: string;
54
- };
55
- type CheckEnginesOutput = {
56
- packageJson: OptionalEngines;
57
- packageLock: PackageLock;
58
- enginesRangeToSet: EngineRangeToSet[];
59
- };
60
- type CheckEnginesContext = CheckEnginesInput & Partial<CheckEnginesOutput>;
61
- declare const checkEnginesFromCLI: (args: CLIArgs) => Promise<CheckEnginesContext>;
62
- declare const rangeOptions: semver.Options;
63
- declare const sortRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>) => semver.Comparator[][];
64
- declare const setToRange: (set: semver.Comparator[][]) => semver.Range;
65
- declare const applyMinVersionToRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>, minVersion: semver.SemVer) => semver.Comparator[][];
66
- declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug: (str: string) => void) => semver.Range;
67
- declare const humanizeRange: (range?: semver.Range) => string;
68
- declare const checkEnginesFromString: (ctx: CheckEnginesInput) => CheckEnginesOutput;
69
- declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, 'packageLockString'>) => boolean;
70
- declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, 'packageJsonString'>) => boolean;
71
- //#endregion
72
- export { CheckEnginesContext, CheckEnginesInput, CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
package/dist/lib/nce.d.ts DELETED
@@ -1,72 +0,0 @@
1
- import * as semver from "semver";
2
-
3
- //#region lib/yargs.d.ts
4
- type CLIArgs = {
5
- [p: string]: unknown;
6
- update?: boolean;
7
- quiet?: boolean;
8
- verbose?: boolean;
9
- debug?: boolean;
10
- enableEngineStrict?: boolean;
11
- engines?: string[];
12
- _?: Array<string | number>;
13
- $0?: string;
14
- };
15
- //#endregion
16
- //#region lib/nce.d.ts
17
- declare const EngineConstraintKeys: readonly ['node', 'npm', 'yarn'];
18
- type EngineConstraintKeysType = typeof EngineConstraintKeys;
19
- type EngineConstraintKey = EngineConstraintKeysType[number];
20
- type LockPackageEnginesObject = Partial<Record<EngineConstraintKey, string>>;
21
- type LockPackageEnginesArray = string[];
22
- type LockPackageEngines = LockPackageEnginesObject | LockPackageEnginesArray;
23
- type OptionalEngines = {
24
- engines?: LockPackageEngines;
25
- };
26
- type PackageDependencies = {
27
- [dependencyName: string]: OptionalEngines;
28
- };
29
- type PackageLockDependencies = {
30
- dependencies: PackageDependencies;
31
- };
32
- type PackageLockPackages = {
33
- packages: PackageDependencies;
34
- };
35
- type PackageLockVersion1 = {
36
- lockfileVersion: 1;
37
- } & PackageLockDependencies;
38
- type PackageLockVersion2 = {
39
- lockfileVersion: 2;
40
- } & Partial<PackageLockPackages> & PackageLockDependencies;
41
- type PackageLockVersion3 = {
42
- lockfileVersion: 3;
43
- } & PackageLockPackages;
44
- type PackageLock = PackageLockVersion1 | PackageLockVersion2 | PackageLockVersion3;
45
- type EngineRangeToSet = {
46
- engine: EngineConstraintKey;
47
- range: string;
48
- rangeToSet: string;
49
- };
50
- type CheckEnginesInput = {
51
- engines?: EngineConstraintKey[] | undefined;
52
- packageLockString: string;
53
- packageJsonString: string;
54
- };
55
- type CheckEnginesOutput = {
56
- packageJson: OptionalEngines;
57
- packageLock: PackageLock;
58
- enginesRangeToSet: EngineRangeToSet[];
59
- };
60
- type CheckEnginesContext = CheckEnginesInput & Partial<CheckEnginesOutput>;
61
- declare const checkEnginesFromCLI: (args: CLIArgs) => Promise<CheckEnginesContext>;
62
- declare const rangeOptions: semver.Options;
63
- declare const sortRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>) => semver.Comparator[][];
64
- declare const setToRange: (set: semver.Comparator[][]) => semver.Range;
65
- declare const applyMinVersionToRangeSet: (set: ReadonlyArray<ReadonlyArray<semver.Comparator>>, minVersion: semver.SemVer) => semver.Comparator[][];
66
- declare const restrictiveRange: (r1: semver.Range, r2: semver.Range, ignoredRanges: string[], debug: (str: string) => void) => semver.Range;
67
- declare const humanizeRange: (range?: semver.Range) => string;
68
- declare const checkEnginesFromString: (ctx: CheckEnginesInput) => CheckEnginesOutput;
69
- declare const validatePackageLock: (ctx: Pick<CheckEnginesInput, 'packageLockString'>) => boolean;
70
- declare const validatePackageJson: (ctx: Pick<CheckEnginesInput, 'packageJsonString'>) => boolean;
71
- //#endregion
72
- export { CheckEnginesContext, CheckEnginesInput, CheckEnginesOutput, applyMinVersionToRangeSet, checkEnginesFromCLI, checkEnginesFromString, humanizeRange, rangeOptions, restrictiveRange, setToRange, sortRangeSet, validatePackageJson, validatePackageLock };
package/dist/lib/nce.js DELETED
@@ -1,5 +0,0 @@
1
- import e from"node:fs/promises";import{join as t,normalize as n}from"node:path";import r from"ajv";import i from"cli-table";import{merge as a}from"es-toolkit";import{Listr as o}from"listr2";import{createDebug as s,disable as c,enable as l}from"obug";import u from"picocolors";import*as d from"semver";import f from"sort-package-json";const p=[`node`,`npm`,`yarn`],m=s(`nce`),h=()=>c(),g=e=>l(e),_=({debug:e,quiet:t,verbose:n},r=process.env)=>{if(t)return{renderer:`silent`};if(n)return{renderer:`verbose`};let i=r.TERM===`dumb`;return e||i?{renderer:`simple`}:r.NODE_ENV===`test`?{renderer:`test`}:{renderer:`default`,rendererOptions:{dateFormat:!1}}},v=async e=>{let r=e,i={workingDir:n(process.cwd()),update:r.update||!1,verbose:r.verbose||!1,quiet:r.quiet||!1,debug:r.debug||!1,engines:r.engines?.filter(e=>p.includes(e))||[],enableEngineStrict:r.enableEngineStrict||!1,packageLockPath:t(process.cwd(),`package-lock.json`),packageJsonPath:t(process.cwd(),`package.json`)},a={..._({quiet:i.quiet,debug:i.debug,verbose:i.verbose})},o=h();return i.debug&&g(o),I({options:i,context:a}).run()},y=new r,b={type:`object`,properties:{engines:{anyOf:[{type:`object`,additionalProperties:{type:`string`},oneOf:[{required:[`node`]},{required:[`npm`]},{required:[`yarn`]}]},{type:`array`,items:{type:`string`}},{type:`object`,not:{required:[`engines`]}}]}}},x={type:`object`,properties:{lockfileVersion:{type:`number`,enum:[1,2,3]},dependencies:{type:`object`,patternProperties:{"^.*$":b}},packages:{type:`object`,patternProperties:{"^.*$":b}}},required:[`lockfileVersion`],oneOf:[{properties:{lockfileVersion:{const:1}},required:[`dependencies`],not:{required:[`packages`]}},{properties:{lockfileVersion:{const:2}},required:[`dependencies`]},{properties:{lockfileVersion:{const:3}},required:[`packages`],not:{required:[`dependencies`]}}]},S={loose:!1},C=e=>[...e.map(e=>[...e])].sort((e,t)=>d.compare(e[0].semver,t[0].semver)),w=e=>new d.Range(e.map(e=>e.map(e=>e.value).join(` `)).join(`||`),S),T=(e,t)=>[...e.map(e=>[...e])].filter(e=>e[0].semver.major>=t.major).map(e=>(e[0].semver.major===t.major&&d.gte(t,e[0].semver,S)&&(e[0]=new d.Comparator(`${e[0].operator}${t.raw}`)),e)),E=(e,t,n,r)=>{if(r(`${u.white(`Compare:`)} ${u.blue(e.raw)} ${u.white(`and`)} ${u.blue(t.raw)}`),d.subset(e,t))return r(`${u.white(`Range`)} ${u.green(e.raw)} ${u.white(`is a subset of`)} ${u.blue(t.raw)}`),n.push(t.raw),e;if(d.subset(t,e))return r(`${u.white(`Range`)} ${u.green(t.raw)} ${u.white(`is a subset of`)} ${u.blue(e.raw)}`),n.push(e.raw),t;if(!e.intersects(t,S))return r(`${u.red(`No intersection`)} ${u.white(`between`)} ${u.blue(e.raw)} ${u.white(`and`)} ${u.blue(t.raw)}, ${u.white(`returning`)} ${u.green(e.raw)}`),e;if(!t.intersects(e,S))return r(`${u.red(`No intersection`)} ${u.white(`between`)} ${u.blue(t.raw)} ${u.white(`and`)} ${u.blue(e.raw)}, ${u.white(`returning`)} ${u.green(t.raw)}`),t;let i=d.minVersion(e,S)||new d.SemVer(`*`),a=d.minVersion(t,S)||new d.SemVer(`*`),o=C(e.set),s=C(t.set);for(;i.major!==a.major;)i.major>a.major?s=s.slice(1):o=o.slice(1),i=d.minVersion(w(o),S)||new d.SemVer(`*`),a=d.minVersion(w(s),S)||new d.SemVer(`*`);if(!d.eq(i,a,S)){let e=d.compare(i,a)===-1?a:i;r(`${u.white(`Applying minimal version`)} ${u.yellow(e.version)} ${u.white(`to both ranges.`)}`);let t=w(T(o,e)),c=w(T(s,e));return t.test(e.raw)?c.test(e.raw)?t.intersects(c,S)?E(t,c,n,r):c.intersects(t,S)?E(c,t,n,r):(r(`${u.white(`Unable to find intersection range`)}: ${u.blue(t.raw)} and ${u.blue(c.raw)}, returning ${u.green(t.raw)}`),t):(r(`${u.white(`Following range is not valid`)}: ${u.red(c.raw)}, returning ${u.green(t.raw)}`),t):(r(`${u.white(`Following range is not valid`)}: ${u.red(t.raw)}, returning ${u.green(c.raw)}`),c)}let c=o.shift(),l=s.shift(),f=c||l;if(!f)throw Error(`Not yet implemented :/`);let p=[f],m=E(w(o),w(s),n,r);return p.push(...C(m.set)),w(p)},D=e=>{if(!e||e.raw===`*`)return`*`;let t=[];return C(e.set).forEach(e=>{let[n,r]=e;e.length===2&&n.operator===`>=`&&r.operator===`<`&&n.semver.major+1===r.semver.major?t.push(`^${n.semver.version}`):e.length===1&&n.operator===`>=`?t.push(n.value):t.push(`${n.value} ${r?.value||``}`.trim())}),t.join(` || `)},O=(e,t)=>{if(typeof e==`object`&&t in e)return e[t];if(Array.isArray(e)&&e.some(e=>e.includes(t)))return e.find(e=>e.includes(t))?.replace(t,``)},k=({packages:e,constraintKey:t,debug:n})=>{let r=new d.Range(`*`),i=[],a=n.extend(t);for(let[n,o]of Object.entries(e)){let{engines:e}=o;if(!e){a(`${u.white(`Package`)} ${u.gray(n)} ${u.white(`has no engines`)}`);continue}let s=O(e,t);if(!s){a(`${u.white(`Package`)} ${u.gray(n)} ${u.white(`has no constraints for current engine`)}`);continue}let c=d.validRange(s);if(!c){a(`${u.red(s)} ${u.white(`is not a valid semver range`)}`);continue}if(i.indexOf(c)!==-1){a(`${u.white(`Ignored range:`)} ${u.gray(c)}`);continue}let l=new d.Range(c,S);if(!r){r=l,a(`${u.white(`New most restrictive range:`)} ${u.green(r.raw)}`);continue}let f=E(r,l,i,a);r.raw!==f.raw&&(r=f,a(`${u.white(`New most restrictive range:`)} ${u.green(r.raw)}`))}return a(r?`${u.white(`Final computed engine range constraint:`)} ${u.blue(r.raw)}`:`${u.white(`No computed engine range constraint`)}`),r},A=e=>new i({style:{head:[],border:[],compact:!1,"padding-left":1,"padding-right":1},colWidths:e,colAligns:[`left`,`left`,`left`,`left`],chars:{top:``,"top-mid":``,"top-left":``,"top-right":``,bottom:``,"bottom-mid":``,"bottom-left":``,"bottom-right":``,left:``,"left-mid":``,mid:``,"mid-mid":``,right:``,"right-mid":``,middle:``}}),j=e=>{let t=[`nce`];return e.engines&&t.push(...e.engines.map(e=>[`-e`,e]).flat()),e.quiet&&t.push(`-q`),e.debug&&t.push(`-d`),e.verbose&&t.push(`-v`),t.push(`-u`),t.join(` `)},M=e=>{let t=JSON.parse(e.packageLockString),n=JSON.parse(e.packageJsonString),r=e.engines,i=[],o=e=>p.indexOf(e)!==-1,s=[...p];r&&r.length>0&&(s=r.filter(o));let c;t.lockfileVersion===1?c=t.dependencies:t.lockfileVersion===2?c=t.packages?t.packages:t.dependencies:t.lockfileVersion===3&&(c=t.packages);for(let e of s){let r=k({packages:{"":{engines:n.engines||{}}},constraintKey:e,debug:m}),o=D(k({packages:a(a({},{"":{engines:n.engines||{}}}),c),constraintKey:e,debug:m})),s=D(r);o!==s&&(i.push({engine:e,range:s,rangeToSet:o}),n.engines=a(a({},n.engines??{}),{[e]:o}),(t.lockfileVersion===2||t.lockfileVersion===3)&&t.packages&&(t.packages[``].engines=a(a({},t.packages[``].engines??{}),{[e]:o})))}return{packageJson:n,packageLock:t,enginesRangeToSet:i}},N=e=>{let t=y.compile(x),n=t(JSON.parse(e.packageLockString));if(!n)throw Error(`Invalid package-lock.json: ${y.errorsText(t.errors)}`);return n},P=e=>{let t=y.compile(b),n=t(JSON.parse(e.packageJsonString));if(!n)throw Error(`Invalid package.json: ${y.errorsText(t.errors)}`);return n},F=({options:t,parent:n})=>[{title:`Reading package-lock.json...`,task:async n=>{n.packageLockString=await e.readFile(t.packageLockPath,`utf8`)}},{title:`Reading package.json...`,task:async n=>{n.packageJsonString=await e.readFile(t.packageJsonPath,`utf8`)}},{title:`Validating package-lock.json...`,task:e=>{N(e)}},{title:`Validating package.json...`,task:e=>{P(e)}},{title:`Compute engines range constraints...`,task:e=>{Object.assign(e,M(a(a({},e),{engines:t.engines})))}},{title:`Output computed engines range constraints...`,task:e=>{let r=e.enginesRangeToSet,i=[2,2,2,2],a=[];for(let{engine:e,range:t,rangeToSet:n}of r)m.extend(e)(`${u.white(`Simplified computed engine range constraint:`)} ${u.blue(n)}`),i=[Math.max(i[0],e.length+2),Math.max(i[1],t.length+2),3,Math.max(i[3],n.length+2)],a.push([e,t,`→`,n]);if(r.length===0)n.title=`All computed engines range constraints are up-to-date ${u.green(`:)`)}`;else{let e=A(i);e.push(...a);let r=`Computed engines range constraints:\n\n${e.toString()}`;t.update||(r+=`\n\nRun ${u.cyan(j(t))} to upgrade package.json.`),n.title=r}}},{title:`Updating package.json...`,skip:()=>t.update?!t.update:`Update is disabled by default.`,task:n=>(m(`${u.white(`Write JSON to`)} ${u.blue(`package.json`)}`),Promise.all([e.writeFile(t.packageJsonPath,JSON.stringify(f(n.packageJson),null,2)+`
2
- `),e.writeFile(t.packageLockPath,JSON.stringify(n.packageLock,null,2)+`
3
- `)]))},{title:`Enabling engine-strict using .npmrc...`,skip:()=>t.enableEngineStrict?!t.enableEngineStrict:`Enabling engine-strict is disabled by default.`,task:async()=>{let t=`.npmrc`;try{await e.access(t,e.constants.F_OK|e.constants.R_OK),(await e.readFile(t,`utf8`)).includes(`engine-strict=true`)?m(`.npmrc file already contains engine-strict=true`):(await e.appendFile(t,`engine-strict=true
4
- `),m(`.npmrc file has been updated to set engine-strict=true`))}catch{await e.writeFile(t,`engine-strict=true
5
- `),m(`.npmrc file has been created and set engine-strict=true`)}}}],I=({options:e,context:t})=>new o([{title:`Checking npm package engines range constraints in package-lock.json...`,task:(t,n)=>n.newListr(t=>F({parent:t,options:e}))}],t);export{T as applyMinVersionToRangeSet,v as checkEnginesFromCLI,M as checkEnginesFromString,D as humanizeRange,S as rangeOptions,E as restrictiveRange,w as setToRange,C as sortRangeSet,P as validatePackageJson,N as validatePackageLock};
@@ -1 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`../chunk-Bmb41Sf3.cjs`);let t=require(`yargs`);t=e.t(t);let n=require(`yargs/helpers`);const r=(0,t.default)((0,n.hideBin)(process.argv)),i=r.scriptName(`nce`).usage(`Usage: $0 [options]`).example(`$0`,`Check package-lock.json file in current working directory.`).strict().options({quiet:{boolean:!0,alias:`q`,default:!1,description:`Enable quiet mode.`},debug:{boolean:!0,alias:`d`,default:!1,description:`Enable debug mode. Can be used with environment variable DEBUG=nce.`},verbose:{boolean:!0,alias:`v`,default:!1,description:`A little more detailed than the default output.`},engines:{array:!0,alias:`e`,description:`Select engines to check. Default will check all engines defined.`},update:{boolean:!0,alias:`u`,default:!1,description:`Update engines in package.json and package-lock.json.`},enableEngineStrict:{boolean:!0,default:!1,description:`Enable engine strict.`}}).help(`help`).version().wrap(r.terminalWidth()).epilog(`© 2023 Samuel MARLHENS`).argv;exports.cli=i;
package/dist/lib/yargs.js DELETED
@@ -1 +0,0 @@
1
- import e from"yargs";import{hideBin as t}from"yargs/helpers";const n=e(t(process.argv)),r=n.scriptName(`nce`).usage(`Usage: $0 [options]`).example(`$0`,`Check package-lock.json file in current working directory.`).strict().options({quiet:{boolean:!0,alias:`q`,default:!1,description:`Enable quiet mode.`},debug:{boolean:!0,alias:`d`,default:!1,description:`Enable debug mode. Can be used with environment variable DEBUG=nce.`},verbose:{boolean:!0,alias:`v`,default:!1,description:`A little more detailed than the default output.`},engines:{array:!0,alias:`e`,description:`Select engines to check. Default will check all engines defined.`},update:{boolean:!0,alias:`u`,default:!1,description:`Update engines in package.json and package-lock.json.`},enableEngineStrict:{boolean:!0,default:!1,description:`Enable engine strict.`}}).help(`help`).version().wrap(n.terminalWidth()).epilog(`© 2023 Samuel MARLHENS`).argv;export{r as cli};