| "use strict"; |
| |
| Object.defineProperty(exports, "__esModule", { |
| value: true |
| }); |
| exports.default = addCreateSuperHelper; |
| |
| var _core = require("@babel/core"); |
| |
| const helperIDs = new WeakMap(); |
| |
| function addCreateSuperHelper(file) { |
| if (helperIDs.has(file)) { |
| return (_core.types.cloneNode || _core.types.clone)(helperIDs.get(file)); |
| } |
| |
| try { |
| return file.addHelper("createSuper"); |
| } catch (_unused) {} |
| |
| const id = file.scope.generateUidIdentifier("createSuper"); |
| helperIDs.set(file, id); |
| const fn = helper({ |
| CREATE_SUPER: id, |
| GET_PROTOTYPE_OF: file.addHelper("getPrototypeOf"), |
| POSSIBLE_CONSTRUCTOR_RETURN: file.addHelper("possibleConstructorReturn") |
| }); |
| file.path.unshiftContainer("body", [fn]); |
| file.scope.registerDeclaration(file.path.get("body.0")); |
| return _core.types.cloneNode(id); |
| } |
| |
| const helper = _core.template.statement` |
| function CREATE_SUPER(Derived) { |
| function isNativeReflectConstruct() { |
| if (typeof Reflect === "undefined" || !Reflect.construct) return false; |
| |
| // core-js@3 |
| if (Reflect.construct.sham) return false; |
| |
| // Proxy can't be polyfilled. Every browser implemented |
| // proxies before or at the same time as Reflect.construct, |
| // so if they support Proxy they also support Reflect.construct. |
| if (typeof Proxy === "function") return true; |
| |
| // Since Reflect.construct can't be properly polyfilled, some |
| // implementations (e.g. core-js@2) don't set the correct internal slots. |
| // Those polyfills don't allow us to subclass built-ins, so we need to |
| // use our fallback implementation. |
| try { |
| // If the internal slots aren't set, this throws an error similar to |
| // TypeError: this is not a Date object. |
| Date.prototype.toString.call(Reflect.construct(Date, [], function() {})); |
| return true; |
| } catch (e) { |
| return false; |
| } |
| } |
| |
| return function () { |
| var Super = GET_PROTOTYPE_OF(Derived), result; |
| if (isNativeReflectConstruct()) { |
| // NOTE: This doesn't work if this.__proto__.constructor has been modified. |
| var NewTarget = GET_PROTOTYPE_OF(this).constructor; |
| result = Reflect.construct(Super, arguments, NewTarget); |
| } else { |
| result = Super.apply(this, arguments); |
| } |
| return POSSIBLE_CONSTRUCTOR_RETURN(this, result); |
| } |
| } |
| `; |