Skip to content

Commit 50fa3d9

Browse files
committed
feat: use stacktrace-parser
1 parent 2588865 commit 50fa3d9

File tree

7 files changed

+56
-35
lines changed

7 files changed

+56
-35
lines changed

package-lock.json

Lines changed: 22 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
"name": "Gajus Kuizinas",
55
"url": "https://gajus.com"
66
},
7+
"dependencies": {
8+
"stacktrace-parser": "^0.1.10"
9+
},
710
"description": "V8 stack traces",
811
"devDependencies": {
912
"@semantic-release/commit-analyzer": "^11.0.0",

src/getStackTrace.test.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@ import { expect, test } from 'vitest';
44
test('gets stack trace', () => {
55
const stackTrace = getStackTrace();
66

7-
expect(stackTrace.callSites[0].fileName).toMatch(/getStackTrace/u);
7+
expect(stackTrace[0].fileName).toMatch(/getStackTrace/u);
8+
expect(stackTrace[0].lineNumber).toBe(5);
9+
expect(stackTrace[0].columnNumber).toBe(22);
810
});

src/getStackTrace.ts

Lines changed: 23 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
11
import { type StackTrace } from './types';
2+
import { parse as parseStackTrace } from 'stacktrace-parser';
23

34
export const getStackTrace = (): StackTrace => {
4-
const oldStackTraceLimit = Error.stackTraceLimit;
5-
const oldPrepareStackTrace = Error.prepareStackTrace;
6-
7-
Error.prepareStackTrace = (error, structuredStackTrace) => {
8-
return structuredStackTrace;
9-
};
10-
11-
const honeypot: { stack: NodeJS.CallSite[] } = {
12-
stack: [],
13-
};
14-
15-
Error.captureStackTrace(honeypot);
16-
17-
const callSites = honeypot.stack;
18-
19-
Error.stackTraceLimit = oldStackTraceLimit;
20-
Error.prepareStackTrace = oldPrepareStackTrace;
21-
22-
const trail: readonly NodeJS.CallSite[] = callSites.slice(1);
23-
24-
return {
25-
callSites: trail.map((callSite) => {
5+
// The reason we are parsing the stack trace rather than
6+
// using captureStackTrace is because captureStackTrace
7+
// does not resolve source maps, i.e. the stack trace
8+
// will contain the compiled code references rather than
9+
// the original source code references.
10+
//
11+
// eslint-disable-next-line unicorn/error-message
12+
const stackTrace = new Error().stack;
13+
14+
if (!stackTrace) {
15+
throw new Error('Could not get stack trace');
16+
}
17+
18+
return parseStackTrace(stackTrace)
19+
.map((stackFrame) => {
2620
return {
27-
columnNumber: callSite.getColumnNumber(),
28-
fileName: callSite.getFileName() ?? null,
29-
functionName: callSite.getFunctionName(),
30-
lineNumber: callSite.getLineNumber(),
21+
arguments: stackFrame.arguments,
22+
columnNumber: stackFrame.column,
23+
fileName: stackFrame.file,
24+
functionName: stackFrame.methodName,
25+
lineNumber: stackFrame.lineNumber,
3126
};
32-
}),
33-
};
27+
})
28+
.slice(1);
3429
};

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export { getStackTrace } from './getStackTrace';
22
export { serializeStackTrace } from './serializeStackTrace';
3-
export { CallSite, StackTrace } from './types';
3+
export { StackFrame, StackTrace } from './types';

src/serializeStackTrace.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export const serializeStackTrace = (
1010
': ' +
1111
errorMessage +
1212
'\n' +
13-
stackTrace.callSites
13+
stackTrace
1414
.map((stackFrame) => {
1515
const { columnNumber, fileName, functionName, lineNumber } = stackFrame;
1616

src/types.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
export type CallSite = {
1+
export type StackFrame = {
2+
arguments: readonly string[];
23
columnNumber: number | null;
34
fileName: string | null;
45
functionName: string | null;
56
lineNumber: number | null;
67
};
78

8-
export type StackTrace = {
9-
callSites: CallSite[];
10-
};
9+
export type StackTrace = StackFrame[];

0 commit comments

Comments
 (0)