-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathless.ts
61 lines (57 loc) · 1.32 KB
/
less.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
import type { AST } from "svelte-eslint-parser"
import type less from "less"
import type { RuleContext } from "../../../types"
import type { TransformResult } from "./types"
import { loadModule } from "../../../utils/load-module"
type Less = typeof less
/**
* Transpile with less
*/
export function transform(
node: AST.SvelteStyleElement,
context: RuleContext,
): TransformResult | null {
const less = loadLess(context)
if (!less) {
return null
}
let inputRange: AST.Range
if (node.endTag) {
inputRange = [node.startTag.range[1], node.endTag.range[0]]
} else {
inputRange = [node.startTag.range[1], node.range[1]]
}
const code = context.getSourceCode().text.slice(...inputRange)
const filename = `${context.getFilename()}.less`
try {
let output: Awaited<ReturnType<Less["render"]>> | undefined
less.render(
code,
{
sourceMap: {},
syncImport: true,
filename,
lint: false,
},
(_error, result) => {
output = result
},
)
if (!output) {
return null
}
return {
inputRange,
output: output.css,
mappings: JSON.parse(output.map).mappings,
}
} catch (_e) {
return null
}
}
/**
* Load less
*/
function loadLess(context: RuleContext): Less | null {
return loadModule(context, "less")
}