]> git.ipfire.org Git - thirdparty/vuejs/core.git/commitdiff
refactor(compiler-sfc): simplify style preprocessors
authorEvan You <yyx990803@gmail.com>
Thu, 16 Jul 2020 17:38:46 +0000 (13:38 -0400)
committerEvan You <yyx990803@gmail.com>
Thu, 16 Jul 2020 17:38:46 +0000 (13:38 -0400)
packages/compiler-sfc/src/compileStyle.ts
packages/compiler-sfc/src/stylePreprocessors.ts

index 60ecffc75cadf0f34b62ecf74c341eb8ce62a725..b0aa484cd2379954a95e386796c77d5ffe00d90c 100644 (file)
@@ -213,7 +213,7 @@ function preprocess(
     )
   }
 
-  return preprocessor.render(
+  return preprocessor(
     options.source,
     options.map,
     {
index 31a983793465fc37dbcefeee88c246fbf8710987..f0a09d751d78d1b67b08db8be617af17d56c950c 100644 (file)
@@ -3,17 +3,15 @@ import path from 'path'
 import { RawSourceMap } from 'source-map'
 import { SFCStyleCompileOptions } from './compileStyle'
 
-export interface StylePreprocessor {
-  render(
-    source: string,
-    map: RawSourceMap | undefined,
-    options: {
-      [key: string]: any
-      filename: string
-    },
-    customRequire: SFCStyleCompileOptions['preprocessCustomRequire']
-  ): StylePreprocessorResults
-}
+export type StylePreprocessor = (
+  source: string,
+  map: RawSourceMap | undefined,
+  options: {
+    [key: string]: any
+    filename: string
+  },
+  customRequire: SFCStyleCompileOptions['preprocessCustomRequire']
+) => StylePreprocessorResults
 
 export interface StylePreprocessorResults {
   code: string
@@ -23,118 +21,109 @@ export interface StylePreprocessorResults {
 }
 
 // .scss/.sass processor
-const scss: StylePreprocessor = {
-  render(source, map, options, load = require) {
-    const nodeSass = load('sass')
-    const finalOptions = {
-      ...options,
-      data: source,
-      file: options.filename,
-      outFile: options.filename,
-      sourceMap: !!map
-    }
-
-    try {
-      const result = nodeSass.renderSync(finalOptions)
-      // sass output path is position path
-      const dependencies = result.stats.includedFiles
-      if (map) {
-        return {
-          code: result.css.toString(),
-          map: merge(map, JSON.parse(result.map.toString())),
-          errors: [],
-          dependencies
-        }
-      }
-
-      return { code: result.css.toString(), errors: [], dependencies }
-    } catch (e) {
-      return { code: '', errors: [e], dependencies: [] }
-    }
-  }
-}
-
-const sass: StylePreprocessor = {
-  render(source, map, options, load) {
-    return scss.render(
-      source,
-      map,
-      {
-        ...options,
-        indentedSyntax: true
-      },
-      load
-    )
+const scss: StylePreprocessor = (source, map, options, load = require) => {
+  const nodeSass = load('sass')
+  const finalOptions = {
+    ...options,
+    data: source,
+    file: options.filename,
+    outFile: options.filename,
+    sourceMap: !!map
   }
-}
 
-// .less
-const less: StylePreprocessor = {
-  render(source, map, options, load = require) {
-    const nodeLess = load('less')
-
-    let result: any
-    let error: Error | null = null
-    nodeLess.render(
-      source,
-      { ...options, syncImport: true },
-      (err: Error | null, output: any) => {
-        error = err
-        result = output
-      }
-    )
-
-    if (error) return { code: '', errors: [error], dependencies: [] }
-    // less output path is relative path
-    const dependencies = getAbsolutePaths(
-      result.imports,
-      path.dirname(options.filename)
-    )
+  try {
+    const result = nodeSass.renderSync(finalOptions)
+    // sass output path is position path
+    const dependencies = result.stats.includedFiles
     if (map) {
       return {
         code: result.css.toString(),
-        map: merge(map, result.map),
+        map: merge(map, JSON.parse(result.map.toString())),
         errors: [],
-        dependencies: dependencies
+        dependencies
       }
     }
 
+    return { code: result.css.toString(), errors: [], dependencies }
+  } catch (e) {
+    return { code: '', errors: [e], dependencies: [] }
+  }
+}
+
+const sass: StylePreprocessor = (source, map, options, load) =>
+  scss(
+    source,
+    map,
+    {
+      ...options,
+      indentedSyntax: true
+    },
+    load
+  )
+
+// .less
+const less: StylePreprocessor = (source, map, options, load = require) => {
+  const nodeLess = load('less')
+
+  let result: any
+  let error: Error | null = null
+  nodeLess.render(
+    source,
+    { ...options, syncImport: true },
+    (err: Error | null, output: any) => {
+      error = err
+      result = output
+    }
+  )
+
+  if (error) return { code: '', errors: [error], dependencies: [] }
+  // less output path is relative path
+  const dependencies = getAbsolutePaths(
+    result.imports,
+    path.dirname(options.filename)
+  )
+  if (map) {
     return {
       code: result.css.toString(),
+      map: merge(map, result.map),
       errors: [],
       dependencies: dependencies
     }
   }
+
+  return {
+    code: result.css.toString(),
+    errors: [],
+    dependencies: dependencies
+  }
 }
 
 // .styl
-const styl: StylePreprocessor = {
-  render(source, map, options, load = require) {
-    const nodeStylus = load('stylus')
-    try {
-      const ref = nodeStylus(source)
-      Object.keys(options).forEach(key => ref.set(key, options[key]))
-      if (map) ref.set('sourcemap', { inline: false, comment: false })
-
-      const result = ref.render()
-      // stylus output path is relative path
-      const dependencies = getAbsolutePaths(
-        ref.deps(),
-        path.dirname(options.fileName)
-      )
-      if (map) {
-        return {
-          code: result,
-          map: merge(map, ref.sourcemap),
-          errors: [],
-          dependencies
-        }
+const styl: StylePreprocessor = (source, map, options, load = require) => {
+  const nodeStylus = load('stylus')
+  try {
+    const ref = nodeStylus(source)
+    Object.keys(options).forEach(key => ref.set(key, options[key]))
+    if (map) ref.set('sourcemap', { inline: false, comment: false })
+
+    const result = ref.render()
+    // stylus output path is relative path
+    const dependencies = getAbsolutePaths(
+      ref.deps(),
+      path.dirname(options.fileName)
+    )
+    if (map) {
+      return {
+        code: result,
+        map: merge(map, ref.sourcemap),
+        errors: [],
+        dependencies
       }
-
-      return { code: result, errors: [], dependencies }
-    } catch (e) {
-      return { code: '', errors: [e], dependencies: [] }
     }
+
+    return { code: result, errors: [], dependencies }
+  } catch (e) {
+    return { code: '', errors: [e], dependencies: [] }
   }
 }