UNPKG

babel-plugin-transform-builtin-classes

Version:

[![Build Status](https://travis-ci.org/WebReflection/babel-plugin-transform-builtin-classes.svg?branch=master)](https://travis-ci.org/WebReflection/babel-plugin-transform-builtin-classes) [![donate](https://img.shields.io/badge/$-donate-ff69b4.svg?maxAge=

72 lines (55 loc) 2.84 kB
'use strict'; 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');