NodeUtils.js 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. "use strict";
  2. var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
  3. function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
  4. var estraverse = require('estraverse');
  5. var NodeType_1 = require("./enums/NodeType");
  6. var Utils_1 = require("./Utils");
  7. var NodeUtils = function () {
  8. function NodeUtils() {
  9. _classCallCheck(this, NodeUtils);
  10. }
  11. _createClass(NodeUtils, null, [{
  12. key: "addXVerbatimPropertyToLiterals",
  13. value: function addXVerbatimPropertyToLiterals(node) {
  14. estraverse.replace(node, {
  15. enter: function enter(node, parentNode) {
  16. if (NodeUtils.isLiteralNode(node)) {
  17. node['x-verbatim-property'] = node.raw;
  18. }
  19. }
  20. });
  21. }
  22. }, {
  23. key: "appendNode",
  24. value: function appendNode(blockScopeBody, node) {
  25. if (!NodeUtils.validateNode(node)) {
  26. return;
  27. }
  28. blockScopeBody.push(node);
  29. }
  30. }, {
  31. key: "getBlockScopeNodeByIndex",
  32. value: function getBlockScopeNodeByIndex(node) {
  33. var index = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];
  34. if (NodeUtils.isNodeHasBlockScope(node) && node.body[index]) {
  35. return node.body[index];
  36. }
  37. return node;
  38. }
  39. }, {
  40. key: "getBlockScopeOfNode",
  41. value: function getBlockScopeOfNode(node) {
  42. var depth = arguments.length <= 1 || arguments[1] === undefined ? 0 : arguments[1];
  43. if (!node.parentNode) {
  44. throw new ReferenceError('`parentNode` property of given node is `undefined`');
  45. }
  46. if (node.parentNode.type === NodeType_1.NodeType.Program) {
  47. return node.parentNode;
  48. }
  49. if (!Utils_1.Utils.arrayContains(NodeUtils.scopeNodes, node.parentNode.type)) {
  50. return NodeUtils.getBlockScopeOfNode(node.parentNode, depth);
  51. }
  52. if (depth > 0) {
  53. return NodeUtils.getBlockScopeOfNode(node.parentNode, --depth);
  54. }
  55. if (node.type !== NodeType_1.NodeType.BlockStatement) {
  56. return NodeUtils.getBlockScopeOfNode(node.parentNode);
  57. }
  58. return node;
  59. }
  60. }, {
  61. key: "getProgramNode",
  62. value: function getProgramNode(bodyNode) {
  63. return {
  64. 'type': NodeType_1.NodeType.Program,
  65. 'body': bodyNode
  66. };
  67. }
  68. }, {
  69. key: "insertNodeAtIndex",
  70. value: function insertNodeAtIndex(blockScopeBody, node, index) {
  71. if (!NodeUtils.validateNode(node)) {
  72. return;
  73. }
  74. blockScopeBody.splice(index, 0, node);
  75. }
  76. }, {
  77. key: "isBlockStatementNode",
  78. value: function isBlockStatementNode(node) {
  79. return node.type === NodeType_1.NodeType.BlockStatement;
  80. }
  81. }, {
  82. key: "isIdentifierNode",
  83. value: function isIdentifierNode(node) {
  84. return node.type === NodeType_1.NodeType.Identifier;
  85. }
  86. }, {
  87. key: "isLiteralNode",
  88. value: function isLiteralNode(node) {
  89. return node.type === NodeType_1.NodeType.Literal;
  90. }
  91. }, {
  92. key: "isMemberExpressionNode",
  93. value: function isMemberExpressionNode(node) {
  94. return node.type === NodeType_1.NodeType.MemberExpression;
  95. }
  96. }, {
  97. key: "isNodeHasBlockScope",
  98. value: function isNodeHasBlockScope(node) {
  99. return node.hasOwnProperty('body');
  100. }
  101. }, {
  102. key: "isProgramNode",
  103. value: function isProgramNode(node) {
  104. return node.type === NodeType_1.NodeType.Program;
  105. }
  106. }, {
  107. key: "isPropertyNode",
  108. value: function isPropertyNode(node) {
  109. return node.type === NodeType_1.NodeType.Property;
  110. }
  111. }, {
  112. key: "isVariableDeclaratorNode",
  113. value: function isVariableDeclaratorNode(node) {
  114. return node.type === NodeType_1.NodeType.VariableDeclarator;
  115. }
  116. }, {
  117. key: "parentize",
  118. value: function parentize(node) {
  119. var isRootNode = true;
  120. estraverse.replace(node, {
  121. enter: function enter(node, parentNode) {
  122. Object.defineProperty(node, 'parentNode', {
  123. configurable: true,
  124. enumerable: true,
  125. value: isRootNode ? NodeUtils.getProgramNode([node]) : parentNode || node,
  126. writable: true
  127. });
  128. isRootNode = false;
  129. }
  130. });
  131. }
  132. }, {
  133. key: "prependNode",
  134. value: function prependNode(blockScopeBody, node) {
  135. if (!NodeUtils.validateNode(node)) {
  136. return;
  137. }
  138. blockScopeBody.unshift(node);
  139. }
  140. }, {
  141. key: "validateNode",
  142. value: function validateNode(node) {
  143. return !!node;
  144. }
  145. }]);
  146. return NodeUtils;
  147. }();
  148. NodeUtils.scopeNodes = [NodeType_1.NodeType.ArrowFunctionExpression, NodeType_1.NodeType.FunctionDeclaration, NodeType_1.NodeType.FunctionExpression, NodeType_1.NodeType.MethodDefinition];
  149. exports.NodeUtils = NodeUtils;