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.
		
		
		
		
		
			
		
			
				
					63 lines
				
				2.3 KiB
			
		
		
			
		
	
	
					63 lines
				
				2.3 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = splitExportDeclaration; | ||
|  | 
 | ||
|  | var _t = require("@babel/types"); | ||
|  | 
 | ||
|  | const { | ||
|  |   cloneNode, | ||
|  |   exportNamedDeclaration, | ||
|  |   exportSpecifier, | ||
|  |   identifier, | ||
|  |   variableDeclaration, | ||
|  |   variableDeclarator | ||
|  | } = _t; | ||
|  | 
 | ||
|  | function splitExportDeclaration(exportDeclaration) { | ||
|  |   if (!exportDeclaration.isExportDeclaration() || exportDeclaration.isExportAllDeclaration()) { | ||
|  |     throw new Error("Only default and named export declarations can be split."); | ||
|  |   } | ||
|  | 
 | ||
|  |   if (exportDeclaration.isExportDefaultDeclaration()) { | ||
|  |     const declaration = exportDeclaration.get("declaration"); | ||
|  |     const standaloneDeclaration = declaration.isFunctionDeclaration() || declaration.isClassDeclaration(); | ||
|  |     const scope = declaration.isScope() ? declaration.scope.parent : declaration.scope; | ||
|  |     let id = declaration.node.id; | ||
|  |     let needBindingRegistration = false; | ||
|  | 
 | ||
|  |     if (!id) { | ||
|  |       needBindingRegistration = true; | ||
|  |       id = scope.generateUidIdentifier("default"); | ||
|  | 
 | ||
|  |       if (standaloneDeclaration || declaration.isFunctionExpression() || declaration.isClassExpression()) { | ||
|  |         declaration.node.id = cloneNode(id); | ||
|  |       } | ||
|  |     } | ||
|  | 
 | ||
|  |     const updatedDeclaration = standaloneDeclaration ? declaration.node : variableDeclaration("var", [variableDeclarator(cloneNode(id), declaration.node)]); | ||
|  |     const updatedExportDeclaration = exportNamedDeclaration(null, [exportSpecifier(cloneNode(id), identifier("default"))]); | ||
|  |     exportDeclaration.insertAfter(updatedExportDeclaration); | ||
|  |     exportDeclaration.replaceWith(updatedDeclaration); | ||
|  | 
 | ||
|  |     if (needBindingRegistration) { | ||
|  |       scope.registerDeclaration(exportDeclaration); | ||
|  |     } | ||
|  | 
 | ||
|  |     return exportDeclaration; | ||
|  |   } else if (exportDeclaration.get("specifiers").length > 0) { | ||
|  |     throw new Error("It doesn't make sense to split exported specifiers."); | ||
|  |   } | ||
|  | 
 | ||
|  |   const declaration = exportDeclaration.get("declaration"); | ||
|  |   const bindingIdentifiers = declaration.getOuterBindingIdentifiers(); | ||
|  |   const specifiers = Object.keys(bindingIdentifiers).map(name => { | ||
|  |     return exportSpecifier(identifier(name), identifier(name)); | ||
|  |   }); | ||
|  |   const aliasDeclar = exportNamedDeclaration(null, specifiers); | ||
|  |   exportDeclaration.insertAfter(aliasDeclar); | ||
|  |   exportDeclaration.replaceWith(declaration.node); | ||
|  |   return exportDeclaration; | ||
|  | } |