hoist-jest.js 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. "use strict";
  2. var __read = (this && this.__read) || function (o, n) {
  3. var m = typeof Symbol === "function" && o[Symbol.iterator];
  4. if (!m) return o;
  5. var i = m.call(o), r, ar = [], e;
  6. try {
  7. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  8. }
  9. catch (error) { e = { error: error }; }
  10. finally {
  11. try {
  12. if (r && !r.done && (m = i["return"])) m.call(i);
  13. }
  14. finally { if (e) throw e.error; }
  15. }
  16. return ar;
  17. };
  18. var __spread = (this && this.__spread) || function () {
  19. for (var ar = [], i = 0; i < arguments.length; i++) ar = ar.concat(__read(arguments[i]));
  20. return ar;
  21. };
  22. Object.defineProperty(exports, "__esModule", { value: true });
  23. var bs_logger_1 = require("bs-logger");
  24. var HOIST_METHODS = ['mock', 'unmock', 'enableAutomock', 'disableAutomock'];
  25. exports.name = 'hoisting-jest-mock';
  26. exports.version = 1;
  27. function factory(cs) {
  28. var logger = cs.logger.child({ namespace: 'ts-hoisting' });
  29. var ts = cs.compilerModule;
  30. function shouldHoistNode(node) {
  31. return (ts.isExpressionStatement(node) &&
  32. ts.isCallExpression(node.expression) &&
  33. ts.isPropertyAccessExpression(node.expression.expression) &&
  34. ts.isIdentifier(node.expression.expression.expression) &&
  35. node.expression.expression.expression.text === 'jest' &&
  36. ts.isIdentifier(node.expression.expression.name) &&
  37. HOIST_METHODS.includes(node.expression.expression.name.text));
  38. }
  39. function createVisitor(ctx, _) {
  40. var level = 0;
  41. var hoisted = [];
  42. var enter = function () {
  43. level++;
  44. if (hoisted[level]) {
  45. hoisted[level].splice(0, hoisted[level].length);
  46. }
  47. };
  48. var exit = function () { return level--; };
  49. var hoist = function (node) {
  50. if (hoisted[level]) {
  51. hoisted[level].push(node);
  52. }
  53. else {
  54. hoisted[level] = [node];
  55. }
  56. };
  57. var visitor = function (node) {
  58. enter();
  59. var resultNode = ts.visitEachChild(node, visitor, ctx);
  60. if (hoisted[level] && hoisted[level].length) {
  61. var hoistedStmts_1 = hoisted[level];
  62. var otherStmts = resultNode.statements.filter(function (s) { return !hoistedStmts_1.includes(s); });
  63. var newNode = ts.getMutableClone(resultNode);
  64. newNode.statements = ts.createNodeArray(__spread(hoistedStmts_1, otherStmts));
  65. resultNode = newNode;
  66. }
  67. exit();
  68. if (shouldHoistNode(resultNode)) {
  69. hoist(resultNode);
  70. }
  71. return resultNode;
  72. };
  73. return visitor;
  74. }
  75. return function (ctx) {
  76. var _a;
  77. 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)); });
  78. };
  79. }
  80. exports.factory = factory;