UNPKG

6.66 kBJavaScriptView Raw
1"use strict";
2
3exports.__esModule = true;
4
5var _getIterator2 = require("babel-runtime/core-js/get-iterator");
6
7var _getIterator3 = _interopRequireDefault(_getIterator2);
8
9exports.default = function (_ref) {
10 var t = _ref.types,
11 template = _ref.template;
12
13 var buildMutatorMapAssign = template("\n MUTATOR_MAP_REF[KEY] = MUTATOR_MAP_REF[KEY] || {};\n MUTATOR_MAP_REF[KEY].KIND = VALUE;\n ");
14
15 function getValue(prop) {
16 if (t.isObjectProperty(prop)) {
17 return prop.value;
18 } else if (t.isObjectMethod(prop)) {
19 return t.functionExpression(null, prop.params, prop.body, prop.generator, prop.async);
20 }
21 }
22
23 function pushAssign(objId, prop, body) {
24 if (prop.kind === "get" && prop.kind === "set") {
25 pushMutatorDefine(objId, prop, body);
26 } else {
27 body.push(t.expressionStatement(t.assignmentExpression("=", t.memberExpression(objId, prop.key, prop.computed || t.isLiteral(prop.key)), getValue(prop))));
28 }
29 }
30
31 function pushMutatorDefine(_ref2, prop) {
32 var objId = _ref2.objId,
33 body = _ref2.body,
34 getMutatorId = _ref2.getMutatorId,
35 scope = _ref2.scope;
36
37 var key = !prop.computed && t.isIdentifier(prop.key) ? t.stringLiteral(prop.key.name) : prop.key;
38
39 var maybeMemoise = scope.maybeGenerateMemoised(key);
40 if (maybeMemoise) {
41 body.push(t.expressionStatement(t.assignmentExpression("=", maybeMemoise, key)));
42 key = maybeMemoise;
43 }
44
45 body.push.apply(body, buildMutatorMapAssign({
46 MUTATOR_MAP_REF: getMutatorId(),
47 KEY: key,
48 VALUE: getValue(prop),
49 KIND: t.identifier(prop.kind)
50 }));
51 }
52
53 function loose(info) {
54 for (var _iterator = info.computedProps, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
55 var _ref3;
56
57 if (_isArray) {
58 if (_i >= _iterator.length) break;
59 _ref3 = _iterator[_i++];
60 } else {
61 _i = _iterator.next();
62 if (_i.done) break;
63 _ref3 = _i.value;
64 }
65
66 var prop = _ref3;
67
68 if (prop.kind === "get" || prop.kind === "set") {
69 pushMutatorDefine(info, prop);
70 } else {
71 pushAssign(info.objId, prop, info.body);
72 }
73 }
74 }
75
76 function spec(info) {
77 var objId = info.objId,
78 body = info.body,
79 computedProps = info.computedProps,
80 state = info.state;
81
82
83 for (var _iterator2 = computedProps, _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : (0, _getIterator3.default)(_iterator2);;) {
84 var _ref4;
85
86 if (_isArray2) {
87 if (_i2 >= _iterator2.length) break;
88 _ref4 = _iterator2[_i2++];
89 } else {
90 _i2 = _iterator2.next();
91 if (_i2.done) break;
92 _ref4 = _i2.value;
93 }
94
95 var prop = _ref4;
96
97 var key = t.toComputedKey(prop);
98
99 if (prop.kind === "get" || prop.kind === "set") {
100 pushMutatorDefine(info, prop);
101 } else if (t.isStringLiteral(key, { value: "__proto__" })) {
102 pushAssign(objId, prop, body);
103 } else {
104 if (computedProps.length === 1) {
105 return t.callExpression(state.addHelper("defineProperty"), [info.initPropExpression, key, getValue(prop)]);
106 } else {
107 body.push(t.expressionStatement(t.callExpression(state.addHelper("defineProperty"), [objId, key, getValue(prop)])));
108 }
109 }
110 }
111 }
112
113 return {
114 visitor: {
115 ObjectExpression: {
116 exit: function exit(path, state) {
117 var node = path.node,
118 parent = path.parent,
119 scope = path.scope;
120
121 var hasComputed = false;
122 for (var _iterator3 = node.properties, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : (0, _getIterator3.default)(_iterator3);;) {
123 var _ref5;
124
125 if (_isArray3) {
126 if (_i3 >= _iterator3.length) break;
127 _ref5 = _iterator3[_i3++];
128 } else {
129 _i3 = _iterator3.next();
130 if (_i3.done) break;
131 _ref5 = _i3.value;
132 }
133
134 var prop = _ref5;
135
136 hasComputed = prop.computed === true;
137 if (hasComputed) break;
138 }
139 if (!hasComputed) return;
140
141 var initProps = [];
142 var computedProps = [];
143 var foundComputed = false;
144
145 for (var _iterator4 = node.properties, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : (0, _getIterator3.default)(_iterator4);;) {
146 var _ref6;
147
148 if (_isArray4) {
149 if (_i4 >= _iterator4.length) break;
150 _ref6 = _iterator4[_i4++];
151 } else {
152 _i4 = _iterator4.next();
153 if (_i4.done) break;
154 _ref6 = _i4.value;
155 }
156
157 var _prop = _ref6;
158
159 if (_prop.computed) {
160 foundComputed = true;
161 }
162
163 if (foundComputed) {
164 computedProps.push(_prop);
165 } else {
166 initProps.push(_prop);
167 }
168 }
169
170 var objId = scope.generateUidIdentifierBasedOnNode(parent);
171 var initPropExpression = t.objectExpression(initProps);
172 var body = [];
173
174 body.push(t.variableDeclaration("var", [t.variableDeclarator(objId, initPropExpression)]));
175
176 var callback = spec;
177 if (state.opts.loose) callback = loose;
178
179 var mutatorRef = void 0;
180
181 var getMutatorId = function getMutatorId() {
182 if (!mutatorRef) {
183 mutatorRef = scope.generateUidIdentifier("mutatorMap");
184
185 body.push(t.variableDeclaration("var", [t.variableDeclarator(mutatorRef, t.objectExpression([]))]));
186 }
187
188 return mutatorRef;
189 };
190
191 var single = callback({
192 scope: scope,
193 objId: objId,
194 body: body,
195 computedProps: computedProps,
196 initPropExpression: initPropExpression,
197 getMutatorId: getMutatorId,
198 state: state
199 });
200
201 if (mutatorRef) {
202 body.push(t.expressionStatement(t.callExpression(state.addHelper("defineEnumerableProperties"), [objId, mutatorRef])));
203 }
204
205 if (single) {
206 path.replaceWith(single);
207 } else {
208 body.push(t.expressionStatement(objId));
209 path.replaceWithMultiple(body);
210 }
211 }
212 }
213 }
214 };
215};
216
217function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
218
219module.exports = exports["default"];
\No newline at end of file