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 processor
- const 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 })
- )
- }
- }
- // .less
- const 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: [] }
- }
- }
- // .styl
- const 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
- }
|