From 9b42715228c32ada4168d11235e41d5415070a49 Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 13:24:52 +0200 Subject: [PATCH 1/2] Test: Fix missing source map for Webpack mock loaders --- .../webpack/loaders/storybook-mock-transform-loader.ts | 3 ++- .../presets/webpack/loaders/webpack-automock-loader.ts | 7 +++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/core/src/core-server/presets/webpack/loaders/storybook-mock-transform-loader.ts b/code/core/src/core-server/presets/webpack/loaders/storybook-mock-transform-loader.ts index c772d4b9edd0..3eb1f0baae4a 100644 --- a/code/core/src/core-server/presets/webpack/loaders/storybook-mock-transform-loader.ts +++ b/code/core/src/core-server/presets/webpack/loaders/storybook-mock-transform-loader.ts @@ -10,5 +10,6 @@ import { rewriteSbMockImportCalls } from '../../../mocking-utils/extract'; */ export default function storybookMockTransformLoader(this: LoaderContext<{}>, source: string) { const result = rewriteSbMockImportCalls(source); - return result.code; + const callback = this.async(); + callback(null, result.code, result.map || undefined); } diff --git a/code/core/src/core-server/presets/webpack/loaders/webpack-automock-loader.ts b/code/core/src/core-server/presets/webpack/loaders/webpack-automock-loader.ts index 546f0fddc522..d29dbda2fda6 100644 --- a/code/core/src/core-server/presets/webpack/loaders/webpack-automock-loader.ts +++ b/code/core/src/core-server/presets/webpack/loaders/webpack-automock-loader.ts @@ -1,5 +1,3 @@ -import { parse } from '@babel/parser'; -import type { ParserOptions } from '@babel/parser'; import type { LoaderContext } from 'webpack'; import { getAutomockCode } from '../../../mocking-utils/automock'; @@ -28,14 +26,15 @@ interface AutomockLoaderOptions { export default function webpackAutomockLoader( this: LoaderContext, source: string -): string { +) { // Retrieve the options passed in the resource query string (e.g., `?spy=true`). const options = this.getOptions(); + const callback = this.async(); const isSpy = options.spy === 'true'; // Generate the mocked source code using the utility from @vitest/mocker. const mocked = getAutomockCode(source, isSpy, babelParser as any); // Return the transformed code to Webpack for further processing. - return mocked.toString(); + callback(null, mocked.toString(), mocked.generateMap()); } From b914f50e8ad152c0d104452b0cd37063ae729f0d Mon Sep 17 00:00:00 2001 From: Valentin Palkovic Date: Wed, 23 Jul 2025 14:42:58 +0200 Subject: [PATCH 2/2] Refactor viteMockPlugin load handler to improve path normalization and file redirection logic to preserve source maps --- .../presets/vitePlugins/vite-mock/plugin.ts | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/code/core/src/core-server/presets/vitePlugins/vite-mock/plugin.ts b/code/core/src/core-server/presets/vitePlugins/vite-mock/plugin.ts index e8bdf17e247f..e1a9f1ff358c 100644 --- a/code/core/src/core-server/presets/vitePlugins/vite-mock/plugin.ts +++ b/code/core/src/core-server/presets/vitePlugins/vite-mock/plugin.ts @@ -101,17 +101,27 @@ export function viteMockPlugin(options: MockPluginOptions): Plugin[] { server.watcher.on('unlink', invalidateAffectedFiles); }, - async load(id) { - for (const call of mockCalls) { - if (call.absolutePath !== id) { - continue; - } + load: { + order: 'pre', + handler(id) { + const preserveSymlinks = viteConfig.resolve.preserveSymlinks; + + const idNorm = normalizePathForComparison(id, preserveSymlinks); + const cleanId = getCleanId(idNorm); + + for (const call of mockCalls) { + const callNorm = normalizePathForComparison(call.absolutePath, preserveSymlinks); + + if (callNorm !== idNorm && call.path !== cleanId) { + continue; + } - if (call.redirectPath) { - return readFileSync(call.redirectPath, 'utf-8'); + if (call.redirectPath) { + return readFileSync(call.redirectPath, 'utf-8'); + } } - } - return null; + return null; + }, }, transform: { order: 'pre', @@ -140,8 +150,6 @@ export function viteMockPlugin(options: MockPluginOptions): Plugin[] { code: automockedCode.toString(), map: automockedCode.generateMap(), }; - } else { - return readFileSync(call.redirectPath, 'utf-8'); } } catch (e) { logger.error(`Error automocking ${id}: ${e}`);