Вход Регистрация
Файл: error-kitty/lib/error-kitty/stacks/frame.js
Строк: 135
<?php
module
.exports = StackFrame;

var 
highlight = require("../highlight");
var 
path      = require("path");
var 
fs        = require("fs");
var 
_s        = require("underscore.string");
var 
_         = require("lodash");

function 
StackFrame(frame) {
  
this.isEval = frame.isEval();
  
this.frame  = frame;

  
this.lineNumber = frame.lineNumber;
  
this.colNumber  = frame.colNumber;
  
this.file       = frame.file;

  
this.setPath();
  
this.setFunctionName(frame);
  
this.setLineAndColNumber(frame);
}

StackFrame.prototype.setFunctionName = function (frame) {
  var 
functionName = frame.getFunctionName();
  var 
methodName = frame.getMethodName();
  if (
methodName) functionName += " [as " + methodName + "]";
  if (
frame.isConstructor()) functionName = "new " + functionName;
  
this.functionName = functionName;

  
this.contextName = frame.getTypeName();
  if (
this.contextName === "Object") this.contextName = "";
};

StackFrame.prototype.isEval = function (frame) {
  return 
frame.isEval && frame.isEval();
};

StackFrame.prototype.setLineAndColNumber = function (frame) {
  if (
frame.lineNumber == null && frame.getLineNumber) {
    
this.lineNumber = frame.getLineNumber();
  }

  if (
frame.colNumber == null && frame.getColumnNumber) {
    
this.colNumber = frame.getColumnNumber();
  }
};

StackFrame.prototype.setPath = function (filename) {
  var 
frame = this.frame;

  
filename = filename || this.getFilename(frame);
  
this.filename = filename;

  var 
isUser = true;
  var 
prettyPath;

  if (
filename) {
    
prettyPath = path.relative(process.cwd(), filename);
  } else {
    if (
frame.isEval()) prettyPath = "eval";
  }
  
this.filename = prettyPath || filename;

  if (
frame.isNative()) isUser = false;
  if (!
_.contains(filename, path.sep)) isUser = false;
  if (
_.contains(filename, "node_modules")) isUser = false;
  
this.isUser = isUser;

  var 
moduleMatch = filename.match(/node_modules[\/]([^\/]+)/);
  if (
moduleMatch) {
    
this.moduleName = moduleMatch[1];

    try {
      var 
modLoc = filename.match(/^((.*?)[\/]node_modules[\/]([^\/]+))/)[1];
      var 
pkgLoc = modLoc + "/package.json";
      var 
pkg = require(pkgLoc);
      
this.moduleVersion = pkg.version;
    } catch (
err) {

    }
  }
};

StackFrame.prototype.getFilename = function (frame) {
  var 
filename;
  if (
frame.getFileName) filename = frame.getFileName();
  return 
filename || frame.prettyPath || "";
};

StackFrame.prototype.getFile = function () {
  if (
this.file != null) return this.file;

  if (
fs.existsSync(this.filename)) {
    return 
this.file = fs.readFileSync(this.filename, "utf8");
  } else {
    return 
this.file = "";
  }
};

StackFrame.prototype.isJavascript = function () {
  return 
path.extname(this.filename) === ".js";
};

StackFrame.prototype.getHighlightedFile = function () {
  var 
file = this.getFile();
  if (
this.isJavascript()) {
    return 
highlight(file, true);
  } else {
    return 
file;
  }
};

StackFrame.prototype.buildMessage = function () {
  var 
functionName = this.functionName;
  var 
lineNumber   = this.lineNumber;
  var 
colNumber    = this.colNumber;
  var 
filename     = this.filename;

  var 
text = [];

  if (
functionName) {
    
text.push("at");
    
text.push(functionName);
  }

  var 
filenameParts = [];

  if (!
this.isEval && filename) {
    
text.push("in");
    
filenameParts.push(filename);
  }

  if (
lineNumber) {
    
filenameParts.push(_.compact([lineNumber, colNumber]).join(":"));
  }

  if (
filenameParts.length) {
    
text.push(filenameParts.join(":"));
  }

  return 
text.join(" ");
};

StackFrame.prototype.fileExists = function () {
  return 
this.file || fs.existsSync(this.filename);
};
?>
Онлайн: 2
Реклама