81 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| var __read = (this && this.__read) || function (o, n) {
 | |
|     var m = typeof Symbol === "function" && o[Symbol.iterator];
 | |
|     if (!m) return o;
 | |
|     var i = m.call(o), r, ar = [], e;
 | |
|     try {
 | |
|         while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
 | |
|     }
 | |
|     catch (error) { e = { error: error }; }
 | |
|     finally {
 | |
|         try {
 | |
|             if (r && !r.done && (m = i["return"])) m.call(i);
 | |
|         }
 | |
|         finally { if (e) throw e.error; }
 | |
|     }
 | |
|     return ar;
 | |
| };
 | |
| var __spread = (this && this.__spread) || function () {
 | |
|     for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
 | |
|     return ar;
 | |
| };
 | |
| Object.defineProperty(exports, "__esModule", { value: true });
 | |
| var bs_logger_1 = require("bs-logger");
 | |
| var HOIST_METHODS = ['mock', 'unmock'];
 | |
| exports.name = 'hoisting-jest-mock';
 | |
| exports.version = 1;
 | |
| function factory(cs) {
 | |
|     var logger = cs.logger.child({ namespace: 'ts-hoisting' });
 | |
|     var ts = cs.compilerModule;
 | |
|     function shouldHoistNode(node) {
 | |
|         return (ts.isExpressionStatement(node) &&
 | |
|             ts.isCallExpression(node.expression) &&
 | |
|             ts.isPropertyAccessExpression(node.expression.expression) &&
 | |
|             ts.isIdentifier(node.expression.expression.expression) &&
 | |
|             node.expression.expression.expression.text === 'jest' &&
 | |
|             ts.isIdentifier(node.expression.expression.name) &&
 | |
|             HOIST_METHODS.includes(node.expression.expression.name.text));
 | |
|     }
 | |
|     function createVisitor(ctx, _) {
 | |
|         var level = 0;
 | |
|         var hoisted = [];
 | |
|         var enter = function () {
 | |
|             level++;
 | |
|             if (hoisted[level]) {
 | |
|                 hoisted[level].splice(0, hoisted[level].length);
 | |
|             }
 | |
|         };
 | |
|         var exit = function () { return level--; };
 | |
|         var hoist = function (node) {
 | |
|             if (hoisted[level]) {
 | |
|                 hoisted[level].push(node);
 | |
|             }
 | |
|             else {
 | |
|                 hoisted[level] = [node];
 | |
|             }
 | |
|         };
 | |
|         var visitor = function (node) {
 | |
|             enter();
 | |
|             var resultNode = ts.visitEachChild(node, visitor, ctx);
 | |
|             if (hoisted[level] && hoisted[level].length) {
 | |
|                 var hoistedStmts_1 = hoisted[level];
 | |
|                 var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s); });
 | |
|                 var newNode = ts.getMutableClone(resultNode);
 | |
|                 newNode.statements = ts.createNodeArray(__spread(hoistedStmts_1, otherStmts));
 | |
|                 resultNode = newNode;
 | |
|             }
 | |
|             exit();
 | |
|             if (shouldHoistNode(resultNode)) {
 | |
|                 hoist(resultNode);
 | |
|             }
 | |
|             return resultNode;
 | |
|         };
 | |
|         return visitor;
 | |
|     }
 | |
|     return function (ctx) {
 | |
|         var _a;
 | |
|         return logger.wrap((_a = {}, _a[bs_logger_1.LogContexts.logLevel] = bs_logger_1.LogLevels.debug, _a.call = null, _a), 'visitSourceFileNode(): hoisting', function (sf) { return ts.visitNode(sf, createVisitor(ctx, sf)); });
 | |
|     };
 | |
| }
 | |
| exports.factory = factory;
 |