src: implement standard.js linting

In addition:

* moved module.exports to the bottom
* no single-line if statements
* no if statements without a {
* const for requires
* array declarations get spaces inside [ ]
* 'use strict' in all .js files

PR-URL: https://github.com/nodejs/node-gyp/pull/1794
Reviewed-By: Richard Lau <riclau@uk.ibm.com>
Reviewed-By: Ben Noordhuis <info@bnoordhuis.nl>
Reviewed-By: João Reis <reis@janeasystems.com>
This commit is contained in:
Rod Vagg 2019-06-22 13:10:59 +10:00
parent 7e8127068f
commit e40c99e283
No known key found for this signature in database
GPG key ID: C273792F7D83545D
28 changed files with 739 additions and 661 deletions

View file

@ -1,35 +1,29 @@
module.exports = exports = configure
module.exports.test = {
PythonFinder: PythonFinder,
findAccessibleSync: findAccessibleSync,
findPython: findPython,
}
'use strict'
var fs = require('graceful-fs')
, path = require('path')
, log = require('npmlog')
, os = require('os')
, semver = require('semver')
, mkdirp = require('mkdirp')
, cp = require('child_process')
, extend = require('util')._extend
, processRelease = require('./process-release')
, win = process.platform === 'win32'
, findNodeDirectory = require('./find-node-directory')
, msgFormat = require('util').format
, logWithPrefix = require('./util').logWithPrefix
if (win)
const fs = require('graceful-fs')
const path = require('path')
const log = require('npmlog')
const os = require('os')
const semver = require('semver')
const mkdirp = require('mkdirp')
const cp = require('child_process')
const extend = require('util')._extend // eslint-disable-line
const processRelease = require('./process-release')
const win = process.platform === 'win32'
const findNodeDirectory = require('./find-node-directory')
const msgFormat = require('util').format
const logWithPrefix = require('./util').logWithPrefix
if (win) {
var findVisualStudio = require('./find-visualstudio')
exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'
}
function configure (gyp, argv, callback) {
var python
, buildDir = path.resolve('build')
, configNames = [ 'config.gypi', 'common.gypi' ]
, configs = []
, nodeDir
, release = processRelease(argv, gyp, process.version, process.release)
var buildDir = path.resolve('build')
var configNames = [ 'config.gypi', 'common.gypi' ]
var configs = []
var nodeDir
var release = processRelease(argv, gyp, process.version, process.release)
findPython(gyp.opts.python, function (err, found) {
if (err) {
@ -67,10 +61,12 @@ function configure (gyp, argv, callback) {
// If the tarball option is set, always remove and reinstall the headers
// into devdir. Otherwise only install if they're not already there.
gyp.opts.ensure = gyp.opts.tarball ? false : true
gyp.opts.ensure = !gyp.opts.tarball
gyp.commands.install([ release.version ], function (err) {
if (err) return callback(err)
if (err) {
return callback(err)
}
log.verbose('get node dir', 'target node version installed:', release.versionDir)
nodeDir = path.resolve(gyp.devDir, release.versionDir)
createBuildDir()
@ -81,7 +77,9 @@ function configure (gyp, argv, callback) {
function createBuildDir () {
log.verbose('build dir', 'attempting to create "build" dir: %s', buildDir)
mkdirp(buildDir, function (err, isNew) {
if (err) return callback(err)
if (err) {
return callback(err)
}
log.verbose('build dir', '"build" dir needed to be created?', isNew)
if (win) {
findVisualStudio(release.semver, gyp.opts.msvs_version,
@ -93,7 +91,9 @@ function configure (gyp, argv, callback) {
}
function createConfigFile (err, vsInfo) {
if (err) return callback(err)
if (err) {
return callback(err)
}
var configFilename = 'config.gypi'
var configPath = path.resolve(buildDir, configFilename)
@ -101,14 +101,18 @@ function configure (gyp, argv, callback) {
log.verbose('build/' + configFilename, 'creating config file')
var config = process.config || {}
, defaults = config.target_defaults
, variables = config.variables
var defaults = config.target_defaults
var variables = config.variables
// default "config.variables"
if (!variables) variables = config.variables = {}
if (!variables) {
variables = config.variables = {}
}
// default "config.defaults"
if (!defaults) defaults = config.target_defaults = {}
if (!defaults) {
defaults = config.target_defaults = {}
}
// don't inherit the "defaults" from node's `process.config` object.
// doing so could cause problems in cases where the `node` executable was
@ -123,13 +127,14 @@ function configure (gyp, argv, callback) {
if ('debug' in gyp.opts) {
defaults.default_configuration = gyp.opts.debug ? 'Debug' : 'Release'
}
if (!defaults.default_configuration) {
defaults.default_configuration = 'Release'
}
// set the target_arch variable
variables.target_arch = gyp.opts.arch || process.arch || 'ia32'
if (variables.target_arch == 'arm64') {
if (variables.target_arch === 'arm64') {
defaults['msvs_configuration_platform'] = 'ARM64'
}
@ -146,7 +151,7 @@ function configure (gyp, argv, callback) {
if (vsInfo.sdk) {
defaults['msvs_windows_target_platform_version'] = vsInfo.sdk
}
if (variables.target_arch == 'arm64') {
if (variables.target_arch === 'arm64') {
if (vsInfo.versionMajor > 15 ||
(vsInfo.versionMajor === 15 && vsInfo.versionMajor >= 9)) {
defaults['msvs_enable_marmasm'] = 1
@ -163,15 +168,20 @@ function configure (gyp, argv, callback) {
//
// $ node-gyp configure --shared-libxml2
Object.keys(gyp.opts).forEach(function (opt) {
if (opt === 'argv') return
if (opt in gyp.configDefs) return
if (opt === 'argv') {
return
}
if (opt in gyp.configDefs) {
return
}
variables[opt.replace(/-/g, '_')] = gyp.opts[opt]
})
// ensures that any boolean values from `process.config` get stringified
function boolsToString (k, v) {
if (typeof v === 'boolean')
if (typeof v === 'boolean') {
return String(v)
}
return v
}
@ -179,21 +189,28 @@ function configure (gyp, argv, callback) {
// now write out the config.gypi file to the build/ dir
var prefix = '# Do not edit. File was generated by node-gyp\'s "configure" step'
, json = JSON.stringify(config, boolsToString, 2)
var json = JSON.stringify(config, boolsToString, 2)
log.verbose('build/' + configFilename, 'writing out config file: %s', configPath)
configs.push(configPath)
fs.writeFile(configPath, [prefix, json, ''].join('\n'), findConfigs)
fs.writeFile(configPath, [ prefix, json, '' ].join('\n'), findConfigs)
}
function findConfigs (err) {
if (err) return callback(err)
if (err) {
return callback(err)
}
var name = configNames.shift()
if (!name) return runGyp()
if (!name) {
return runGyp()
}
var fullPath = path.resolve(name)
log.verbose(name, 'checking for gypi file: %s', fullPath)
fs.stat(fullPath, function (err) {
if (err) {
if (err.code == 'ENOENT') {
if (err.code === 'ENOENT') {
findConfigs() // check next gypi filename
} else {
callback(err)
@ -207,7 +224,9 @@ function configure (gyp, argv, callback) {
}
function runGyp (err) {
if (err) return callback(err)
if (err) {
return callback(err)
}
if (!~argv.indexOf('-f') && !~argv.indexOf('--format')) {
if (win) {
@ -228,63 +247,68 @@ function configure (gyp, argv, callback) {
// For AIX and z/OS we need to set up the path to the exports file
// which contains the symbols needed for linking.
var node_exp_file = undefined
var nodeExpFile
if (process.platform === 'aix' || process.platform === 'os390') {
var ext = process.platform === 'aix' ? 'exp' : 'x'
var node_root_dir = findNodeDirectory()
var candidates = undefined
var nodeRootDir = findNodeDirectory()
var candidates
if (process.platform === 'aix') {
candidates = ['include/node/node',
'out/Release/node',
'out/Debug/node',
'node'
].map(function(file) {
return file + '.' + ext
})
candidates = [
'include/node/node',
'out/Release/node',
'out/Debug/node',
'node'
].map(function (file) {
return file + '.' + ext
})
} else {
candidates = ['out/Release/obj.target/libnode',
'out/Debug/obj.target/libnode',
'lib/libnode'
].map(function(file) {
return file + '.' + ext
})
candidates = [
'out/Release/obj.target/libnode',
'out/Debug/obj.target/libnode',
'lib/libnode'
].map(function (file) {
return file + '.' + ext
})
}
var logprefix = 'find exports file'
node_exp_file = findAccessibleSync(logprefix, node_root_dir, candidates)
if (node_exp_file !== undefined) {
log.verbose(logprefix, 'Found exports file: %s', node_exp_file)
nodeExpFile = findAccessibleSync(logprefix, nodeRootDir, candidates)
if (nodeExpFile !== undefined) {
log.verbose(logprefix, 'Found exports file: %s', nodeExpFile)
} else {
var msg = msgFormat('Could not find node.%s file in %s', ext, node_root_dir)
var msg = msgFormat('Could not find node.%s file in %s', ext, nodeRootDir)
log.error(logprefix, 'Could not find exports file')
return callback(new Error(msg))
}
}
// this logic ported from the old `gyp_addon` python file
var gyp_script = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
var addon_gypi = path.resolve(__dirname, '..', 'addon.gypi')
var common_gypi = path.resolve(nodeDir, 'include/node/common.gypi')
fs.stat(common_gypi, function (err) {
if (err)
common_gypi = path.resolve(nodeDir, 'common.gypi')
var gypScript = path.resolve(__dirname, '..', 'gyp', 'gyp_main.py')
var addonGypi = path.resolve(__dirname, '..', 'addon.gypi')
var commonGypi = path.resolve(nodeDir, 'include/node/common.gypi')
fs.stat(commonGypi, function (err) {
if (err) {
commonGypi = path.resolve(nodeDir, 'common.gypi')
}
var output_dir = 'build'
var outputDir = 'build'
if (win) {
// Windows expects an absolute path
output_dir = buildDir
outputDir = buildDir
}
var nodeGypDir = path.resolve(__dirname, '..')
var nodeLibFile = path.join(nodeDir,
!gyp.opts.nodedir ? '<(target_arch)' : '$(Configuration)',
release.name + '.lib')
argv.push('-I', addon_gypi)
argv.push('-I', common_gypi)
argv.push('-I', addonGypi)
argv.push('-I', commonGypi)
argv.push('-Dlibrary=shared_library')
argv.push('-Dvisibility=default')
argv.push('-Dnode_root_dir=' + nodeDir)
if (process.platform === 'aix' || process.platform === 'os390') {
argv.push('-Dnode_exp_file=' + node_exp_file)
argv.push('-Dnode_exp_file=' + nodeExpFile)
}
argv.push('-Dnode_gyp_dir=' + nodeGypDir)
argv.push('-Dnode_lib_file=' + nodeLibFile)
@ -295,7 +319,7 @@ function configure (gyp, argv, callback) {
argv.push('--no-parallel')
// tell gyp to write the Makefile/Solution files into output_dir
argv.push('--generator-output', output_dir)
argv.push('--generator-output', outputDir)
// tell make to write its output into the same dir
argv.push('-Goutput_dir=.')
@ -304,10 +328,10 @@ function configure (gyp, argv, callback) {
argv.unshift('binding.gyp')
// execute `gyp` from the current target nodedir
argv.unshift(gyp_script)
argv.unshift(gypScript)
// make sure python uses files that came with this particular node package
var pypath = [path.join(__dirname, '..', 'gyp', 'pylib')]
var pypath = [ path.join(__dirname, '..', 'gyp', 'pylib') ]
if (process.env.PYTHONPATH) {
pypath.push(process.env.PYTHONPATH)
}
@ -326,7 +350,6 @@ function configure (gyp, argv, callback) {
callback()
}
}
}
/**
@ -336,23 +359,23 @@ function configure (gyp, argv, callback) {
*/
function findAccessibleSync (logprefix, dir, candidates) {
for (var next = 0; next < candidates.length; next++) {
var candidate = path.resolve(dir, candidates[next])
try {
var fd = fs.openSync(candidate, 'r')
} catch (e) {
// this candidate was not found or not readable, do nothing
log.silly(logprefix, 'Could not open %s: %s', candidate, e.message)
continue
}
fs.closeSync(fd)
log.silly(logprefix, 'Found readable %s', candidate)
return candidate
var candidate = path.resolve(dir, candidates[next])
try {
var fd = fs.openSync(candidate, 'r')
} catch (e) {
// this candidate was not found or not readable, do nothing
log.silly(logprefix, 'Could not open %s: %s', candidate, e.message)
continue
}
fs.closeSync(fd)
log.silly(logprefix, 'Found readable %s', candidate)
return candidate
}
return undefined
}
function PythonFinder(configPython, callback) {
function PythonFinder (configPython, callback) {
this.callback = callback
this.configPython = configPython
this.errorLog = []
@ -360,8 +383,8 @@ function PythonFinder(configPython, callback) {
PythonFinder.prototype = {
log: logWithPrefix(log, 'find Python'),
argsExecutable: ['-c', 'import sys; print(sys.executable);'],
argsVersion: ['-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);'],
argsExecutable: [ '-c', 'import sys; print(sys.executable);' ],
argsVersion: [ '-c', 'import sys; print("%s.%s.%s" % sys.version_info[:3]);' ],
semverRange: '>=2.6.0 <3.0.0',
// These can be overridden for testing:
@ -370,20 +393,19 @@ PythonFinder.prototype = {
win: win,
pyLauncher: 'py.exe',
defaultLocation: path.join(process.env.SystemDrive || 'C:', 'Python27',
'python.exe'),
'python.exe'),
// Logs a message at verbose level, but also saves it to be displayed later
// at error level if an error occurs. This should help diagnose the problem.
addLog: function addLog(message) {
addLog: function addLog (message) {
this.log.verbose(message)
this.errorLog.push(message)
},
// Find Python by trying a sequence of possibilities.
// Ignore errors, keep trying until Python is found.
findPython: function findPython() {
const SKIP=0, FAIL=1
findPython: function findPython () {
const SKIP = 0; const FAIL = 1
const toCheck = [
{
before: () => {
@ -398,7 +420,7 @@ PythonFinder.prototype = {
`"${this.configPython}"`)
},
check: this.checkCommand,
arg: this.configPython,
arg: this.configPython
},
{
before: () => {
@ -411,17 +433,17 @@ PythonFinder.prototype = {
this.addLog(`- process.env.PYTHON is "${this.env.PYTHON}"`)
},
check: this.checkCommand,
arg: this.env.PYTHON,
arg: this.env.PYTHON
},
{
before: () => { this.addLog('checking if "python2" can be used') },
check: this.checkCommand,
arg: 'python2',
arg: 'python2'
},
{
before: () => { this.addLog('checking if "python" can be used') },
check: this.checkCommand,
arg: 'python',
arg: 'python'
},
{
before: () => {
@ -432,7 +454,7 @@ PythonFinder.prototype = {
this.addLog(
'checking if the py launcher can be used to find Python 2')
},
check: this.checkPyLauncher,
check: this.checkPyLauncher
},
{
before: () => {
@ -440,12 +462,12 @@ PythonFinder.prototype = {
'checking if Python 2 is installed in the default location')
},
check: this.checkExecPath,
arg: this.defaultLocation,
},
arg: this.defaultLocation
}
]
function runChecks(err) {
this.log.silly('runChecks: err = %j', err && err.stack || err)
function runChecks (err) {
this.log.silly('runChecks: err = %j', (err && err.stack) || err)
const check = toCheck.shift()
if (!check) {
@ -470,7 +492,6 @@ PythonFinder.prototype = {
runChecks.apply(this)
},
// Check if command is a valid Python to use.
// Will exit the Python finder on success.
// If on Windows, run in a CMD shell to support BAT/CMD launchers.
@ -513,17 +534,17 @@ PythonFinder.prototype = {
checkPyLauncher: function checkPyLauncher (errorCallback) {
this.log.verbose(
`- executing "${this.pyLauncher}" to get Python 2 executable path`)
this.run(this.pyLauncher, ['-2', ...this.argsExecutable], false,
function (err, execPath) {
this.run(this.pyLauncher, [ '-2', ...this.argsExecutable ], false,
function (err, execPath) {
// Possible outcomes: same as checkCommand
if (err) {
this.addLog(
`- "${this.pyLauncher}" is not in PATH or produced an error`)
return errorCallback(err)
}
this.addLog(`- executable path is "${execPath}"`)
this.checkExecPath(execPath, errorCallback)
}.bind(this))
if (err) {
this.addLog(
`- "${this.pyLauncher}" is not in PATH or produced an error`)
return errorCallback(err)
}
this.addLog(`- executable path is "${execPath}"`)
this.checkExecPath(execPath, errorCallback)
}.bind(this))
},
// Check if a Python executable is the correct version to use.
@ -565,7 +586,7 @@ PythonFinder.prototype = {
},
// Run an executable or shell command, trimming the output.
run: function run(exec, args, shell, callback) {
run: function run (exec, args, shell, callback) {
var env = extend({}, this.env)
env.TERM = 'dumb'
const opts = { env: env, shell: shell }
@ -580,8 +601,8 @@ PythonFinder.prototype = {
return callback(err)
}
function execFileCallback(err, stdout, stderr) {
this.log.silly('execFile result: err = %j', err && err.stack || err)
function execFileCallback (err, stdout, stderr) {
this.log.silly('execFile result: err = %j', (err && err.stack) || err)
this.log.silly('execFile result: stdout = %j', stdout)
this.log.silly('execFile result: stderr = %j', stderr)
if (err) {
@ -592,17 +613,16 @@ PythonFinder.prototype = {
}
},
succeed: function succeed(execPath, version) {
succeed: function succeed (execPath, version) {
this.log.info(`using Python version ${version} found at "${execPath}"`)
process.nextTick(this.callback.bind(null, null, execPath))
},
fail: function fail() {
fail: function fail () {
const errorLog = this.errorLog.join('\n')
const pathExample = this.win ? 'C:\\Path\\To\\python.exe' :
'/path/to/pythonexecutable'
const pathExample = this.win ? 'C:\\Path\\To\\python.exe'
: '/path/to/pythonexecutable'
// For Windows 80 col console, use up to the column before the one marked
// with X (total 79 chars including logger prefix, 58 chars usable here):
// X
@ -618,16 +638,24 @@ PythonFinder.prototype = {
` npm config set python "${pathExample}"`,
'For more information consult the documentation at:',
'https://github.com/nodejs/node-gyp#installation',
'**********************************************************',
'**********************************************************'
].join('\n')
this.log.error(`\n${errorLog}\n\n${info}\n`)
process.nextTick(this.callback.bind(null, new Error (
process.nextTick(this.callback.bind(null, new Error(
'Could not find any Python 2 installation to use')))
},
}
}
function findPython (configPython, callback) {
var finder = new PythonFinder(configPython, callback)
finder.findPython()
}
module.exports = configure
module.exports.test = {
PythonFinder: PythonFinder,
findAccessibleSync: findAccessibleSync,
findPython: findPython
}
module.exports.usage = 'Generates ' + (win ? 'MSVC project files' : 'a Makefile') + ' for the current module'