@@ -235,20 +235,33 @@ function createStream (opts, api) {
235
235
// Here if `exports.a` is removed we need to make sure the `function(){}` is still
236
236
// an expression, by prepending `void 0,` to result in:
237
237
// `void 0,function(){},exports.b=function(){}`
238
- var isPossiblyAmbiguousExpression = node . right . type === 'FunctionExpression' || node . right . type === 'ClassExpression'
239
- if ( isPossiblyAmbiguousExpression && node . parent . type === 'SequenceExpression' ||
238
+ // In the case of non-function/class expressions, we can void the whole thing
239
+ // eg: `exports.a={},exports.b=''`
240
+ // becomes: `void {},void ''`
241
+ var isFunction = node . right . type === 'FunctionExpression'
242
+ var isAssignment = node . right . type === 'AssignmentExpression'
243
+ var isArrowFunction = node . right . type === 'ArrowFunctionExpression'
244
+ var isVariableDeclarator = node . parent . parent . type === 'VariableDeclarator'
245
+ if (
246
+ // persist sequential variable declarations
247
+ // eg: `var a = (0, exports.a = function(){})`
248
+ ( ! isVariableDeclarator && node . parent . type === 'SequenceExpression' ) ||
240
249
// without this, `exports.a = exports.b = xyz` eliminating exports.a becomes `void exports.b = xyz`
241
250
// which is invalid.
242
- node . right . type === 'AssignmentExpression' ||
251
+ isAssignment ||
243
252
// Don't output a statement containing only `void () => {}`
244
- node . right . type === 'ArrowFunctionExpression' ) {
253
+ isArrowFunction
254
+ ) {
245
255
// ignore alias assignment expression `exports.a = exports.b = exports.c`
246
256
// unless the last argument is noname function
247
- var isAliasAssignment = node . right . type === 'AssignmentExpression' && node . right . left . type === 'MemberExpression' && node . right . left . object . name === 'exports'
248
- var isFunction = isAliasAssignment && node . right . right . type === 'FunctionExpression'
249
- var isClass = isAliasAssignment && node . right . right . type === 'ClassExpression'
250
- if ( ! isAliasAssignment || isFunction || isClass ) {
251
- prefix += 'void 0, '
257
+ var isAliasAssignment = isAssignment && node . right . left . type === 'MemberExpression' && node . right . left . object . name === 'exports'
258
+ var isAliasFunction = isAliasAssignment && node . right . right . type === 'FunctionExpression'
259
+ var isAliasClass = isAliasAssignment && node . right . right . type === 'ClassExpression'
260
+ if ( ! isAliasAssignment || isAliasFunction || isAliasClass ) {
261
+ prefix += 'void '
262
+ if ( isAssignment || isArrowFunction || isFunction || isAliasFunction || isAliasClass ) {
263
+ prefix += '0, '
264
+ }
252
265
}
253
266
}
254
267
// Make sure we can't accidentally continue a previous statement.
0 commit comments