You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							118 lines
						
					
					
						
							2.6 KiB
						
					
					
				
			
		
		
	
	
							118 lines
						
					
					
						
							2.6 KiB
						
					
					
				"use strict"; | 
						|
 | 
						|
var t = require("@babel/types"); | 
						|
var convertComments = require("./convertComments"); | 
						|
 | 
						|
module.exports = function(ast, traverse, code) { | 
						|
  var state = { source: code }; | 
						|
 | 
						|
  // Monkey patch visitor keys in order to be able to traverse the estree nodes | 
						|
  t.VISITOR_KEYS.Property = t.VISITOR_KEYS.ObjectProperty; | 
						|
  t.VISITOR_KEYS.MethodDefinition = [ | 
						|
    "key", | 
						|
    "value", | 
						|
    "decorators", | 
						|
    "returnType", | 
						|
    "typeParameters", | 
						|
  ]; | 
						|
 | 
						|
  traverse(ast, astTransformVisitor, null, state); | 
						|
 | 
						|
  delete t.VISITOR_KEYS.Property; | 
						|
  delete t.VISITOR_KEYS.MethodDefinition; | 
						|
}; | 
						|
 | 
						|
var astTransformVisitor = { | 
						|
  noScope: true, | 
						|
  enter(path) { | 
						|
    var node = path.node; | 
						|
 | 
						|
    // private var to track original node type | 
						|
    node._babelType = node.type; | 
						|
 | 
						|
    if (node.innerComments) { | 
						|
      node.trailingComments = node.innerComments; | 
						|
      delete node.innerComments; | 
						|
    } | 
						|
 | 
						|
    if (node.trailingComments) { | 
						|
      convertComments(node.trailingComments); | 
						|
    } | 
						|
 | 
						|
    if (node.leadingComments) { | 
						|
      convertComments(node.leadingComments); | 
						|
    } | 
						|
  }, | 
						|
  exit(path) { | 
						|
    var node = path.node; | 
						|
 | 
						|
    if (path.isJSXText()) { | 
						|
      node.type = "Literal"; | 
						|
    } | 
						|
 | 
						|
    if ( | 
						|
      path.isRestElement() && | 
						|
      path.parent && | 
						|
      path.parent.type === "ObjectPattern" | 
						|
    ) { | 
						|
      node.type = "ExperimentalRestProperty"; | 
						|
    } | 
						|
 | 
						|
    if ( | 
						|
      path.isSpreadElement() && | 
						|
      path.parent && | 
						|
      path.parent.type === "ObjectExpression" | 
						|
    ) { | 
						|
      node.type = "ExperimentalSpreadProperty"; | 
						|
    } | 
						|
 | 
						|
    if (path.isTypeParameter()) { | 
						|
      node.type = "Identifier"; | 
						|
      node.typeAnnotation = node.bound; | 
						|
      delete node.bound; | 
						|
    } | 
						|
 | 
						|
    // flow: prevent "no-undef" | 
						|
    // for "Component" in: "let x: React.Component" | 
						|
    if (path.isQualifiedTypeIdentifier()) { | 
						|
      delete node.id; | 
						|
    } | 
						|
    // for "b" in: "var a: { b: Foo }" | 
						|
    if (path.isObjectTypeProperty()) { | 
						|
      delete node.key; | 
						|
    } | 
						|
    // for "indexer" in: "var a: {[indexer: string]: number}" | 
						|
    if (path.isObjectTypeIndexer()) { | 
						|
      delete node.id; | 
						|
    } | 
						|
    // for "param" in: "var a: { func(param: Foo): Bar };" | 
						|
    if (path.isFunctionTypeParam()) { | 
						|
      delete node.name; | 
						|
    } | 
						|
 | 
						|
    // modules | 
						|
 | 
						|
    if (path.isImportDeclaration()) { | 
						|
      delete node.isType; | 
						|
    } | 
						|
 | 
						|
    // template string range fixes | 
						|
    if (path.isTemplateLiteral()) { | 
						|
      for (var j = 0; j < node.quasis.length; j++) { | 
						|
        var q = node.quasis[j]; | 
						|
        q.range[0] -= 1; | 
						|
        if (q.tail) { | 
						|
          q.range[1] += 1; | 
						|
        } else { | 
						|
          q.range[1] += 2; | 
						|
        } | 
						|
        q.loc.start.column -= 1; | 
						|
        if (q.tail) { | 
						|
          q.loc.end.column += 1; | 
						|
        } else { | 
						|
          q.loc.end.column += 2; | 
						|
        } | 
						|
      } | 
						|
    } | 
						|
  }, | 
						|
};
 | 
						|
 |