1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const deps_1 = require("./deps");
|
4 | const util = require("util");
|
5 | const arrow = process.platform === 'win32' ? ' !' : ' ▸';
|
6 | function bangify(msg, c) {
|
7 | const lines = msg.split('\n');
|
8 | for (let i = 0; i < lines.length; i++) {
|
9 | const line = lines[i];
|
10 | lines[i] = c + line.substr(2, line.length);
|
11 | }
|
12 | return lines.join('\n');
|
13 | }
|
14 | function getErrorMessage(err) {
|
15 | let message;
|
16 | if (err.body) {
|
17 |
|
18 | if (err.body.message) {
|
19 | message = util.inspect(err.body.message);
|
20 | }
|
21 | else if (err.body.error) {
|
22 | message = util.inspect(err.body.error);
|
23 | }
|
24 | }
|
25 |
|
26 | if (err.message && err.code) {
|
27 | message = `${util.inspect(err.code)}: ${err.message}`;
|
28 | }
|
29 | else if (err.message) {
|
30 | message = err.message;
|
31 | }
|
32 | return message || util.inspect(err);
|
33 | }
|
34 | function wrap(msg) {
|
35 | const linewrap = require('@heroku/linewrap');
|
36 | return linewrap(6, deps_1.default.screen.errtermwidth, {
|
37 | skip: /^\$ .*$/,
|
38 | skipScheme: 'ansi-color',
|
39 | })(msg);
|
40 | }
|
41 | class Errors extends deps_1.default.Base {
|
42 | handleUnhandleds() {
|
43 | process.on('unhandledRejection', (reason, p) => {
|
44 | this.fatal(reason, { context: 'Promise unhandledRejection' });
|
45 | });
|
46 | process.on('uncaughtException', error => {
|
47 | this.fatal(error, { context: 'Error uncaughtException' });
|
48 | });
|
49 | }
|
50 | error(err, options) {
|
51 | if (typeof options === 'string')
|
52 | options = { context: options };
|
53 | options = options || {};
|
54 | if (!options.severity)
|
55 | options.severity = 'error';
|
56 | if (options.exitCode === undefined)
|
57 | options.exitCode = 1;
|
58 | if (options.severity !== 'warn' && deps_1.default.Config.mock && typeof err !== 'string' && options.exitCode !== false)
|
59 | throw err;
|
60 | try {
|
61 | if (typeof err === 'string')
|
62 | err = new Error(err);
|
63 | const prefix = options.context ? `${options.context}: ` : '';
|
64 | this.logError(err);
|
65 | if (deps_1.default.Config.debug) {
|
66 | this.stderr.write(`${options.severity.toUpperCase()}: ${prefix}`);
|
67 | this.stderr.log(err.stack || util.inspect(err));
|
68 | }
|
69 | else {
|
70 | let bang = deps_1.default.chalk.red(arrow);
|
71 | if (options.severity === 'fatal')
|
72 | bang = deps_1.default.chalk.bgRed.bold.white(' FATAL ');
|
73 | if (options.severity === 'warn')
|
74 | bang = deps_1.default.chalk.yellow(arrow);
|
75 | this.stderr.log(bangify(wrap(prefix + getErrorMessage(err)), bang));
|
76 | }
|
77 | }
|
78 | catch (e) {
|
79 | console.error('error displaying error');
|
80 | console.error(e);
|
81 | console.error(err);
|
82 | }
|
83 | if (options.exitCode !== false)
|
84 | this.exit(options.exitCode);
|
85 | }
|
86 | fatal(err, options = {}) {
|
87 | options.severity = 'fatal';
|
88 | this.error(err, options);
|
89 | }
|
90 | warn(err, options = {}) {
|
91 | if (typeof options === 'string')
|
92 | options = { context: options };
|
93 | options.exitCode = false;
|
94 | options.severity = 'warn';
|
95 | this.error(err, options);
|
96 | }
|
97 | exit(code = 0) {
|
98 | if (deps_1.default.Config.debug) {
|
99 | console.error(`Exiting with code: ${code}`);
|
100 | }
|
101 | if (deps_1.default.Config.mock) {
|
102 | throw new deps_1.default.ExitError(code, this.stdout.output, this.stderr.output);
|
103 | }
|
104 | else {
|
105 | process.exit(code);
|
106 | }
|
107 | }
|
108 | logError(err) {
|
109 | if (!deps_1.default.Config.errlog)
|
110 | return;
|
111 | deps_1.default.StreamOutput.logToFile(util.inspect(err) + '\n', deps_1.default.Config.errlog);
|
112 | }
|
113 | }
|
114 | exports.Errors = Errors;
|