-
-
Notifications
You must be signed in to change notification settings - Fork 6.1k
/
manifest.ts
123 lines (103 loc) · 3.28 KB
/
manifest.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
import path from 'path'
import { OutputChunk } from 'rollup'
import { ResolvedConfig } from '..'
import { Plugin } from '../plugin'
import { chunkToEmittedCssFileMap } from './css'
import { chunkToEmittedAssetsMap } from './asset'
import { normalizePath } from '../utils'
export type Manifest = Record<string, ManifestChunk>
export interface ManifestChunk {
src?: string
file: string
css?: string[]
assets?: string[]
isEntry?: boolean
isDynamicEntry?: boolean
imports?: string[]
dynamicImports?: string[]
}
export function manifestPlugin(config: ResolvedConfig): Plugin {
const manifest: Manifest = {}
let outputCount: number
return {
name: 'vite:manifest',
buildStart() {
outputCount = 0
},
generateBundle({ format }, bundle) {
function getChunkName(chunk: OutputChunk) {
if (chunk.facadeModuleId) {
let name = normalizePath(
path.relative(config.root, chunk.facadeModuleId)
)
if (format === 'system' && !chunk.name.includes('-legacy')) {
const ext = path.extname(name)
name = name.slice(0, -ext.length) + `-legacy` + ext
}
return name
} else {
return `_` + path.basename(chunk.fileName)
}
}
function getInternalImports(imports: string[]): string[] {
const filteredImports: string[] = []
for (const file of imports) {
if (bundle[file] === undefined) {
continue
}
filteredImports.push(getChunkName(bundle[file] as OutputChunk))
}
return filteredImports
}
function createChunk(chunk: OutputChunk): ManifestChunk {
const manifestChunk: ManifestChunk = {
file: chunk.fileName
}
if (chunk.facadeModuleId) {
manifestChunk.src = getChunkName(chunk)
}
if (chunk.isEntry) {
manifestChunk.isEntry = true
}
if (chunk.isDynamicEntry) {
manifestChunk.isDynamicEntry = true
}
if (chunk.imports.length) {
const internalImports = getInternalImports(chunk.imports)
if (internalImports.length > 0) {
manifestChunk.imports = internalImports
}
}
if (chunk.dynamicImports.length) {
const internalImports = getInternalImports(chunk.dynamicImports)
if (internalImports.length > 0) {
manifestChunk.dynamicImports = internalImports
}
}
const cssFiles = chunkToEmittedCssFileMap.get(chunk)
if (cssFiles) {
manifestChunk.css = [...cssFiles]
}
const assets = chunkToEmittedAssetsMap.get(chunk)
if (assets) [(manifestChunk.assets = [...assets])]
return manifestChunk
}
for (const file in bundle) {
const chunk = bundle[file]
if (chunk.type === 'chunk') {
manifest[getChunkName(chunk)] = createChunk(chunk)
}
}
outputCount++
const output = config.build.rollupOptions?.output
const outputLength = Array.isArray(output) ? output.length : 1
if (outputCount >= outputLength) {
this.emitFile({
fileName: `manifest.json`,
type: 'asset',
source: JSON.stringify(manifest, null, 2)
})
}
}
}
}