UNPKG

4.41 kBJavaScriptView Raw
1"use strict";
2
3var _map = require("lodash/map");
4
5var _map2 = _interopRequireDefault(_map);
6
7var _babelTypes = require("babel-types");
8
9var t = _interopRequireWildcard(_babelTypes);
10
11function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
12
13function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14
15function crawl(node) {
16 var state = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
17
18 if (t.isMemberExpression(node)) {
19 crawl(node.object, state);
20 if (node.computed) crawl(node.property, state);
21 } else if (t.isBinary(node) || t.isAssignmentExpression(node)) {
22 crawl(node.left, state);
23 crawl(node.right, state);
24 } else if (t.isCallExpression(node)) {
25 state.hasCall = true;
26 crawl(node.callee, state);
27 } else if (t.isFunction(node)) {
28 state.hasFunction = true;
29 } else if (t.isIdentifier(node)) {
30 state.hasHelper = state.hasHelper || isHelper(node.callee);
31 }
32
33 return state;
34}
35
36function isHelper(node) {
37 if (t.isMemberExpression(node)) {
38 return isHelper(node.object) || isHelper(node.property);
39 } else if (t.isIdentifier(node)) {
40 return node.name === "require" || node.name[0] === "_";
41 } else if (t.isCallExpression(node)) {
42 return isHelper(node.callee);
43 } else if (t.isBinary(node) || t.isAssignmentExpression(node)) {
44 return t.isIdentifier(node.left) && isHelper(node.left) || isHelper(node.right);
45 } else {
46 return false;
47 }
48}
49
50function isType(node) {
51 return t.isLiteral(node) || t.isObjectExpression(node) || t.isArrayExpression(node) || t.isIdentifier(node) || t.isMemberExpression(node);
52}
53
54exports.nodes = {
55 AssignmentExpression: function AssignmentExpression(node) {
56 var state = crawl(node.right);
57 if (state.hasCall && state.hasHelper || state.hasFunction) {
58 return {
59 before: state.hasFunction,
60 after: true
61 };
62 }
63 },
64 SwitchCase: function SwitchCase(node, parent) {
65 return {
66 before: node.consequent.length || parent.cases[0] === node
67 };
68 },
69 LogicalExpression: function LogicalExpression(node) {
70 if (t.isFunction(node.left) || t.isFunction(node.right)) {
71 return {
72 after: true
73 };
74 }
75 },
76 Literal: function Literal(node) {
77 if (node.value === "use strict") {
78 return {
79 after: true
80 };
81 }
82 },
83 CallExpression: function CallExpression(node) {
84 if (t.isFunction(node.callee) || isHelper(node)) {
85 return {
86 before: true,
87 after: true
88 };
89 }
90 },
91 VariableDeclaration: function VariableDeclaration(node) {
92 for (var i = 0; i < node.declarations.length; i++) {
93 var declar = node.declarations[i];
94
95 var enabled = isHelper(declar.id) && !isType(declar.init);
96 if (!enabled) {
97 var state = crawl(declar.init);
98 enabled = isHelper(declar.init) && state.hasCall || state.hasFunction;
99 }
100
101 if (enabled) {
102 return {
103 before: true,
104 after: true
105 };
106 }
107 }
108 },
109 IfStatement: function IfStatement(node) {
110 if (t.isBlockStatement(node.consequent)) {
111 return {
112 before: true,
113 after: true
114 };
115 }
116 }
117};
118
119exports.nodes.ObjectProperty = exports.nodes.ObjectTypeProperty = exports.nodes.ObjectMethod = exports.nodes.SpreadProperty = function (node, parent) {
120 if (parent.properties[0] === node) {
121 return {
122 before: true
123 };
124 }
125};
126
127exports.list = {
128 VariableDeclaration: function VariableDeclaration(node) {
129 return (0, _map2.default)(node.declarations, "init");
130 },
131 ArrayExpression: function ArrayExpression(node) {
132 return node.elements;
133 },
134 ObjectExpression: function ObjectExpression(node) {
135 return node.properties;
136 }
137};
138
139[["Function", true], ["Class", true], ["Loop", true], ["LabeledStatement", true], ["SwitchStatement", true], ["TryStatement", true]].forEach(function (_ref) {
140 var type = _ref[0],
141 amounts = _ref[1];
142
143 if (typeof amounts === "boolean") {
144 amounts = { after: amounts, before: amounts };
145 }
146 [type].concat(t.FLIPPED_ALIAS_KEYS[type] || []).forEach(function (type) {
147 exports.nodes[type] = function () {
148 return amounts;
149 };
150 });
151});
\No newline at end of file