You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
60 lines
1.8 KiB
60 lines
1.8 KiB
2 years ago
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.getUserCodeFrame = getUserCodeFrame;
|
||
|
// We try to load node dependencies
|
||
|
let chalk = null;
|
||
|
let readFileSync = null;
|
||
|
let codeFrameColumns = null;
|
||
|
|
||
|
try {
|
||
|
const nodeRequire = module && module.require;
|
||
|
readFileSync = nodeRequire.call(module, 'fs').readFileSync;
|
||
|
codeFrameColumns = nodeRequire.call(module, '@babel/code-frame').codeFrameColumns;
|
||
|
chalk = nodeRequire.call(module, 'chalk');
|
||
|
} catch {// We're in a browser environment
|
||
|
} // frame has the form "at myMethod (location/to/my/file.js:10:2)"
|
||
|
|
||
|
|
||
|
function getCodeFrame(frame) {
|
||
|
const locationStart = frame.indexOf('(') + 1;
|
||
|
const locationEnd = frame.indexOf(')');
|
||
|
const frameLocation = frame.slice(locationStart, locationEnd);
|
||
|
const frameLocationElements = frameLocation.split(':');
|
||
|
const [filename, line, column] = [frameLocationElements[0], parseInt(frameLocationElements[1], 10), parseInt(frameLocationElements[2], 10)];
|
||
|
let rawFileContents = '';
|
||
|
|
||
|
try {
|
||
|
rawFileContents = readFileSync(filename, 'utf-8');
|
||
|
} catch {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
const codeFrame = codeFrameColumns(rawFileContents, {
|
||
|
start: {
|
||
|
line,
|
||
|
column
|
||
|
}
|
||
|
}, {
|
||
|
highlightCode: true,
|
||
|
linesBelow: 0
|
||
|
});
|
||
|
return `${chalk.dim(frameLocation)}\n${codeFrame}\n`;
|
||
|
}
|
||
|
|
||
|
function getUserCodeFrame() {
|
||
|
// If we couldn't load dependencies, we can't generate the user trace
|
||
|
|
||
|
/* istanbul ignore next */
|
||
|
if (!readFileSync || !codeFrameColumns) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
const err = new Error();
|
||
|
const firstClientCodeFrame = err.stack.split('\n').slice(1) // Remove first line which has the form "Error: TypeError"
|
||
|
.find(frame => !frame.includes('node_modules/')); // Ignore frames from 3rd party libraries
|
||
|
|
||
|
return getCodeFrame(firstClientCodeFrame);
|
||
|
}
|