diff --git a/packages/metro-symbolicate/src/Symbolication.js b/packages/metro-symbolicate/src/Symbolication.js index 585c0055a0..407c2e0870 100644 --- a/packages/metro-symbolicate/src/Symbolication.js +++ b/packages/metro-symbolicate/src/Symbolication.js @@ -161,11 +161,13 @@ class SymbolicationContext { // IOS: foo@123.js:4:18131, Android: bar:123.js:4:18063 // sample stack trace without function name: // 123.js:4:18131 + // sample stack trace with a Windows absolute path: + // foo@C:\app\123.js:4:18131 // sample result: // IOS: foo.js:57:foo, Android: bar.js:75:bar symbolicate(stackTrace: string): string { return stackTrace.replace( - /(?:([^@: \n(]+)(@|:))?(?:(?:([^@: \n(]+):)?(\d+):(\d+)|\[native code\])/g, + /(?:((?:[A-Za-z]:\\)?[^@: \n(]+)(@|:))?(?:(?:((?:[A-Za-z]:\\)?[^@: \n(]+):)?(\d+):(\d+)|\[native code\])/g, (match, func, delimiter, fileName, line, column) => { if (delimiter === ':' && func && !fileName) { fileName = func; diff --git a/packages/metro-symbolicate/src/__tests__/symbolicate-test.js b/packages/metro-symbolicate/src/__tests__/symbolicate-test.js index 932f0c79af..ba7d33782a 100644 --- a/packages/metro-symbolicate/src/__tests__/symbolicate-test.js +++ b/packages/metro-symbolicate/src/__tests__/symbolicate-test.js @@ -210,6 +210,18 @@ test('symbolicating a stack trace', async () => execute([TESTFILE_MAP], read('testfile.stack')), ).resolves.toMatchSnapshot()); +test('symbolicating a stack trace with Windows absolute paths', async () => { + const stack = read('testfile.stack'); + const windowsStack = stack.replaceAll( + /(^|@)(thrower\.min\.js)/gm, + '$1C:\\app\\$2', + ); + expect(windowsStack).not.toEqual(stack); + expect(await execute([TESTFILE_MAP], windowsStack)).toEqual( + await execute([TESTFILE_MAP], stack), + ); +}); + test('symbolicating a stack trace in Node format', async () => await expect( execute([TESTFILE_MAP], read('testfile.node.stack')), diff --git a/scripts/jestFilter.js b/scripts/jestFilter.js index f8b8c42c9b..26398044f9 100644 --- a/scripts/jestFilter.js +++ b/scripts/jestFilter.js @@ -15,10 +15,6 @@ const SKIPPED_ON_WINDOWS = [ // flow-api-translator emits os.EOL line endings in generated comments. // Snapshots are generated and verified on posix only. 'scripts/__tests__/api-snapshots-sync-test.js', - - // TODO: Windows product bugs - // Stack trace parsing does not support drive letters - 'packages/metro-symbolicate/src/__tests__/symbolicate-test.js', ]; const SKIPPED_PATHS = process.platform === 'win32' ? SKIPPED_ON_WINDOWS : [];