diff --git a/dev-packages/e2e-tests/test-applications/react-router-sourcemaps/assert-build.ts b/dev-packages/e2e-tests/test-applications/react-router-sourcemaps/assert-build.ts index 2bc4986220d4..ca6acfb5a6aa 100644 --- a/dev-packages/e2e-tests/test-applications/react-router-sourcemaps/assert-build.ts +++ b/dev-packages/e2e-tests/test-applications/react-router-sourcemaps/assert-build.ts @@ -111,4 +111,12 @@ for (const chunk of chunks) { assert.ok(crossCheckedChunks > 0, 'Expected at least one uploaded chunk to cross-check debug IDs against'); console.log(`${crossCheckedChunks} chunk(s) ship a debug ID that was uploaded\n`); +const remainingClientMaps = fs + .readdirSync(CLIENT_ASSETS_DIR, { recursive: true }) + .filter(file => file.endsWith('.map')); +assert.deepEqual(remainingClientMaps, [], 'Expected client source maps to be deleted after upload'); + +const remainingServerMaps = fs.readdirSync('build/server', { recursive: true }).filter(file => file.endsWith('.map')); +assert.ok(remainingServerMaps.length > 0, 'Expected server source maps outside the deletion pattern to be preserved'); + console.log('All react-router source map assertions passed!'); diff --git a/packages/react-router/package.json b/packages/react-router/package.json index 097e965abe48..96123d150f2d 100644 --- a/packages/react-router/package.json +++ b/packages/react-router/package.json @@ -64,7 +64,6 @@ "@sentry/server-runtime-injection": "11.9.0", "@sentry/server-utils": "11.9.0", "@sentry/bundler-plugins": "11.9.0", - "glob": "^13.0.6", "sentry": "^0.44.0" }, "devDependencies": { diff --git a/packages/react-router/src/vite/buildEnd/handleOnBuildEnd.ts b/packages/react-router/src/vite/buildEnd/handleOnBuildEnd.ts index a4cf0403e248..79d413c99861 100644 --- a/packages/react-router/src/vite/buildEnd/handleOnBuildEnd.ts +++ b/packages/react-router/src/vite/buildEnd/handleOnBuildEnd.ts @@ -1,8 +1,8 @@ import { rm } from 'node:fs/promises'; import type { Config } from '@react-router/dev/config'; import { createSentrySDK } from 'sentry'; +import { globFiles } from '@sentry/bundler-plugins/core'; import type { SentryVitePluginOptions } from '@sentry/bundler-plugins/vite'; -import { glob } from 'glob'; import type { SentryReactRouterBuildOptions } from '../types'; type BuildEndHook = NonNullable; @@ -134,10 +134,7 @@ export const sentryOnBuildEnd: BuildEndHook = async ({ reactRouterConfig, viteCo } if (updatedFilesToDeleteAfterUpload) { try { - const filePathsToDelete = await glob(updatedFilesToDeleteAfterUpload, { - absolute: true, - nodir: true, - }); + const filePathsToDelete = await globFiles(updatedFilesToDeleteAfterUpload); if (debug) { filePathsToDelete.forEach(filePathToDelete => { // eslint-disable-next-line no-console diff --git a/packages/react-router/test/vite/buildEnd/handleOnBuildEnd.test.ts b/packages/react-router/test/vite/buildEnd/handleOnBuildEnd.test.ts index 560552ed278d..a7db6362b9fa 100644 --- a/packages/react-router/test/vite/buildEnd/handleOnBuildEnd.test.ts +++ b/packages/react-router/test/vite/buildEnd/handleOnBuildEnd.test.ts @@ -1,6 +1,6 @@ import { createSentrySDK } from 'sentry'; import { rm } from 'node:fs/promises'; -import { glob } from 'glob'; +import { globFiles } from '@sentry/bundler-plugins/core'; import type { ResolvedConfig } from 'vite'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { sentryOnBuildEnd } from '../../../src/vite/buildEnd/handleOnBuildEnd'; @@ -11,7 +11,7 @@ vi.mock('node:fs/promises', () => { const rm = vi.fn().mockResolvedValue(undefined); return { rm, default: { rm } }; }); -vi.mock('glob'); +vi.mock('@sentry/bundler-plugins/core', () => ({ globFiles: vi.fn() })); type TestConfig = ResolvedConfig & { sentryConfig: SentryReactRouterBuildOptions; @@ -62,7 +62,7 @@ describe('sentryOnBuildEnd', () => { vi.mocked(createSentrySDK) .mockReset() .mockReturnValue(mockSentrySdkInstance as unknown as ReturnType); - vi.mocked(glob).mockResolvedValue(['/build/file1.map', '/build/file2.map']); + vi.mocked(globFiles).mockResolvedValue(['/build/file1.map', '/build/file2.map']); vi.mocked(rm).mockResolvedValue(undefined); }); @@ -126,10 +126,7 @@ describe('sentryOnBuildEnd', () => { directory: '/build', release: '1.2.3', }); - expect(glob).toHaveBeenCalledWith(['./build/custom/**/*.map'], { - absolute: true, - nodir: true, - }); + expect(globFiles).toHaveBeenCalledWith(['./build/custom/**/*.map']); }); it('should upload source maps when enabled', async () => { @@ -196,7 +193,7 @@ describe('sentryOnBuildEnd', () => { expect(mockSentrySdkInstance.sourcemap.inject).not.toHaveBeenCalled(); expect(mockSentrySdkInstance.sourcemap.upload).not.toHaveBeenCalled(); - expect(glob).not.toHaveBeenCalled(); + expect(globFiles).not.toHaveBeenCalled(); expect(rm).not.toHaveBeenCalled(); }); @@ -219,7 +216,7 @@ describe('sentryOnBuildEnd', () => { expect(mockSentrySdkInstance.sourcemap.inject).toHaveBeenCalledWith({ directory: '/build' }); expect(mockSentrySdkInstance.sourcemap.upload).not.toHaveBeenCalled(); - expect(glob).not.toHaveBeenCalled(); + expect(globFiles).not.toHaveBeenCalled(); }); it('should delete custom files after upload when specified', async () => { @@ -239,10 +236,7 @@ describe('sentryOnBuildEnd', () => { // @ts-expect-error - mocking the React config await sentryOnBuildEnd(config); - expect(glob).toHaveBeenCalledWith('/custom/**/*.map', { - absolute: true, - nodir: true, - }); + expect(globFiles).toHaveBeenCalledWith('/custom/**/*.map'); }); it('should handle errors during release creation gracefully', async () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1fb1417361a2..d88cfdede849 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1983,9 +1983,6 @@ importers: '@sentry/server-utils': specifier: 11.9.0 version: link:../server-utils - glob: - specifier: ^13.0.6 - version: 13.0.6 sentry: specifier: ^0.44.0 version: 0.44.0