Skip to content

Instantly share code, notes, and snippets.

@NF1198
Last active October 14, 2016 20:31
Show Gist options
  • Save NF1198/a5097a5fa0fa3a5c1b1f708ba5ff0c1e to your computer and use it in GitHub Desktop.
Save NF1198/a5097a5fa0fa3a5c1b1f708ba5ff0c1e to your computer and use it in GitHub Desktop.
node.js line number debug utility script - returns call site info for debugging purposes - compatible with TypeScript & ES5+
/*
* Copyright (c) 2016 Nicholas Folse -- All Rights Reserved
*
* debug-util.js -- Call site info for debugging javascript
*
* requires node 'source-map' (npm install source-map)
*
* usage:
*
* const debug_line = require("../debug-util");
*
* function myFunc() {
* console.log(debug_line());
* }
*
*/
"use strict";
var sourceMap = require("source-map");
var fs = require("fs");
var path = require("path");
function prepareStackTrace(_, stack) {
return stack;
}
var __sourceMapCache = {};
function getSourceMap(fileName) {
var srcmap = __sourceMapCache[fileName];
if (srcmap) {
return srcmap;
}
try {
var smc = new sourceMap.SourceMapConsumer(JSON.parse(fs.readFileSync(fileName, "utf-8")));
if (smc) {
__sourceMapCache[fileName] = smc;
return smc;
}
} catch (e) {
}
}
function debug_line(stackOffset) {
var offset = stackOffset || 0;
var orig = Error.prepareStackTrace;
Error.prepareStackTrace = prepareStackTrace;
var err = new Error();
var stack = err.stack;
Error.prepareStackTrace = orig;
var cs = stack[1 + offset];
var file = cs.getFileName();
var line = cs.getLineNumber();
var column = cs.getColumnNumber();
var functionName = cs.getFunctionName() || "<anonymous>";
var summary = path.basename(file) + ":" + line + ":" + column + "(@" + functionName + ")";
var src = file, lineNo = line, colNo = column;
var map_file_src = src + '.map';
var lineDef = {source: file, line: lineNo, column: colNo, summary: summary};
var srcMap = getSourceMap(map_file_src);
var origSrc = srcMap.originalPositionFor({line: lineNo, column: colNo});
lineDef.source = origSrc.source;
lineDef.line = origSrc.line;
lineDef.column = origSrc.column;
lineDef.summary = path.basename(origSrc.source) + ":" + origSrc.line + ":" + origSrc.column + "(@" + functionName + ")";
return lineDef;
}
module.exports = debug_line;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment