From 01085f6d7389b9589d89adc9fa9c3a4b2a46da8d Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 19 Apr 2023 12:21:54 +0200 Subject: [PATCH] fix(nextjs): Handle braces in stack frame URLs --- packages/browser/src/stack-parsers.ts | 2 +- .../test/unit/tracekit/chromium.test.ts | 35 +++++++++++++++++++ 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/packages/browser/src/stack-parsers.ts b/packages/browser/src/stack-parsers.ts index e4c66755f232..2cbde124ba7e 100644 --- a/packages/browser/src/stack-parsers.ts +++ b/packages/browser/src/stack-parsers.ts @@ -55,7 +55,7 @@ function createFrame(filename: string, func: string, lineno?: number, colno?: nu // Chromium based browsers: Chrome, Brave, new Opera, new Edge const chromeRegex = - /^\s*at (?:(.*\).*?|.*?) ?\((?:address at )?)?(?:async )?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; + /^\s*at (?:(.+?\)(?: \[.+\])?|.*?) ?\((?:address at )?)?(?:async )?((?:file|https?|blob|chrome-extension|address|native|eval|webpack||[-a-z]+:|.*bundle|\/)?.*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i; const chromeEvalRegex = /\((\S*)(?::(\d+))(?::(\d+))\)/; const chrome: StackLineParserFn = line => { diff --git a/packages/browser/test/unit/tracekit/chromium.test.ts b/packages/browser/test/unit/tracekit/chromium.test.ts index b0df582ebeef..56b5844711e7 100644 --- a/packages/browser/test/unit/tracekit/chromium.test.ts +++ b/packages/browser/test/unit/tracekit/chromium.test.ts @@ -573,6 +573,41 @@ describe('Tracekit - Chrome Tests', () => { }); }); + it('handles braces in urls', () => { + const CHROME_BRACES_URL = { + message: 'bad', + name: 'Error', + stack: `Error: bad + at something (http://localhost:5000/(some)/(thing)/index.html:20:16) + at more (http://localhost:5000/(some)/(thing)/index.html:25:7)`, + }; + + const ex = exceptionFromError(parser, CHROME_BRACES_URL); + + expect(ex).toEqual({ + value: 'bad', + type: 'Error', + stacktrace: { + frames: [ + { + filename: 'http://localhost:5000/(some)/(thing)/index.html', + function: 'more', + lineno: 25, + colno: 7, + in_app: true, + }, + { + filename: 'http://localhost:5000/(some)/(thing)/index.html', + function: 'something', + lineno: 20, + colno: 16, + in_app: true, + }, + ], + }, + }); + }); + it('should drop frames that are over 1kb', () => { const LONG_STR = 'A'.repeat(1040);