@@ -182,21 +182,95 @@ function localizeDeclValue(valueNode, context) {
182
182
return newValueNode ;
183
183
}
184
184
185
- function localizeDecl ( decl , context ) {
186
- var valuesNode = Tokenizer . parseValues ( decl . value ) ;
187
- var localizeName = / a n i m a t i o n ( - n a m e ) ? $ / . test ( decl . prop ) ;
185
+ function localizeAnimationShorthandDeclValueNodes ( nodes , context ) {
186
+ var validIdent = validIdent = / ^ - ? [ _ a - z ] [ _ a - z 0 - 9 - ] * $ / i;
187
+
188
+ var animationKeywords = {
189
+ 'alternate' : 1 ,
190
+ 'alternate-reverse' : 1 ,
191
+ 'backwards' : 1 ,
192
+ 'both' : 1 ,
193
+ 'ease' : 1 ,
194
+ 'ease-in' : 1 ,
195
+ 'ease-in-out' : 1 ,
196
+ 'ease-out' : 1 ,
197
+ 'forwards' : 1 ,
198
+ 'infinite' : 1 ,
199
+ 'linear' : 1 ,
200
+ 'none' : 2 ,
201
+ 'normal' : 1 ,
202
+ 'paused' : 1 ,
203
+ 'reverse' : 1 ,
204
+ 'running' : 1 ,
205
+ 'step-end' : 1 ,
206
+ 'step-start' : 1 ,
207
+ } ;
208
+
209
+ var didParseAnimationName = false ;
210
+ var parsedAnimationKeywords = { } ;
211
+ return nodes . map ( function ( valueNode ) {
212
+ var value = valueNode . type === 'item'
213
+ ? valueNode . name . toLowerCase ( )
214
+ : null ;
215
+
216
+ var shouldParseAnimationName = false ;
217
+
218
+ if ( ! didParseAnimationName && value && validIdent . test ( value ) ) {
219
+ if ( value in animationKeywords ) {
220
+ parsedAnimationKeywords [ value ] = ( value in parsedAnimationKeywords )
221
+ ? ( parsedAnimationKeywords [ value ] + 1 )
222
+ : 0 ;
223
+
224
+ shouldParseAnimationName = ( parsedAnimationKeywords [ value ] >= animationKeywords [ value ] ) ;
225
+ } else {
226
+ shouldParseAnimationName = true ;
227
+ }
228
+ }
229
+
230
+ var subContext = {
231
+ options : context . options ,
232
+ global : context . global ,
233
+ localizeNextItem : shouldParseAnimationName && ! context . global
234
+ } ;
235
+ return localizeDeclNode ( valueNode , subContext ) ;
236
+ } ) ;
237
+ }
238
+
239
+ function localizeAnimationShorthandDeclValues ( valuesNode , decl , context ) {
240
+ var newValuesNode = Object . create ( valuesNode ) ;
241
+ newValuesNode . nodes = valuesNode . nodes . map ( function ( valueNode , index ) {
242
+ var newValueNode = Object . create ( valueNode ) ;
243
+ newValueNode . nodes = localizeAnimationShorthandDeclValueNodes ( valueNode . nodes , context ) ;
244
+ return newValueNode ;
245
+ } ) ;
246
+ decl . value = Tokenizer . stringifyValues ( newValuesNode ) ;
247
+ }
248
+
249
+ function localizeDeclValues ( localize , valuesNode , decl , context ) {
188
250
var newValuesNode = Object . create ( valuesNode ) ;
189
251
newValuesNode . nodes = valuesNode . nodes . map ( function ( valueNode ) {
190
252
var subContext = {
191
253
options : context . options ,
192
254
global : context . global ,
193
- localizeNextItem : localizeName && ! context . global
255
+ localizeNextItem : localize && ! context . global
194
256
} ;
195
257
return localizeDeclValue ( valueNode , subContext ) ;
196
258
} ) ;
197
259
decl . value = Tokenizer . stringifyValues ( newValuesNode ) ;
198
260
}
199
261
262
+ function localizeDecl ( decl , context ) {
263
+ var valuesNode = Tokenizer . parseValues ( decl . value ) ;
264
+
265
+ var isAnimation = / a n i m a t i o n ? $ / . test ( decl . prop ) ;
266
+ if ( isAnimation ) return localizeAnimationShorthandDeclValues ( valuesNode , decl , context ) ;
267
+
268
+ var isAnimationName = / a n i m a t i o n ( - n a m e ) ? $ / . test ( decl . prop ) ;
269
+ if ( isAnimationName ) return localizeDeclValues ( true , valuesNode , decl , context ) ;
270
+
271
+ return localizeDeclValues ( false , valuesNode , decl , context ) ;
272
+ }
273
+
200
274
module . exports = postcss . plugin ( 'postcss-modules-local-by-default' , function ( options ) {
201
275
if ( typeof options !== 'object' ) {
202
276
options = { } ; // If options is undefined or not an object the plugin fails
0 commit comments