@@ -18,24 +18,26 @@ const glob = require('tiny-glob/sync');
18
18
19
19
const processed = new WeakSet ( ) ;
20
20
21
- const getAdaptivePropSelector = ( userProps ) => {
21
+ const getAdaptivePropSelector = ( selector ) => {
22
22
return ( prop ) => {
23
- if ( ! userProps || ! userProps . adaptive_prop_selector ) {
23
+ if ( ! selector ) {
24
24
return `${ prop } -@media:dark`
25
25
}
26
26
27
- return `${ prop } ${ userProps . adaptive_prop_selector } `
27
+ return `${ prop } ${ selector } `
28
28
}
29
29
}
30
30
31
31
/** @type { import('postcss').PluginCreator<any> }*/
32
- module . exports = ( UserProps ) => {
32
+ module . exports = ( options ) => {
33
+ const { files, adaptive_prop_selector, custom_selector, layer, ...props } = options
34
+
33
35
const FilePropsCache = new Map ( ) ;
34
36
35
37
return {
36
38
postcssPlugin : 'postcss-jit-props' ,
37
39
prepare ( ) {
38
- const UserPropsCopy = JSON . parse ( JSON . stringify ( UserProps ) ) ;
40
+ const UserProps = { ... props }
39
41
40
42
const STATE = {
41
43
mapped : null , // track prepended props
@@ -48,23 +50,23 @@ module.exports = (UserProps) => {
48
50
target_media_dark : null , // dark media query props
49
51
}
50
52
51
- const adaptivePropSelector = getAdaptivePropSelector ( UserProps )
53
+ const adaptivePropSelector = getAdaptivePropSelector ( adaptive_prop_selector )
52
54
53
55
return {
54
56
Once ( node , { parse, result, Rule, AtRule } ) {
55
- let target_selector = ':root'
57
+ let target_selector = custom_selector || ':root'
56
58
57
- if ( ! Object . keys ( UserPropsCopy ) . length ) {
59
+ if ( ! files && ! Object . keys ( props ) . length ) {
58
60
return console . warn ( 'postcss-jit-props: Variable source(s) not passed.' )
59
61
}
60
62
61
- if ( UserPropsCopy ?. files ?. length ) {
63
+ if ( files ?. length ) {
62
64
63
- const files = UserPropsCopy ?. files
65
+ const globs = files
64
66
. map ( ( file ) => glob ( file ) )
65
67
. reduce ( ( flattenedFileList , files ) => flattenedFileList . concat ( files ) , [ ] )
66
68
67
- files . map ( file => {
69
+ globs . map ( file => {
68
70
result . messages . push ( {
69
71
type : 'dependency' ,
70
72
plugin : 'postcss-jit-props' ,
@@ -82,7 +84,7 @@ module.exports = (UserProps) => {
82
84
if ( FilePropsCache . has ( fileCacheKey ) ) {
83
85
const fileProps = FilePropsCache . get ( fileCacheKey )
84
86
for ( const [ key , value ] of fileProps ) {
85
- UserPropsCopy [ key ] = value
87
+ UserProps [ key ] = value
86
88
}
87
89
88
90
return
@@ -95,39 +97,35 @@ module.exports = (UserProps) => {
95
97
96
98
dependencyResult . walkDecls ( decl => {
97
99
if ( ! decl . variable ) return
98
- UserPropsCopy [ decl . prop ] = decl . value
100
+ UserProps [ decl . prop ] = decl . value
99
101
fileProps . set ( decl . prop , decl . value )
100
102
} )
101
103
102
104
dependencyResult . walkAtRules ( atrule => {
103
105
if ( atrule . name === 'custom-media' ) {
104
106
let media = atrule . params . slice ( 0 , atrule . params . indexOf ( ' ' ) )
105
- UserPropsCopy [ media ] = `@custom-media ${ atrule . params } ;`
107
+ UserProps [ media ] = `@custom-media ${ atrule . params } ;`
106
108
fileProps . set ( media , `@custom-media ${ atrule . params } ;` )
107
109
}
108
110
else if ( atrule . name === 'keyframes' ) {
109
111
let keyframeName = `--${ atrule . params } -@`
110
112
let keyframes = atrule . source . input . css . slice ( atrule . source . start . offset , atrule . source . end . offset + 1 )
111
- UserPropsCopy [ keyframeName ] = keyframes
113
+ UserProps [ keyframeName ] = keyframes
112
114
fileProps . set ( keyframeName , keyframes )
113
115
}
114
116
} )
115
117
} )
116
118
}
117
119
118
- if ( UserPropsCopy ?. custom_selector ) {
119
- target_selector = UserPropsCopy . custom_selector
120
- }
121
-
122
120
STATE . mapped = new Set ( )
123
121
STATE . mapped_dark = new Set ( )
124
122
125
123
STATE . target_rule = new Rule ( { selector : target_selector , source : node . first . source } )
126
124
STATE . target_rule_dark = new Rule ( { selector : target_selector , source : node . first . source } )
127
125
STATE . target_media_dark = new AtRule ( { name : 'media' , params : '(prefers-color-scheme: dark)' , source : node . first . source } )
128
126
129
- if ( UserPropsCopy ?. layer ) {
130
- STATE . target_layer = new AtRule ( { name : 'layer' , params : UserPropsCopy . layer , source : node . first . source } )
127
+ if ( layer ) {
128
+ STATE . target_layer = new AtRule ( { name : 'layer' , params : layer , source : node . first . source } )
131
129
node . root ( ) . prepend ( STATE . target_layer )
132
130
STATE . target_ss = STATE . target_layer
133
131
}
@@ -151,7 +149,7 @@ module.exports = (UserProps) => {
151
149
STATE . target_ss . prepend ( STATE . target_rule )
152
150
153
151
// lookup prop value from pool
154
- let value = UserPropsCopy [ prop ] || null
152
+ let value = UserProps [ prop ] || null
155
153
156
154
// warn if media prop not resolved
157
155
if ( ! value ) {
@@ -188,7 +186,7 @@ module.exports = (UserProps) => {
188
186
if ( STATE . mapped . has ( prop ) ) continue
189
187
190
188
// lookup prop from options object
191
- let value = UserPropsCopy [ prop ] || null
189
+ let value = UserProps [ prop ] || null
192
190
193
191
// warn if props won't resolve from plugin
194
192
if ( ! value ) {
@@ -201,7 +199,7 @@ module.exports = (UserProps) => {
201
199
STATE . mapped . add ( prop )
202
200
203
201
// lookup keyframes for the prop and append if found
204
- let keyframes = UserPropsCopy [ `${ prop } -@` ]
202
+ let keyframes = UserProps [ `${ prop } -@` ]
205
203
if ( keyframes ) {
206
204
const keyframesNode = parse ( keyframes ) . first
207
205
keyframesNode . source = node . source
@@ -210,7 +208,7 @@ module.exports = (UserProps) => {
210
208
}
211
209
212
210
// lookup dark adaptive prop and append if found
213
- let adaptive = UserPropsCopy [ adaptivePropSelector ( prop ) ]
211
+ let adaptive = UserProps [ adaptivePropSelector ( prop ) ]
214
212
if ( adaptive && ! STATE . mapped_dark . has ( prop ) ) {
215
213
// create @media ... { :root {} } context just in time
216
214
if ( STATE . mapped_dark . size === 0 ) {
0 commit comments