UNPKG

3.91 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const deps_1 = require("./deps");
4const util = require("util");
5const arrow = process.platform === 'win32' ? ' !' : ' ▸';
6function 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}
14function getErrorMessage(err) {
15 let message;
16 if (err.body) {
17 // API error
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 // Unhandled error
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}
34function 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}
41class 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}
114exports.Errors = Errors;