1- const semver = require ( 'semver' )
1+ const process = require ( 'node:process' )
2+ const satisfies = require ( 'semver/functions/satisfies' )
3+ const validRange = require ( 'semver/ranges/valid' )
24
3- const checkEngine = ( target , npmVer , nodeVer , force = false ) => {
5+ /*
6+
7+ interface DevEngines {
8+ cpu?: DevEngineDependency | DevEngineDependency[];
9+ libc?: DevEngineDependency | DevEngineDependency[];
10+ os?: DevEngineDependency | DevEngineDependency[];
11+ packageManager?: DevEngineDependency | DevEngineDependency[];
12+ runtime?: DevEngineDependency | DevEngineDependency[];
13+ }
14+
15+ interface DevEngineDependency {
16+ name: string;
17+ version?: string;
18+ onFail?: 'ignore' | 'warn' | 'error' | 'download';
19+ download?: {
20+ url: string;
21+ algorithm?: string;
22+ digest?: string;
23+ }
24+ }
25+
26+ */
27+
28+ const envNames = [ 'packageManager' , 'runtime' , 'cpu' , 'libc' , 'os' ]
29+
30+ // Returns an object with the last failing entry of any given wanted entry, null if no failures
31+ function checkDev ( wanted = { } , current = { } , opts = { } ) {
32+ const failures = { }
33+ for ( const env of envNames ) {
34+ let wantedEnv = wanted [ env ]
35+ if ( wantedEnv ) {
36+ const currentEnv = current [ env ]
37+ if ( ! Array . isArray ( wantedEnv ) ) {
38+ wantedEnv = [ wantedEnv ]
39+ }
40+ // In case of failure we return the last entry to fail so we walk backwards and return the first failure
41+ for ( let i = wantedEnv . length - 1 ; i > - 1 ; i -- ) {
42+ const w = wantedEnv [ i ]
43+ if ( ! currentEnv ) {
44+ failures [ env ] = w
45+ break
46+ }
47+ if ( w . name !== currentEnv . name ) {
48+ failures [ env ] = w
49+ break
50+ }
51+ if ( validRange ( w . version ) ) {
52+ if ( ! satisfies ( currentEnv . version , w . version , opts . semver ) ) {
53+ failures [ env ] = w
54+ break
55+ }
56+ } else if ( currentEnv . version !== w . version ) {
57+ failures [ env ] = w
58+ break
59+ }
60+ }
61+ }
62+ }
63+ if ( Object . keys ( failures ) . length ) {
64+ return failures
65+ }
66+ return null
67+ }
68+
69+ function checkEngine ( target , npmVer , nodeVer , force = false ) {
470 const nodev = force ? null : nodeVer
571 const eng = target . engines
672 const opt = { includePrerelease : true }
773 if ( ! eng ) {
874 return
975 }
1076
11- const nodeFail = nodev && eng . node && ! semver . satisfies ( nodev , eng . node , opt )
12- const npmFail = npmVer && eng . npm && ! semver . satisfies ( npmVer , eng . npm , opt )
77+ const nodeFail = nodev && eng . node && ! satisfies ( nodev , eng . node , opt )
78+ const npmFail = npmVer && eng . npm && ! satisfies ( npmVer , eng . npm , opt )
1379 if ( nodeFail || npmFail ) {
1480 throw Object . assign ( new Error ( 'Unsupported engine' ) , {
1581 pkgid : target . _id ,
@@ -20,9 +86,11 @@ const checkEngine = (target, npmVer, nodeVer, force = false) => {
2086 }
2187}
2288
23- const isMusl = ( file ) => file . includes ( 'libc.musl-' ) || file . includes ( 'ld-musl-' )
89+ function isMusl ( file ) {
90+ return file . includes ( 'libc.musl-' ) || file . includes ( 'ld-musl-' )
91+ }
2492
25- const checkPlatform = ( target , force = false , environment = { } ) => {
93+ function checkPlatform ( target , force = false , environment = { } ) {
2694 if ( force ) {
2795 return
2896 }
@@ -69,7 +137,7 @@ const checkPlatform = (target, force = false, environment = {}) => {
69137 }
70138}
71139
72- const checkList = ( value , list ) => {
140+ function checkList ( value , list ) {
73141 if ( typeof list === 'string' ) {
74142 list = [ list ]
75143 }
@@ -96,6 +164,10 @@ const checkList = (value, list) => {
96164}
97165
98166module . exports = {
167+ // Used by npm-pick-manifest, "npm install -g npm", and arborist build-ideal-tree/reify
99168 checkEngine,
169+ // used by arborist build-ideal-tree/reify
100170 checkPlatform,
171+ // used by npm install for devEngines
172+ checkDev,
101173}
0 commit comments