|
|
@@ -23,28 +23,48 @@ export interface StylePreprocessorResults {
|
|
|
|
|
|
// .scss/.sass processor
|
|
|
const scss: StylePreprocessor = (source, map, options, load = require) => {
|
|
|
- const nodeSass = load('sass')
|
|
|
- const finalOptions = {
|
|
|
- ...options,
|
|
|
- data: getSource(source, options.filename, options.additionalData),
|
|
|
- file: options.filename,
|
|
|
- outFile: options.filename,
|
|
|
- sourceMap: !!map,
|
|
|
- }
|
|
|
+ const nodeSass: typeof import('sass') = load('sass')
|
|
|
+ const { compileString, renderSync } = nodeSass
|
|
|
+
|
|
|
+ const data = getSource(source, options.filename, options.additionalData)
|
|
|
+ let css: string
|
|
|
+ let dependencies: string[]
|
|
|
+ let sourceMap: any
|
|
|
|
|
|
try {
|
|
|
- const result = nodeSass.renderSync(finalOptions)
|
|
|
- const dependencies = result.stats.includedFiles
|
|
|
+ if (compileString) {
|
|
|
+ const { pathToFileURL, fileURLToPath }: typeof import('url') = load('url')
|
|
|
+
|
|
|
+ const result = compileString(data, {
|
|
|
+ ...options,
|
|
|
+ url: pathToFileURL(options.filename),
|
|
|
+ sourceMap: !!map,
|
|
|
+ })
|
|
|
+ css = result.css
|
|
|
+ dependencies = result.loadedUrls.map(url => fileURLToPath(url))
|
|
|
+ sourceMap = map ? result.sourceMap! : undefined
|
|
|
+ } else {
|
|
|
+ const result = renderSync({
|
|
|
+ ...options,
|
|
|
+ data,
|
|
|
+ file: options.filename,
|
|
|
+ outFile: options.filename,
|
|
|
+ sourceMap: !!map,
|
|
|
+ })
|
|
|
+ css = result.css.toString()
|
|
|
+ dependencies = result.stats.includedFiles
|
|
|
+ sourceMap = map ? JSON.parse(result.map!.toString()) : undefined
|
|
|
+ }
|
|
|
+
|
|
|
if (map) {
|
|
|
return {
|
|
|
- code: result.css.toString(),
|
|
|
- map: merge(map, JSON.parse(result.map.toString())),
|
|
|
+ code: css,
|
|
|
errors: [],
|
|
|
dependencies,
|
|
|
+ map: merge(map, sourceMap!),
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
- return { code: result.css.toString(), errors: [], dependencies }
|
|
|
+ return { code: css, errors: [], dependencies }
|
|
|
} catch (e: any) {
|
|
|
return { code: '', errors: [e], dependencies: [] }
|
|
|
}
|