novemberborn / babel-plugin-es6-promise

Babel plugin that rewrites Promise references to es6-promise, but only if necessary
ISC License
13 stars 4 forks source link

es6 module transpile to amd error #24

Open Sheetaa opened 7 years ago

Sheetaa commented 7 years ago

Problem

events.js:160
      throw er; // Unhandled 'error' event
      ^
TypeError: xxx/src/lib/util.js: Property object of MemberExpression expected node to be of a type ["Expression"] but instead got null
    at Object.validate (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-types/lib/definitions/index.js:109:13)
    at Object.validate (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-types/lib/index.js:505:9)
    at NodePath._replaceWith (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-traverse/lib/path/replacement.js:176:7)
    at NodePath._remove (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-traverse/lib/path/removal.js:58:10)
    at NodePath.remove (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-traverse/lib/path/removal.js:30:8)
    at PluginPass.CallExpression (/Users/baidu/Documents/gitlab/mms-js-sdk/node_modules/babel-plugin-transform-es2015-modules-amd/lib/index.js:42:12)
    at NodePath._call (

Code

.babelrc

{
    "presets": [
        ["es2015", {"modules": "amd"}],
        "stage-1"
    ],
    "plugins": [
        "es6-promise"
    ]
}

Use like this:

export function invokeBySchema(url: string) {
    return new Promise((resolve, reject) => {});
}

issue

As your readme said, Promise is transpiled to

var _Promise = typeof Promise === 'undefined'
  ? require('es6-promise').Promise
  : Promise

While babel would throw error when transpiling memberexpression of require() above to AMD module. memberexpression like .Promise. For reference issue:https://github.com/babel/babel/pull/4894. So in this issue, I think correct transpiling way is:

var _Promise = Promise;
if (typeof Promise === 'undefined') {
  var _es6Promise = require('es6-promise');
  _Promise = _es6Promise.Promise;
}
novemberborn commented 7 years ago

Interesting. No harm in making the transpilation output compatible with the AMD transpilation. Do you want to make a PR for this?