@@ -153,10 +153,49 @@ function localizeNode(node, context) {
153
153
return node ;
154
154
}
155
155
156
- function localizeDecl ( decl ) {
157
- if ( typeof decl . prop === "string" && / a n i m a t i o n ( - n a m e ) ? / . test ( decl . prop ) ) {
158
- decl . value = decl . value . replace ( / ( ^ | , ) ( \s * ) ( \w + ) / g, "$1$2:local($3)" ) ; // TODO
156
+ function localizeDeclNode ( node , context ) {
157
+ var newNode ;
158
+ switch ( node . type ) {
159
+ case "item" :
160
+ if ( context . localizeNextItem ) {
161
+ newNode = Object . create ( node ) ;
162
+ newNode . name = ":local(" + newNode . name + ")" ;
163
+ context . localizeNextItem = false ;
164
+ return newNode ;
165
+ }
166
+ break ;
167
+ case "url" :
168
+ if ( context . options . rewriteUrl ) {
169
+ newNode = Object . create ( node ) ;
170
+ newNode . url = context . options . rewriteUrl ( context . global , node . url ) ;
171
+ return newNode ;
172
+ }
173
+ break ;
159
174
}
175
+ return node ;
176
+ }
177
+
178
+ function localizeDeclValue ( valueNode , context ) {
179
+ var newValueNode = Object . create ( valueNode ) ;
180
+ newValueNode . nodes = valueNode . nodes . map ( function ( node ) {
181
+ return localizeDeclNode ( node , context ) ;
182
+ } ) ;
183
+ return newValueNode ;
184
+ }
185
+
186
+ function localizeDecl ( decl , context ) {
187
+ var valuesNode = Tokenizer . parseValues ( decl . value ) ;
188
+ var localizeName = / a n i m a t i o n ( - n a m e ) ? / . test ( decl . prop ) ;
189
+ var newValuesNode = Object . create ( valuesNode ) ;
190
+ newValuesNode . nodes = valuesNode . nodes . map ( function ( valueNode ) {
191
+ var subContext = {
192
+ options : context . options ,
193
+ global : context . global ,
194
+ localizeNextItem : localizeName && ! context . global
195
+ } ;
196
+ return localizeDeclValue ( valueNode , subContext ) ;
197
+ } ) ;
198
+ decl . value = Tokenizer . stringifyValues ( newValuesNode ) ;
160
199
}
161
200
162
201
module . exports = postcss . plugin ( 'postcss-modules-local-by-default' , function ( options ) {
@@ -174,7 +213,7 @@ module.exports = postcss.plugin('postcss-modules-local-by-default', function (op
174
213
var localMatch = / ^ \s * : l o c a l \s * \( ( .+ ) \) \s * $ / . exec ( atrule . params ) ;
175
214
if ( globalMatch ) {
176
215
if ( pureMode ) {
177
- throw new Error ( "@keyframes :global(...) is not allowed in pure mode" ) ;
216
+ throw atrule . error ( "@keyframes :global(...) is not allowed in pure mode" ) ;
178
217
}
179
218
atrule . params = globalMatch [ 1 ] ;
180
219
} else if ( localMatch ) {
@@ -187,22 +226,28 @@ module.exports = postcss.plugin('postcss-modules-local-by-default', function (op
187
226
css . eachRule ( function ( rule ) {
188
227
var selector = Tokenizer . parse ( rule . selector ) ;
189
228
var context = {
229
+ options : options ,
190
230
global : globalMode ,
191
231
hasPureGlobals : false ,
192
232
hasPureImplicitGlobals : false
193
233
} ;
194
- var newSelector = localizeNode ( selector , context ) ;
234
+ var newSelector ;
235
+ try {
236
+ newSelector = localizeNode ( selector , context ) ;
237
+ } catch ( e ) {
238
+ throw rule . error ( e . message ) ;
239
+ }
195
240
if ( pureMode && context . hasPureGlobals ) {
196
- throw new Error ( "Selector '" + Tokenizer . stringify ( selector ) + "' is not pure " +
241
+ throw rule . error ( "Selector '" + Tokenizer . stringify ( selector ) + "' is not pure " +
197
242
"(pure selectors must contain at least one local class or id)" ) ;
198
243
}
199
244
if ( ! globalMode && context . hasPureImplicitGlobals ) {
200
- throw new Error ( "Selector '" + Tokenizer . stringify ( selector ) + "' must be explicit flagged :global " +
245
+ throw rule . error ( "Selector '" + Tokenizer . stringify ( selector ) + "' must be explicit flagged :global " +
201
246
"(elsewise it would leak globally)" ) ;
202
247
}
203
- if ( ! context . global ) {
204
- rule . nodes . forEach ( localizeDecl ) ;
205
- }
248
+ rule . nodes . forEach ( function ( decl ) {
249
+ localizeDecl ( decl , context ) ;
250
+ } ) ;
206
251
rule . selector = Tokenizer . stringify ( newSelector ) ;
207
252
} ) ;
208
253
} ;
0 commit comments