-
-
Notifications
You must be signed in to change notification settings - Fork 48
/
Copy pathsass.ts
51 lines (48 loc) · 1.16 KB
/
sass.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
import type { AST } from "svelte-eslint-parser"
import type sass from "sass"
import type { RuleContext } from "../../../types"
import type { TransformResult } from "./types"
import { loadModule } from "../../../utils/load-module"
type Sass = typeof sass
/**
* Transpile with sass
*/
export function transform(
node: AST.SvelteStyleElement,
context: RuleContext,
type: "scss" | "sass",
): TransformResult | null {
const sass = loadSass(context)
if (!sass) {
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)
try {
const output = sass.compileString(code, {
sourceMap: true,
syntax: type === "sass" ? "indented" : undefined,
})
if (!output) {
return null
}
return {
inputRange,
output: output.css,
mappings: output.sourceMap!.mappings,
}
} catch (_e) {
return null
}
}
/**
* Load sass
*/
function loadSass(context: RuleContext): Sass | null {
return loadModule(context, "sass")
}