Skip to content

Commit 7d8c0e2

Browse files
authored
feat: support originalFilename (#17867)
1 parent 9370742 commit 7d8c0e2

File tree

8 files changed

+157
-146
lines changed

8 files changed

+157
-146
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@
6868
"playwright-chromium": "^1.46.0",
6969
"prettier": "3.3.3",
7070
"rimraf": "^5.0.10",
71-
"rollup": "^4.13.0",
71+
"rollup": "^4.20.0",
7272
"rollup-plugin-esbuild": "^6.1.1",
7373
"simple-git-hooks": "^2.11.1",
7474
"tslib": "^2.6.3",

packages/vite/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@
8787
"dependencies": {
8888
"esbuild": "^0.21.3",
8989
"postcss": "^8.4.41",
90-
"rollup": "^4.13.0"
90+
"rollup": "^4.20.0"
9191
},
9292
"optionalDependencies": {
9393
"fsevents": "~2.3.3"

packages/vite/src/node/plugins/asset.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ const assetCache = new WeakMap<ResolvedConfig, Map<string, string>>()
4343
// For the manifest, we need to preserve the original file path and isEntry
4444
// for CSS assets. We keep a map from referenceId to this information.
4545
export interface GeneratedAssetMeta {
46-
originalName: string
46+
originalFileName: string
4747
isEntry?: boolean
4848
}
4949
export const generatedAssets = new WeakMap<
@@ -371,15 +371,15 @@ async function fileToBuiltUrl(
371371
const { search, hash } = parseUrl(id)
372372
const postfix = (search || '') + (hash || '')
373373

374+
const originalFileName = normalizePath(path.relative(config.root, file))
374375
const referenceId = pluginContext.emitFile({
376+
type: 'asset',
375377
// Ignore directory structure for asset file names
376378
name: path.basename(file),
377-
type: 'asset',
379+
originalFileName,
378380
source: content,
379381
})
380-
381-
const originalName = normalizePath(path.relative(config.root, file))
382-
generatedAssets.get(config)!.set(referenceId, { originalName })
382+
generatedAssets.get(config)!.set(referenceId, { originalFileName })
383383

384384
url = `__VITE_ASSET__${referenceId}__${postfix ? `$_${postfix}__` : ``}` // TODO_BASE
385385
}

packages/vite/src/node/plugins/css.ts

+14-13
Original file line numberDiff line numberDiff line change
@@ -424,8 +424,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
424424
} else {
425425
return path.dirname(
426426
assetFileNames({
427-
name: cssAssetName,
428427
type: 'asset',
428+
name: cssAssetName,
429+
originalFileName: null,
429430
source: '/* vite internal call, ignore */',
430431
}),
431432
)
@@ -646,7 +647,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
646647
let s: MagicString | undefined
647648
const urlEmitTasks: Array<{
648649
cssAssetName: string
649-
originalFilename: string
650+
originalFileName: string
650651
content: string
651652
start: number
652653
end: number
@@ -658,9 +659,9 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
658659
while ((match = cssUrlAssetRE.exec(code))) {
659660
const [full, idHex] = match
660661
const id = Buffer.from(idHex, 'hex').toString()
661-
const originalFilename = cleanUrl(id)
662+
const originalFileName = cleanUrl(id)
662663
const cssAssetName = ensureFileExt(
663-
path.basename(originalFilename),
664+
path.basename(originalFileName),
664665
'.css',
665666
)
666667
if (!styles.has(id)) {
@@ -675,7 +676,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
675676

676677
urlEmitTasks.push({
677678
cssAssetName,
678-
originalFilename,
679+
originalFileName,
679680
content: cssContent,
680681
start: match.index,
681682
end: match.index + full.length,
@@ -701,19 +702,18 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
701702

702703
for (const {
703704
cssAssetName,
704-
originalFilename,
705+
originalFileName,
705706
content,
706707
start,
707708
end,
708709
} of urlEmitTasks) {
709710
const referenceId = this.emitFile({
710-
name: cssAssetName,
711711
type: 'asset',
712+
name: cssAssetName,
713+
originalFileName,
712714
source: content,
713715
})
714-
generatedAssets
715-
.get(config)!
716-
.set(referenceId, { originalName: originalFilename })
716+
generatedAssets.get(config)!.set(referenceId, { originalFileName })
717717

718718
const filename = this.getFileName(referenceId)
719719
chunk.viteMetadata!.importedAssets.add(cleanUrl(filename))
@@ -751,7 +751,7 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
751751
(!chunk.facadeModuleId || !isCSSRequest(chunk.facadeModuleId))
752752
? path.basename(cssFullAssetName)
753753
: cssFullAssetName
754-
const originalFilename = getChunkOriginalFileName(
754+
const originalFileName = getChunkOriginalFileName(
755755
chunk,
756756
config.root,
757757
opts.format,
@@ -766,13 +766,14 @@ export function cssPostPlugin(config: ResolvedConfig): Plugin {
766766

767767
// emit corresponding css file
768768
const referenceId = this.emitFile({
769-
name: cssAssetName,
770769
type: 'asset',
770+
name: cssAssetName,
771+
originalFileName,
771772
source: chunkCSS,
772773
})
773774
generatedAssets
774775
.get(config)!
775-
.set(referenceId, { originalName: originalFilename, isEntry })
776+
.set(referenceId, { originalFileName, isEntry })
776777
chunk.viteMetadata!.importedCss.add(this.getFileName(referenceId))
777778
} else if (!config.build.ssr) {
778779
// legacy build and inline css

packages/vite/src/node/plugins/html.ts

+1
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,7 @@ export function buildHtmlPlugin(config: ResolvedConfig): Plugin {
934934
)
935935
this.emitFile({
936936
type: 'asset',
937+
originalFileName: normalizedId,
937938
fileName: shortEmitName,
938939
source: result,
939940
})

packages/vite/src/node/plugins/manifest.ts

+19-18
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import type { ResolvedConfig } from '..'
99
import type { Plugin } from '../plugin'
1010
import { normalizePath, sortObjectKeys } from '../utils'
1111
import { generatedAssets } from './asset'
12-
import type { GeneratedAssetMeta } from './asset'
1312

1413
const endsWithJSRE = /\.[cm]?js$/
1514

@@ -111,18 +110,20 @@ export function manifestPlugin(config: ResolvedConfig): Plugin {
111110
return manifestChunk
112111
}
113112

114-
const fileNameToAssetMeta = new Map<string, GeneratedAssetMeta>()
115113
const assets = generatedAssets.get(config)!
116-
assets.forEach((asset, referenceId) => {
117-
try {
118-
const fileName = this.getFileName(referenceId)
119-
fileNameToAssetMeta.set(fileName, asset)
120-
} catch (error: unknown) {
121-
// The asset was generated as part of a different output option.
122-
// It was already handled during the previous run of this plugin.
123-
assets.delete(referenceId)
114+
const entryCssAssetFileNames = new Set()
115+
for (const [id, asset] of assets.entries()) {
116+
if (asset.isEntry) {
117+
try {
118+
const fileName = this.getFileName(id)
119+
entryCssAssetFileNames.add(fileName)
120+
} catch (error: unknown) {
121+
// The asset was generated as part of a different output option.
122+
// It was already handled during the previous run of this plugin.
123+
assets.delete(id)
124+
}
124125
}
125-
})
126+
}
126127

127128
const fileNameToAsset = new Map<string, ManifestChunk>()
128129

@@ -132,9 +133,9 @@ export function manifestPlugin(config: ResolvedConfig): Plugin {
132133
manifest[getChunkName(chunk)] = createChunk(chunk)
133134
} else if (chunk.type === 'asset' && typeof chunk.name === 'string') {
134135
// Add every unique asset to the manifest, keyed by its original name
135-
const assetMeta = fileNameToAssetMeta.get(chunk.fileName)
136-
const src = assetMeta?.originalName ?? chunk.name
137-
const asset = createAsset(chunk, src, assetMeta?.isEntry)
136+
const src = chunk.originalFileName ?? chunk.name
137+
const isEntry = entryCssAssetFileNames.has(chunk.fileName)
138+
const asset = createAsset(chunk, src, isEntry)
138139

139140
// If JS chunk and asset chunk are both generated from the same source file,
140141
// prioritize JS chunk as it contains more information
@@ -147,15 +148,15 @@ export function manifestPlugin(config: ResolvedConfig): Plugin {
147148
}
148149

149150
// Add deduplicated assets to the manifest
150-
assets.forEach(({ originalName }, referenceId) => {
151-
if (!manifest[originalName]) {
151+
for (const [referenceId, { originalFileName }] of assets.entries()) {
152+
if (!manifest[originalFileName]) {
152153
const fileName = this.getFileName(referenceId)
153154
const asset = fileNameToAsset.get(fileName)
154155
if (asset) {
155-
manifest[originalName] = asset
156+
manifest[originalFileName] = asset
156157
}
157158
}
158-
})
159+
}
159160

160161
outputCount++
161162
const output = config.build.rollupOptions?.output

packages/vite/src/node/plugins/worker.ts

+9-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,11 @@ import {
2020
import { cleanUrl } from '../../shared/utils'
2121
import { fileToUrl } from './asset'
2222

23-
type WorkerBundleAsset = { fileName: string; source: string | Uint8Array }
23+
type WorkerBundleAsset = {
24+
fileName: string
25+
originalFileName: string | null
26+
source: string | Uint8Array
27+
}
2428

2529
interface WorkerCache {
2630
// save worker all emit chunk avoid rollup make the same asset unique.
@@ -111,6 +115,7 @@ async function bundleWorkerEntry(
111115
} else if (outputChunk.type === 'chunk') {
112116
saveEmitWorkerAsset(config, {
113117
fileName: outputChunk.fileName,
118+
originalFileName: null,
114119
source: outputChunk.code,
115120
})
116121
}
@@ -136,6 +141,7 @@ function emitSourcemapForWorkerEntry(
136141
const mapFileName = chunk.fileName + '.map'
137142
saveEmitWorkerAsset(config, {
138143
fileName: mapFileName,
144+
originalFileName: null,
139145
source: data,
140146
})
141147
}
@@ -169,6 +175,7 @@ export async function workerFileToUrl(
169175
fileName = outputChunk.fileName
170176
saveEmitWorkerAsset(config, {
171177
fileName,
178+
originalFileName: null,
172179
source: outputChunk.code,
173180
})
174181
workerMap.bundle.set(id, fileName)
@@ -447,6 +454,7 @@ export function webWorkerPlugin(config: ResolvedConfig): Plugin {
447454
this.emitFile({
448455
type: 'asset',
449456
fileName: asset.fileName,
457+
originalFileName: asset.originalFileName,
450458
source: asset.source,
451459
})
452460
})

0 commit comments

Comments
 (0)