Skip to content

Commit

Permalink
[js] Update js.lib.Object and js.lib.Symbol
Browse files Browse the repository at this point in the history
From their implementation in js-object haxelib
  • Loading branch information
kLabz committed Oct 15, 2023
1 parent c612905 commit f0f8df7
Show file tree
Hide file tree
Showing 2 changed files with 234 additions and 194 deletions.
316 changes: 148 additions & 168 deletions std/js/lib/Object.hx
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@

package js.lib;

import haxe.extern.Rest;
import haxe.DynamicAccess;
import haxe.extern.Rest;

/**
The `js.lib.Object` constructor creates an object wrapper.
Expand All @@ -32,230 +32,210 @@ import haxe.DynamicAccess;
**/
@:native("Object")
extern class Object {
/**
Copies the values of all enumerable own properties from one or more
source objects to a target object.
**/
static function assign<T:{}>(target:T, sources:Rest<{}>):T;
static var prototype(default,never):ObjectPrototype;

/**
Creates a new object with the specified prototype object and properties.
**/
@:pure static function create<T>(proto:{}, ?propertiesObject:DynamicAccess<ObjectPropertyDescriptor>):T;
The Object.assign() method is used to copy the values of all enumerable
own properties from one or more source objects to a target object. It
will return the target object.
/**
Adds the named properties described by the given descriptors to an object.
**/
static function defineProperties<T:{}>(obj:T, props:DynamicAccess<ObjectPropertyDescriptor>):T;
Note: this is an ES2015 feature
/**
Adds the named property described by a given descriptor to an object.
**/
@:overload(function<T:{}>(obj:T, prop:Symbol, descriptor:ObjectPropertyDescriptor):T {})
static function defineProperty<T:{}>(obj:T, prop:String, descriptor:ObjectPropertyDescriptor):T;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
*/
static function assign<TSource:{}, TDest:{}>(target:TSource, sources:Rest<{}>):TDest;

/**
Returns an array containing all of the [key, value] pairs of a given
object's own enumerable string properties.
**/
@:pure static function entries(obj:{}):Array<ObjectEntry>;
The Object.create() method create a new object, using an existing object
to provide the newly created object's __proto__ . (see browser console
for visual evidence.)
/**
Freezes an object: other code can't delete or change any properties.
**/
static function freeze<T:{}>(obj:T):T;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create
*/
static function create<TObj>(proto:Null<{}>, ?propertiesObject:DynamicAccess<ObjectPropertyDescriptor<Any>>):TObj;

/**
Returns a new object from an iterable of key-value pairs
(reverses Object.entries).
**/
@:pure static function fromEntries<T:{}>(iterable:Any):T;
The static method Object.defineProperty() defines a new property directly
on an object, or modifies an existing property on an object, and returns
the object.
/**
Returns a property descriptor for a named property on an object.
**/
@:overload(function<T>(target:Array<T>, propertyKey:Int):Null<ObjectPropertyDescriptor> {})
@:overload(function(obj:{}, prop:Symbol):Null<ObjectPropertyDescriptor> {})
@:pure static function getOwnPropertyDescriptor(obj:{}, prop:String):Null<ObjectPropertyDescriptor>;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty
*/
static function defineProperty<TObj:{}, TProp>(obj:TObj, prop:String, descriptor:ObjectPropertyDescriptor<TProp>):TObj;

/**
Returns an array containing the names of all of the given object's own
enumerable and non-enumerable properties.
**/
@:pure static function getOwnPropertyNames(obj:{}):Array<String>;
The Object.defineProperties() method defines new or modifies existing
properties directly on an object, returning the object.
/**
Returns an array of all symbol properties found directly upon a given object.
**/
@:pure static function getOwnPropertySymbols(obj:{}):Array<Symbol>;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperties
*/
static function defineProperties<TObj:{}>(obj:TObj, props:DynamicAccess<ObjectPropertyDescriptor<Any>>):TObj;

