Skip to content

Commit

Permalink
[helpers TS conversion] reflection (#16507)
Browse files Browse the repository at this point in the history
Co-authored-by: Nicolò Ribaudo <hello@nicr.dev>
  • Loading branch information
coelhucas and nicolo-ribaudo committed May 19, 2024
1 parent 0ee85cb commit d6c2343
Show file tree
Hide file tree
Showing 15 changed files with 76 additions and 46 deletions.
4 changes: 2 additions & 2 deletions packages/babel-helpers/src/helpers-generated.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ const helpers: Record<string, Helper> = {
// size: 327, gzip size: 200
construct: helper(
"7.0.0-beta.0",
'import setPrototypeOf from"setPrototypeOf";import isNativeReflectConstruct from"isNativeReflectConstruct";export default function _construct(t,e,r){if(isNativeReflectConstruct())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,e);var p=new(t.bind.apply(t,o));return r&&setPrototypeOf(p,r.prototype),p}',
'import isNativeReflectConstruct from"isNativeReflectConstruct";import setPrototypeOf from"setPrototypeOf";export default function _construct(t,e,r){if(isNativeReflectConstruct())return Reflect.construct.apply(null,arguments);var o=[null];o.push.apply(o,e);var p=new(t.bind.apply(t,o));return r&&setPrototypeOf(p,r.prototype),p}',
),
// size: 404, gzip size: 243
createClass: helper(
Expand Down Expand Up @@ -209,7 +209,7 @@ const helpers: Record<string, Helper> = {
// size: 319, gzip size: 225
get: helper(
"7.0.0-beta.0",
'import superPropBase from"superPropBase";export default function _get(){return _get="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,r){var p=superPropBase(e,t);if(p){var n=Object.getOwnPropertyDescriptor(p,t);return n.get?n.get.call(arguments.length<3?e:r):n.value}},_get.apply(this,arguments)}',
'import superPropBase from"superPropBase";export default function _get(){return _get="undefined"!=typeof Reflect&&Reflect.get?Reflect.get.bind():function(e,t,r){var p=superPropBase(e,t);if(p){var n=Object.getOwnPropertyDescriptor(p,t);return n.get?n.get.call(arguments.length<3?e:r):n.value}},_get.apply(null,arguments)}',
),
// size: 194, gzip size: 120
getPrototypeOf: helper(
Expand Down
3 changes: 1 addition & 2 deletions packages/babel-helpers/src/helpers/construct.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
/* @minVersion 7.0.0-beta.0 */

// @ts-expect-error helper
import setPrototypeOf from "setPrototypeOf";
import isNativeReflectConstruct from "./isNativeReflectConstruct.ts";
import setPrototypeOf from "./setPrototypeOf.ts";

export default function _construct(
Parent: Function,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
/* @minVersion 7.0.0-beta.0 */
/* @onlyBabel7 */

export default function _defineEnumerableProperties(obj, descs) {
export default function _defineEnumerableProperties<T>(
obj: T,
descs: { [key: string | symbol]: PropertyDescriptor },
): T {
// eslint-disable-next-line guard-for-in
for (var key in descs) {
var desc = descs[key];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
/* @minVersion 7.0.0-beta.0 */
import toPropertyKey from "./toPropertyKey.ts";

import toPropertyKey from "toPropertyKey";
export default function _defineProperty(obj, key, value) {
export default function _defineProperty<T extends object>(
obj: T,
key: PropertyKey,
value: any,
) {
key = toPropertyKey(key);
// Shortcircuit the slow defineProperty path when possible.
// We are trying to avoid issues where setters defined on the
Expand All @@ -16,6 +20,7 @@ export default function _defineProperty(obj, key, value) {
writable: true,
});
} else {
// @ts-expect-error - Explicitly assigning to generic type key
obj[key] = value;
}
return obj;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,28 @@
/* @minVersion 7.0.0-beta.0 */

import superPropBase from "superPropBase";
import superPropBase from "./superPropBase.ts";

// https://tc39.es/ecma262/multipage/reflection.html#sec-reflect.get
//
// 28.1.5 Reflect.get ( target, propertyKey [ , receiver ] )
export default function _get() {
// 28.1ak.5 Reflect.get ( target, propertyKey [ , receiver ] )
export default function _get<T extends object, P extends PropertyKey>(
target: T,
property: P,
receiver?: unknown,
): P extends keyof T ? T[P] : any;
export default function _get(): any {
if (typeof Reflect !== "undefined" && Reflect.get) {
// need a bind because https://github.com/babel/babel/issues/14527
_get = Reflect.get.bind();
// @ts-expect-error function reassign
_get = Reflect.get.bind(/* undefined */);
} else {
// @ts-expect-error function reassign
_get = function _get(target, property, receiver) {
var base = superPropBase(target, property);

if (!base) return;

var desc = Object.getOwnPropertyDescriptor(base, property);
var desc = Object.getOwnPropertyDescriptor(base, property)!;
if (desc.get) {
// STEP 3. If receiver is not present, then set receiver to target.
return desc.get.call(arguments.length < 3 ? target : receiver);
Expand All @@ -24,5 +31,6 @@ export default function _get() {
return desc.value;
};
}
return _get.apply(this, arguments);

return _get.apply(null, arguments as any as Parameters<typeof Reflect.get>);
}
10 changes: 0 additions & 10 deletions packages/babel-helpers/src/helpers/getPrototypeOf.js

This file was deleted.

12 changes: 12 additions & 0 deletions packages/babel-helpers/src/helpers/getPrototypeOf.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
/* @minVersion 7.0.0-beta.0 */

export default function _getPrototypeOf(o: object) {
// @ts-expect-error explicitly assign to function
_getPrototypeOf = Object.setPrototypeOf
? // @ts-expect-error -- intentionally omitting the argument
Object.getPrototypeOf.bind(/* undefined */)
: function _getPrototypeOf<T extends Object>(o: T) {
return (o as any).__proto__ || Object.getPrototypeOf(o);
};
return _getPrototypeOf(o);
}
1 change: 0 additions & 1 deletion packages/babel-helpers/src/helpers/objectSpread.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
/* @minVersion 7.0.0-beta.0 */
/* @onlyBabel7 */

// @ts-expect-error Migrate in another PR
import defineProperty from "./defineProperty.ts";

type Intersection<R extends any[]> = R extends [infer H, ...infer S]
Expand Down
1 change: 0 additions & 1 deletion packages/babel-helpers/src/helpers/objectSpread2.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
/* @minVersion 7.5.0 */

// @ts-expect-error Migrate in another PR
import defineProperty from "./defineProperty.ts";

// This function is different to "Reflect.ownKeys". The enumerableOnly
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,29 @@
/* @minVersion 7.0.0-beta.0 */

import superPropBase from "superPropBase";
import defineProperty from "defineProperty";
import superPropBase from "./superPropBase.ts";
import defineProperty from "./defineProperty.ts";

function set(target, property, value, receiver) {
function set(
target: object,
property: PropertyKey,
value: any,
receiver?: any,
): boolean {
if (typeof Reflect !== "undefined" && Reflect.set) {
// @ts-expect-error explicit function reassign
set = Reflect.set;
} else {
// @ts-expect-error explicit function reassign
set = function set(target, property, value, receiver) {
var base = superPropBase(target, property);
var desc;

if (base) {
desc = Object.getOwnPropertyDescriptor(base, property);
desc = Object.getOwnPropertyDescriptor(base, property)!;
if (desc.set) {
desc.set.call(receiver, value);
return true;
// so getOwnPropertyDescriptor should always be defined
} else if (!desc.writable) {
// Both getter and non-writable fall into this.
return false;
Expand Down Expand Up @@ -46,7 +54,13 @@ function set(target, property, value, receiver) {
return set(target, property, value, receiver);
}

export default function _set(target, property, value, receiver, isStrict) {
export default function _set(
target: Object,
property: PropertyKey,
value: any,
receiver?: any,
isStrict?: boolean,
) {
var s = set(target, property, value, receiver || target);
if (!s && isStrict) {
throw new TypeError("failed to set property");
Expand Down
11 changes: 0 additions & 11 deletions packages/babel-helpers/src/helpers/setPrototypeOf.js

This file was deleted.

13 changes: 13 additions & 0 deletions packages/babel-helpers/src/helpers/setPrototypeOf.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
/* @minVersion 7.0.0-beta.0 */

export default function _setPrototypeOf(o: object, p: object) {
// @ts-expect-error - assigning to function
_setPrototypeOf = Object.setPrototypeOf
? // @ts-expect-error - intentionally omitted argument
Object.setPrototypeOf.bind(/* undefined */)
: function _setPrototypeOf(o: Object, p: object) {
(o as any).__proto__ = p;
return o;
};
return _setPrototypeOf(o, p);
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
/* @minVersion 7.0.0-beta.0 */

import getPrototypeOf from "getPrototypeOf";
import getPrototypeOf from "./getPrototypeOf.ts";

export default function _superPropBase(object, property) {
export default function _superPropBase(object: object, property: PropertyKey) {
// Yes, this throws if object is null to being with, that's on purpose.
while (!Object.prototype.hasOwnProperty.call(object, property)) {
object = getPrototypeOf(object);
Expand Down
2 changes: 1 addition & 1 deletion packages/babel-runtime-corejs3/helpers/esm/construct.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import _Reflect$construct from "core-js-pure/features/reflect/construct.js";
import _pushInstanceProperty from "core-js-pure/features/instance/push.js";
import _bindInstanceProperty from "core-js-pure/features/instance/bind.js";
import setPrototypeOf from "./setPrototypeOf.js";
import isNativeReflectConstruct from "./isNativeReflectConstruct.js";
import setPrototypeOf from "./setPrototypeOf.js";
export default function _construct(t, e, r) {
if (isNativeReflectConstruct()) return _Reflect$construct.apply(null, arguments);
var o = [null];
Expand Down
2 changes: 1 addition & 1 deletion packages/babel-runtime-corejs3/helpers/esm/get.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ export default function _get() {
var n = _Object$getOwnPropertyDescriptor(p, t);
return n.get ? n.get.call(arguments.length < 3 ? e : r) : n.value;
}
}, _get.apply(this, arguments);
}, _get.apply(null, arguments);
}

0 comments on commit d6c2343

Please sign in to comment.