UNPKG

8.23 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4exports.toComputedKey = toComputedKey;
5exports.toSequenceExpression = toSequenceExpression;
6exports.toKeyAlias = toKeyAlias;
7exports.toIdentifier = toIdentifier;
8exports.toBindingIdentifierName = toBindingIdentifierName;
9exports.toStatement = toStatement;
10exports.toExpression = toExpression;
11exports.toBlock = toBlock;
12exports.valueToNode = valueToNode;
13
14var _isPlainObject = require("lodash/isPlainObject");
15
16var _isPlainObject2 = _interopRequireDefault(_isPlainObject);
17
18var _isRegExp = require("lodash/isRegExp");
19
20var _isRegExp2 = _interopRequireDefault(_isRegExp);
21
22var _index = require("./index");
23
24var t = _interopRequireWildcard(_index);
25
26function _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; } }
27
28function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
29
30function toComputedKey(node) {
31 var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : node.key || node.property;
32
33 if (!node.computed) {
34 if (t.isIdentifier(key)) key = t.stringLiteral(key.name);
35 }
36 return key;
37}
38
39function gatherSequenceExpressions(nodes, scope, declars) {
40 var exprs = [];
41 var ensureLastUndefined = true;
42
43 for (var _iterator = nodes, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
44 var _ref;
45
46 if (_isArray) {
47 if (_i >= _iterator.length) break;
48 _ref = _iterator[_i++];
49 } else {
50 _i = _iterator.next();
51 if (_i.done) break;
52 _ref = _i.value;
53 }
54
55 var node = _ref;
56
57 ensureLastUndefined = false;
58
59 if (t.isExpression(node)) {
60 exprs.push(node);
61 } else if (t.isExpressionStatement(node)) {
62 exprs.push(node.expression);
63 } else if (t.isVariableDeclaration(node)) {
64 if (node.kind !== "var") return;
65
66 for (var _iterator2 = node.declarations, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) {
67 var _ref2;
68
69 if (_isArray2) {
70 if (_i2 >= _iterator2.length) break;
71 _ref2 = _iterator2[_i2++];
72 } else {
73 _i2 = _iterator2.next();
74 if (_i2.done) break;
75 _ref2 = _i2.value;
76 }
77
78 var declar = _ref2;
79
80 var bindings = t.getBindingIdentifiers(declar);
81 for (var key in bindings) {
82 declars.push({
83 kind: node.kind,
84 id: bindings[key]
85 });
86 }
87
88 if (declar.init) {
89 exprs.push(t.assignmentExpression("=", declar.id, declar.init));
90 }
91 }
92
93 ensureLastUndefined = true;
94 } else if (t.isIfStatement(node)) {
95 var consequent = node.consequent ? gatherSequenceExpressions([node.consequent], scope, declars) : scope.buildUndefinedNode();
96 var alternate = node.alternate ? gatherSequenceExpressions([node.alternate], scope, declars) : scope.buildUndefinedNode();
97 if (!consequent || !alternate) return;
98
99 exprs.push(t.conditionalExpression(node.test, consequent, alternate));
100 } else if (t.isBlockStatement(node)) {
101 var body = gatherSequenceExpressions(node.body, scope, declars);
102 if (!body) return;
103
104 exprs.push(body);
105 } else if (t.isEmptyStatement(node)) {
106 ensureLastUndefined = true;
107 } else {
108 return;
109 }
110 }
111
112 if (ensureLastUndefined) {
113 exprs.push(scope.buildUndefinedNode());
114 }
115
116 if (exprs.length === 1) {
117 return exprs[0];
118 } else {
119 return t.sequenceExpression(exprs);
120 }
121}
122
123function toSequenceExpression(nodes, scope) {
124 if (!nodes || !nodes.length) return;
125
126 var declars = [];
127 var result = gatherSequenceExpressions(nodes, scope, declars);
128 if (!result) return;
129
130 for (var _iterator3 = declars, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) {
131 var _ref3;
132
133 if (_isArray3) {
134 if (_i3 >= _iterator3.length) break;
135 _ref3 = _iterator3[_i3++];
136 } else {
137 _i3 = _iterator3.next();
138 if (_i3.done) break;
139 _ref3 = _i3.value;
140 }
141
142 var declar = _ref3;
143
144 scope.push(declar);
145 }
146
147 return result;
148}
149
150function toKeyAlias(node) {
151 var key = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : node.key;
152
153 var alias = void 0;
154
155 if (node.kind === "method") {
156 return toKeyAlias.increment() + "";
157 } else if (t.isIdentifier(key)) {
158 alias = key.name;
159 } else if (t.isStringLiteral(key)) {
160 alias = JSON.stringify(key.value);
161 } else {
162 alias = JSON.stringify(t.removePropertiesDeep(t.cloneDeep(key)));
163 }
164
165 if (node.computed) {
166 alias = "[" + alias + "]";
167 }
168
169 if (node.static) {
170 alias = "static:" + alias;
171 }
172
173 return alias;
174}
175
176toKeyAlias.uid = 0;
177
178toKeyAlias.increment = function () {
179 if (toKeyAlias.uid >= Number.MAX_SAFE_INTEGER) {
180 return toKeyAlias.uid = 0;
181 } else {
182 return toKeyAlias.uid++;
183 }
184};
185
186function toIdentifier(name) {
187 name = name + "";
188
189 name = name.replace(/[^a-zA-Z0-9$_]/g, "-");
190
191 name = name.replace(/^[-0-9]+/, "");
192
193 name = name.replace(/[-\s]+(.)?/g, function (match, c) {
194 return c ? c.toUpperCase() : "";
195 });
196
197 if (!t.isValidIdentifier(name)) {
198 name = "_" + name;
199 }
200
201 return name || "_";
202}
203
204function toBindingIdentifierName(name) {
205 name = toIdentifier(name);
206 if (name === "eval" || name === "arguments") name = "_" + name;
207 return name;
208}
209
210function toStatement(node, ignore) {
211 if (t.isStatement(node)) {
212 return node;
213 }
214
215 var mustHaveId = false;
216 var newType = void 0;
217
218 if (t.isClass(node)) {
219 mustHaveId = true;
220 newType = "ClassDeclaration";
221 } else if (t.isFunction(node)) {
222 mustHaveId = true;
223 newType = "FunctionDeclaration";
224 } else if (t.isAssignmentExpression(node)) {
225 return t.expressionStatement(node);
226 }
227
228 if (mustHaveId && !node.id) {
229 newType = false;
230 }
231
232 if (!newType) {
233 if (ignore) {
234 return false;
235 } else {
236 throw new Error("cannot turn " + node.type + " to a statement");
237 }
238 }
239
240 node.type = newType;
241
242 return node;
243}
244
245function toExpression(node) {
246 if (t.isExpressionStatement(node)) {
247 node = node.expression;
248 }
249
250 if (t.isExpression(node)) {
251 return node;
252 }
253
254 if (t.isClass(node)) {
255 node.type = "ClassExpression";
256 } else if (t.isFunction(node)) {
257 node.type = "FunctionExpression";
258 }
259
260 if (!t.isExpression(node)) {
261 throw new Error("cannot turn " + node.type + " to an expression");
262 }
263
264 return node;
265}
266
267function toBlock(node, parent) {
268 if (t.isBlockStatement(node)) {
269 return node;
270 }
271
272 if (t.isEmptyStatement(node)) {
273 node = [];
274 }
275
276 if (!Array.isArray(node)) {
277 if (!t.isStatement(node)) {
278 if (t.isFunction(parent)) {
279 node = t.returnStatement(node);
280 } else {
281 node = t.expressionStatement(node);
282 }
283 }
284
285 node = [node];
286 }
287
288 return t.blockStatement(node);
289}
290
291function valueToNode(value) {
292 if (value === undefined) {
293 return t.identifier("undefined");
294 }
295
296 if (value === true || value === false) {
297 return t.booleanLiteral(value);
298 }
299
300 if (value === null) {
301 return t.nullLiteral();
302 }
303
304 if (typeof value === "string") {
305 return t.stringLiteral(value);
306 }
307
308 if (typeof value === "number") {
309 return t.numericLiteral(value);
310 }
311
312 if ((0, _isRegExp2.default)(value)) {
313 var pattern = value.source;
314 var flags = value.toString().match(/\/([a-z]+|)$/)[1];
315 return t.regExpLiteral(pattern, flags);
316 }
317
318 if (Array.isArray(value)) {
319 return t.arrayExpression(value.map(t.valueToNode));
320 }
321
322 if ((0, _isPlainObject2.default)(value)) {
323 var props = [];
324 for (var key in value) {
325 var nodeKey = void 0;
326 if (t.isValidIdentifier(key)) {
327 nodeKey = t.identifier(key);
328 } else {
329 nodeKey = t.stringLiteral(key);
330 }
331 props.push(t.objectProperty(nodeKey, t.valueToNode(value[key])));
332 }
333 return t.objectExpression(props);
334 }
335
336 throw new Error("don't know how to turn this value into a node");
337}
\No newline at end of file