50 lines
2.0 KiB
JavaScript
50 lines
2.0 KiB
JavaScript
// This is separate to indicate that it should contain code we expect to work in
|
|
// all versions of node >= 6. This is a best effort to catch syntax errors to
|
|
// give users a good error message if they are using a node version that doesn't
|
|
// allow syntax we are using such as private properties, etc. This file is
|
|
// linted with ecmaVersion=6 so we don't use invalid syntax, which is set in the
|
|
// .eslintrc.local.json file
|
|
|
|
const { engines: { node: engines }, version } = require('../../package.json')
|
|
const npm = `v${version}`
|
|
|
|
module.exports = (process, getCli) => {
|
|
const node = process.version
|
|
|
|
/* eslint-disable-next-line max-len */
|
|
const unsupportedMessage = `npm ${npm} does not support Node.js ${node}. This version of npm supports the following node versions: \`${engines}\`. You can find the latest version at https://nodejs.org/.`
|
|
|
|
/* eslint-disable-next-line max-len */
|
|
const brokenMessage = `ERROR: npm ${npm} is known not to run on Node.js ${node}. This version of npm supports the following node versions: \`${engines}\`. You can find the latest version at https://nodejs.org/.`
|
|
|
|
// coverage ignored because this is only hit in very unsupported node versions
|
|
// and it's a best effort attempt to show something nice in those cases
|
|
/* istanbul ignore next */
|
|
const syntaxErrorHandler = (err) => {
|
|
if (err instanceof SyntaxError) {
|
|
// eslint-disable-next-line no-console
|
|
console.error(`${brokenMessage}\n\nERROR:`)
|
|
// eslint-disable-next-line no-console
|
|
console.error(err)
|
|
return process.exit(1)
|
|
}
|
|
throw err
|
|
}
|
|
|
|
process.on('uncaughtException', syntaxErrorHandler)
|
|
process.on('unhandledRejection', syntaxErrorHandler)
|
|
|
|
// require this only after setting up the error handlers
|
|
const cli = getCli()
|
|
return cli(process, {
|
|
node,
|
|
npm,
|
|
engines,
|
|
unsupportedMessage,
|
|
off: () => {
|
|
process.off('uncaughtException', syntaxErrorHandler)
|
|
process.off('unhandledRejection', syntaxErrorHandler)
|
|
},
|
|
})
|
|
}
|