/**
Returns the prototype of the specified object.
**/
@:pure static function getPrototypeOf<TProto:{}>(obj:{}):Null<TProto>;
The Object.entries() method returns an array of a given object's own
enumerable property [key, value] pairs, in the same order as that
provided by a for...in loop (the difference being that a for-in loop
enumerates properties in the prototype chain as well).
/**
Compares if two values are the same value. Equates all NaN values
(which differs from both Abstract Equality Comparison and
Strict Equality Comparison).
**/
@:pure static function is<T>(value1:T, value2:T):Bool;
Note: this is an ES2017 feature
/**
Determines if extending of an object is allowed.
**/
@:pure static function isExtensible(obj:{}):Bool;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/entries
*/
static function entries<TObj:{}>(obj:TObj):Array<Array<Any>>;

/**
Determines if an object was frozen.
**/
@:pure static function isFrozen(obj:{}):Bool;
The Object.freeze() method freezes an object: that is, prevents new
properties from being added to it; prevents existing properties from
being removed; and prevents existing properties, or their enumerability,
configurability, or writability, from being changed, it also prevents the
prototype from being changed.
The method returns the passed object.
/**
Determines if an object is sealed.
**/
@:pure static function isSealed(obj:{}):Bool;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
*/
static function freeze<TObj:{}>(obj:TObj):TObj;

/**
Returns an array containing the names of all of the given object's own
enumerable string properties.
**/
@:pure static function keys(obj:{}):Array<String>;
The Object.getOwnPropertyDescriptor() method returns a property
descriptor for an own property (that is, one directly present on an
object and not in the object's prototype chain) of a given object.
/**
Prevents any extensions of an object.
**/
static function preventExtensions<T:{}>(obj:T):T;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptor
*/
static function getOwnPropertyDescriptor<TObj:{}, TProp>(obj:TObj, prop:String):Null<ObjectPropertyDescriptor<TProp>>;

/**
Prevents other code from deleting properties of an object.
**/
static function seal<T:{}>(obj:T):T;
The Object.getOwnPropertyDescriptors() method returns all own property
descriptors of a given object.
/**
Sets the prototype (i.e., the internal Prototype property).
**/
static function setPrototypeOf<T:{}>(obj:T, prototype:Null<{}>):T;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyDescriptors
*/
static function getOwnPropertyDescriptors<TObj:{}>(obj:TObj):DynamicAccess<ObjectPropertyDescriptor<Any>>;

/**
Returns an array containing the values that correspond to all of
a given object's own enumerable string properties.
**/
@:pure static function values(obj:{}):Array<Any>;
The Object.getOwnPropertyNames() method returns an array of all
properties (including non-enumerable properties except for those which
use Symbol) found directly upon a given object.
/**
Allows the addition of properties to all objects of type Object.
**/
static var prototype(default, never):ObjectPrototype;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertyNames
*/
static function getOwnPropertyNames<TObj:{}>(obj:TObj):Array<String>;

/**
The Object constructor creates an object wrapper.
**/
@:pure function new(?value:Any);
}
The Object.getOwnPropertySymbols() method returns an array of all symbol
properties found directly upon a given object.
/**
Type for
@see <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object>
**/
typedef ObjectPrototype = {
/**
Returns a boolean indicating whether an object contains the specified
property as a direct property of that object and not inherited through
the prototype chain.
**/
var hasOwnProperty(default, never):Function;
Note: this is an ES2015 feature
/**
Returns a boolean indicating whether the object this method is called
upon is in the prototype chain of the specified object.
**/
var isPrototypeOf(default, never):Function;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getOwnPropertySymbols
*/
static function getOwnPropertySymbols<TObj:{}>(obj:TObj):Array<Symbol>;

/**
Returns a boolean indicating if the internal enumerable attribute is set.
**/
var propertyIsEnumerable(default, never):Function;
The Object.getPrototypeOf() method returns the prototype (i.e. the value
of the internal [[Prototype]] property) of the specified object.
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/getPrototypeOf
*/
static function getPrototypeOf<TObj:{}, TProto>(obj:TObj):TProto;

/**
Calls `toString()`.
**/
var toLocaleString(default, never):Function;
The Object.is() method determines whether two values are the same value.
Note: this is an ES2015 feature
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is
*/
static function is<TObj:{}>(obj1:TObj, obj2:TObj):Bool;

/**
Returns a string representation of the object.
**/
var toString(default, never):Function;
The Object.isExtensible() method determines if an object is extensible
(whether it can have new properties added to it).
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isExtensible
*/
static function isExtensible<TObj:{}>(obj:TObj):Bool;

/**
Returns the primitive value of the specified object.
**/
var valueOf(default, never):Function;
}
The Object.isFrozen() determines if an object is frozen.
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isFrozen
*/
static function isFrozen<TObj:{}>(obj:TObj):Bool;

