diff --git a/packages/vite/src/node/server/sourcemap.ts b/packages/vite/src/node/server/sourcemap.ts index 0447dfc80dfd6f..abfbc5c82ec45e 100644 --- a/packages/vite/src/node/server/sourcemap.ts +++ b/packages/vite/src/node/server/sourcemap.ts @@ -1,32 +1,51 @@ -import { promises as fs } from 'fs' import path from 'path' +import { promises as fs } from 'fs' +import { Logger } from '../logger' +import { createDebugger } from '../utils' + +const isDebug = !!process.env.DEBUG +const debug = createDebugger('vite:sourcemap', { + onlyWhenFocused: true +}) + +interface SourceMapLike { + sources: string[] + sourcesContent?: (string | null)[] + sourceRoot?: string +} export async function injectSourcesContent( - map: { sources: string[]; sourcesContent?: string[]; sourceRoot?: string }, - file: string + map: SourceMapLike, + file: string, + logger: Logger ): Promise { + let sourceRoot: string | undefined try { - var sourceRoot = await fs.realpath( + // The source root is undefined for virtual modules and permission errors. + sourceRoot = await fs.realpath( path.resolve(path.dirname(file), map.sourceRoot || '') ) - } catch (e) { - if (e.code !== 'ENOENT') throw e - var isVirtual = true - } - map.sourcesContent = [] - await Promise.all( - map.sources.filter(Boolean).map(async (sourcePath, i) => { + } catch {} + + const missingSources: string[] = [] + map.sourcesContent = await Promise.all( + map.sources.filter(Boolean).map((sourcePath) => { sourcePath = decodeURI(sourcePath) - if (!isVirtual) { + if (sourceRoot) { sourcePath = path.resolve(sourceRoot, sourcePath) } - try { - map.sourcesContent![i] = await fs.readFile(sourcePath, 'utf-8') - } catch (e) { - throw new Error( - `Sourcemap for "${file}" has a non-existent source: "${sourcePath}"` - ) - } + return fs.readFile(sourcePath, 'utf-8').catch(() => { + missingSources.push(sourcePath) + return null + }) }) ) + + // Use this command… + // DEBUG="vite:sourcemap" vite build + // …to log the missing sources. + if (missingSources.length) { + logger.warnOnce(`Sourcemap for "${file}" points to missing source files`) + isDebug && debug(`Missing sources:\n ` + missingSources.join(`\n `)) + } } diff --git a/packages/vite/src/node/server/transformRequest.ts b/packages/vite/src/node/server/transformRequest.ts index ebb29dc461ea72..483df46d06e6e5 100644 --- a/packages/vite/src/node/server/transformRequest.ts +++ b/packages/vite/src/node/server/transformRequest.ts @@ -147,7 +147,7 @@ export async function transformRequest( if (map && mod.file) { map = (typeof map === 'string' ? JSON.parse(map) : map) as SourceMap if (map.mappings && !map.sourcesContent) { - await injectSourcesContent(map, mod.file) + await injectSourcesContent(map, mod.file, logger) } }