|
'use strict' |
|
|
|
let NoWorkResult = require('./no-work-result') |
|
let LazyResult = require('./lazy-result') |
|
let Document = require('./document') |
|
let Root = require('./root') |
|
|
|
class Processor { |
|
constructor(plugins = []) { |
|
this.version = '8.4.35' |
|
this.plugins = this.normalize(plugins) |
|
} |
|
|
|
normalize(plugins) { |
|
let normalized = [] |
|
for (let i of plugins) { |
|
if (i.postcss === true) { |
|
i = i() |
|
} else if (i.postcss) { |
|
i = i.postcss |
|
} |
|
|
|
if (typeof i === 'object' && Array.isArray(i.plugins)) { |
|
normalized = normalized.concat(i.plugins) |
|
} else if (typeof i === 'object' && i.postcssPlugin) { |
|
normalized.push(i) |
|
} else if (typeof i === 'function') { |
|
normalized.push(i) |
|
} else if (typeof i === 'object' && (i.parse || i.stringify)) { |
|
if (process.env.NODE_ENV !== 'production') { |
|
throw new Error( |
|
'PostCSS syntaxes cannot be used as plugins. Instead, please use ' + |
|
'one of the syntax/parser/stringifier options as outlined ' + |
|
'in your PostCSS runner documentation.' |
|
) |
|
} |
|
} else { |
|
throw new Error(i + ' is not a PostCSS plugin') |
|
} |
|
} |
|
return normalized |
|
} |
|
|
|
process(css, opts = {}) { |
|
if ( |
|
!this.plugins.length && |
|
!opts.parser && |
|
!opts.stringifier && |
|
!opts.syntax |
|
) { |
|
return new NoWorkResult(this, css, opts) |
|
} else { |
|
return new LazyResult(this, css, opts) |
|
} |
|
} |
|
|
|
use(plugin) { |
|
this.plugins = this.plugins.concat(this.normalize([plugin])) |
|
return this |
|
} |
|
} |
|
|
|
module.exports = Processor |
|
Processor.default = Processor |
|
|
|
Root.registerProcessor(Processor) |
|
Document.registerProcessor(Processor) |
|
|