@@ -41,6 +41,10 @@ function optimizeJs (jsString, opts) {
4141        return  false 
4242      } 
4343
44+       function  isNumeric  ( str )  { 
45+         return  / ^ [ 0 - 9 ] + $ / . test ( str ) 
46+       } 
47+ 
4448      function  isCallExpression  ( node )  { 
4549        return  node  &&  node . type  ===  'CallExpression' 
4650      } 
@@ -49,37 +53,62 @@ function optimizeJs (jsString, opts) {
4953        return  node  &&  node . type  ===  'ArrayExpression' 
5054      } 
5155
56+       function  isElementOfArray  ( node )  { 
57+         return  isArrayExpression ( node . parent ( ) )  && 
58+           node . parent ( ) . elements . indexOf ( node )  !==  - 1 
59+       } 
60+ 
5261      // returns true iff node is an argument to a function call expression. 
5362      function  isArgumentToFunctionCall  ( node )  { 
5463        return  isCallExpression ( node . parent ( ) )  && 
5564          node . parent ( ) . arguments . length  && 
5665          node . parent ( ) . arguments . indexOf ( node )  !==  - 1 
5766      } 
5867
59-       // returns true iff node is an element of an array literal which is in turn 
60-       // an argument to a function call expression. 
61-       function  isElementOfArrayArgumentToFunctionCall  ( node )  { 
62-         return  isArrayExpression ( node . parent ( ) )  && 
63-           node . parent ( ) . elements . indexOf ( node )  !==  - 1  && 
64-           isArgumentToFunctionCall ( node . parent ( ) ) 
68+       function  isValueOfObjectLiteralWithNumericName  ( node )  { 
69+         return  node  && 
70+           node . parent ( )  && 
71+           node . parent ( ) . type  ===  'Property'  && 
72+           node . parent ( ) . key  && 
73+           node . parent ( ) . key . type  ===  'Literal'  && 
74+           node . parent ( ) . key . raw  && 
75+           isNumeric ( node . parent ( ) . key . raw )  && 
76+           node . parent ( ) . value  ===  node  && 
77+           node . parent ( ) . parent ( )  && 
78+           node . parent ( ) . parent ( ) . type  ===  'ObjectExpression' 
6579      } 
6680
6781      // returns true iff node is an IIFE. 
6882      function  isIIFE  ( node )  { 
69-         return  isCallExpression ( node . parent ( ) )  && 
83+         return  node  && 
84+           node . type  ===  'FunctionExpression'  && 
85+           isCallExpression ( node . parent ( ) )  && 
7086          node . parent ( ) . callee  ===  node 
7187      } 
7288
89+       // returns true iff this is an IIFE call expression 
90+       function  isIIFECall  ( node )  { 
91+         return  node  && 
92+           isCallExpression ( node )  && 
93+           node . callee  && 
94+           node . callee . type  ===  'FunctionExpression' 
95+       } 
96+ 
7397      // tries to divine if this function is a webpack module wrapper. 
7498      // returns true iff node is an element of an array literal which is in turn 
7599      // an argument to a function call expression, and that function call 
76100      // expression is an IIFE. 
77101      function  isProbablyWebpackModule  ( node )  { 
78-         return  isElementOfArrayArgumentToFunctionCall ( node )  && 
79-           node . parent ( )  &&  // array literal 
80-           node . parent ( ) . parent ( )  &&  // CallExpression 
81-           node . parent ( ) . parent ( ) . callee  &&  // function that is being called 
82-           node . parent ( ) . parent ( ) . callee . type  ===  'FunctionExpression' 
102+         return  isElementOfArray ( node )  && 
103+           isArgumentToFunctionCall ( node . parent ( ) )  && 
104+           isIIFECall ( node . parent ( ) . parent ( ) ) 
105+       } 
106+ 
107+       function  isProbablyBrowserifyModule  ( node )  { 
108+         return  isElementOfArray ( node )  && 
109+           isValueOfObjectLiteralWithNumericName ( node . parent ( ) )  && 
110+           isArgumentToFunctionCall ( node . parent ( ) . parent ( ) . parent ( ) )  && 
111+           isIIFECall ( node . parent ( ) . parent ( ) . parent ( ) . parent ( ) ) 
83112      } 
84113
85114      if  ( node . type  ===  'FunctionExpression' )  { 
@@ -88,7 +117,9 @@ function optimizeJs (jsString, opts) {
88117        var  postChar  =  jsString . charAt ( node . end ) 
89118        var  postPostChar  =  jsString . charAt ( node . end  +  1 ) 
90119
91-         if  ( isArgumentToFunctionCall ( node )  ||  isProbablyWebpackModule ( node ) )  { 
120+         if  ( isArgumentToFunctionCall ( node )  || 
121+           isProbablyWebpackModule ( node )  || 
122+           isProbablyBrowserifyModule ( node ) )  { 
92123          // function passed in to another function, either as an argument, or as an element 
93124          // of an array argument. these are almost _always_ executed, e.g. webpack bundles, 
94125          // UMD bundles, Browserify bundles, Node-style errbacks, Promise then()s and catch()s, etc. 
0 commit comments