d81d480601c4895ed1588be828cfe4165603bf252fad93cd71c1b7eb5be602eb0e23b0a564f4c5f4e2e7a894af16aec8845f0312e380a603243d313e2cc8d7 8.5 KB

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