Skip to content

Commit

Permalink
fix(plugin-legacy): group discovered polyfills by output
Browse files Browse the repository at this point in the history
  • Loading branch information
bluwy committed May 29, 2024
1 parent e6a70b7 commit 6236846
Showing 1 changed file with 28 additions and 15 deletions.
43 changes: 28 additions & 15 deletions packages/plugin-legacy/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,10 +159,11 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
const modernPolyfills = new Set<string>()
const legacyPolyfills = new Set<string>()
// When discovering polyfills in `renderChunk`, the hook may be non-deterministic, so we group the
// modern and legacy polyfills in a sorted map before merging them.
let chunkFileNameToPolyfills:
| Map<string, { modern: Set<string>; legacy: Set<string> }>
| undefined
// modern and legacy polyfills in a sorted chunks map for each rendered outputs before merging them.
const outputToChunkFileNameToPolyfills = new Map<
NormalizedOutputOptions,
Map<string, { modern: Set<string>; legacy: Set<string> }> | null
>()

if (Array.isArray(options.modernPolyfills) && genModern) {
options.modernPolyfills.forEach((i) => {
Expand Down Expand Up @@ -267,12 +268,18 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
return
}

const chunkFileNameToPolyfills =
outputToChunkFileNameToPolyfills.get(opts)
if (chunkFileNameToPolyfills == null) {
throw new Error(
'Internal @vitejs/plugin-legacy error: discovered polyfills should exist',
)
}

if (!isLegacyBundle(bundle, opts)) {
// Merge discovered modern polyfills to `modernPolyfills`
if (chunkFileNameToPolyfills) {
for (const { modern } of chunkFileNameToPolyfills.values()) {
modern.forEach((p) => modernPolyfills.add(p))
}
for (const { modern } of chunkFileNameToPolyfills.values()) {
modern.forEach((p) => modernPolyfills.add(p))
}
if (!modernPolyfills.size) {
return
Expand Down Expand Up @@ -303,10 +310,8 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
}

// Merge discovered legacy polyfills to `legacyPolyfills`
if (chunkFileNameToPolyfills) {
for (const { legacy } of chunkFileNameToPolyfills.values()) {
legacy.forEach((p) => legacyPolyfills.add(p))
}
for (const { legacy } of chunkFileNameToPolyfills.values()) {
legacy.forEach((p) => legacyPolyfills.add(p))
}

// legacy bundle
Expand Down Expand Up @@ -348,8 +353,9 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
enforce: 'post',
apply: 'build',

renderStart() {
chunkFileNameToPolyfills = undefined
renderStart(opts) {
// Empty the nested map for this output
outputToChunkFileNameToPolyfills.set(opts, null)
},

configResolved(_config) {
Expand Down Expand Up @@ -438,6 +444,7 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
}

// On first run, intialize the map with sorted chunk file names
let chunkFileNameToPolyfills = outputToChunkFileNameToPolyfills.get(opts)
if (chunkFileNameToPolyfills == null) {
chunkFileNameToPolyfills = new Map()
for (const fileName in chunks) {
Expand All @@ -446,8 +453,14 @@ function viteLegacyPlugin(options: Options = {}): Plugin[] {
legacy: new Set(),
})
}
outputToChunkFileNameToPolyfills.set(opts, chunkFileNameToPolyfills)
}
const polyfillsDiscovered = chunkFileNameToPolyfills.get(chunk.fileName)
if (polyfillsDiscovered == null) {
throw new Error(
`Internal @vitejs/plugin-legacy error: discovered polyfills for ${chunk.fileName} should exist`,
)
}
const polyfillsDiscovered = chunkFileNameToPolyfills.get(chunk.fileName)!

if (!isLegacyChunk(chunk, opts)) {
if (
Expand Down

0 comments on commit 6236846

Please sign in to comment.