@@ -189,6 +189,92 @@ function walkExpression(context, expression) {
189189 break ;
190190 case "CallExpression" :
191191 var noCallee = false ;
192+ function processAmdArray ( params , elements ) {
193+ params . forEach ( function ( param , idx ) {
194+ if ( param . conditional ) {
195+ context . requires = context . requires || [ ] ;
196+ param . conditional . forEach ( function ( paramItem ) {
197+ context . requires . push ( {
198+ name : paramItem . value ,
199+ expressionRange : paramItem . range ,
200+ line : elements [ idx ] . loc . start . line ,
201+ column : elements [ idx ] . loc . start . column
202+ } ) ;
203+ } ) ;
204+ } else if ( param . code ) {
205+ // make context
206+ var pos = param . value . indexOf ( "/" ) ;
207+ context . contexts = context . contexts || [ ] ;
208+ if ( pos === - 1 ) {
209+ var newContext = {
210+ name : "." ,
211+ valueRange : elements [ idx ] . range ,
212+ line : elements [ idx ] . loc . start . line ,
213+ column : elements [ idx ] . loc . start . column
214+ } ;
215+ context . contexts . push ( newContext ) ;
216+ } else {
217+ var match = / \/ [ ^ \/ ] * $ / . exec ( param . value ) ;
218+ var dirname = param . value . substring ( 0 , match . index ) ;
219+ var remainder = "." + param . value . substring ( match . index ) ;
220+ var newContext = {
221+ name : dirname ,
222+ replace : [ param . range , remainder ] ,
223+ valueRange : elements [ idx ] . range ,
224+ line : elements [ idx ] . loc . start . line ,
225+ column : elements [ idx ] . loc . start . column
226+ } ;
227+ context . contexts . push ( newContext ) ;
228+ }
229+ } else {
230+ // normal require
231+ context . requires = context . requires || [ ] ;
232+ context . requires . push ( {
233+ name : param . value ,
234+ expressionRange : elements [ idx ] . range ,
235+ line : elements [ idx ] . loc . start . line ,
236+ column : elements [ idx ] . loc . start . column
237+ } ) ;
238+ }
239+ } ) ;
240+ }
241+ // AMD require
242+ if ( context . overwrite . indexOf ( "require" ) === - 1 &&
243+ expression . callee && expression . arguments &&
244+ expression . arguments . length == 2 &&
245+ expression . callee . type === "Identifier" &&
246+ expression . callee . name === "require" ) {
247+ var params = parseCalculatedStringArray ( expression . arguments [ 0 ] ) ;
248+ var elements = expression . arguments [ 0 ] . type == "ArrayExpression" ?
249+ expression . arguments [ 0 ] . elements : [ expression . arguments [ 0 ] ] ;
250+ processAmdArray ( params , elements ) ;
251+ context . requires = context . requires || [ ] ;
252+ context . requires . push ( {
253+ amdRequireRange : expression . callee . range ,
254+ line : expression . callee . loc . start . line ,
255+ column : expression . callee . loc . start . column
256+ } ) ;
257+ noCallee = true ;
258+ }
259+ // AMD define
260+ if ( context . overwrite . indexOf ( "define" ) === - 1 &&
261+ expression . callee && expression . arguments &&
262+ expression . arguments . length == 3 &&
263+ expression . callee . type === "Identifier" &&
264+ expression . callee . name === "define" ) {
265+ var params = parseCalculatedStringArray ( expression . arguments [ 1 ] ) ;
266+ var elements = expression . arguments [ 1 ] . type == "ArrayExpression" ?
267+ expression . arguments [ 1 ] . elements : [ expression . arguments [ 1 ] ] ;
268+ processAmdArray ( params , elements ) ;
269+ context . requires = context . requires || [ ] ;
270+ context . requires . push ( {
271+ amdDefineRange : expression . callee . range ,
272+ line : expression . callee . loc . start . line ,
273+ column : expression . callee . loc . start . column
274+ } ) ;
275+ noCallee = true ;
276+ }
277+ // CommonJS
192278 if ( context . overwrite . indexOf ( "require" ) === - 1 &&
193279 expression . callee && expression . arguments &&
194280 expression . arguments . length == 1 &&
@@ -245,6 +331,7 @@ function walkExpression(context, expression) {
245331 }
246332 noCallee = true ;
247333 }
334+ // require.ensure
248335 if ( context . overwrite . indexOf ( "require" ) === - 1 &&
249336 expression . callee && expression . arguments &&
250337 expression . arguments . length >= 1 &&
@@ -286,6 +373,7 @@ function walkExpression(context, expression) {
286373 context = newContext ;
287374 noCallee = true ;
288375 }
376+ // (non-standard) require.context
289377 if ( context . overwrite . indexOf ( "require" ) === - 1 &&
290378 expression . callee && expression . arguments &&
291379 expression . arguments . length == 1 &&
@@ -306,6 +394,7 @@ function walkExpression(context, expression) {
306394 context . contexts . push ( newContext ) ;
307395 noCallee = true ;
308396 }
397+ // CommonJS: require.resolve
309398 if ( context . overwrite . indexOf ( "require" ) === - 1 &&
310399 expression . callee && expression . arguments &&
311400 expression . arguments . length == 1 &&
@@ -472,6 +561,19 @@ function parseStringArray(expression) {
472561 return [ parseString ( expression ) ] ;
473562}
474563
564+ function parseCalculatedStringArray ( expression ) {
565+ switch ( expression . type ) {
566+ case "ArrayExpression" :
567+ var arr = [ ] ;
568+ if ( expression . elements )
569+ expression . elements . forEach ( function ( expr ) {
570+ arr . push ( parseCalculatedString ( expr ) ) ;
571+ } ) ;
572+ return arr ;
573+ }
574+ return [ parseCalculatedString ( expression ) ] ;
575+ }
576+
475577module . exports = function parse ( source , options ) {
476578 var ast = esprima . parse ( source , { range : true , loc : true , raw : true } ) ;
477579 if ( ! ast || typeof ast != "object" )
0 commit comments