forked from tailwindlabs/tailwindcss
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprocessPlugins.js
More file actions
66 lines (53 loc) · 2.08 KB
/
processPlugins.js
File metadata and controls
66 lines (53 loc) · 2.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import _ from 'lodash'
import postcss from 'postcss'
import Node from 'postcss/lib/node'
import escapeClassName from '../util/escapeClassName'
import parseObjectStyles from '../util/parseObjectStyles'
import prefixSelector from '../util/prefixSelector'
import wrapWithVariants from '../util/wrapWithVariants'
function parseStyles(styles) {
if (!Array.isArray(styles)) {
return parseStyles([styles])
}
return _.flatMap(styles, style => (style instanceof Node ? style : parseObjectStyles(style)))
}
export default function(config) {
const pluginComponents = []
const pluginUtilities = []
config.plugins.forEach(plugin => {
plugin({
config: (path, defaultValue) => _.get(config, path, defaultValue),
e: escapeClassName,
prefix: selector => {
return prefixSelector(config.options.prefix, selector)
},
addUtilities: (utilities, options) => {
const defaultOptions = { variants: [], respectPrefix: true, respectImportant: true }
options = Array.isArray(options)
? Object.assign({}, defaultOptions, { variants: options })
: _.defaults(options, defaultOptions)
const styles = postcss.root({ nodes: parseStyles(utilities) })
styles.walkRules(rule => {
if (options.respectPrefix) {
rule.selector = prefixSelector(config.options.prefix, rule.selector)
}
if (options.respectImportant && _.get(config, 'options.important')) {
rule.walkDecls(decl => (decl.important = true))
}
})
pluginUtilities.push(wrapWithVariants(styles.nodes, options.variants))
},
addComponents: (components, options) => {
options = Object.assign({ respectPrefix: true }, options)
const styles = postcss.root({ nodes: parseStyles(components) })
styles.walkRules(rule => {
if (options.respectPrefix) {
rule.selector = prefixSelector(config.options.prefix, rule.selector)
}
})
pluginComponents.push(...styles.nodes)
},
})
})
return [pluginComponents, pluginUtilities]
}