-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
Copy pathbin.js
134 lines (114 loc) · 3.72 KB
/
bin.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* @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,
};