| "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; | 
|         } | 
|       } | 
|     } | 
|   }, | 
| }; |