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.
		
		
		
		
		
			
		
			
				
					164 lines
				
				4.1 KiB
			
		
		
			
		
	
	
					164 lines
				
				4.1 KiB
			| 
											3 years ago
										 | "use strict"; | ||
|  | 
 | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |   value: true | ||
|  | }); | ||
|  | exports.default = void 0; | ||
|  | 
 | ||
|  | var _assert = require("assert"); | ||
|  | 
 | ||
|  | var _t = require("@babel/types"); | ||
|  | 
 | ||
|  | const { | ||
|  |   callExpression, | ||
|  |   cloneNode, | ||
|  |   expressionStatement, | ||
|  |   identifier, | ||
|  |   importDeclaration, | ||
|  |   importDefaultSpecifier, | ||
|  |   importNamespaceSpecifier, | ||
|  |   importSpecifier, | ||
|  |   memberExpression, | ||
|  |   stringLiteral, | ||
|  |   variableDeclaration, | ||
|  |   variableDeclarator | ||
|  | } = _t; | ||
|  | 
 | ||
|  | class ImportBuilder { | ||
|  |   constructor(importedSource, scope, hub) { | ||
|  |     this._statements = []; | ||
|  |     this._resultName = null; | ||
|  |     this._importedSource = void 0; | ||
|  |     this._scope = scope; | ||
|  |     this._hub = hub; | ||
|  |     this._importedSource = importedSource; | ||
|  |   } | ||
|  | 
 | ||
|  |   done() { | ||
|  |     return { | ||
|  |       statements: this._statements, | ||
|  |       resultName: this._resultName | ||
|  |     }; | ||
|  |   } | ||
|  | 
 | ||
|  |   import() { | ||
|  |     this._statements.push(importDeclaration([], stringLiteral(this._importedSource))); | ||
|  | 
 | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   require() { | ||
|  |     this._statements.push(expressionStatement(callExpression(identifier("require"), [stringLiteral(this._importedSource)]))); | ||
|  | 
 | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   namespace(name = "namespace") { | ||
|  |     const local = this._scope.generateUidIdentifier(name); | ||
|  | 
 | ||
|  |     const statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     _assert(statement.type === "ImportDeclaration"); | ||
|  | 
 | ||
|  |     _assert(statement.specifiers.length === 0); | ||
|  | 
 | ||
|  |     statement.specifiers = [importNamespaceSpecifier(local)]; | ||
|  |     this._resultName = cloneNode(local); | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   default(name) { | ||
|  |     const id = this._scope.generateUidIdentifier(name); | ||
|  | 
 | ||
|  |     const statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     _assert(statement.type === "ImportDeclaration"); | ||
|  | 
 | ||
|  |     _assert(statement.specifiers.length === 0); | ||
|  | 
 | ||
|  |     statement.specifiers = [importDefaultSpecifier(id)]; | ||
|  |     this._resultName = cloneNode(id); | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   named(name, importName) { | ||
|  |     if (importName === "default") return this.default(name); | ||
|  | 
 | ||
|  |     const id = this._scope.generateUidIdentifier(name); | ||
|  | 
 | ||
|  |     const statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     _assert(statement.type === "ImportDeclaration"); | ||
|  | 
 | ||
|  |     _assert(statement.specifiers.length === 0); | ||
|  | 
 | ||
|  |     statement.specifiers = [importSpecifier(id, identifier(importName))]; | ||
|  |     this._resultName = cloneNode(id); | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   var(name) { | ||
|  |     const id = this._scope.generateUidIdentifier(name); | ||
|  | 
 | ||
|  |     let statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     if (statement.type !== "ExpressionStatement") { | ||
|  |       _assert(this._resultName); | ||
|  | 
 | ||
|  |       statement = expressionStatement(this._resultName); | ||
|  | 
 | ||
|  |       this._statements.push(statement); | ||
|  |     } | ||
|  | 
 | ||
|  |     this._statements[this._statements.length - 1] = variableDeclaration("var", [variableDeclarator(id, statement.expression)]); | ||
|  |     this._resultName = cloneNode(id); | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   defaultInterop() { | ||
|  |     return this._interop(this._hub.addHelper("interopRequireDefault")); | ||
|  |   } | ||
|  | 
 | ||
|  |   wildcardInterop() { | ||
|  |     return this._interop(this._hub.addHelper("interopRequireWildcard")); | ||
|  |   } | ||
|  | 
 | ||
|  |   _interop(callee) { | ||
|  |     const statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     if (statement.type === "ExpressionStatement") { | ||
|  |       statement.expression = callExpression(callee, [statement.expression]); | ||
|  |     } else if (statement.type === "VariableDeclaration") { | ||
|  |       _assert(statement.declarations.length === 1); | ||
|  | 
 | ||
|  |       statement.declarations[0].init = callExpression(callee, [statement.declarations[0].init]); | ||
|  |     } else { | ||
|  |       _assert.fail("Unexpected type."); | ||
|  |     } | ||
|  | 
 | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   prop(name) { | ||
|  |     const statement = this._statements[this._statements.length - 1]; | ||
|  | 
 | ||
|  |     if (statement.type === "ExpressionStatement") { | ||
|  |       statement.expression = memberExpression(statement.expression, identifier(name)); | ||
|  |     } else if (statement.type === "VariableDeclaration") { | ||
|  |       _assert(statement.declarations.length === 1); | ||
|  | 
 | ||
|  |       statement.declarations[0].init = memberExpression(statement.declarations[0].init, identifier(name)); | ||
|  |     } else { | ||
|  |       _assert.fail("Unexpected type:" + statement.type); | ||
|  |     } | ||
|  | 
 | ||
|  |     return this; | ||
|  |   } | ||
|  | 
 | ||
|  |   read(name) { | ||
|  |     this._resultName = memberExpression(this._resultName, identifier(name)); | ||
|  |   } | ||
|  | 
 | ||
|  | } | ||
|  | 
 | ||
|  | exports.default = ImportBuilder; |