Skip to content

Commit cf9eced

Browse files
committed
Implement basic plugin system
1 parent 05fbe1a commit cf9eced

File tree

7 files changed

+102
-53
lines changed

7 files changed

+102
-53
lines changed

__tests__/fixtures/tailwind-input.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
@tailwind preflight;
22

3+
@tailwind components;
4+
35
@tailwind utilities;
46

57
@responsive {

css/tailwind.css

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
11
@tailwind preflight;
22

3+
@tailwind components;
4+
35
@tailwind utilities;

defaultConfig.stub.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,9 @@ module.exports = {
859859
},
860860

861861

862+
plugins: [],
863+
864+
862865
/*
863866
|-----------------------------------------------------------------------------
864867
| Advanced Options https://tailwindcss.com/docs/configuration#options

src/index.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,8 @@ import postcss from 'postcss'
55
import perfectionist from 'perfectionist'
66

77
import registerConfigAsDependency from './lib/registerConfigAsDependency'
8-
import substituteTailwindPreflightAtRule from './lib/substituteTailwindPreflightAtRule'
8+
import substituteTailwindAtRules from './lib/substituteTailwindAtRules'
99
import evaluateTailwindFunctions from './lib/evaluateTailwindFunctions'
10-
import substituteTailwindUtilitiesAtRules from './lib/substituteTailwindUtilitiesAtRules'
1110
import substituteVariantsAtRules from './lib/substituteVariantsAtRules'
1211
import substituteResponsiveAtRules from './lib/substituteResponsiveAtRules'
1312
import substituteScreenAtRules from './lib/substituteScreenAtRules'
@@ -34,9 +33,8 @@ const plugin = postcss.plugin('tailwind', config => {
3433
return postcss(
3534
...plugins,
3635
...[
37-
substituteTailwindPreflightAtRule(lazyConfig),
36+
substituteTailwindAtRules(lazyConfig),
3837
evaluateTailwindFunctions(lazyConfig),
39-
substituteTailwindUtilitiesAtRules(lazyConfig),
4038
substituteVariantsAtRules(lazyConfig),
4139
substituteResponsiveAtRules(lazyConfig),
4240
substituteScreenAtRules(lazyConfig),
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
import _ from 'lodash'
2+
import applyClassPrefix from '../util/applyClassPrefix'
3+
import container from '../generators/container'
4+
import fs from 'fs'
5+
import generateModules from '../util/generateModules'
6+
import postcss from 'postcss'
7+
import utilityModules from '../utilityModules'
8+
import wrapWithVariants from '../util/wrapWithVariants'
9+
10+
function defineSelector(selector, properties) {
11+
const decls = _.map(properties, (value, property) => {
12+
return postcss.decl({
13+
prop: `${property}`,
14+
value: `${value}`,
15+
})
16+
})
17+
18+
return postcss.rule({ selector }).append(decls)
19+
}
20+
21+
export default function(config) {
22+
return function(css) {
23+
const unwrappedConfig = config()
24+
25+
const pluginComponents = []
26+
const pluginUtilities = []
27+
28+
unwrappedConfig.plugins.forEach(plugin => {
29+
plugin({
30+
selector: defineSelector,
31+
addUtilities: (utilities, variants) => {
32+
pluginUtilities.push(wrapWithVariants(utilities, variants))
33+
},
34+
addComponents: components => {
35+
pluginComponents.push(...components)
36+
},
37+
})
38+
})
39+
40+
css.walkAtRules('tailwind', atRule => {
41+
if (atRule.params === 'preflight') {
42+
atRule.before(
43+
postcss.parse(fs.readFileSync(`${__dirname}/../../css/preflight.css`, 'utf8'))
44+
)
45+
atRule.remove()
46+
}
47+
48+
if (atRule.params === 'components') {
49+
const tailwindComponentTree = postcss.root({
50+
nodes: [...container(unwrappedConfig)],
51+
})
52+
53+
const pluginComponentTree = postcss.root({
54+
nodes: [...pluginComponents],
55+
})
56+
57+
applyClassPrefix(tailwindComponentTree, unwrappedConfig.options.prefix)
58+
59+
tailwindComponentTree.walk(node => (node.source = atRule.source))
60+
pluginComponentTree.walk(node => (node.source = atRule.source))
61+
62+
atRule.before(tailwindComponentTree)
63+
atRule.before(pluginComponentTree)
64+
atRule.remove()
65+
}
66+
67+
if (atRule.params === 'utilities') {
68+
const utilities = generateModules(utilityModules, unwrappedConfig.modules, unwrappedConfig)
69+
70+
if (unwrappedConfig.options.important) {
71+
utilities.walkDecls(decl => (decl.important = true))
72+
}
73+
74+
const tailwindUtilityTree = postcss.root({
75+
nodes: [...utilities.nodes],
76+
})
77+
78+
const pluginUtilityTree = postcss.root({
79+
nodes: [...pluginUtilities],
80+
})
81+
82+
applyClassPrefix(tailwindUtilityTree, unwrappedConfig.options.prefix)
83+
84+
tailwindUtilityTree.walk(node => (node.source = atRule.source))
85+
pluginUtilityTree.walk(node => (node.source = atRule.source))
86+
87+
atRule.before(tailwindUtilityTree)
88+
atRule.before(pluginUtilityTree)
89+
atRule.remove()
90+
}
91+
})
92+
}
93+
}

src/lib/substituteTailwindPreflightAtRule.js

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/lib/substituteTailwindUtilitiesAtRules.js

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)