@@ -8,35 +8,65 @@ module.exports.extractThemeRulesPlugin = postcss.plugin('postcss-extract-theme-r
88 const prefix = options . prefix || THEME_VAR_PREFIX ;
99
1010 return ( root , results ) => {
11- /*
12- ruleMap = {
13- '.example': {
14- color: 'theme-var(--color-primary);',
15- 'font-weight': 'theme-var(--font-weight-medium);'
16- }
17- }
18- */
19- let ruleMap ;
11+ let themeRoot = new postcss . root ( ) ;
2012
21- root . walkRules ( rule => {
13+ const extractThemeRule = rule => {
14+ let hasThemeVar = false
15+ let decls = [ ] ;
2216 rule . walkDecls ( decl => {
2317 if ( decl . value . indexOf ( prefix ) > - 1 ) {
24- ruleMap = ruleMap || ( ruleMap = { } ) ;
25- let declMap = ruleMap [ rule . selector ] || ( ruleMap [ rule . selector ] = { } ) ;
26-
27- let value = decl . value ;
28-
29- if ( decl . important ) {
30- value += ' !important' ;
31- }
32-
33- declMap [ decl . prop ] = value ;
18+ hasThemeVar = true
19+ let themeDecl = decl . clone ( ) ;
20+ decls . push ( themeDecl ) ;
3421 decl . remove ( ) ;
3522 }
3623 } ) ;
24+ if ( decls . length > 0 ) {
25+ let themeRule = new postcss . rule ( ) ;
26+ themeRule . selector = rule . selector ;
27+ themeRule . nodes = decls ;
28+ themeRule . raws = rule . raws ;
29+ return themeRule
30+ }
31+ }
32+
33+ root . each ( node => {
34+ let nodes = [ ] ;
35+ switch ( node . type ) {
36+ case 'rule' :
37+ let themeRule = extractThemeRule ( node ) ;
38+ if ( themeRule ) {
39+ nodes . push ( themeRule ) ;
40+ }
41+ break ;
42+ case 'atrule' :
43+ let rules = [ ]
44+ node . each ( atnode => {
45+ if ( atnode . type === 'rule' ) {
46+ let themeRule = extractThemeRule ( atnode ) ;
47+ if ( themeRule ) {
48+ rules . push ( themeRule ) ;
49+ }
50+ }
51+ } )
52+ if ( rules . length > 0 ) {
53+ let themeAtRule = new postcss . atRule ( )
54+ themeAtRule . params = node . params ;
55+ themeAtRule . name = node . name ;
56+ themeAtRule . nodes = rules ;
57+ themeAtRule . raws = node . raws ;
58+ nodes . push ( themeAtRule ) ;
59+ }
60+ break ;
61+ }
62+ if ( nodes . length > 0 ) {
63+ themeRoot . nodes = themeRoot . nodes . concat ( nodes ) ;
64+ }
3765 } ) ;
3866
39- results . ruleMap = ruleMap ;
67+ if ( themeRoot . nodes . length > 0 ) {
68+ results . themeRoot = themeRoot
69+ }
4070 } ;
4171} ) ;
4272
0 commit comments