Skip to content

Commit

Permalink
npm: Detect unsupported Node.js versions and warn
Browse files Browse the repository at this point in the history
Also error on really old versions where we know we can't work.

Credit: @iarna
Reviewed-By: @othiym23
Reviewed-By: @zkat
PR-URL: npm/npm#14230
  • Loading branch information
iarna committed Oct 20, 2016
1 parent c246a75 commit bdeac3e
Show file tree
Hide file tree
Showing 4 changed files with 82 additions and 1 deletion.
6 changes: 5 additions & 1 deletion bin/npm-cli.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,15 @@

process.title = 'npm'

var unsupported = require('../lib/utils/unsupported.js')
unsupported.checkForBrokenNode()

var log = require('npmlog')
log.pause() // will be unpaused when config is loaded.

log.info('it worked if it ends with', 'ok')

unsupported.checkForUnsupportedNode()

var path = require('path')
var npm = require('../lib/npm.js')
var npmconf = require('../lib/config/core.js')
Expand Down
3 changes: 3 additions & 0 deletions lib/npm.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,9 @@
return
}

var unsupported = require('../lib/utils/unsupported.js')
unsupported.checkForBrokenNode()

var gfs = require('graceful-fs')
// Patch the global fs module here at the app level
var fs = gfs.gracefulify(require('fs'))
Expand Down
33 changes: 33 additions & 0 deletions lib/utils/unsupported.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
'use strict'
var semver = require('semver')
var supportedNode = '0.10 || 0.12 || >= 4'
var knownBroken = '>=0.1 <=0.7'

var checkVersion = exports.checkVersion = function (version) {
var versionNoPrerelease = version.replace(/-.*$/, '')
return {
broken: semver.satisfies(versionNoPrerelease, knownBroken),
unsupported: !semver.satisfies(versionNoPrerelease, supportedNode)
}
}

exports.checkForBrokenNode = function () {
var nodejs = checkVersion(process.version)
if (nodejs.broken) {
console.error('ERROR: npm is known not to run on Node.js ' + process.version)
console.error("You'll need to upgrade to a newer version in order to use this")
console.error('version of npm. You can find the latest version at https://nodejs.org/')
process.exit(1)
}
}

exports.checkForUnsupportedNode = function () {
var nodejs = checkVersion(process.version)
if (nodejs.unsupported) {
var log = require('npmlog')
log.warn('npm', 'npm does not support Node.js ' + process.version)
log.warn('npm', 'You should probably upgrade to a newer version of node as we')
log.warn('npm', "can't make any promises that npm will work with this version.")
log.warn('npm', 'You can find the latest version at https://nodejs.org/')
}
}
41 changes: 41 additions & 0 deletions test/tap/unsupported.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
'use strict'
var test = require('tap').test
var unsupported = require('../../lib/utils/unsupported.js')

var versions = [
// broken unsupported
['v0.1.103', true, true],
['v0.2.0', true, true],
['v0.3.5', true, true],
['v0.4.7', true, true],
['v0.5.3', true, true],
['v0.6.17', true, true],
['v0.7.8', true, true],
['v0.8.28', false, true],
['v0.9.6', false, true],
['v0.10.48', false, false],
['v0.11.16', false, true],
['v0.12.9', false, false],
['v1.0.1', false, true],
['v1.6.0', false, true],
['v2.3.1', false, true],
['v3.0.0', false, true],
['v4.5.0', false, false],
['v5.7.1', false, false],
['v6.8.1', false, false],
['v7.0.0-beta23', false, false],
['v7.2.3', false, false]
]

test('versions', function (t) {
t.plan(versions.length * 2)
versions.forEach(function (verinfo) {
var version = verinfo[0]
var broken = verinfo[1]
var unsupp = verinfo[2]
var nodejs = unsupported.checkVersion(version)
t.is(nodejs.broken, broken, version + ' ' + (broken ? '' : 'not ') + 'broken')
t.is(nodejs.unsupported, unsupp, version + ' ' + (unsupp ? 'unsupported' : 'supported'))
})
t.done()
})

0 comments on commit bdeac3e

Please sign in to comment.