@@ -182,21 +182,95 @@ function localizeDeclValue(valueNode, context) {
182182 return newValueNode ;
183183}
184184
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 ) {
188250 var newValuesNode = Object . create ( valuesNode ) ;
189251 newValuesNode . nodes = valuesNode . nodes . map ( function ( valueNode ) {
190252 var subContext = {
191253 options : context . options ,
192254 global : context . global ,
193- localizeNextItem : localizeName && ! context . global
255+ localizeNextItem : localize && ! context . global
194256 } ;
195257 return localizeDeclValue ( valueNode , subContext ) ;
196258 } ) ;
197259 decl . value = Tokenizer . stringifyValues ( newValuesNode ) ;
198260}
199261
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+
200274module . exports = postcss . plugin ( 'postcss-modules-local-by-default' , function ( options ) {
201275 if ( typeof options !== 'object' ) {
202276 options = { } ; // If options is undefined or not an object the plugin fails
0 commit comments