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
"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); |
|
} |
|
} |
|
`; |