mirror of
https://github.com/nuxt/nuxt.git
synced 2024-12-12 23:37:14 +00:00
64 lines
1.6 KiB
TypeScript
64 lines
1.6 KiB
TypeScript
import { mkdir, readFile, writeFile } from 'node:fs/promises'
|
|
import { dirname, resolve } from 'pathe'
|
|
|
|
import type { Plugin as RollupPlugin } from 'rollup'
|
|
import type { Plugin as VitePlugin } from 'vite'
|
|
|
|
export const createSourcemapPreserver = () => {
|
|
let outputDir: string
|
|
const ids = new Set<string>()
|
|
|
|
const vitePlugin = {
|
|
name: 'nuxt:sourcemap-export',
|
|
configResolved (config) {
|
|
outputDir = config.build.outDir
|
|
},
|
|
async writeBundle (_options, bundle) {
|
|
for (const chunk of Object.values(bundle)) {
|
|
if (chunk.type !== 'chunk' || !chunk.map) { continue }
|
|
|
|
const id = resolve(outputDir, chunk.fileName)
|
|
ids.add(id)
|
|
const dest = id + '.map.json'
|
|
await mkdir(dirname(dest), { recursive: true })
|
|
await writeFile(dest, JSON.stringify({
|
|
file: chunk.map.file,
|
|
mappings: chunk.map.mappings,
|
|
names: chunk.map.names,
|
|
sources: chunk.map.sources,
|
|
sourcesContent: chunk.map.sourcesContent,
|
|
version: chunk.map.version,
|
|
}))
|
|
}
|
|
},
|
|
} satisfies VitePlugin
|
|
|
|
const nitroPlugin = {
|
|
name: 'nuxt:sourcemap-import',
|
|
async load (id) {
|
|
id = resolve(id)
|
|
if (!ids.has(id)) { return }
|
|
|
|
const [code, map] = await Promise.all([
|
|
readFile(id, 'utf-8').catch(() => undefined),
|
|
readFile(id + '.map.json', 'utf-8').catch(() => undefined),
|
|
])
|
|
|
|
if (!code) {
|
|
this.warn('Failed loading file')
|
|
return null
|
|
}
|
|
|
|
return {
|
|
code,
|
|
map,
|
|
}
|
|
},
|
|
} satisfies RollupPlugin
|
|
|
|
return {
|
|
vitePlugin,
|
|
nitroPlugin,
|
|
}
|
|
}
|