diff --git a/lighthouse-cli/index.js b/lighthouse-cli/index.js index 07a3dacb7444..ddcbdd43e36c 100755 --- a/lighthouse-cli/index.js +++ b/lighthouse-cli/index.js @@ -18,17 +18,17 @@ 'use strict'; +const environment = require('../lighthouse-core/lib/environment.js'); +if (!environment.checkNodeCompatibility()) { + console.warn('Compatibility error', 'Lighthouse requires node 5+ or 4 with --harmony'); + process.exit(1); +} + const yargs = require('yargs'); -const semver = require('semver'); const Printer = require('./printer'); const lighthouse = require('../lighthouse-core'); const log = require('../lighthouse-core/lib/log'); -// node 5.x required due to use of ES2015 features, like spread operator -if (semver.lt(process.version, '5.0.0')) { - console.warn('Compatibility error', 'Lighthouse requires node 5+ or 4 with --harmony'); -} - const cli = yargs .help('help') .version() diff --git a/lighthouse-core/index.js b/lighthouse-core/index.js index 3435c9c1825d..7ec2dfed636f 100644 --- a/lighthouse-core/index.js +++ b/lighthouse-core/index.js @@ -17,7 +17,12 @@ 'use strict'; -const semver = require('semver'); +const environment = require('../lighthouse-core/lib/environment'); +if (!environment.checkNodeCompatibility()) { + console.warn('Compatibility error', 'Lighthouse requires node 5+ or 4 with --harmony'); + process.exit(1); +} + const Runner = require('./runner'); const log = require('./lib/log.js'); const ChromeProtocol = require('./gather/drivers/cri.js'); @@ -38,17 +43,14 @@ const Config = require('./config'); * */ -// node 5.x required due to use of ES2015 features, like spread operator -if (semver.lt(process.version, '5.0.0')) { - log.warn('Compatibility error', 'Lighthouse requires node 5+ or 4 with --harmony'); -} - module.exports = function(url, flags, configJSON) { return new Promise((resolve, reject) => { if (!url) { return reject(new Error('Lighthouse requires a URL')); } + flags = flags || {}; + // set logging preferences, assume quiet flags.logLevel = flags.logLevel || 'error'; log.setLevel(flags.logLevel); @@ -59,8 +61,6 @@ module.exports = function(url, flags, configJSON) { log.warn('Lighthouse', 'Performance stats will be skewed redirecting from HTTP to HTTPS.'); } - flags = flags || {}; - // Use ConfigParser to generate a valid config file const config = new Config(configJSON, flags.auditWhitelist); diff --git a/lighthouse-core/lib/environment.js b/lighthouse-core/lib/environment.js new file mode 100644 index 000000000000..b788cd0e95ce --- /dev/null +++ b/lighthouse-core/lib/environment.js @@ -0,0 +1,39 @@ +/** + * @license + * Copyright 2016 Google Inc. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +'use strict'; + +const semver = require('semver'); +const vm = require('vm'); + +function checkNodeCompatibility() { + // node 5.x required due to use of ES2015 features, like spread operator + if (semver.gte(process.version, '5.0.0')) { + return true; + } + + try { + // Test for the availability of the spread operator. + new vm.Script('Math.max(...[ 5, 10 ])').runInThisContext(); + return true; + } catch (e) { + return false; + } +} + +module.exports = { + checkNodeCompatibility: checkNodeCompatibility +};