pretty-print-error
Version:
Formats errors as nice strings with colors
189 lines (170 loc) • 5.49 kB
JavaScript
(function(global) {
function factory() {
var modules = {
/* --- src/index.ts --- */
"src/index.ts": (function (exports, _kame_require_, module, __filename, __dirname, _kame_dynamic_import_) {
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.formatError = formatError;
function _typeof(obj) {
"@babel/helpers - typeof";
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
return typeof obj;
} : function (obj) {
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
}, _typeof(obj);
}
var isNode = false;
try {
isNode = process.argv0 != null;
} catch (err) {
// ignored
}
var fakeKleur = {
red: function red(value) {
return value;
},
gray: function gray(value) {
return value;
},
magenta: function magenta(value) {
return value;
}
};
var autoDetectedKleur = fakeKleur;
if (isNode) {
try {
// I use eval("require") here instead of just require,
// so that webpack et. al don't try to bundle kleur into
// browser stuff, cause it's not very useful there.
autoDetectedKleur = eval("require")("kleur");
} catch (err) {
// ignored
}
}
var util = {};
if (isNode) {
// I use eval("require") here instead of just require,
// so that webpack et. al don't try to bundle util into
// browser stuff, since it won't be used even if it's
// bundled, and because most util shims for browsers
// are huge.
try {
util = eval("require")("util");
} catch (err) {
// ignored
}
}
/**
* Formats an Error into a string suitable for printing.
*
* @param err The Error object to format. If the value you pass in isn't error-like, it'll get formatted via `String()`.
* @param options Options that affect the format of the returned string.
* @returns A formatted string containing information about the error.
*/
function formatError(err) {
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
_ref$color = _ref.color,
color = _ref$color === void 0 ? true : _ref$color,
_ref$lineFilter = _ref.lineFilter,
lineFilter = _ref$lineFilter === void 0 ? function (line) {
return !/\(node:/.test(line);
} : _ref$lineFilter;
var kleur = color ? autoDetectedKleur : fakeKleur;
var prettyErr = String(err);
if (_typeof(err) === "object" && err != null &&
// @ts-ignore
typeof err.name === "string" &&
// @ts-ignore
typeof err.message === "string" &&
// @ts-ignore
typeof err.stack === "string") {
var error = err;
prettyErr = kleur.red(error.name) + ": " + error.message.replace(new RegExp("^".concat(error.name, "[: ]*")), "") + "\n" + (error.stack || "").split("\n").map(function (line) {
return line.trim();
}).filter(lineFilter).map(function (line) {
if (line.startsWith(error.name + ": " + error.message)) return null;
if (line.startsWith("at")) {
return " " + kleur.gray(line);
}
return line;
}).filter(Boolean).join("\n");
}
if (_typeof(err) === "object" && err != null) {
var propNames = Object.getOwnPropertyNames(err).filter(function (name) {
return name !== "stack" && name !== "message";
});
if (propNames.length > 0) {
var props = {};
propNames.forEach(function (name) {
props[name] = err[name];
});
var propertiesString;
if (typeof util.inspect === "function") {
propertiesString = util.inspect(props, {
depth: Infinity,
colors: color
});
} else {
try {
propertiesString = JSON.stringify(props);
} catch (err) {
propertiesString = ["{", " the properties object couldn't be converted to JSON :(", "", " the error that happened while stringifying it was:", formatError(err).split("\n").map(function (line) {
return " " + line;
}).join("\n"), "}"].join("\n");
}
}
prettyErr += kleur.magenta("\nThe above error also had these properties on it:\n") + propertiesString;
}
}
return prettyErr;
}
})
/* --- end of modules --- */};
var __kame__ = {
basedir: typeof __dirname === 'string' ? __dirname : "",
cache: {},
runModule: function runModule(name, isMain) {
var exports = {};
var module = {
id: name,
exports: exports,
};
__kame__.cache[name] = module;
var _kame_require_ = function require(id) {
if (__kame__.cache[id]) {
return __kame__.cache[id].exports;
} else {
__kame__.runModule(id, false);
return __kame__.cache[id].exports;
}
};
_kame_require_.cache = __kame__.cache;
if (isMain) {
_kame_require_.main = module;
}
var __filename = __kame__.basedir + "/" + name;
var __dirname = __kame__.basedir + "/" + name.split("/").slice(0, -1).join("/");
__kame__.modules[name](exports, _kame_require_, module, __filename, __dirname );
return module.exports;
},
modules: modules,
};
return __kame__.runModule("src/index.ts", true);
}
if (typeof exports === 'object' && typeof module !== 'undefined') {
module.exports = factory();
} else if (typeof define === 'function' && define.amd) {
define([], factory);
} else {
global["PrettyPrintError"] = factory();
}
})(
typeof global !== "undefined" ? global :
typeof window !== "undefined" ? window :
typeof self !== "undefined" ? self :
typeof this === "object" ? this :
new Function("return this")()
);