-
-
Notifications
You must be signed in to change notification settings - Fork 348
/
getManifestEntry.ts
97 lines (88 loc) · 3.22 KB
/
getManifestEntry.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
export { getManifestEntry }
import type { ViteManifest, ViteManifestEntry } from '../../helpers'
import { assert, slice, isNpmPackageModule } from '../../../utils'
import { assertClientEntryId } from './assertClientEntryId'
import { isVirutalModulePageCodeFilesImporter } from '../../../commons/virtualIdPageCodeFilesImporter'
function getManifestEntry(
id: string,
clientManifest: ViteManifest,
manifestKeyMap: Record<string, string>
): { manifestKey: string; manifestEntry: ViteManifestEntry } {
assertClientEntryId(id)
// VPS client entry
if (id.startsWith('@@vite-plugin-ssr/')) {
const manifestKeyEnd = slice(id, '@@vite-plugin-ssr'.length, 0)
const { manifestKey, manifestEntry } = findEntryWithKeyEnd(manifestKeyEnd, clientManifest, id)
assert(manifestEntry && manifestKey, id)
return { manifestEntry, manifestKey }
}
// Code files importer
if (isVirutalModulePageCodeFilesImporter(id)) {
const manifestKey = id
let manifestEntry = clientManifest[manifestKey]
assert(manifestEntry, id)
return { manifestEntry, manifestKey }
}
// User files
if (id.startsWith('/')) {
const manifestKey = id.slice(1)
let manifestEntry = clientManifest[manifestKey]
assert(manifestEntry, id)
return { manifestEntry, manifestKey }
}
// extensions[number].pageFilesDist
if (isNpmPackageModule(id)) {
const manifestKey = manifestKeyMap[id]
assert(manifestKey, id)
const manifestEntry = clientManifest[manifestKey]
assert(manifestEntry, { id, manifestKey })
return { manifestEntry, manifestKey }
}
// extensions[number].pageFilesSrc
if (id.startsWith('/node_modules/') || id.startsWith('/../')) {
let manifestKeyEnd = id.split('/node_modules/').slice(-1)[0]
assert(manifestKeyEnd, id)
assert(!manifestKeyEnd.startsWith('/'))
manifestKeyEnd = '/' + manifestKeyEnd
{
const { manifestEntry, manifestKey } = findEntryWithKeyEnd(manifestKeyEnd, clientManifest, id)
if (manifestEntry) {
assert(manifestKey)
return { manifestEntry, manifestKey }
}
}
{
assert(manifestKeyEnd.startsWith('/'))
const dirS = manifestKeyEnd.split('/')
assert(dirS[0] === '')
manifestKeyEnd = '/' + dirS.slice(2).join('/')
assert(manifestKeyEnd.startsWith('/'), id)
}
{
const { manifestEntry, manifestKey } = findEntryWithKeyEnd(manifestKeyEnd, clientManifest, id)
if (manifestEntry) {
assert(manifestKey)
return { manifestEntry, manifestKey }
}
}
assert(false, id)
}
assert(false, id)
}
function findEntryWithKeyEnd(manifestKeyEnd: string, clientManifest: ViteManifest, id: string) {
assert(manifestKeyEnd.startsWith('/'))
const manifestKeys: string[] = []
for (const manifestKey in clientManifest) {
if (manifestKey.endsWith(manifestKeyEnd)) {
manifestKeys.push(manifestKey)
}
}
const manifestKeysRelative = manifestKeys.filter((k) => k.startsWith('../'))
assert(manifestKeysRelative.length <= 1, { id })
const manifestKey = manifestKeysRelative[0] ?? manifestKeys[0] ?? null
if (!manifestKey) {
return { manifestEntry: null, manifestKey: null }
}
const manifestEntry = clientManifest[manifestKey]!
return { manifestEntry, manifestKey }
}