-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
util.ts
65 lines (55 loc) · 1.85 KB
/
util.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
import { resolve, sep } from 'node:path'
import type { InlineConfig, ModuleNode } from 'vite'
import { createServer } from 'vite'
const baseDir = resolve(__dirname, '../..')
export async function compile(options: InlineConfig, file: string): Promise<string | undefined> {
const vite = await createServer({
root: baseDir,
...options,
plugins: [
...options.plugins,
{
name: 'externals',
config(config) {
const newAlias = [
...(config?.resolve?.alias ?? []),
{ find: /^vue$/, replacement: 'virtual:empty:vue' },
{ find: /^@fluent\/bundle$/, replacement: 'virtual:empty:fluent-bundle' },
]
config.resolve = {
...(config.resolve ?? {}),
alias: newAlias,
}
},
},
{
name: 'virtual:empty',
resolveId(id) {
if (id.startsWith('virtual:empty:'))
return id
},
load(id) {
if (id.startsWith('virtual:empty:'))
return 'export default {}'
},
},
],
})
await vite.transformRequest(file)
const module = await vite.moduleGraph.getModuleByUrl(file)
const getAllModules = (module: ModuleNode): ModuleNode[] => [module].concat([...module.importedModules.values()].flatMap(getAllModules))
const modules = await Promise.all(getAllModules(module)
.map(async module => ({
transform: await vite.transformRequest(module.url),
module,
})))
const code = modules
.filter(module => module.transform)
.filter(module => !module.module.url.includes('node_modules'))
.map(module => `=== ${module.module.url} ===\n${module.transform.code}`).join('\n\n')
// normalize paths
return code
?.replaceAll(baseDir.replaceAll(sep, '/'), '')
.replace(/\/@(fs|id).*?node_modules\//g, '')
.replaceAll('\\r\\n', '\\n')
}