/
transformers.ts
79 lines (75 loc) · 2.17 KB
/
transformers.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
import type { Plugin } from 'vite'
import type { UnocssPluginContext } from '@unocss/core'
import MagicString from 'magic-string'
import type { EncodedSourceMap } from '@ampproject/remapping'
import remapping from '@ampproject/remapping'
import type { SourceMap } from 'rollup'
import { IGNORE_COMMENT } from './integration'
export function createTransformerPlugins(ctx: UnocssPluginContext): Plugin[] {
async function applyTransformers(original: string, id: string, enforce?: 'pre' | 'post') {
if (original.includes(IGNORE_COMMENT))
return
const transformers = (ctx.uno.config.transformers || []).filter(i => i.enforce === enforce)
if (!transformers.length)
return
let code = original
let s = new MagicString(code)
const maps: EncodedSourceMap[] = []
for (const t of transformers) {
if (t.idFilter) {
if (!t.idFilter(id))
continue
}
else if (!ctx.filter(code, id)) {
continue
}
await t.transform(s, id, ctx)
if (s.hasChanged()) {
code = s.toString()
maps.push(s.generateMap({ hires: true, source: id }) as EncodedSourceMap)
s = new MagicString(code)
}
}
if (code !== original) {
ctx.affectedModules.add(id)
return {
code,
map: remapping(maps, () => null) as SourceMap,
}
}
}
return [
{
name: 'unocss:transformers:default',
transform(code, id) {
return applyTransformers(code, id)
},
transformIndexHtml(code) {
return applyTransformers(code, 'index.html')
.then(t => t?.code)
},
},
{
name: 'unocss:transformers:pre',
enforce: 'pre',
transform(code, id) {
return applyTransformers(code, id, 'pre')
},
transformIndexHtml(code) {
return applyTransformers(code, 'index.html', 'pre')
.then(t => t?.code)
},
},
{
name: 'unocss:transformers:post',
enforce: 'post',
transform(code, id) {
return applyTransformers(code, id, 'post')
},
transformIndexHtml(code) {
applyTransformers(code, 'index.html', 'post')
.then(t => t?.code)
},
},
]
}