diff --git a/packages/node/src/module.ts b/packages/node/src/module.ts index 15682d16d121..1e759df77506 100644 --- a/packages/node/src/module.ts +++ b/packages/node/src/module.ts @@ -1,20 +1,29 @@ import { basename, dirname } from '@sentry/utils'; +/** normalizes Windows paths */ +function normalizePath(path: string): string { + return path + .replace(/^[A-Z]:/, '') // remove Windows-style prefix + .replace(/\\/g, '/'); // replace all `\` instances with `/` +} + /** Gets the module from a filename */ export function getModule(filename: string | undefined): string | undefined { if (!filename) { return; } + const normalizedFilename = normalizePath(filename); + // We could use optional chaining here but webpack does like that mixed with require - const base = `${ - (require && require.main && require.main.filename && dirname(require.main.filename)) || global.process.cwd() - }/`; + const base = normalizePath( + `${(require && require.main && require.main.filename && dirname(require.main.filename)) || global.process.cwd()}/`, + ); // It's specifically a module - const file = basename(filename, '.js'); + const file = basename(normalizedFilename, '.js'); - const path = dirname(filename); + const path = dirname(normalizedFilename); let n = path.lastIndexOf('/node_modules/'); if (n > -1) { // /node_modules/ is 14 chars diff --git a/packages/node/test/module.test.ts b/packages/node/test/module.test.ts new file mode 100644 index 000000000000..d059dc803f9d --- /dev/null +++ b/packages/node/test/module.test.ts @@ -0,0 +1,30 @@ +import { getModule } from '../src/module'; + +function withFilename(fn: () => void, filename: string) { + const prevFilename = require.main?.filename; + if (require.main?.filename) { + require.main.filename = filename; + } + + try { + fn(); + } finally { + if (require.main && prevFilename) { + require.main.filename = prevFilename; + } + } +} + +describe('getModule', () => { + test('Windows', () => { + withFilename(() => { + expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); + }, 'C:\\Users\\Tim\\app.js'); + }); + + test('POSIX', () => { + withFilename(() => { + expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); + }, '/Users/Tim/app.js'); + }); +});