codemix/babel-plugin-closure-elimination

`this` expression unexpected for async/await arrow function

jhen0409 opened this issue · 2 comments

Before

function test() {

  call(async () => {
    this.user = await createUser();
  })
}

After

"use strict";

var _marked = [_ref2].map(regeneratorRuntime.mark);

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

function _ref2$2(_context) {
  while (1) {
    switch (_context.prev = _context.next) {
      case 0:
        _context.next = 2;
        return createUser();

      case 2:
        _this.user = _context.sent;  // _this is not defined

      case 3:
      case "end":
        return _context.stop();
    }
  }
}

function _ref2() {
  return regeneratorRuntime.wrap(_ref2$2, _marked[0], this);
}

function test() {
  var _this = this;

  call(_asyncToGenerator(_ref2));
}

.babelrc

{
  "presets": ["latest"],
  "plugins": ["closure-elimination"]
}

version: 1.1.6

Gvozd commented

@jhen0409 , please try 1.1.7
your example converted to

"use strict";

Object.defineProperty(exports, "__esModule", {
    value: true
});
exports.demo = demo;

function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }

function demo() {
    var _this = this;

    function _callee$2(_context) {
        while (1) {
            switch (_context.prev = _context.next) {
                case 0:
                    _context.next = 2;
                    return createUser();

                case 2:
                    _this.user = _context.sent;

                case 3:
                case "end":
                    return _context.stop();
            }
        }
    }

    call(_asyncToGenerator(regeneratorRuntime.mark(function _callee() {
        return regeneratorRuntime.wrap(_callee$2, _callee, _this);
    })));
}

Thanks @Gvozd, it works well on my projects now! :D