UNPKG

lighthouse

Version:

Automated auditing, performance metrics, and best practices for the web.

135 lines (114 loc) 3.81 kB
/** * @license * Copyright 2016 Google LLC * SPDX-License-Identifier: Apache-2.0 */ /** * @fileoverview The relationship between these CLI modules: * * index.js : only calls bin.js's begin() * cli-flags.js : leverages yargs to read argv, outputs LH.CliFlags * bin.js : CLI args processing. cwd, list/print commands * run.js : chrome-launcher bits, calling core, output to Printer * * index ----> bin ----> run ----> printer * ⭏ ⭎ ⭏ ⭎ * cli-flags lh-core/index */ import fs from 'fs'; import path from 'path'; import url from 'url'; import log from 'lighthouse-logger'; import * as commands from './commands/commands.js'; import * as Printer from './printer.js'; import {getFlags} from './cli-flags.js'; import {runLighthouse} from './run.js'; import {askPermission} from './sentry-prompt.js'; import {LH_ROOT} from '../shared/root.js'; import {Sentry} from '../core/lib/sentry.js'; const pkg = JSON.parse(fs.readFileSync(LH_ROOT + '/package.json', 'utf-8')); /** * @return {boolean} */ function isDev() { return fs.existsSync(path.join(LH_ROOT, '/.git')); } /** * @return {Promise<LH.RunnerResult|void>} */ async function begin() { const cliFlags = getFlags(); // Process terminating command if (cliFlags.listAllAudits) { commands.listAudits(); } // Process terminating command if (cliFlags.listLocales) { commands.listLocales(); } // Process terminating command if (cliFlags.listTraceCategories) { commands.listTraceCategories(); } const urlUnderTest = cliFlags._[0]; /** @type {LH.Config|undefined} */ let config; if (cliFlags.configPath) { // Resolve the config file path relative to where cli was called. cliFlags.configPath = path.resolve(process.cwd(), cliFlags.configPath); if (cliFlags.configPath.endsWith('.json')) { config = JSON.parse(fs.readFileSync(cliFlags.configPath, 'utf-8')); } else { const configModuleUrl = url.pathToFileURL(cliFlags.configPath).href; config = (await import(configModuleUrl)).default; } } else if (cliFlags.preset) { config = (await import(`../core/config/${cliFlags.preset}-config.js`)).default; } // set logging preferences cliFlags.logLevel = 'info'; if (cliFlags.verbose) { cliFlags.logLevel = 'verbose'; } else if (cliFlags.quiet) { cliFlags.logLevel = 'silent'; } log.setLevel(cliFlags.logLevel); if ( cliFlags.output.length === 1 && cliFlags.output[0] === Printer.OutputMode.json && !cliFlags.outputPath ) { cliFlags.outputPath = 'stdout'; } if (cliFlags.precomputedLanternDataPath) { const lanternDataStr = fs.readFileSync(cliFlags.precomputedLanternDataPath, 'utf8'); /** @type {LH.PrecomputedLanternData} */ const data = JSON.parse(lanternDataStr); if (!data.additionalRttByOrigin || !data.serverResponseTimeByOrigin) { throw new Error('Invalid precomputed lantern data file'); } cliFlags.precomputedLanternData = data; } // By default, cliFlags.enableErrorReporting is undefined so the user is // prompted. This can be overridden with an explicit flag or by the cached // answer returned by askPermission(). if (typeof cliFlags.enableErrorReporting === 'undefined') { cliFlags.enableErrorReporting = await askPermission(); } if (cliFlags.enableErrorReporting) { await Sentry.init({ url: urlUnderTest, flags: cliFlags, config, environmentData: { serverName: 'redacted', // prevent sentry from using hostname environment: isDev() ? 'development' : 'production', release: pkg.version, }, }); } return runLighthouse(urlUnderTest, cliFlags, config); } export { begin, };