From 082d66ff5725318febc8adb6cb4f2ac4093c884e Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 27 Jul 2022 16:04:06 +0100 Subject: [PATCH 1/5] Fix getModule so it correctly handles Windows paths --- packages/node/src/module.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/packages/node/src/module.ts b/packages/node/src/module.ts index 15682d16d121..cc2d91436b0f 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 normalisePath(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 = normalisePath(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 = normalisePath( + `${(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 From 8f44a263d37c38b447cdd908f5523ec636885393 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 27 Jul 2022 22:21:36 +0100 Subject: [PATCH 2/5] Add test --- packages/node/test/module.test.ts | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 packages/node/test/module.test.ts diff --git a/packages/node/test/module.test.ts b/packages/node/test/module.test.ts new file mode 100644 index 000000000000..2e0c981aaa31 --- /dev/null +++ b/packages/node/test/module.test.ts @@ -0,0 +1,15 @@ +import { getModule } from '../src/module'; + +describe('getModule', () => { + test('Windows', async () => { + (require.main as any) = { filename: 'C:\\Users\\Tim\\app.js' }; + + expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); + }); + + test('POSIX', async () => { + (require.main as any) = { filename: '/Users/Tim/app.js' }; + + expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); + }); +}); From e9573b01f3db252b295d2c0da5377ed55e16182b Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Wed, 27 Jul 2022 23:42:54 +0100 Subject: [PATCH 3/5] Restore filename --- packages/node/test/module.test.ts | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/packages/node/test/module.test.ts b/packages/node/test/module.test.ts index 2e0c981aaa31..714abe7b6490 100644 --- a/packages/node/test/module.test.ts +++ b/packages/node/test/module.test.ts @@ -1,15 +1,30 @@ import { getModule } from '../src/module'; +function reaplaceFilename(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', async () => { - (require.main as any) = { filename: 'C:\\Users\\Tim\\app.js' }; - - expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); + reaplaceFilename(() => { + expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); + }, 'C:\\Users\\Tim\\app.js'); }); test('POSIX', async () => { - (require.main as any) = { filename: '/Users/Tim/app.js' }; - - expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); + reaplaceFilename(() => { + expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); + }, '/Users/Tim/app.js'); }); }); From d220b2688db074322a8a2be0d6a1492a98913871 Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Thu, 28 Jul 2022 00:03:15 +0100 Subject: [PATCH 4/5] better function name --- packages/node/test/module.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/node/test/module.test.ts b/packages/node/test/module.test.ts index 714abe7b6490..c3f4d3785fe9 100644 --- a/packages/node/test/module.test.ts +++ b/packages/node/test/module.test.ts @@ -1,6 +1,6 @@ import { getModule } from '../src/module'; -function reaplaceFilename(fn: () => void, filename: string) { +function withFilename(fn: () => void, filename: string) { const prevFilename = require.main?.filename; if (require.main?.filename) { require.main.filename = filename; @@ -17,13 +17,13 @@ function reaplaceFilename(fn: () => void, filename: string) { describe('getModule', () => { test('Windows', async () => { - reaplaceFilename(() => { + withFilename(() => { expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); }, 'C:\\Users\\Tim\\app.js'); }); test('POSIX', async () => { - reaplaceFilename(() => { + withFilename(() => { expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); }, '/Users/Tim/app.js'); }); From 589b5056113cd9d8ac9ae27c35a95e670c6684dc Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Thu, 28 Jul 2022 00:20:54 +0100 Subject: [PATCH 5/5] Review fixes --- packages/node/src/module.ts | 6 +++--- packages/node/test/module.test.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/node/src/module.ts b/packages/node/src/module.ts index cc2d91436b0f..1e759df77506 100644 --- a/packages/node/src/module.ts +++ b/packages/node/src/module.ts @@ -1,7 +1,7 @@ import { basename, dirname } from '@sentry/utils'; /** normalizes Windows paths */ -function normalisePath(path: string): string { +function normalizePath(path: string): string { return path .replace(/^[A-Z]:/, '') // remove Windows-style prefix .replace(/\\/g, '/'); // replace all `\` instances with `/` @@ -13,10 +13,10 @@ export function getModule(filename: string | undefined): string | undefined { return; } - const normalizedFilename = normalisePath(filename); + const normalizedFilename = normalizePath(filename); // We could use optional chaining here but webpack does like that mixed with require - const base = normalisePath( + const base = normalizePath( `${(require && require.main && require.main.filename && dirname(require.main.filename)) || global.process.cwd()}/`, ); diff --git a/packages/node/test/module.test.ts b/packages/node/test/module.test.ts index c3f4d3785fe9..d059dc803f9d 100644 --- a/packages/node/test/module.test.ts +++ b/packages/node/test/module.test.ts @@ -16,13 +16,13 @@ function withFilename(fn: () => void, filename: string) { } describe('getModule', () => { - test('Windows', async () => { + test('Windows', () => { withFilename(() => { expect(getModule('C:\\Users\\users\\Tim\\Desktop\\node_modules\\module.js')).toEqual('module'); }, 'C:\\Users\\Tim\\app.js'); }); - test('POSIX', async () => { + test('POSIX', () => { withFilename(() => { expect(getModule('/Users/users/Tim/Desktop/node_modules/module.js')).toEqual('module'); }, '/Users/Tim/app.js');