From 08ff23319964903b9f380859c216b10e577ddb6f Mon Sep 17 00:00:00 2001 From: Vladimir Date: Tue, 24 Sep 2024 21:35:07 +0200 Subject: [PATCH] refactor: remove the need for "processSourceMap" (#18187) --- docs/guide/api-environment.md | 6 +++++- packages/vite/src/module-runner/esmEvaluator.ts | 7 ++++++- packages/vite/src/module-runner/runner.ts | 1 + packages/vite/src/module-runner/types.ts | 5 +++++ .../node/server/environments/nodeEnvironment.ts | 15 +-------------- packages/vite/src/node/ssr/fetchModule.ts | 12 ++++++++---- 6 files changed, 26 insertions(+), 20 deletions(-) diff --git a/docs/guide/api-environment.md b/docs/guide/api-environment.md index c9a4908e2c8421..470ce35b55cf35 100644 --- a/docs/guide/api-environment.md +++ b/docs/guide/api-environment.md @@ -714,6 +714,10 @@ export interface ModuleRunnerOptions { ```ts export interface ModuleEvaluator { + /** + * Number of prefixed lines in the transformed code. + */ + startOffset?: number /** * Evaluate code that was transformed by Vite. * @param context Function context @@ -733,7 +737,7 @@ export interface ModuleEvaluator { } ``` -Vite exports `ESModulesEvaluator` that implements this interface by default. It uses `new AsyncFunction` to evaluate code, so if the code has inlined source map it should contain an [offset of 2 lines](https://tc39.es/ecma262/#sec-createdynamicfunction) to accommodate for new lines added. This is done automatically in the server node environment. If your runner implementation doesn't have this constraint, you should use `fetchModule` (exported from `vite`) directly. +Vite exports `ESModulesEvaluator` that implements this interface by default. It uses `new AsyncFunction` to evaluate code, so if the code has inlined source map it should contain an [offset of 2 lines](https://tc39.es/ecma262/#sec-createdynamicfunction) to accommodate for new lines added. This is done automatically by the `ESModulesEvaluator`. Custom evaluators will not add additional lines. ## RunnerTransport diff --git a/packages/vite/src/module-runner/esmEvaluator.ts b/packages/vite/src/module-runner/esmEvaluator.ts index 3e84f98f7646bd..7266fc870612dd 100644 --- a/packages/vite/src/module-runner/esmEvaluator.ts +++ b/packages/vite/src/module-runner/esmEvaluator.ts @@ -1,4 +1,7 @@ -import { AsyncFunction } from '../shared/utils' +import { + AsyncFunction, + asyncFunctionDeclarationPaddingLineCount, +} from '../shared/utils' import { ssrDynamicImportKey, ssrExportAllKey, @@ -9,6 +12,8 @@ import { import type { ModuleEvaluator, ModuleRunnerContext } from './types' export class ESModulesEvaluator implements ModuleEvaluator { + startOffset = asyncFunctionDeclarationPaddingLineCount + async runInlinedModule( context: ModuleRunnerContext, code: string, diff --git a/packages/vite/src/module-runner/runner.ts b/packages/vite/src/module-runner/runner.ts index 4c132ec4117072..1df16d3ffd094e 100644 --- a/packages/vite/src/module-runner/runner.ts +++ b/packages/vite/src/module-runner/runner.ts @@ -265,6 +265,7 @@ export class ModuleRunner { ? { externalize: url, type: 'builtin' } : await this.transport.fetchModule(url, importer, { cached: isCached, + startOffset: this.evaluator.startOffset, }) ) as ResolvedResult diff --git a/packages/vite/src/module-runner/types.ts b/packages/vite/src/module-runner/types.ts index 71857ba5964007..18ac314cbf1e95 100644 --- a/packages/vite/src/module-runner/types.ts +++ b/packages/vite/src/module-runner/types.ts @@ -46,6 +46,10 @@ export interface ModuleRunnerContext { } export interface ModuleEvaluator { + /** + * Number of prefixed lines in the transformed code. + */ + startOffset?: number /** * Run code that was transformed by Vite. * @param context Function context @@ -138,6 +142,7 @@ export type FetchFunction = ( export interface FetchFunctionOptions { cached?: boolean + startOffset?: number } export interface ModuleRunnerHmr { diff --git a/packages/vite/src/node/server/environments/nodeEnvironment.ts b/packages/vite/src/node/server/environments/nodeEnvironment.ts index 14c295bcdcd1a5..9e63c814e7bcf3 100644 --- a/packages/vite/src/node/server/environments/nodeEnvironment.ts +++ b/packages/vite/src/node/server/environments/nodeEnvironment.ts @@ -1,7 +1,6 @@ import type { ResolvedConfig } from '../../config' import type { DevEnvironmentContext } from '../environment' import { DevEnvironment } from '../environment' -import { asyncFunctionDeclarationPaddingLineCount } from '../../../shared/utils' export function createNodeDevEnvironment( name: string, @@ -14,17 +13,5 @@ export function createNodeDevEnvironment( ) } - return new DevEnvironment(name, config, { - ...context, - runner: { - processSourceMap(map) { - // this assumes that "new AsyncFunction" is used to create the module - return Object.assign({}, map, { - mappings: - ';'.repeat(asyncFunctionDeclarationPaddingLineCount) + map.mappings, - }) - }, - ...context.runner, - }, - }) + return new DevEnvironment(name, config, context) } diff --git a/packages/vite/src/node/ssr/fetchModule.ts b/packages/vite/src/node/ssr/fetchModule.ts index 663fff6bd121da..8cf533906419b4 100644 --- a/packages/vite/src/node/ssr/fetchModule.ts +++ b/packages/vite/src/node/ssr/fetchModule.ts @@ -15,7 +15,7 @@ import { normalizeResolvedIdToUrl } from '../plugins/importAnalysis' export interface FetchModuleOptions { cached?: boolean inlineSourceMap?: boolean - processSourceMap?>(map: T): T + startOffset?: number } /** @@ -127,7 +127,7 @@ export async function fetchModule( } if (options.inlineSourceMap !== false) { - result = inlineSourceMap(mod, result, options.processSourceMap) + result = inlineSourceMap(mod, result, options.startOffset) } // remove shebang @@ -150,7 +150,7 @@ const OTHER_SOURCE_MAP_REGEXP = new RegExp( function inlineSourceMap( mod: EnvironmentModuleNode, result: TransformResult, - processSourceMap?: FetchModuleOptions['processSourceMap'], + startOffset: number | undefined, ) { const map = result.map let code = result.code @@ -167,7 +167,11 @@ function inlineSourceMap( if (OTHER_SOURCE_MAP_REGEXP.test(code)) code = code.replace(OTHER_SOURCE_MAP_REGEXP, '') - const sourceMap = processSourceMap?.(map) || map + const sourceMap = startOffset + ? Object.assign({}, map, { + mappings: ';'.repeat(startOffset) + map.mappings, + }) + : map result.code = `${code.trimEnd()}\n//# sourceURL=${ mod.id }\n${MODULE_RUNNER_SOURCEMAPPING_SOURCE}\n//# ${SOURCEMAPPING_URL}=${genSourceMapUrl(sourceMap)}\n`