Файл: error-kitty/lib/error-kitty/stacks/stack.js
Строк: 80
<?php
module.exports = Stack;
var StackFrame = require("./frame");
var stacks = require("./index");
var _ = require("lodash");
function Stack(err, frames) {
this.err = err;
this.frames = err.frames = this.parseFrames(err, frames);
}
Stack.prototype.parseFrames = function (err, frames) {
var manipulateEvals = err.manipulateEvals || [];
frames = frames || [];
if (err.frameOffset) frames = frames.slice(err.frameOffset);
frames = frames.slice(0, 15);
this.shareWithFrame(frames[0]);
frames = frames.map(function (frame) {
var stackFrame = new StackFrame(frame);
if (frame.isEval()) {
var manipulateFrame = manipulateEvals.shift();
if (manipulateFrame) manipulateFrame(err, stackFrame);
}
return stackFrame;
});
return frames;
};
Stack.prototype.shareWithFrame = function (frame) {
if (!frame) return;
var err = this.err;
_.each(["file", "locals", "filename", "colNumber", "lineNumber",
"functionName", "ignoreMap"], function (key) {
var val = err[key];
if (val == null) val = frame[key];
err[key] = frame[key] = val;
});
};
Stack.prototype.buildAssertionMessage = function () {
var err = this.err;
var replacer = function (key, value) {
if (value === undefined) {
return "" + value;
}
if (typeof value === "number" && (isNaN(value) || !isFinite(value))) {
return value.toString();
}
if (typeof value === "function" || value instanceof RegExp) {
return value.toString();
}
return value;
};
var truncate = function (s, n) {
if (typeof s == "string") {
return s.length < n ? s : s.slice(0, n);
} else {
return s;
}
};
return [
truncate(JSON.stringify(err.actual, replacer), 128),
err.operator,
truncate(JSON.stringify(err.expected, replacer), 128)
].join(" ");
};
Stack.prototype.buildMessage = function () {
var err = this.err;
var msg = err.message;
if (err.name === "AssertionError") {
msg = this.buildAssertionMessage();
}
msg = JSON.stringify(msg);
return msg;
};
Stack.prototype.toString = function () {
var frames = this.frames.slice();
var first = frames.shift();
var err = this.err;
var result = [
err.name + ":",
this.buildMessage(),
first && first.buildMessage()
].join(" ");
if (first && first.fileExists()) {
result += stacks(first.getHighlightedFile(), first.lineNumber,
first.colNumber);
}
_.each(frames, function (frame) {
result += "n " + frame.buildMessage();
});
return result;
};
?>