/**
@see <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty>
**/
typedef ObjectPropertyDescriptor = {
/**
`true` if and only if the type of this property descriptor may be
changed and if the property may be deleted from the corresponding object.
The Object.isSealed() method determines if an object is sealed.
Defaults to `false`.
**/
var ?configurable:Bool;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/isSealed
*/
static function isSealed<TObj:{}>(obj:TObj):Bool;

/**
`true` if and only if this property shows up during enumeration of the
properties on the corresponding object.
The Object.keys() method returns an array of a given object's own
enumerable properties, in the same order as that provided by a for...in
loop (the difference being that a for-in loop enumerates properties in
the prototype chain as well).
Defaults to `false`.
**/
var ?enumerable:Bool;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
*/
static function keys<TObj:{}>(obj:TObj):Array<String>;

/**
The value associated with the property.
Can be any valid JavaScript value (number, object, function, etc).
**/
var ?value:Any;
The Object.preventExtensions() method prevents new properties from ever
being added to an object (i.e. prevents future extensions to the object).
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/preventExtensions
*/
static function preventExtensions<TObj:{}>(obj:TObj):TObj;

/**
`true` if and only if the value associated with the property may be
changed with an assignment operator.
The Object.seal() method seals an object, preventing new properties from
being added to it and marking all existing properties as
non-configurable. Values of present properties can still be changed as
long as they are writable.
Defaults to `false`.
**/
var ?writable:Bool;
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/seal
*/
static function seal<TObj:{}>(obj:TObj):TObj;

/**
A function which serves as a getter for the property, or `undefined` if
there is no getter. When the property is accessed, this function is
called without arguments and with `this` set to the object through which
the property is accessed (this may not be the object on which the
property is defined due to inheritance).
The return value will be used as the value of the property.
**/
var ?get:Void->Any;
The Object.setPrototypeOf() method sets the prototype (i.e., the internal
[[Prototype]] property) of a specified object to another object or null.
Note: this is an ES2015 feature
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/setPrototypeOf
*/
static function setPrototypeOf<TObj:{}, TProto:{}>(obj:TObj, proto:Null<TProto>):TObj;

/**
A function which serves as a setter for the property, or undefined if
there is no setter. When the property is assigned to, this function
is called with one argument (the value being assigned to the property)
and with `this` set to the object through which the property is assigned.
**/
var ?set:Any->Void;
}
The Object.values() method returns an array of a given object's own
enumerable property values, in the same order as that provided by a
for...in loop (the difference being that a for-in loop enumerates
properties in the prototype chain as well).
/**
Key/value access helper for `js.lib.Object.entries()`.
**/
abstract ObjectEntry(Array<Any>) {
public var key(get, never):String;
public var value(get, never):Any;
Note: this is an ES2017 feature
inline function get_key():String
return this[0];
See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values
*/
static function values<TObj:{}>(obj:TObj):Array<Dynamic>;
}

inline function get_value():Any
return this[1];
typedef ObjectPrototype = {
var hasOwnProperty(default,never):Function;
var isPrototypeOf(default,never):Function;
var propertyIsEnumerable(default,never):Function;
var toLocaleString(default,never):Function;
var toString(default,never):Function;
var valueOf(default,never):Function;
}

typedef ObjectPropertyDescriptor<TProp> = {
@:optional var value:TProp;
@:optional var configurable:Bool;
@:optional var enumerable:Bool;
@:optional var writable:Bool;
@:optional var get:Void->TProp;
@:optional var set:TProp->Void;
}

Loading

0 comments on commit f0f8df7

Please sign in to comment.