2023-08-27 18:21:25 +00:00
|
|
|
/** @internal */
|
|
|
|
define("values/object", () => {
|
|
|
|
var Object = env.global.Object = function(arg: any) {
|
|
|
|
if (arg === undefined || arg === null) return {};
|
|
|
|
else if (typeof arg === 'boolean') return new Boolean(arg);
|
|
|
|
else if (typeof arg === 'number') return new Number(arg);
|
|
|
|
else if (typeof arg === 'string') return new String(arg);
|
|
|
|
return arg;
|
|
|
|
} as ObjectConstructor;
|
|
|
|
|
|
|
|
Object.prototype = ({} as any).__proto__ as Object;
|
|
|
|
setConstr(Object.prototype, Object as any, env);
|
|
|
|
|
|
|
|
function throwNotObject(obj: any, name: string) {
|
|
|
|
if (obj === null || typeof obj !== 'object' && typeof obj !== 'function') {
|
|
|
|
throw new TypeError(`Object.${name} may only be used for objects.`);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
function check(obj: any) {
|
|
|
|
return typeof obj === 'object' && obj !== null || typeof obj === 'function';
|
2023-08-05 15:37:18 +00:00
|
|
|
}
|
|
|
|
|
2023-08-27 18:21:25 +00:00
|
|
|
setProps(Object, env, {
|
|
|
|
assign: function(dst, ...src) {
|
|
|
|
throwNotObject(dst, 'assign');
|
|
|
|
for (let i = 0; i < src.length; i++) {
|
|
|
|
const obj = src[i];
|
|
|
|
throwNotObject(obj, 'assign');
|
|
|
|
for (const key of Object.keys(obj)) {
|
|
|
|
(dst as any)[key] = (obj as any)[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return dst;
|
|
|
|
},
|
|
|
|
create(obj, props) {
|
|
|
|
props ??= {};
|
|
|
|
return Object.defineProperties({ __proto__: obj }, props as any) as any;
|
|
|
|
},
|
|
|
|
|
|
|
|
defineProperty(obj, key, attrib) {
|
|
|
|
throwNotObject(obj, 'defineProperty');
|
|
|
|
if (typeof attrib !== 'object') throw new TypeError('Expected attributes to be an object.');
|
|
|
|
|
|
|
|
if ('value' in attrib) {
|
|
|
|
if ('get' in attrib || 'set' in attrib) throw new TypeError('Cannot specify a value and accessors for a property.');
|
|
|
|
if (!env.internals.defineField(
|
|
|
|
obj, key,
|
|
|
|
attrib.value,
|
|
|
|
!!attrib.writable,
|
|
|
|
!!attrib.enumerable,
|
|
|
|
!!attrib.configurable
|
|
|
|
)) throw new TypeError('Can\'t define property \'' + key + '\'.');
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
if (typeof attrib.get !== 'function' && attrib.get !== undefined) throw new TypeError('Get accessor must be a function.');
|
|
|
|
if (typeof attrib.set !== 'function' && attrib.set !== undefined) throw new TypeError('Set accessor must be a function.');
|
|
|
|
|
|
|
|
if (!env.internals.defineProp(
|
|
|
|
obj, key,
|
|
|
|
attrib.get,
|
|
|
|
attrib.set,
|
|
|
|
!!attrib.enumerable,
|
|
|
|
!!attrib.configurable
|
|
|
|
)) throw new TypeError('Can\'t define property \'' + key + '\'.');
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
defineProperties(obj, attrib) {
|
|
|
|
throwNotObject(obj, 'defineProperties');
|
|
|
|
if (typeof attrib !== 'object' && typeof attrib !== 'function') throw 'Expected second argument to be an object.';
|
|
|
|
|
|
|
|
for (var key in attrib) {
|
|
|
|
Object.defineProperty(obj, key, attrib[key]);
|
|
|
|
}
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
keys(obj, onlyString) {
|
|
|
|
onlyString = !!(onlyString ?? true);
|
|
|
|
return env.internals.keys(obj, onlyString);
|
|
|
|
},
|
|
|
|
entries(obj, onlyString) {
|
|
|
|
return Object.keys(obj, onlyString).map(v => [ v, (obj as any)[v] ]);
|
|
|
|
},
|
|
|
|
values(obj, onlyString) {
|
|
|
|
return Object.keys(obj, onlyString).map(v => (obj as any)[v]);
|
|
|
|
},
|
|
|
|
|
|
|
|
getOwnPropertyDescriptor(obj, key) {
|
|
|
|
return env.internals.ownProp(obj, key);
|
|
|
|
},
|
|
|
|
getOwnPropertyDescriptors(obj) {
|
|
|
|
return Object.fromEntries([
|
|
|
|
...Object.getOwnPropertyNames(obj),
|
|
|
|
...Object.getOwnPropertySymbols(obj)
|
|
|
|
].map(v => [ v, Object.getOwnPropertyDescriptor(obj, v) ])) as any;
|
|
|
|
},
|
|
|
|
|
|
|
|
getOwnPropertyNames(obj) {
|
|
|
|
return env.internals.ownPropKeys(obj, false);
|
|
|
|
},
|
|
|
|
getOwnPropertySymbols(obj) {
|
|
|
|
return env.internals.ownPropKeys(obj, true);
|
|
|
|
},
|
|
|
|
hasOwn(obj, key) {
|
|
|
|
if (Object.getOwnPropertyNames(obj).includes(key)) return true;
|
|
|
|
if (Object.getOwnPropertySymbols(obj).includes(key)) return true;
|
|
|
|
return false;
|
|
|
|
},
|
|
|
|
|
|
|
|
getPrototypeOf(obj) {
|
|
|
|
return obj.__proto__;
|
|
|
|
},
|
|
|
|
setPrototypeOf(obj, proto) {
|
|
|
|
(obj as any).__proto__ = proto;
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
fromEntries(iterable) {
|
|
|
|
const res = {} as any;
|
|
|
|
|
|
|
|
for (const el of iterable) {
|
|
|
|
res[el[0]] = el[1];
|
2023-08-05 15:37:18 +00:00
|
|
|
}
|
|
|
|
|
2023-08-27 18:21:25 +00:00
|
|
|
return res;
|
|
|
|
},
|
|
|
|
|
|
|
|
preventExtensions(obj) {
|
|
|
|
throwNotObject(obj, 'preventExtensions');
|
|
|
|
env.internals.preventExtensions(obj);
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
seal(obj) {
|
|
|
|
throwNotObject(obj, 'seal');
|
|
|
|
env.internals.seal(obj);
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
freeze(obj) {
|
|
|
|
throwNotObject(obj, 'freeze');
|
|
|
|
env.internals.freeze(obj);
|
|
|
|
return obj;
|
|
|
|
},
|
|
|
|
|
|
|
|
isExtensible(obj) {
|
|
|
|
if (!check(obj)) return false;
|
|
|
|
return env.internals.extensible(obj);
|
|
|
|
},
|
|
|
|
isSealed(obj) {
|
|
|
|
if (!check(obj)) return true;
|
|
|
|
if (Object.isExtensible(obj)) return false;
|
|
|
|
return Object.getOwnPropertyNames(obj).every(v => !Object.getOwnPropertyDescriptor(obj, v).configurable);
|
|
|
|
},
|
|
|
|
isFrozen(obj) {
|
|
|
|
if (!check(obj)) return true;
|
|
|
|
if (Object.isExtensible(obj)) return false;
|
|
|
|
return Object.getOwnPropertyNames(obj).every(v => {
|
|
|
|
var prop = Object.getOwnPropertyDescriptor(obj, v);
|
|
|
|
if ('writable' in prop && prop.writable) return false;
|
|
|
|
return !prop.configurable;
|
|
|
|
});
|
2023-08-05 15:37:18 +00:00
|
|
|
}
|
2023-08-27 18:21:25 +00:00
|
|
|
});
|
|
|
|
|
|
|
|
setProps(Object.prototype, env, {
|
|
|
|
valueOf() {
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
toString() {
|
|
|
|
return '[object ' + (this[Symbol.typeName] ?? 'Unknown') + ']';
|
|
|
|
},
|
|
|
|
hasOwnProperty(key) {
|
|
|
|
return Object.hasOwn(this, key);
|
|
|
|
},
|
|
|
|
});
|
|
|
|
});
|