@@ -161,12 +161,17 @@ type EnvBase = {
161
161
// Landed in npm v11.2.0.
162
162
npmBuggyOverrides : boolean
163
163
}
164
+ nodeSupported : boolean
165
+ nodeVersion : SemVer
164
166
npmExecPath : string
165
- pkgSupported : boolean
166
167
pkgRequirements : {
167
168
agent : string
168
169
node : string
169
170
}
171
+ pkgSupports : {
172
+ agent : boolean
173
+ node : boolean
174
+ }
170
175
}
171
176
172
177
export type EnvDetails = Readonly <
@@ -262,25 +267,30 @@ export async function detectPackageEnvironment({
262
267
// Lazily access constants.minimumVersionByAgent.
263
268
const minSupportedAgentVersion = constants . minimumVersionByAgent . get ( agent ) !
264
269
const minSupportedNodeVersion = maintainedNodeVersions . last
270
+ const nodeVersion = semver . coerce ( process . version ) !
265
271
let lockSrc : string | undefined
272
+ let pkgAgentRange : string | undefined
273
+ let pkgNodeRange : string | undefined
266
274
let pkgMinAgentVersion = minSupportedAgentVersion
267
275
let pkgMinNodeVersion = minSupportedNodeVersion
268
276
if ( pkgJson ) {
269
277
const { engines } = pkgJson
270
- const agentRange = engines ?. [ agent ]
271
- const nodeRange = engines ?. [ 'node' ]
272
- if ( isNonEmptyString ( agentRange ) ) {
278
+ const engineAgentRange = engines ?. [ agent ]
279
+ const engineNodeRange = engines ?. [ 'node' ]
280
+ if ( isNonEmptyString ( engineAgentRange ) ) {
281
+ pkgAgentRange = engineAgentRange
273
282
// Roughly check agent range as semver.coerce will strip leading
274
283
// v's, carets (^), comparators (<,<=,>,>=,=), and tildes (~).
275
- const coerced = semver . coerce ( agentRange )
284
+ const coerced = semver . coerce ( pkgAgentRange )
276
285
if ( coerced && semver . lt ( coerced , pkgMinAgentVersion ) ) {
277
286
pkgMinAgentVersion = coerced . version
278
287
}
279
288
}
280
- if ( isNonEmptyString ( nodeRange ) ) {
289
+ if ( isNonEmptyString ( engineNodeRange ) ) {
290
+ pkgNodeRange = engineNodeRange
281
291
// Roughly check Node range as semver.coerce will strip leading
282
292
// v's, carets (^), comparators (<,<=,>,>=,=), and tildes (~).
283
- const coerced = semver . coerce ( nodeRange )
293
+ const coerced = semver . coerce ( pkgNodeRange )
284
294
if ( coerced && semver . lt ( coerced , pkgMinNodeVersion ) ) {
285
295
pkgMinNodeVersion = coerced . version
286
296
}
@@ -313,13 +323,11 @@ export async function detectPackageEnvironment({
313
323
! ! agentVersion &&
314
324
semver . satisfies ( agentVersion , `>=${ minSupportedAgentVersion } ` )
315
325
316
- // Does our minimum supported agent version meet the package's requirements?
317
- // Does our supported Node versions meet the package's requirements?
318
- const pkgSupported =
319
- semver . satisfies ( minSupportedAgentVersion , `>=${ pkgMinAgentVersion } ` ) &&
320
- maintainedNodeVersions . some ( v =>
321
- semver . satisfies ( v , `>=${ pkgMinNodeVersion } ` )
322
- )
326
+ // Does the system Node version meet our minimum supported Node version?
327
+ const nodeSupported = semver . satisfies (
328
+ nodeVersion ,
329
+ `>=${ minSupportedNodeVersion } `
330
+ )
323
331
324
332
const npmBuggyOverrides =
325
333
agent === NPM &&
@@ -335,13 +343,25 @@ export async function detectPackageEnvironment({
335
343
lockName,
336
344
lockPath,
337
345
lockSrc,
346
+ nodeSupported,
347
+ nodeVersion,
338
348
npmExecPath,
339
349
pkgJson : editablePkgJson ,
340
350
pkgPath,
341
- pkgSupported,
342
351
pkgRequirements : {
343
- agent : `>=${ pkgMinAgentVersion } ` ,
344
- node : `>=${ pkgMinNodeVersion } `
352
+ agent : pkgAgentRange ?? `>=${ pkgMinAgentVersion } ` ,
353
+ node : pkgNodeRange ?? `>=${ pkgMinNodeVersion } `
354
+ } ,
355
+ pkgSupports : {
356
+ // Does our minimum supported agent version meet the package's requirements?
357
+ agent : semver . satisfies (
358
+ minSupportedAgentVersion ,
359
+ `>=${ pkgMinAgentVersion } `
360
+ ) ,
361
+ // Does our supported Node versions meet the package's requirements?
362
+ node : maintainedNodeVersions . some ( v =>
363
+ semver . satisfies ( v , `>=${ pkgMinNodeVersion } ` )
364
+ )
345
365
}
346
366
}
347
367
}
@@ -374,22 +394,42 @@ export async function detectAndValidatePackageEnvironment(
374
394
)
375
395
}
376
396
} )
377
- const { agent, agentVersion } = details
397
+ const { agent, nodeVersion, pkgRequirements } = details
398
+ const agentVersion = details . agentVersion ?? 'unknown'
378
399
if ( ! details . agentSupported ) {
379
400
const minVersion = constants . minimumVersionByAgent . get ( agent ) !
380
401
logger ?. fail (
381
402
cmdPrefixMessage (
382
403
cmdName ,
383
- `Requires ${ agent } >=${ minVersion } . Current version: ${ agentVersion ?? 'unknown' } .`
404
+ `Requires ${ agent } >=${ minVersion } . Current version: ${ agentVersion } .`
405
+ )
406
+ )
407
+ return
408
+ }
409
+ if ( ! details . nodeSupported ) {
410
+ const minVersion = constants . maintainedNodeVersions . last
411
+ logger ?. fail (
412
+ cmdPrefixMessage (
413
+ cmdName ,
414
+ `Requires Node >=${ minVersion } . Current version: ${ nodeVersion } .`
415
+ )
416
+ )
417
+ return
418
+ }
419
+ if ( ! details . pkgSupports . agent ) {
420
+ logger ?. fail (
421
+ cmdPrefixMessage (
422
+ cmdName ,
423
+ `Package engine "${ agent } " requires ${ pkgRequirements . agent } . Current version: ${ agentVersion } `
384
424
)
385
425
)
386
426
return
387
427
}
388
- if ( ! details . pkgSupported ) {
428
+ if ( ! details . pkgSupports . node ) {
389
429
logger ?. fail (
390
430
cmdPrefixMessage (
391
431
cmdName ,
392
- `Package engine "node" or " ${ agent } " range not met `
432
+ `Package engine "node" requires ${ pkgRequirements . node } . Current version: ${ nodeVersion } `
393
433
)
394
434
)
395
435
return
0 commit comments