Skip to content

Commit

Permalink
fix(injectSourcesContent): warn once per sourcemap for missing sources
Browse files Browse the repository at this point in the history
  • Loading branch information
aleclarson committed Jul 25, 2021
1 parent fdf889d commit 0dc9310
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 19 deletions.
73 changes: 55 additions & 18 deletions packages/vite/src/node/server/sourcemap.ts
@@ -1,29 +1,66 @@
import { promises as fs } from 'fs'
import path from 'path'
import { promises as fs } from 'fs'
import { Logger } from '../logger'
import { createDebugger } from '../utils'
import { ModuleGraph } from './moduleGraph'

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 },
map: SourceMapLike,
file: string,
logger: Logger,
moduleGraph?: ModuleGraph
): Promise<void> {
const sourceRoot = await fs.realpath(
path.resolve(path.dirname(file), map.sourceRoot || '')
)
const needsContent = !map.sourcesContent
if (needsContent) {
map.sourcesContent = []
}
await Promise.all(
map.sources.filter(Boolean).map(async (sourcePath, i) => {
const mod = await moduleGraph?.getModuleByUrl(sourcePath)
sourcePath = mod?.file || path.resolve(sourceRoot, decodeURI(sourcePath))
if (moduleGraph) {
map.sources[i] = sourcePath
}
if (needsContent) {
map.sourcesContent![i] = await fs.readFile(sourcePath, 'utf-8')
let sourceRoot: string | undefined
try {
// The source root is undefined for virtual modules and permission errors.
sourceRoot = await fs.realpath(
path.resolve(path.dirname(file), map.sourceRoot || '')
)
} catch {}

const { sourcesContent } = map
const missingSources: string[] = []
map.sourcesContent = await Promise.all(
map.sources.map((sourcePath, i) => {
if (sourcePath) {
sourcePath = decodeURI(sourcePath)
const mod = await moduleGraph?.getModuleByUrl(sourcePath)
if (mod.file) {
sourcePath = mod.file
map.sources[i] = sourceRoot
? path.relative(sourceRoot, sourcePath)
: sourcePath
} else if (sourceRoot) {
sourcePath = path.resolve(sourceRoot, sourcePath)
}
if (sourcesContent) {
return sourcesContent[i]
}
return fs.readFile(sourcePath, 'utf-8').catch(() => {
missingSources.push(sourcePath)
return null
})
}
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 `))
}
}
2 changes: 1 addition & 1 deletion packages/vite/src/node/server/transformRequest.ts
Expand Up @@ -144,7 +144,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)
}
}

Expand Down

0 comments on commit 0dc9310

Please sign in to comment.