Updating NPM dependencies
This commit is contained in:
547
node_modules/stack-utils/index.js
generated
vendored
547
node_modules/stack-utils/index.js
generated
vendored
@@ -1,215 +1,309 @@
|
||||
'use strict';
|
||||
module.exports = StackUtils;
|
||||
|
||||
function StackUtils(opts) {
|
||||
if (!(this instanceof StackUtils)) {
|
||||
throw new Error('StackUtils constructor must be called with new');
|
||||
}
|
||||
opts = opts || {};
|
||||
this._cwd = (opts.cwd || process.cwd()).replace(/\\/g, '/');
|
||||
this._internals = opts.internals || [];
|
||||
this._wrapCallSite = opts.wrapCallSite || false;
|
||||
}
|
||||
const escapeStringRegexp = require('escape-string-regexp');
|
||||
|
||||
module.exports.nodeInternals = nodeInternals;
|
||||
const natives = [].concat(
|
||||
require('module').builtinModules,
|
||||
'bootstrap_node',
|
||||
'node',
|
||||
).map(n => new RegExp(`(?:\\(${n}\\.js:\\d+:\\d+\\)$|^\\s*at ${n}\\.js:\\d+:\\d+$)`));
|
||||
|
||||
function nodeInternals() {
|
||||
if (!module.exports.natives) {
|
||||
module.exports.natives = Object.keys(process.binding('natives'));
|
||||
module.exports.natives.push('bootstrap_node', 'node',
|
||||
'internal/bootstrap/node');
|
||||
natives.push(
|
||||
/\(internal\/[^:]+:\d+:\d+\)$/,
|
||||
/\s*at internal\/[^:]+:\d+:\d+$/,
|
||||
/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/
|
||||
);
|
||||
|
||||
class StackUtils {
|
||||
constructor (opts) {
|
||||
opts = {
|
||||
ignoredPackages: [],
|
||||
...opts
|
||||
};
|
||||
|
||||
if ('internals' in opts === false) {
|
||||
opts.internals = StackUtils.nodeInternals();
|
||||
}
|
||||
|
||||
if ('cwd' in opts === false) {
|
||||
opts.cwd = process.cwd()
|
||||
}
|
||||
|
||||
this._cwd = opts.cwd.replace(/\\/g, '/');
|
||||
this._internals = [].concat(
|
||||
opts.internals,
|
||||
ignoredPackagesRegExp(opts.ignoredPackages)
|
||||
);
|
||||
|
||||
this._wrapCallSite = opts.wrapCallSite || false;
|
||||
}
|
||||
|
||||
return module.exports.natives.map(function (n) {
|
||||
return new RegExp('\\(' + n + '\\.js:\\d+:\\d+\\)$');
|
||||
}).concat([
|
||||
/\s*at (bootstrap_)?node\.js:\d+:\d+?$/,
|
||||
/\(internal\/[^:]+:\d+:\d+\)$/,
|
||||
/\/\.node-spawn-wrap-\w+-\w+\/node:\d+:\d+\)?$/
|
||||
]);
|
||||
}
|
||||
|
||||
StackUtils.prototype.clean = function (stack) {
|
||||
if (!Array.isArray(stack)) {
|
||||
stack = stack.split('\n');
|
||||
static nodeInternals () {
|
||||
return [...natives];
|
||||
}
|
||||
|
||||
if (!(/^\s*at /.test(stack[0])) &&
|
||||
(/^\s*at /.test(stack[1]))) {
|
||||
stack = stack.slice(1);
|
||||
}
|
||||
clean (stack, indent = 0) {
|
||||
indent = ' '.repeat(indent);
|
||||
|
||||
var outdent = false;
|
||||
var lastNonAtLine = null;
|
||||
var result = [];
|
||||
if (!Array.isArray(stack)) {
|
||||
stack = stack.split('\n');
|
||||
}
|
||||
|
||||
stack.forEach(function (st) {
|
||||
st = st.replace(/\\/g, '/');
|
||||
var isInternal = this._internals.some(function (internal) {
|
||||
return internal.test(st);
|
||||
if (!(/^\s*at /.test(stack[0])) && (/^\s*at /.test(stack[1]))) {
|
||||
stack = stack.slice(1);
|
||||
}
|
||||
|
||||
let outdent = false;
|
||||
let lastNonAtLine = null;
|
||||
const result = [];
|
||||
|
||||
stack.forEach(st => {
|
||||
st = st.replace(/\\/g, '/');
|
||||
|
||||
if (this._internals.some(internal => internal.test(st))) {
|
||||
return;
|
||||
}
|
||||
|
||||
const isAtLine = /^\s*at /.test(st);
|
||||
|
||||
if (outdent) {
|
||||
st = st.trimEnd().replace(/^(\s+)at /, '$1');
|
||||
} else {
|
||||
st = st.trim();
|
||||
if (isAtLine) {
|
||||
st = st.slice(3);
|
||||
}
|
||||
}
|
||||
|
||||
st = st.replace(`${this._cwd}/`, '');
|
||||
|
||||
if (st) {
|
||||
if (isAtLine) {
|
||||
if (lastNonAtLine) {
|
||||
result.push(lastNonAtLine);
|
||||
lastNonAtLine = null;
|
||||
}
|
||||
|
||||
result.push(st);
|
||||
} else {
|
||||
outdent = true;
|
||||
lastNonAtLine = st;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (isInternal) {
|
||||
return result.map(line => `${indent}${line}\n`).join('');
|
||||
}
|
||||
|
||||
captureString (limit, fn = this.captureString) {
|
||||
if (typeof limit === 'function') {
|
||||
fn = limit;
|
||||
limit = Infinity;
|
||||
}
|
||||
|
||||
const {stackTraceLimit} = Error;
|
||||
if (limit) {
|
||||
Error.stackTraceLimit = limit;
|
||||
}
|
||||
|
||||
const obj = {};
|
||||
|
||||
Error.captureStackTrace(obj, fn);
|
||||
const {stack} = obj;
|
||||
Error.stackTraceLimit = stackTraceLimit;
|
||||
|
||||
return this.clean(stack);
|
||||
}
|
||||
|
||||
capture (limit, fn = this.capture) {
|
||||
if (typeof limit === 'function') {
|
||||
fn = limit;
|
||||
limit = Infinity;
|
||||
}
|
||||
|
||||
const {prepareStackTrace, stackTraceLimit} = Error;
|
||||
Error.prepareStackTrace = (obj, site) => {
|
||||
if (this._wrapCallSite) {
|
||||
return site.map(this._wrapCallSite);
|
||||
}
|
||||
|
||||
return site;
|
||||
};
|
||||
|
||||
if (limit) {
|
||||
Error.stackTraceLimit = limit;
|
||||
}
|
||||
|
||||
const obj = {};
|
||||
Error.captureStackTrace(obj, fn);
|
||||
const { stack } = obj;
|
||||
Object.assign(Error, {prepareStackTrace, stackTraceLimit});
|
||||
|
||||
return stack;
|
||||
}
|
||||
|
||||
at (fn = this.at) {
|
||||
const [site] = this.capture(1, fn);
|
||||
|
||||
if (!site) {
|
||||
return {};
|
||||
}
|
||||
|
||||
const res = {
|
||||
line: site.getLineNumber(),
|
||||
column: site.getColumnNumber()
|
||||
};
|
||||
|
||||
setFile(res, site.getFileName(), this._cwd);
|
||||
|
||||
if (site.isConstructor()) {
|
||||
res.constructor = true;
|
||||
}
|
||||
|
||||
if (site.isEval()) {
|
||||
res.evalOrigin = site.getEvalOrigin();
|
||||
}
|
||||
|
||||
// Node v10 stopped with the isNative() on callsites, apparently
|
||||
/* istanbul ignore next */
|
||||
if (site.isNative()) {
|
||||
res.native = true;
|
||||
}
|
||||
|
||||
let typename;
|
||||
try {
|
||||
typename = site.getTypeName();
|
||||
} catch (_) {
|
||||
}
|
||||
|
||||
if (typename && typename !== 'Object' && typename !== '[object Object]') {
|
||||
res.type = typename;
|
||||
}
|
||||
|
||||
const fname = site.getFunctionName();
|
||||
if (fname) {
|
||||
res.function = fname;
|
||||
}
|
||||
|
||||
const meth = site.getMethodName();
|
||||
if (meth && fname !== meth) {
|
||||
res.method = meth;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
parseLine (line) {
|
||||
const match = line && line.match(re);
|
||||
if (!match) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var isAtLine = /^\s*at /.test(st);
|
||||
const ctor = match[1] === 'new';
|
||||
let fname = match[2];
|
||||
const evalOrigin = match[3];
|
||||
const evalFile = match[4];
|
||||
const evalLine = Number(match[5]);
|
||||
const evalCol = Number(match[6]);
|
||||
let file = match[7];
|
||||
const lnum = match[8];
|
||||
const col = match[9];
|
||||
const native = match[10] === 'native';
|
||||
const closeParen = match[11] === ')';
|
||||
let method;
|
||||
|
||||
if (outdent) {
|
||||
st = st.replace(/\s+$/, '').replace(/^(\s+)at /, '$1');
|
||||
} else {
|
||||
st = st.trim();
|
||||
if (isAtLine) {
|
||||
st = st.substring(3);
|
||||
}
|
||||
const res = {};
|
||||
|
||||
if (lnum) {
|
||||
res.line = Number(lnum);
|
||||
}
|
||||
|
||||
st = st.replace(this._cwd + '/', '');
|
||||
if (col) {
|
||||
res.column = Number(col);
|
||||
}
|
||||
|
||||
if (st) {
|
||||
if (isAtLine) {
|
||||
if (lastNonAtLine) {
|
||||
result.push(lastNonAtLine);
|
||||
lastNonAtLine = null;
|
||||
if (closeParen && file) {
|
||||
// make sure parens are balanced
|
||||
// if we have a file like "asdf) [as foo] (xyz.js", then odds are
|
||||
// that the fname should be += " (asdf) [as foo]" and the file
|
||||
// should be just "xyz.js"
|
||||
// walk backwards from the end to find the last unbalanced (
|
||||
let closes = 0;
|
||||
for (let i = file.length - 1; i > 0; i--) {
|
||||
if (file.charAt(i) === ')') {
|
||||
closes++;
|
||||
} else if (file.charAt(i) === '(' && file.charAt(i - 1) === ' ') {
|
||||
closes--;
|
||||
if (closes === -1 && file.charAt(i - 1) === ' ') {
|
||||
const before = file.slice(0, i - 1);
|
||||
const after = file.slice(i + 1);
|
||||
file = after;
|
||||
fname += ` (${before}`;
|
||||
break;
|
||||
}
|
||||
}
|
||||
result.push(st);
|
||||
} else {
|
||||
outdent = true;
|
||||
lastNonAtLine = st;
|
||||
}
|
||||
}
|
||||
}, this);
|
||||
|
||||
stack = result.join('\n').trim();
|
||||
|
||||
if (stack) {
|
||||
return stack + '\n';
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
StackUtils.prototype.captureString = function (limit, fn) {
|
||||
if (typeof limit === 'function') {
|
||||
fn = limit;
|
||||
limit = Infinity;
|
||||
}
|
||||
if (!fn) {
|
||||
fn = this.captureString;
|
||||
}
|
||||
|
||||
var limitBefore = Error.stackTraceLimit;
|
||||
if (limit) {
|
||||
Error.stackTraceLimit = limit;
|
||||
}
|
||||
|
||||
var obj = {};
|
||||
|
||||
Error.captureStackTrace(obj, fn);
|
||||
var stack = obj.stack;
|
||||
Error.stackTraceLimit = limitBefore;
|
||||
|
||||
return this.clean(stack);
|
||||
};
|
||||
|
||||
StackUtils.prototype.capture = function (limit, fn) {
|
||||
if (typeof limit === 'function') {
|
||||
fn = limit;
|
||||
limit = Infinity;
|
||||
}
|
||||
if (!fn) {
|
||||
fn = this.capture;
|
||||
}
|
||||
var prepBefore = Error.prepareStackTrace;
|
||||
var limitBefore = Error.stackTraceLimit;
|
||||
var wrapCallSite = this._wrapCallSite;
|
||||
|
||||
Error.prepareStackTrace = function (obj, site) {
|
||||
if (wrapCallSite) {
|
||||
return site.map(wrapCallSite);
|
||||
if (fname) {
|
||||
const methodMatch = fname.match(methodRe);
|
||||
if (methodMatch) {
|
||||
fname = methodMatch[1];
|
||||
method = methodMatch[2];
|
||||
}
|
||||
}
|
||||
return site;
|
||||
};
|
||||
|
||||
if (limit) {
|
||||
Error.stackTraceLimit = limit;
|
||||
setFile(res, file, this._cwd);
|
||||
|
||||
if (ctor) {
|
||||
res.constructor = true;
|
||||
}
|
||||
|
||||
if (evalOrigin) {
|
||||
res.evalOrigin = evalOrigin;
|
||||
res.evalLine = evalLine;
|
||||
res.evalColumn = evalCol;
|
||||
res.evalFile = evalFile && evalFile.replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
if (native) {
|
||||
res.native = true;
|
||||
}
|
||||
|
||||
if (fname) {
|
||||
res.function = fname;
|
||||
}
|
||||
|
||||
if (method && fname !== method) {
|
||||
res.method = method;
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
}
|
||||
|
||||
var obj = {};
|
||||
Error.captureStackTrace(obj, fn);
|
||||
var stack = obj.stack;
|
||||
Error.prepareStackTrace = prepBefore;
|
||||
Error.stackTraceLimit = limitBefore;
|
||||
|
||||
return stack;
|
||||
};
|
||||
|
||||
StackUtils.prototype.at = function at(fn) {
|
||||
if (!fn) {
|
||||
fn = at;
|
||||
}
|
||||
|
||||
var site = this.capture(1, fn)[0];
|
||||
|
||||
if (!site) {
|
||||
return {};
|
||||
}
|
||||
|
||||
var res = {
|
||||
line: site.getLineNumber(),
|
||||
column: site.getColumnNumber()
|
||||
};
|
||||
|
||||
this._setFile(res, site.getFileName());
|
||||
|
||||
if (site.isConstructor()) {
|
||||
res.constructor = true;
|
||||
}
|
||||
|
||||
if (site.isEval()) {
|
||||
res.evalOrigin = site.getEvalOrigin();
|
||||
}
|
||||
|
||||
// Node v10 stopped with the isNative() on callsites, apparently
|
||||
/* istanbul ignore next */
|
||||
if (site.isNative()) {
|
||||
res.native = true;
|
||||
}
|
||||
|
||||
var typename = null;
|
||||
try {
|
||||
typename = site.getTypeName();
|
||||
} catch (er) {}
|
||||
|
||||
if (typename &&
|
||||
typename !== 'Object' &&
|
||||
typename !== '[object Object]') {
|
||||
res.type = typename;
|
||||
}
|
||||
|
||||
var fname = site.getFunctionName();
|
||||
if (fname) {
|
||||
res.function = fname;
|
||||
}
|
||||
|
||||
var meth = site.getMethodName();
|
||||
if (meth && fname !== meth) {
|
||||
res.method = meth;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
StackUtils.prototype._setFile = function (result, filename) {
|
||||
function setFile (result, filename, cwd) {
|
||||
if (filename) {
|
||||
filename = filename.replace(/\\/g, '/');
|
||||
if ((filename.indexOf(this._cwd + '/') === 0)) {
|
||||
filename = filename.substr(this._cwd.length + 1);
|
||||
if (filename.startsWith(`${cwd}/`)) {
|
||||
filename = filename.slice(cwd.length + 1);
|
||||
}
|
||||
|
||||
result.file = filename;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
var re = new RegExp(
|
||||
function ignoredPackagesRegExp(ignoredPackages) {
|
||||
if (ignoredPackages.length === 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
const packages = ignoredPackages.map(mod => escapeStringRegexp(mod));
|
||||
|
||||
return new RegExp(`[\/\\\\]node_modules[\/\\\\](?:${packages.join('|')})[\/\\\\][^:]+:\\d+:\\d+`)
|
||||
}
|
||||
|
||||
const re = new RegExp(
|
||||
'^' +
|
||||
// Sometimes we strip out the ' at' because it's noisy
|
||||
'(?:\\s*at )?' +
|
||||
@@ -235,97 +329,6 @@ var re = new RegExp(
|
||||
'(\\)?)$'
|
||||
);
|
||||
|
||||
var methodRe = /^(.*?) \[as (.*?)\]$/;
|
||||
const methodRe = /^(.*?) \[as (.*?)\]$/;
|
||||
|
||||
StackUtils.prototype.parseLine = function parseLine(line) {
|
||||
var match = line && line.match(re);
|
||||
if (!match) {
|
||||
return null;
|
||||
}
|
||||
|
||||
var ctor = match[1] === 'new';
|
||||
var fname = match[2];
|
||||
var evalOrigin = match[3];
|
||||
var evalFile = match[4];
|
||||
var evalLine = Number(match[5]);
|
||||
var evalCol = Number(match[6]);
|
||||
var file = match[7];
|
||||
var lnum = match[8];
|
||||
var col = match[9];
|
||||
var native = match[10] === 'native';
|
||||
var closeParen = match[11] === ')';
|
||||
|
||||
var res = {};
|
||||
|
||||
if (lnum) {
|
||||
res.line = Number(lnum);
|
||||
}
|
||||
|
||||
if (col) {
|
||||
res.column = Number(col);
|
||||
}
|
||||
|
||||
if (closeParen && file) {
|
||||
// make sure parens are balanced
|
||||
// if we have a file like "asdf) [as foo] (xyz.js", then odds are
|
||||
// that the fname should be += " (asdf) [as foo]" and the file
|
||||
// should be just "xyz.js"
|
||||
// walk backwards from the end to find the last unbalanced (
|
||||
var closes = 0;
|
||||
for (var i = file.length - 1; i > 0; i--) {
|
||||
if (file.charAt(i) === ')') {
|
||||
closes ++;
|
||||
} else if (file.charAt(i) === '(' && file.charAt(i - 1) === ' ') {
|
||||
closes --;
|
||||
if (closes === -1 && file.charAt(i - 1) === ' ') {
|
||||
var before = file.substr(0, i - 1);
|
||||
var after = file.substr(i + 1);
|
||||
file = after;
|
||||
fname += ' (' + before;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (fname) {
|
||||
var methodMatch = fname.match(methodRe);
|
||||
if (methodMatch) {
|
||||
fname = methodMatch[1];
|
||||
var meth = methodMatch[2];
|
||||
}
|
||||
}
|
||||
|
||||
this._setFile(res, file);
|
||||
|
||||
if (ctor) {
|
||||
res.constructor = true;
|
||||
}
|
||||
|
||||
if (evalOrigin) {
|
||||
res.evalOrigin = evalOrigin;
|
||||
res.evalLine = evalLine;
|
||||
res.evalColumn = evalCol;
|
||||
res.evalFile = evalFile && evalFile.replace(/\\/g, '/');
|
||||
}
|
||||
|
||||
if (native) {
|
||||
res.native = true;
|
||||
}
|
||||
|
||||
if (fname) {
|
||||
res.function = fname;
|
||||
}
|
||||
|
||||
if (meth && fname !== meth) {
|
||||
res.method = meth;
|
||||
}
|
||||
|
||||
return res;
|
||||
};
|
||||
|
||||
var bound = new StackUtils();
|
||||
|
||||
Object.keys(StackUtils.prototype).forEach(function (key) {
|
||||
StackUtils[key] = bound[key].bind(bound);
|
||||
});
|
||||
module.exports = StackUtils;
|
||||
|
||||
Reference in New Issue
Block a user