-
-
Notifications
You must be signed in to change notification settings - Fork 1.7k
Description
Currently, when you are using the RewriteFrames integration, in my case to handle TypeScript source maps, you end you with a filename starting with app://. Here is an example:
I would like to change this prefix to something else, like : project://. After some research, I found that the app:// is hardcoded here, in the default iteratee:
sentry-javascript/packages/integrations/src/rewriteframes.ts
Lines 77 to 79 in f48efb8
| const base = this._root ? relative(this._root, filename) : basename(filename); | |
| frame.filename = `app:///${base}`; | |
| } |
Of course, it's possible to pass a custom iteratee into the RewriteFrames constructor, like so:
new RewriteFrames({
root: global.__rootdir__,
iteratee: function (frame: StackFrame) {
if (!frame.filename) {
return frame;
}
// Check if the frame filename begins with `/` or a Windows-style prefix such as `C:\`
const isWindowsFrame = /^[A-Z]:\\/.test(frame.filename);
const startsWithSlash = /^\//.test(frame.filename);
if (isWindowsFrame || startsWithSlash) {
const filename = isWindowsFrame
? frame.filename
.replace(/^[A-Z]:/, '') // remove Windows-style prefix
.replace(/\\/g, '/') // replace all `\\` instances with `/`
: frame.filename;
const base = global.__rootdir__ ? relative(global.__rootdir__, filename) : basename(filename);
frame.filename = `myprefix:///${base}`; // <--- custom prefix
}
return frame;
},
});but it means that the developer has to update the callback after each @sentry/inetgration upgrade, if he wants to keep the library default behavior.
I think that it would be convenient to add a prefix key to the RewriteFrames constructor and a _prefix property set to app:// by default. The patched version could look like this:
export class RewriteFrames implements Integration {
private readonly _prefix: string = 'app://';
// Rest of rewriteframes.ts
public constructor(options: { root?: string; iteratee?: StackFrameIteratee } = {}) {
if (options.root) {
this._root = options.root;
}
if (options.iteratee) {
this._iteratee = options.iteratee;
}
if (options.prefix) {
this._prefix = options.prefix;
}
}
// Rest of rewriteframes.ts
private readonly _iteratee: StackFrameIteratee = (frame: StackFrame) => {
if (!frame.filename) {
return frame;
}
// Check if the frame filename begins with `/` or a Windows-style prefix such as `C:\`
const isWindowsFrame = /^[A-Z]:\\/.test(frame.filename);
const startsWithSlash = /^\//.test(frame.filename);
if (isWindowsFrame || startsWithSlash) {
const filename = isWindowsFrame
? frame.filename
.replace(/^[A-Z]:/, '') // remove Windows-style prefix
.replace(/\\/g, '/') // replace all `\\` instances with `/`
: frame.filename;
const base = this._root ? relative(this._root, filename) : basename(filename);
frame.filename = `${this._prefix}:///${base}`;
}
return frame;
};
// Rest of rewriteframes.ts
}If this feature is coherent with the project, I would be happy to submit a PR.
