Skip to content

Commit 01228c8

Browse files
committed
feat: Add root option to RewriteFrames integration
1 parent 8ab69ac commit 01228c8

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

packages/node/src/integrations/pluggable/rewriteframes.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Scope } from '@sentry/hub';
22
import { Integration, SentryEvent, StackFrame } from '@sentry/types';
3-
import { basename } from 'path';
3+
import { basename, relative } from 'path';
44
import { getCurrentHub } from '../../hub';
55

66
type StackFrameIteratee = (frame: StackFrame) => Promise<StackFrame>;
@@ -15,17 +15,26 @@ export class RewriteFrames implements Integration {
1515
/**
1616
* @inheritDoc
1717
*/
18-
public iteratee: StackFrameIteratee = async (frame: StackFrame) => {
18+
private readonly root?: string;
19+
20+
/**
21+
* @inheritDoc
22+
*/
23+
private readonly iteratee: StackFrameIteratee = async (frame: StackFrame) => {
1924
if (frame.filename && frame.filename.startsWith('/')) {
20-
frame.filename = `app:///${basename(frame.filename)}`;
25+
const base = this.root ? relative(this.root, frame.filename) : basename(frame.filename);
26+
frame.filename = `app:///${base}`;
2127
}
2228
return frame;
2329
};
2430

2531
/**
2632
* @inheritDoc
2733
*/
28-
public constructor(options: { iteratee?: StackFrameIteratee } = {}) {
34+
public constructor(options: { root?: string; iteratee?: StackFrameIteratee } = {}) {
35+
if (options.root) {
36+
this.root = options.root;
37+
}
2938
if (options.iteratee) {
3039
this.iteratee = options.iteratee;
3140
}

packages/node/test/integrations/rewriteframes.test.ts

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,16 @@ let rewriteFrames: RewriteFrames;
55
let messageEvent: SentryEvent;
66
let exceptionEvent: SentryEvent;
77

8-
describe('RewriteFrames', () => {
8+
describe.only('RewriteFrames', () => {
99
beforeEach(() => {
1010
messageEvent = {
1111
stacktrace: {
1212
frames: [
1313
{
14-
filename: '/some/file1.js',
14+
filename: '/www/src/app/file1.js',
1515
},
1616
{
17-
filename: '/some/file2.js',
17+
filename: '/www/src/app/file2.js',
1818
},
1919
],
2020
},
@@ -26,10 +26,10 @@ describe('RewriteFrames', () => {
2626
stacktrace: {
2727
frames: [
2828
{
29-
filename: '/some/file1.js',
29+
filename: '/www/src/app/file1.js',
3030
},
3131
{
32-
filename: '/some/file2.js',
32+
filename: '/www/src/app/file2.js',
3333
},
3434
],
3535
},
@@ -39,7 +39,7 @@ describe('RewriteFrames', () => {
3939
};
4040
});
4141

42-
describe('default iteratee appends `app:///` if frame starts with `/`', () => {
42+
describe('default iteratee appends basename to `app:///` if frame starts with `/`', () => {
4343
beforeEach(() => {
4444
rewriteFrames = new RewriteFrames();
4545
});
@@ -57,6 +57,26 @@ describe('RewriteFrames', () => {
5757
});
5858
});
5959

60+
describe('can use custom root to perform `relative` on filepaths', () => {
61+
beforeEach(() => {
62+
rewriteFrames = new RewriteFrames({
63+
root: '/www',
64+
});
65+
});
66+
67+
it('transforms messageEvent frames', async () => {
68+
const event = await rewriteFrames.process(messageEvent);
69+
expect(event.stacktrace!.frames![0].filename).toEqual('app:///src/app/file1.js');
70+
expect(event.stacktrace!.frames![1].filename).toEqual('app:///src/app/file2.js');
71+
});
72+
73+
it('transforms exceptionEvent frames', async () => {
74+
const event = await rewriteFrames.process(exceptionEvent);
75+
expect(event.exception!.values![0].stacktrace!.frames![0].filename).toEqual('app:///src/app/file1.js');
76+
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('app:///src/app/file2.js');
77+
});
78+
});
79+
6080
describe('can use custom iteratee', () => {
6181
beforeEach(() => {
6282
rewriteFrames = new RewriteFrames({
@@ -69,17 +89,17 @@ describe('RewriteFrames', () => {
6989

7090
it('transforms messageEvent frames', async () => {
7191
const event = await rewriteFrames.process(messageEvent);
72-
expect(event.stacktrace!.frames![0].filename).toEqual('/some/file1.js');
92+
expect(event.stacktrace!.frames![0].filename).toEqual('/www/src/app/file1.js');
7393
expect(event.stacktrace!.frames![0].function).toEqual('whoops');
74-
expect(event.stacktrace!.frames![1].filename).toEqual('/some/file2.js');
94+
expect(event.stacktrace!.frames![1].filename).toEqual('/www/src/app/file2.js');
7595
expect(event.stacktrace!.frames![1].function).toEqual('whoops');
7696
});
7797

7898
it('transforms exceptionEvent frames', async () => {
7999
const event = await rewriteFrames.process(exceptionEvent);
80-
expect(event.exception!.values![0].stacktrace!.frames![0].filename).toEqual('/some/file1.js');
100+
expect(event.exception!.values![0].stacktrace!.frames![0].filename).toEqual('/www/src/app/file1.js');
81101
expect(event.exception!.values![0].stacktrace!.frames![0].function).toEqual('whoops');
82-
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('/some/file2.js');
102+
expect(event.exception!.values![0].stacktrace!.frames![1].filename).toEqual('/www/src/app/file2.js');
83103
expect(event.exception!.values![0].stacktrace!.frames![1].function).toEqual('whoops');
84104
});
85105
});

0 commit comments

Comments
 (0)