|
|
@@ -1,12 +1,14 @@
|
|
|
import merge from 'merge-source-map'
|
|
|
import { RawSourceMap } from 'source-map'
|
|
|
import { SFCStyleCompileOptions } from './compileStyle'
|
|
|
+import { isFunction } from '@vue/shared'
|
|
|
|
|
|
export type StylePreprocessor = (
|
|
|
source: string,
|
|
|
map: RawSourceMap | undefined,
|
|
|
options: {
|
|
|
[key: string]: any
|
|
|
+ additionalData?: string | ((source: string, filename: string) => string)
|
|
|
filename: string
|
|
|
},
|
|
|
customRequire: SFCStyleCompileOptions['preprocessCustomRequire']
|
|
|
@@ -24,7 +26,7 @@ const scss: StylePreprocessor = (source, map, options, load = require) => {
|
|
|
const nodeSass = load('sass')
|
|
|
const finalOptions = {
|
|
|
...options,
|
|
|
- data: (options.additionalData || '') + source,
|
|
|
+ data: getSource(source, options.filename, options.additionalData),
|
|
|
file: options.filename,
|
|
|
outFile: options.filename,
|
|
|
sourceMap: !!map
|
|
|
@@ -66,7 +68,7 @@ const less: StylePreprocessor = (source, map, options, load = require) => {
|
|
|
let result: any
|
|
|
let error: Error | null = null
|
|
|
nodeLess.render(
|
|
|
- source,
|
|
|
+ getSource(source, options.filename, options.additionalData),
|
|
|
{ ...options, syncImport: true },
|
|
|
(err: Error | null, output: any) => {
|
|
|
error = err
|
|
|
@@ -117,6 +119,18 @@ const styl: StylePreprocessor = (source, map, options, load = require) => {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+function getSource(
|
|
|
+ source: string,
|
|
|
+ filename: string,
|
|
|
+ additionalData?: string | ((source: string, filename: string) => string)
|
|
|
+) {
|
|
|
+ if (!additionalData) return source
|
|
|
+ if (isFunction(additionalData)) {
|
|
|
+ return additionalData(source, filename)
|
|
|
+ }
|
|
|
+ return additionalData + source
|
|
|
+}
|
|
|
+
|
|
|
export type PreprocessLang = 'less' | 'sass' | 'scss' | 'styl' | 'stylus'
|
|
|
|
|
|
export const processors: Record<PreprocessLang, StylePreprocessor> = {
|