| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | const merge = require('merge-source-map')export interface StylePreprocessor {  render(    source: string,    map: any | null,    options: any  ): StylePreprocessorResults}export interface StylePreprocessorResults {  code: string  map?: any  errors: Array<Error>}// .scss/.sass processorconst scss: StylePreprocessor = {  render(    source: string,    map: any | null,    options: any  ): StylePreprocessorResults {    const nodeSass = require('sass')    const finalOptions = Object.assign({}, options, {      data: source,      file: options.filename,      outFile: options.filename,      sourceMap: !!map    })    try {      const result = nodeSass.renderSync(finalOptions)      if (map) {        return {          code: result.css.toString(),          map: merge(map, JSON.parse(result.map.toString())),          errors: []        }      }      return { code: result.css.toString(), errors: [] }    } catch (e) {      return { code: '', errors: [e] }    }  }}const sass = {  render(    source: string,    map: any | null,    options: any  ): StylePreprocessorResults {    return scss.render(      source,      map,      Object.assign({}, options, { indentedSyntax: true })    )  }}// .lessconst less = {  render(    source: string,    map: any | null,    options: any  ): StylePreprocessorResults {    const nodeLess = require('less')    let result: any    let error: Error | null = null    nodeLess.render(      source,      Object.assign({}, options, { syncImport: true }),      (err: Error | null, output: any) => {        error = err        result = output      }    )    if (error) return { code: '', errors: [error] }    if (map) {      return {        code: result.css.toString(),        map: merge(map, result.map),        errors: []      }    }    return { code: result.css.toString(), errors: [] }  }}// .stylconst styl = {  render(    source: string,    map: any | null,    options: any  ): StylePreprocessorResults {    const nodeStylus = require('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()      if (map) {        return {          code: result,          map: merge(map, ref.sourcemap),          errors: []        }      }      return { code: result, errors: [] }    } catch (e) {      return { code: '', errors: [e] }    }  }}export const processors: { [key: string]: StylePreprocessor } = {  less,  sass,  scss,  styl,  stylus: styl}
 |