You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
2.3 KiB
72 lines
2.3 KiB
4 years ago
|
"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);
|
||
|
}
|
||
|
}
|
||
|
`;
|