-
Notifications
You must be signed in to change notification settings - Fork 9.4k
/
Copy pathsentry-prompt.js
80 lines (69 loc) · 2.17 KB
/
sentry-prompt.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
/**
* @license
* Copyright 2017 Google LLC
* SPDX-License-Identifier: Apache-2.0
*/
import Configstore from 'configstore';
import Confirm from 'enquirer';
import log from 'lighthouse-logger';
const MAXIMUM_WAIT_TIME = 20 * 1000;
/* eslint-disable max-len */
const MESSAGE = `${log.reset}We're constantly trying to improve Lighthouse and its reliability.\n ` +
`${log.reset}Learn more: https://github.com/GoogleChrome/lighthouse/blob/main/docs/error-reporting.md \n ` +
` ${log.bold}May we anonymously report runtime exceptions to improve the tool over time?${log.reset}\n ` +
`We'll remember your choice, but you can also use the flag --[no-]enable-error-reporting`;
/* eslint-enable max-len */
/**
* @return {Promise<boolean>}
*/
function prompt() {
if (!process.stdout.isTTY || process.env.CI) {
// Default non-interactive sessions to false
return Promise.resolve(false);
}
/** @type {NodeJS.Timeout|undefined} */
let timeout;
const prompt = new Confirm.Confirm({
name: 'isErrorReportingEnabled',
initial: false,
message: MESSAGE,
actions: {ctrl: {}},
});
const timeoutPromise = new Promise((resolve) => {
timeout = setTimeout(() => {
prompt.close().then(() => {
log.warn('CLI', 'No response to error logging preference, errors will not be reported.');
resolve(false);
});
}, MAXIMUM_WAIT_TIME);
});
return Promise.race([
prompt.run().then(result => {
clearTimeout(timeout);
return result;
}),
timeoutPromise,
]);
}
/**
* @return {Promise<boolean>}
*/
function askPermission() {
return Promise.resolve().then(_ => {
const configstore = new Configstore('lighthouse');
let isErrorReportingEnabled = configstore.get('isErrorReportingEnabled');
if (typeof isErrorReportingEnabled === 'boolean') {
return Promise.resolve(isErrorReportingEnabled);
}
return prompt()
.then(response => {
isErrorReportingEnabled = response;
configstore.set('isErrorReportingEnabled', isErrorReportingEnabled);
return isErrorReportingEnabled;
});
// Error accessing configstore; default to false.
}).catch(_ => false);
}
export {
askPermission,
};