From 742baceef97e767527498a2ad8b2ab66ad748333 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Wed, 6 Sep 2017 11:10:41 -0400 Subject: [PATCH] Add comment for posterity --- .../react-error-overlay/src/utils/unmapper.js | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/packages/react-error-overlay/src/utils/unmapper.js b/packages/react-error-overlay/src/utils/unmapper.js index 524b5258752..dc34af3265a 100644 --- a/packages/react-error-overlay/src/utils/unmapper.js +++ b/packages/react-error-overlay/src/utils/unmapper.js @@ -27,6 +27,25 @@ function count(search: string, string: string): number { return count; } +function normalizePath(_path: string): string { + // `path.normalize` cleans a file path, (e.g. /foo//baz/..//bar/ becomes + // /foo/bar/). + // The web version of this module only provides POSIX support, so Windows + // paths like C:\foo\\baz\..\\bar\ cannot be normalized. + // A simple solution to this is to replace all `\` with `/`, then normalize + // afterwards. + // + // Note: + // `path.normalize` supports POSIX forward slashes on Windows, but not the + // other way around. Converting all backslashes to forward slashes before + // normalizing makes this cross platform if it were isomorphic (used server + // side). + return path.normalize( + // Match contiguous backslashes + _path.replace(/[\\]+/g, '/') + ); +} + /** * Turns a set of mapped StackFrames back into their generated code position and enhances them with code. * @param {string} fileUri The URI of the bundle.js file. @@ -56,7 +75,7 @@ async function unmap( } let { fileName } = frame; if (fileName) { - fileName = path.normalize(fileName.replace(/[\\]+/g, '/')); + fileName = normalizePath(fileName); } if (fileName == null) { return frame; @@ -64,7 +83,7 @@ async function unmap( const fN: string = fileName; const source = map .getSources() - .map(s => s.replace(/[\\]+/g, '/')) + .map(normalizePath) .filter(p => { p = path.normalize(p); const i = p.lastIndexOf(fN);