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.
		
		
		
		
			
				
					119 lines
				
				2.6 KiB
			
		
		
			
		
	
	
					119 lines
				
				2.6 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								"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;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  },
							 | 
						||
| 
								 | 
							
								};
							 |