@@ -356,6 +356,8 @@ module NameResolution {
356356 name = "$$promise-content" and
357357 result = imprt .getImportedPathExpr ( )
358358 )
359+ or
360+ storeToExports ( result , mod , name )
359361 }
360362
361363 /**
@@ -373,6 +375,58 @@ module NameResolution {
373375 value = target .getAnAssignedExpr ( ) .( ObjectExpr ) .getPropertyByName ( prop ) .getInit ( )
374376 }
375377
378+ pragma [ nomagic]
379+ private GlobalVarAccess globalAccess ( Module mod , string name ) {
380+ result .getName ( ) = name and
381+ result .getTopLevel ( ) = mod and
382+ name = [ "exports" , "module" ] // manually restrict size of predicate
383+ }
384+
385+ private Node moduleObjectRef ( Module mod ) {
386+ result = mod .getScope ( ) .getVariable ( "module" ) .getAnAccess ( )
387+ or
388+ result = globalAccess ( mod , "module" )
389+ or
390+ commonStep ( moduleObjectRef ( mod ) , result )
391+ }
392+
393+ private Node exportsObjectRhs ( Module mod ) {
394+ exists ( AssignExpr assign |
395+ assign .getLhs ( ) .( PropAccess ) .accesses ( moduleObjectRef ( mod ) , "exports" ) and
396+ result = assign .getRhs ( )
397+ )
398+ or
399+ commonStep ( result , exportsObjectRhs ( mod ) )
400+ }
401+
402+ private Node exportsObjectAlias ( Module mod ) {
403+ result = mod .getScope ( ) .getVariable ( "exports" ) .getAnAccess ( )
404+ or
405+ result = globalAccess ( mod , "exports" )
406+ or
407+ result .( ThisExpr ) .getBindingContainer ( ) = mod and
408+ mod instanceof NodeModule
409+ or
410+ readStep ( moduleObjectRef ( mod ) , "exports" , result )
411+ or
412+ result = exportsObjectRhs ( mod )
413+ or
414+ commonStep ( exportsObjectAlias ( mod ) , result )
415+ }
416+
417+ private predicate storeToExports ( Node node , Module mod , string name ) {
418+ exists ( AssignExpr assign |
419+ node = assign .getRhs ( ) and
420+ assign .getLhs ( ) .( PropAccess ) .accesses ( exportsObjectAlias ( mod ) , name )
421+ )
422+ or
423+ exists ( Property prop |
424+ node = prop .getInit ( ) and
425+ name = prop .getName ( ) and
426+ prop .getObjectExpr ( ) = exportsObjectAlias ( mod )
427+ )
428+ }
429+
376430 /** Steps that only apply for this configuration. */
377431 private predicate specificStep ( Node node1 , Node node2 ) {
378432 exists ( LexicalName var | S:: isRelevantVariable ( var ) |
0 commit comments