babel-plugin-transform-builtin-classes
Version:
[](https://travis-ci.org/WebReflection/babel-plugin-transform-builtin-classes) [ • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
var _symbol = require('babel-runtime/core-js/symbol');
var _symbol2 = _interopRequireDefault(_symbol);
exports.default = function (babel) {
var name = void 0;
var VISITED = (0, _symbol2.default)();
var t = babel.types;
var needsWrapping = function needsWrapping(path, globals) {
var superClass = path.get('superClass');
return !!superClass.node && (globals || []).some(function (name) {
return superClass.isIdentifier({ name: name });
});
};
var getName = function getName(path) {
if (!name) {
name = path.scope.generateUidIdentifier('fixBabelExtend');
path.scope.getProgramParent().path.unshiftContainer('body', fixAsTemplate({ HELPER: name }));
}
return name;
};
return {
pre: function pre() {
name = null;
},
visitor: {
ClassDeclaration: function ClassDeclaration(path) {
var node = path.node;
if (!node[VISITED] && needsWrapping(path, this.opts.globals)) {
var _name = getName(path);
var ref = node.id || path.scope.generateUidIdentifier('class');
path.replaceWith(t.variableDeclaration('let', [t.variableDeclarator(ref, t.callExpression(_name, [t.toExpression(node)]))]));
}
node[VISITED] = true;
},
ClassExpression: function ClassExpression(path) {
var node = path.node;
if (!node[VISITED] && needsWrapping(path, this.opts.globals)) {
var _name2 = getName(path);
path.replaceWith(t.callExpression(_name2, [t.toExpression(node)]));
}
node[VISITED] = true;
}
},
post: function post() {
if (name && this.opts.logIfPatched) console.warn(' ✔ builtin extends patched');
}
};
};
var _babelTemplate = require('babel-template');
var _babelTemplate2 = _interopRequireDefault(_babelTemplate);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var fixAsTemplate = (0, _babelTemplate2.default)('\nvar HELPER = (function (O) {\n var\n gPO = O.getPrototypeOf || function (o) { return o.__proto__; },\n sPO = O.setPrototypeOf || function (o, p) { o.__proto__ = p; return o; },\n construct = typeof Reflect === \'object\' ?\n Reflect.construct :\n function (Parent, args, Class) {\n var Constructor, a = [null];\n a.push.apply(a, args);\n Constructor = Parent.bind.apply(Parent, a);\n return sPO(new Constructor, Class.prototype);\n }\n ;\n return function fixBabelExtend(Class) {\n var Parent = gPO(Class);\n return sPO(\n Class,\n sPO(\n function Super() {\n return construct(Parent, arguments, gPO(this).constructor);\n },\n Parent\n )\n );\n };\n}(Object));\n');