项目原始demo,不改动
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
Este repositório está arquivado. Pode ver ficheiros e cloná-lo, mas não pode fazer envios ou lançar questões ou pedidos de integração.
 
 
 
 

89 linhas
2.7 KiB

  1. "use strict";
  2. exports.__esModule = true;
  3. var _getIterator2 = require("babel-runtime/core-js/get-iterator");
  4. var _getIterator3 = _interopRequireDefault(_getIterator2);
  5. exports.default = function (_ref) {
  6. var t = _ref.types;
  7. function isProtoKey(node) {
  8. return t.isLiteral(t.toComputedKey(node, node.key), { value: "__proto__" });
  9. }
  10. function isProtoAssignmentExpression(node) {
  11. var left = node.left;
  12. return t.isMemberExpression(left) && t.isLiteral(t.toComputedKey(left, left.property), { value: "__proto__" });
  13. }
  14. function buildDefaultsCallExpression(expr, ref, file) {
  15. return t.expressionStatement(t.callExpression(file.addHelper("defaults"), [ref, expr.right]));
  16. }
  17. return {
  18. visitor: {
  19. AssignmentExpression: function AssignmentExpression(path, file) {
  20. if (!isProtoAssignmentExpression(path.node)) return;
  21. var nodes = [];
  22. var left = path.node.left.object;
  23. var temp = path.scope.maybeGenerateMemoised(left);
  24. if (temp) nodes.push(t.expressionStatement(t.assignmentExpression("=", temp, left)));
  25. nodes.push(buildDefaultsCallExpression(path.node, temp || left, file));
  26. if (temp) nodes.push(temp);
  27. path.replaceWithMultiple(nodes);
  28. },
  29. ExpressionStatement: function ExpressionStatement(path, file) {
  30. var expr = path.node.expression;
  31. if (!t.isAssignmentExpression(expr, { operator: "=" })) return;
  32. if (isProtoAssignmentExpression(expr)) {
  33. path.replaceWith(buildDefaultsCallExpression(expr, expr.left.object, file));
  34. }
  35. },
  36. ObjectExpression: function ObjectExpression(path, file) {
  37. var proto = void 0;
  38. var node = path.node;
  39. for (var _iterator = node.properties, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : (0, _getIterator3.default)(_iterator);;) {
  40. var _ref2;
  41. if (_isArray) {
  42. if (_i >= _iterator.length) break;
  43. _ref2 = _iterator[_i++];
  44. } else {
  45. _i = _iterator.next();
  46. if (_i.done) break;
  47. _ref2 = _i.value;
  48. }
  49. var prop = _ref2;
  50. if (isProtoKey(prop)) {
  51. proto = prop.value;
  52. (0, _pull2.default)(node.properties, prop);
  53. }
  54. }
  55. if (proto) {
  56. var args = [t.objectExpression([]), proto];
  57. if (node.properties.length) args.push(node);
  58. path.replaceWith(t.callExpression(file.addHelper("extends"), args));
  59. }
  60. }
  61. }
  62. };
  63. };
  64. var _pull = require("lodash/pull");
  65. var _pull2 = _interopRequireDefault(_pull);
  66. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  67. module.exports = exports["default"];