Ajout de promotion et de commande
This commit is contained in:
+38
@@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
|
||||
var ToNumber = require('./ToNumber');
|
||||
var ToPrimitive = require('./ToPrimitive');
|
||||
|
||||
var isSameType = require('../helpers/isSameType');
|
||||
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-abstract-equality-comparison
|
||||
|
||||
module.exports = function AbstractEqualityComparison(x, y) {
|
||||
if (isSameType(x, y)) {
|
||||
return x === y; // ES6+ specified this shortcut anyways.
|
||||
}
|
||||
if (x == null && y == null) {
|
||||
return true;
|
||||
}
|
||||
if (typeof x === 'number' && typeof y === 'string') {
|
||||
return AbstractEqualityComparison(x, ToNumber(y));
|
||||
}
|
||||
if (typeof x === 'string' && typeof y === 'number') {
|
||||
return AbstractEqualityComparison(ToNumber(x), y);
|
||||
}
|
||||
if (typeof x === 'boolean') {
|
||||
return AbstractEqualityComparison(ToNumber(x), y);
|
||||
}
|
||||
if (typeof y === 'boolean') {
|
||||
return AbstractEqualityComparison(x, ToNumber(y));
|
||||
}
|
||||
if ((typeof x === 'string' || typeof x === 'number' || typeof x === 'symbol') && isObject(y)) {
|
||||
return AbstractEqualityComparison(x, ToPrimitive(y));
|
||||
}
|
||||
if (isObject(x) && (typeof y === 'string' || typeof y === 'number' || typeof y === 'symbol')) {
|
||||
return AbstractEqualityComparison(ToPrimitive(x), y);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $Number = GetIntrinsic('%Number%');
|
||||
var $TypeError = require('es-errors/type');
|
||||
var $isNaN = require('math-intrinsics/isNaN');
|
||||
var $isFinite = require('math-intrinsics/isFinite');
|
||||
|
||||
var isPrefixOf = require('../helpers/isPrefixOf');
|
||||
|
||||
var ToNumber = require('./ToNumber');
|
||||
var ToPrimitive = require('./ToPrimitive');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-11.8.5
|
||||
|
||||
// eslint-disable-next-line max-statements
|
||||
module.exports = function AbstractRelationalComparison(x, y, LeftFirst) {
|
||||
if (typeof LeftFirst !== 'boolean') {
|
||||
throw new $TypeError('Assertion failed: LeftFirst argument must be a Boolean');
|
||||
}
|
||||
var px;
|
||||
var py;
|
||||
if (LeftFirst) {
|
||||
px = ToPrimitive(x, $Number);
|
||||
py = ToPrimitive(y, $Number);
|
||||
} else {
|
||||
py = ToPrimitive(y, $Number);
|
||||
px = ToPrimitive(x, $Number);
|
||||
}
|
||||
var bothStrings = typeof px === 'string' && typeof py === 'string';
|
||||
if (!bothStrings) {
|
||||
var nx = ToNumber(px);
|
||||
var ny = ToNumber(py);
|
||||
if ($isNaN(nx) || $isNaN(ny)) {
|
||||
return undefined;
|
||||
}
|
||||
if ($isFinite(nx) && $isFinite(ny) && nx === ny) {
|
||||
return false;
|
||||
}
|
||||
if (nx === Infinity) {
|
||||
return false;
|
||||
}
|
||||
if (ny === Infinity) {
|
||||
return true;
|
||||
}
|
||||
if (ny === -Infinity) {
|
||||
return false;
|
||||
}
|
||||
if (nx === -Infinity) {
|
||||
return true;
|
||||
}
|
||||
return nx < ny; // by now, these are both nonzero, finite, and not equal
|
||||
}
|
||||
if (isPrefixOf(py, px)) {
|
||||
return false;
|
||||
}
|
||||
if (isPrefixOf(px, py)) {
|
||||
return true;
|
||||
}
|
||||
return px < py; // both strings, neither a prefix of the other. shortcut for steps c-f
|
||||
};
|
||||
+44
@@ -0,0 +1,44 @@
|
||||
'use strict';
|
||||
|
||||
var isInteger = require('math-intrinsics/isInteger');
|
||||
var MAX_SAFE_INTEGER = require('math-intrinsics/constants/maxSafeInteger');
|
||||
|
||||
var isLeadingSurrogate = require('../helpers/isLeadingSurrogate');
|
||||
var isTrailingSurrogate = require('../helpers/isTrailingSurrogate');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var $charCodeAt = require('call-bound')('String.prototype.charCodeAt');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-advancestringindex
|
||||
|
||||
module.exports = function AdvanceStringIndex(S, index, unicode) {
|
||||
if (typeof S !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `S` must be a String');
|
||||
}
|
||||
if (!isInteger(index) || index < 0 || index > MAX_SAFE_INTEGER) {
|
||||
throw new $TypeError('Assertion failed: `length` must be an integer >= 0 and <= 2**53');
|
||||
}
|
||||
if (typeof unicode !== 'boolean') {
|
||||
throw new $TypeError('Assertion failed: `unicode` must be a Boolean');
|
||||
}
|
||||
if (!unicode) {
|
||||
return index + 1;
|
||||
}
|
||||
var length = S.length;
|
||||
if ((index + 1) >= length) {
|
||||
return index + 1;
|
||||
}
|
||||
|
||||
var first = $charCodeAt(S, index);
|
||||
if (!isLeadingSurrogate(first)) {
|
||||
return index + 1;
|
||||
}
|
||||
|
||||
var second = $charCodeAt(S, index + 1);
|
||||
if (!isTrailingSurrogate(second)) {
|
||||
return index + 1;
|
||||
}
|
||||
|
||||
return index + 2;
|
||||
};
|
||||
+42
@@ -0,0 +1,42 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $ArrayPrototype = GetIntrinsic('%Array.prototype%');
|
||||
var $RangeError = require('es-errors/range');
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isInteger = require('math-intrinsics/isInteger');
|
||||
var MAX_ARRAY_LENGTH = require('math-intrinsics/constants/maxArrayLength');
|
||||
var $setProto = require('set-proto');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-arraycreate
|
||||
|
||||
module.exports = function ArrayCreate(length) {
|
||||
if (!isInteger(length) || length < 0) {
|
||||
throw new $TypeError('Assertion failed: `length` must be an integer Number >= 0');
|
||||
}
|
||||
if (length > MAX_ARRAY_LENGTH) {
|
||||
throw new $RangeError('length is greater than (2**32 - 1)');
|
||||
}
|
||||
var proto = arguments.length > 1 ? arguments[1] : $ArrayPrototype;
|
||||
var A = []; // steps 5 - 7, and 9
|
||||
if (proto !== $ArrayPrototype) { // step 8
|
||||
if (!$setProto) {
|
||||
throw new $SyntaxError('ArrayCreate: a `proto` argument that is not `Array.prototype` is not supported in an environment that does not support setting the [[Prototype]]');
|
||||
}
|
||||
$setProto(A, proto);
|
||||
}
|
||||
if (length !== 0) { // bypasses the need for step 2
|
||||
A.length = length;
|
||||
}
|
||||
/* step 10, the above as a shortcut for the below
|
||||
OrdinaryDefineOwnProperty(A, 'length', {
|
||||
'[[Configurable]]': false,
|
||||
'[[Enumerable]]': false,
|
||||
'[[Value]]': length,
|
||||
'[[Writable]]': true
|
||||
});
|
||||
*/
|
||||
return A;
|
||||
};
|
||||
+77
@@ -0,0 +1,77 @@
|
||||
'use strict';
|
||||
|
||||
var $RangeError = require('es-errors/range');
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var assign = require('object.assign');
|
||||
|
||||
var isPropertyDescriptor = require('../helpers/records/property-descriptor');
|
||||
|
||||
var IsArray = require('./IsArray');
|
||||
var IsDataDescriptor = require('./IsDataDescriptor');
|
||||
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
|
||||
var OrdinaryGetOwnProperty = require('./OrdinaryGetOwnProperty');
|
||||
var ToNumber = require('./ToNumber');
|
||||
var ToString = require('./ToString');
|
||||
var ToUint32 = require('./ToUint32');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-arraysetlength
|
||||
|
||||
// eslint-disable-next-line max-statements, max-lines-per-function
|
||||
module.exports = function ArraySetLength(A, Desc) {
|
||||
if (!IsArray(A)) {
|
||||
throw new $TypeError('Assertion failed: A must be an Array');
|
||||
}
|
||||
if (!isPropertyDescriptor(Desc)) {
|
||||
throw new $TypeError('Assertion failed: Desc must be a Property Descriptor');
|
||||
}
|
||||
if (!('[[Value]]' in Desc)) {
|
||||
return OrdinaryDefineOwnProperty(A, 'length', Desc);
|
||||
}
|
||||
var newLenDesc = assign({}, Desc);
|
||||
var newLen = ToUint32(Desc['[[Value]]']);
|
||||
var numberLen = ToNumber(Desc['[[Value]]']);
|
||||
if (newLen !== numberLen) {
|
||||
throw new $RangeError('Invalid array length');
|
||||
}
|
||||
newLenDesc['[[Value]]'] = newLen;
|
||||
var oldLenDesc = OrdinaryGetOwnProperty(A, 'length');
|
||||
if (!IsDataDescriptor(oldLenDesc)) {
|
||||
throw new $TypeError('Assertion failed: an array had a non-data descriptor on `length`');
|
||||
}
|
||||
var oldLen = oldLenDesc['[[Value]]'];
|
||||
if (newLen >= oldLen) {
|
||||
return OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
|
||||
}
|
||||
if (!oldLenDesc['[[Writable]]']) {
|
||||
return false;
|
||||
}
|
||||
var newWritable;
|
||||
if (!('[[Writable]]' in newLenDesc) || newLenDesc['[[Writable]]']) {
|
||||
newWritable = true;
|
||||
} else {
|
||||
newWritable = false;
|
||||
newLenDesc['[[Writable]]'] = true;
|
||||
}
|
||||
var succeeded = OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
|
||||
if (!succeeded) {
|
||||
return false;
|
||||
}
|
||||
while (newLen < oldLen) {
|
||||
oldLen -= 1;
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
var deleteSucceeded = delete A[ToString(oldLen)];
|
||||
if (!deleteSucceeded) {
|
||||
newLenDesc['[[Value]]'] = oldLen + 1;
|
||||
if (!newWritable) {
|
||||
newLenDesc['[[Writable]]'] = false;
|
||||
OrdinaryDefineOwnProperty(A, 'length', newLenDesc);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (!newWritable) {
|
||||
return OrdinaryDefineOwnProperty(A, 'length', { '[[Writable]]': false });
|
||||
}
|
||||
return true;
|
||||
};
|
||||
+46
@@ -0,0 +1,46 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $Array = GetIntrinsic('%Array%');
|
||||
var $species = GetIntrinsic('%Symbol.species%', true);
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isInteger = require('math-intrinsics/isInteger');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var Get = require('./Get');
|
||||
var IsArray = require('./IsArray');
|
||||
var IsConstructor = require('./IsConstructor');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-arrayspeciescreate
|
||||
|
||||
module.exports = function ArraySpeciesCreate(originalArray, length) {
|
||||
if (!isInteger(length) || length < 0) {
|
||||
throw new $TypeError('Assertion failed: length must be an integer >= 0');
|
||||
}
|
||||
var len = length === 0 ? 0 : length;
|
||||
var C;
|
||||
var isArray = IsArray(originalArray);
|
||||
if (isArray) {
|
||||
C = Get(originalArray, 'constructor');
|
||||
// TODO: figure out how to make a cross-realm normal Array, a same-realm Array
|
||||
// if (IsConstructor(C)) {
|
||||
// if C is another realm's Array, C = undefined
|
||||
// Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Array))) === null ?
|
||||
// }
|
||||
if ($species && isObject(C)) {
|
||||
C = Get(C, $species);
|
||||
if (C === null) {
|
||||
C = void 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (typeof C === 'undefined') {
|
||||
return $Array(len);
|
||||
}
|
||||
if (!IsConstructor(C)) {
|
||||
throw new $TypeError('C must be a constructor');
|
||||
}
|
||||
return new C(len); // Construct(C, len);
|
||||
};
|
||||
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
var callBound = require('call-bound');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var IsArray = require('./IsArray');
|
||||
|
||||
var $apply = GetIntrinsic('%Reflect.apply%', true) || callBound('Function.prototype.apply');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-call
|
||||
|
||||
module.exports = function Call(F, V) {
|
||||
var argumentsList = arguments.length > 2 ? arguments[2] : [];
|
||||
if (!IsArray(argumentsList)) {
|
||||
throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
|
||||
}
|
||||
return $apply(F, V, argumentsList);
|
||||
};
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var SameValue = require('./SameValue');
|
||||
var ToNumber = require('./ToNumber');
|
||||
var ToString = require('./ToString');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-canonicalnumericindexstring
|
||||
|
||||
module.exports = function CanonicalNumericIndexString(argument) {
|
||||
if (typeof argument !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `argument` must be a String');
|
||||
}
|
||||
if (argument === '-0') { return -0; }
|
||||
var n = ToNumber(argument);
|
||||
if (SameValue(ToString(n), argument)) { return n; }
|
||||
return void 0;
|
||||
};
|
||||
+51
@@ -0,0 +1,51 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var callBound = require('call-bound');
|
||||
var hasOwn = require('hasown');
|
||||
|
||||
var $charCodeAt = callBound('String.prototype.charCodeAt');
|
||||
var $toUpperCase = callBound('String.prototype.toUpperCase');
|
||||
|
||||
var caseFolding = require('../helpers/caseFolding.json');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-runtime-semantics-canonicalize-ch
|
||||
|
||||
module.exports = function Canonicalize(ch, IgnoreCase, Unicode) {
|
||||
if (typeof ch !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `ch` must be a character');
|
||||
}
|
||||
|
||||
if (typeof IgnoreCase !== 'boolean' || typeof Unicode !== 'boolean') {
|
||||
throw new $TypeError('Assertion failed: `IgnoreCase` and `Unicode` must be Booleans');
|
||||
}
|
||||
|
||||
if (!IgnoreCase) {
|
||||
return ch; // step 1
|
||||
}
|
||||
|
||||
if (Unicode) { // step 2
|
||||
if (hasOwn(caseFolding.C, ch)) {
|
||||
return caseFolding.C[ch];
|
||||
}
|
||||
if (hasOwn(caseFolding.S, ch)) {
|
||||
return caseFolding.S[ch];
|
||||
}
|
||||
return ch; // step 2.b
|
||||
}
|
||||
|
||||
var u = $toUpperCase(ch); // step 2
|
||||
|
||||
if (u.length !== 1) {
|
||||
return ch; // step 3
|
||||
}
|
||||
|
||||
var cu = u; // step 4
|
||||
|
||||
if ($charCodeAt(ch, 0) >= 128 && $charCodeAt(cu, 0) < 128) {
|
||||
return ch; // step 5
|
||||
}
|
||||
|
||||
return cu;
|
||||
};
|
||||
+53
@@ -0,0 +1,53 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
var callBound = require('call-bound');
|
||||
|
||||
var $fromCharCode = GetIntrinsic('%String.fromCharCode%');
|
||||
var $TypeError = require('es-errors/type');
|
||||
var $charCodeAt = callBound('String.prototype.charCodeAt');
|
||||
|
||||
var CharSet = require('../helpers/CharSet').CharSet;
|
||||
|
||||
module.exports = function CharacterRange(A, B) {
|
||||
var a;
|
||||
var b;
|
||||
|
||||
if (A instanceof CharSet || B instanceof CharSet) {
|
||||
if (!(A instanceof CharSet) || !(B instanceof CharSet)) {
|
||||
throw new $TypeError('Assertion failed: CharSets A and B are not both CharSets');
|
||||
}
|
||||
|
||||
A.yield(function (c) {
|
||||
if (typeof a !== 'undefined') {
|
||||
throw new $TypeError('Assertion failed: CharSet A has more than one character');
|
||||
}
|
||||
a = c;
|
||||
});
|
||||
B.yield(function (c) {
|
||||
if (typeof b !== 'undefined') {
|
||||
throw new $TypeError('Assertion failed: CharSet B has more than one character');
|
||||
}
|
||||
b = c;
|
||||
});
|
||||
} else {
|
||||
if (A.length !== 1 || B.length !== 1) {
|
||||
throw new $TypeError('Assertion failed: CharSets A and B contain exactly one character');
|
||||
}
|
||||
a = A[0];
|
||||
b = B[0];
|
||||
}
|
||||
|
||||
var i = $charCodeAt(a, 0);
|
||||
var j = $charCodeAt(b, 0);
|
||||
|
||||
if (!(i <= j)) {
|
||||
throw new $TypeError('Assertion failed: i is not <= j');
|
||||
}
|
||||
|
||||
var arr = [];
|
||||
for (var k = i; k <= j; k += 1) {
|
||||
arr[arr.length] = $fromCharCode(k);
|
||||
}
|
||||
return arr;
|
||||
};
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var hasOwn = require('hasown');
|
||||
|
||||
var IsDataDescriptor = require('./IsDataDescriptor');
|
||||
var IsGenericDescriptor = require('./IsGenericDescriptor');
|
||||
|
||||
var isPropertyDescriptor = require('../helpers/records/property-descriptor');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-completepropertydescriptor
|
||||
|
||||
module.exports = function CompletePropertyDescriptor(Desc) {
|
||||
if (!isPropertyDescriptor(Desc)) {
|
||||
throw new $TypeError('Assertion failed: `Desc` must be a Property Descriptor');
|
||||
}
|
||||
|
||||
/* eslint no-param-reassign: 0 */
|
||||
|
||||
if (IsGenericDescriptor(Desc) || IsDataDescriptor(Desc)) {
|
||||
if (!hasOwn(Desc, '[[Value]]')) {
|
||||
Desc['[[Value]]'] = void 0;
|
||||
}
|
||||
if (!hasOwn(Desc, '[[Writable]]')) {
|
||||
Desc['[[Writable]]'] = false;
|
||||
}
|
||||
} else {
|
||||
if (!hasOwn(Desc, '[[Get]]')) {
|
||||
Desc['[[Get]]'] = void 0;
|
||||
}
|
||||
if (!hasOwn(Desc, '[[Set]]')) {
|
||||
Desc['[[Set]]'] = void 0;
|
||||
}
|
||||
}
|
||||
if (!hasOwn(Desc, '[[Enumerable]]')) {
|
||||
Desc['[[Enumerable]]'] = false;
|
||||
}
|
||||
if (!hasOwn(Desc, '[[Configurable]]')) {
|
||||
Desc['[[Configurable]]'] = false;
|
||||
}
|
||||
return Desc;
|
||||
};
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
'use strict';
|
||||
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
|
||||
var SLOT = require('internal-slot');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-completion-record-specification-type
|
||||
|
||||
var CompletionRecord = function CompletionRecord(type, value) {
|
||||
if (!(this instanceof CompletionRecord)) {
|
||||
return new CompletionRecord(type, value);
|
||||
}
|
||||
if (type !== 'normal' && type !== 'break' && type !== 'continue' && type !== 'return' && type !== 'throw') {
|
||||
throw new $SyntaxError('Assertion failed: `type` must be one of "normal", "break", "continue", "return", or "throw"');
|
||||
}
|
||||
SLOT.set(this, '[[type]]', type);
|
||||
SLOT.set(this, '[[value]]', value);
|
||||
// [[target]] slot?
|
||||
};
|
||||
|
||||
CompletionRecord.prototype.type = function type() {
|
||||
return SLOT.get(this, '[[type]]');
|
||||
};
|
||||
|
||||
CompletionRecord.prototype.value = function value() {
|
||||
return SLOT.get(this, '[[value]]');
|
||||
};
|
||||
|
||||
CompletionRecord.prototype['?'] = function ReturnIfAbrupt() {
|
||||
var type = SLOT.get(this, '[[type]]');
|
||||
var value = SLOT.get(this, '[[value]]');
|
||||
|
||||
if (type === 'throw') {
|
||||
throw value;
|
||||
}
|
||||
return value;
|
||||
};
|
||||
|
||||
CompletionRecord.prototype['!'] = function assert() {
|
||||
var type = SLOT.get(this, '[[type]]');
|
||||
|
||||
if (type !== 'normal') {
|
||||
throw new $SyntaxError('Assertion failed: Completion Record is not of type "normal"');
|
||||
}
|
||||
return SLOT.get(this, '[[value]]');
|
||||
};
|
||||
|
||||
module.exports = CompletionRecord;
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
var OrdinaryDefineOwnProperty = require('./OrdinaryDefineOwnProperty');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-createdataproperty
|
||||
|
||||
module.exports = function CreateDataProperty(O, P, V) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
var newDesc = {
|
||||
'[[Configurable]]': true,
|
||||
'[[Enumerable]]': true,
|
||||
'[[Value]]': V,
|
||||
'[[Writable]]': true
|
||||
};
|
||||
return OrdinaryDefineOwnProperty(O, P, newDesc);
|
||||
};
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var CreateDataProperty = require('./CreateDataProperty');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
// // https://262.ecma-international.org/6.0/#sec-createdatapropertyorthrow
|
||||
|
||||
module.exports = function CreateDataPropertyOrThrow(O, P, V) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
var success = CreateDataProperty(O, P, V);
|
||||
if (!success) {
|
||||
throw new $TypeError('unable to create data property');
|
||||
}
|
||||
return success;
|
||||
};
|
||||
+27
@@ -0,0 +1,27 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var callBound = require('call-bound');
|
||||
|
||||
var $replace = callBound('String.prototype.replace');
|
||||
|
||||
var RequireObjectCoercible = require('./RequireObjectCoercible');
|
||||
var ToString = require('./ToString');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-createhtml
|
||||
|
||||
module.exports = function CreateHTML(string, tag, attribute, value) {
|
||||
if (typeof tag !== 'string' || typeof attribute !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `tag` and `attribute` must be strings');
|
||||
}
|
||||
var str = RequireObjectCoercible(string);
|
||||
var S = ToString(str);
|
||||
var p1 = '<' + tag;
|
||||
if (attribute !== '') {
|
||||
var V = ToString(value);
|
||||
var escapedV = $replace(V, /\x22/g, '"');
|
||||
p1 += '\x20' + attribute + '\x3D\x22' + escapedV + '\x22';
|
||||
}
|
||||
return p1 + '>' + S + '</' + tag + '>';
|
||||
};
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-createiterresultobject
|
||||
|
||||
module.exports = function CreateIterResultObject(value, done) {
|
||||
if (typeof done !== 'boolean') {
|
||||
throw new $TypeError('Assertion failed: Type(done) is not Boolean');
|
||||
}
|
||||
return {
|
||||
value: value,
|
||||
done: done
|
||||
};
|
||||
};
|
||||
+43
@@ -0,0 +1,43 @@
|
||||
'use strict';
|
||||
|
||||
var callBound = require('call-bound');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf');
|
||||
|
||||
var Get = require('./Get');
|
||||
var IsArray = require('./IsArray');
|
||||
var ToLength = require('./ToLength');
|
||||
var ToString = require('./ToString');
|
||||
var Type = require('./Type');
|
||||
|
||||
var defaultElementTypes = ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object'];
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-createlistfromarraylike
|
||||
module.exports = function CreateListFromArrayLike(obj) {
|
||||
var elementTypes = arguments.length > 1
|
||||
? arguments[1]
|
||||
: defaultElementTypes;
|
||||
|
||||
if (!isObject(obj)) {
|
||||
throw new $TypeError('Assertion failed: `obj` must be an Object');
|
||||
}
|
||||
if (!IsArray(elementTypes)) {
|
||||
throw new $TypeError('Assertion failed: `elementTypes`, if provided, must be an array');
|
||||
}
|
||||
var len = ToLength(Get(obj, 'length'));
|
||||
var list = [];
|
||||
var index = 0;
|
||||
while (index < len) {
|
||||
var indexName = ToString(index);
|
||||
var next = Get(obj, indexName);
|
||||
var nextType = Type(next);
|
||||
if ($indexOf(elementTypes, nextType) < 0) {
|
||||
throw new $TypeError('item type ' + nextType + ' is not a valid elementType');
|
||||
}
|
||||
list[list.length] = next;
|
||||
index += 1;
|
||||
}
|
||||
return list;
|
||||
};
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var DefineOwnProperty = require('../helpers/DefineOwnProperty');
|
||||
|
||||
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
|
||||
var IsDataDescriptor = require('./IsDataDescriptor');
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
var SameValue = require('./SameValue');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-createmethodproperty
|
||||
|
||||
module.exports = function CreateMethodProperty(O, P, V) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
|
||||
var newDesc = {
|
||||
'[[Configurable]]': true,
|
||||
'[[Enumerable]]': false,
|
||||
'[[Value]]': V,
|
||||
'[[Writable]]': true
|
||||
};
|
||||
return DefineOwnProperty(
|
||||
IsDataDescriptor,
|
||||
SameValue,
|
||||
FromPropertyDescriptor,
|
||||
O,
|
||||
P,
|
||||
newDesc
|
||||
);
|
||||
};
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
'use strict';
|
||||
|
||||
var $EvalError = require('es-errors/eval');
|
||||
|
||||
var DayWithinYear = require('./DayWithinYear');
|
||||
var InLeapYear = require('./InLeapYear');
|
||||
var MonthFromTime = require('./MonthFromTime');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.5
|
||||
|
||||
module.exports = function DateFromTime(t) {
|
||||
var m = MonthFromTime(t);
|
||||
var d = DayWithinYear(t);
|
||||
if (m === 0) {
|
||||
return d + 1;
|
||||
}
|
||||
if (m === 1) {
|
||||
return d - 30;
|
||||
}
|
||||
var leap = InLeapYear(t);
|
||||
if (m === 2) {
|
||||
return d - 58 - leap;
|
||||
}
|
||||
if (m === 3) {
|
||||
return d - 89 - leap;
|
||||
}
|
||||
if (m === 4) {
|
||||
return d - 119 - leap;
|
||||
}
|
||||
if (m === 5) {
|
||||
return d - 150 - leap;
|
||||
}
|
||||
if (m === 6) {
|
||||
return d - 180 - leap;
|
||||
}
|
||||
if (m === 7) {
|
||||
return d - 211 - leap;
|
||||
}
|
||||
if (m === 8) {
|
||||
return d - 242 - leap;
|
||||
}
|
||||
if (m === 9) {
|
||||
return d - 272 - leap;
|
||||
}
|
||||
if (m === 10) {
|
||||
return d - 303 - leap;
|
||||
}
|
||||
if (m === 11) {
|
||||
return d - 333 - leap;
|
||||
}
|
||||
throw new $EvalError('Assertion failed: MonthFromTime returned an impossible value: ' + m);
|
||||
};
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
var floor = require('./floor');
|
||||
|
||||
var msPerDay = require('../helpers/timeConstants').msPerDay;
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.2
|
||||
|
||||
module.exports = function Day(t) {
|
||||
return floor(t / msPerDay);
|
||||
};
|
||||
+10
@@ -0,0 +1,10 @@
|
||||
'use strict';
|
||||
|
||||
var floor = require('./floor');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.3
|
||||
|
||||
module.exports = function DayFromYear(y) {
|
||||
return (365 * (y - 1970)) + floor((y - 1969) / 4) - floor((y - 1901) / 100) + floor((y - 1601) / 400);
|
||||
};
|
||||
|
||||
+11
@@ -0,0 +1,11 @@
|
||||
'use strict';
|
||||
|
||||
var Day = require('./Day');
|
||||
var DayFromYear = require('./DayFromYear');
|
||||
var YearFromTime = require('./YearFromTime');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.4
|
||||
|
||||
module.exports = function DayWithinYear(t) {
|
||||
return Day(t) - DayFromYear(YearFromTime(t));
|
||||
};
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
|
||||
var modulo = require('./modulo');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.3
|
||||
|
||||
module.exports = function DaysInYear(y) {
|
||||
if (modulo(y, 4) !== 0) {
|
||||
return 365;
|
||||
}
|
||||
if (modulo(y, 100) !== 0) {
|
||||
return 366;
|
||||
}
|
||||
if (modulo(y, 400) !== 0) {
|
||||
return 365;
|
||||
}
|
||||
return 366;
|
||||
};
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var isPropertyDescriptor = require('../helpers/records/property-descriptor');
|
||||
var DefineOwnProperty = require('../helpers/DefineOwnProperty');
|
||||
|
||||
var FromPropertyDescriptor = require('./FromPropertyDescriptor');
|
||||
var IsDataDescriptor = require('./IsDataDescriptor');
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
var SameValue = require('./SameValue');
|
||||
var ToPropertyDescriptor = require('./ToPropertyDescriptor');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-definepropertyorthrow
|
||||
|
||||
module.exports = function DefinePropertyOrThrow(O, P, desc) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
|
||||
var Desc = isPropertyDescriptor(desc) ? desc : ToPropertyDescriptor(desc);
|
||||
if (!isPropertyDescriptor(Desc)) {
|
||||
throw new $TypeError('Assertion failed: Desc is not a valid Property Descriptor');
|
||||
}
|
||||
|
||||
return DefineOwnProperty(
|
||||
IsDataDescriptor,
|
||||
SameValue,
|
||||
FromPropertyDescriptor,
|
||||
O,
|
||||
P,
|
||||
Desc
|
||||
);
|
||||
};
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-deletepropertyorthrow
|
||||
|
||||
module.exports = function DeletePropertyOrThrow(O, P) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
|
||||
// eslint-disable-next-line no-param-reassign
|
||||
var success = delete O[P];
|
||||
if (!success) {
|
||||
throw new $TypeError('Attempt to delete property failed.');
|
||||
}
|
||||
return success;
|
||||
};
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
'use strict';
|
||||
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var isArrayBuffer = require('is-array-buffer');
|
||||
|
||||
var IsDetachedBuffer = require('./IsDetachedBuffer');
|
||||
|
||||
var MessageChannel;
|
||||
try {
|
||||
// eslint-disable-next-line global-require
|
||||
MessageChannel = require('worker_threads').MessageChannel; // node 11.7+
|
||||
} catch (e) { /**/ }
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-detacharraybuffer
|
||||
|
||||
/* globals postMessage */
|
||||
|
||||
module.exports = function DetachArrayBuffer(arrayBuffer) {
|
||||
if (!isArrayBuffer(arrayBuffer)) {
|
||||
throw new $TypeError('Assertion failed: `arrayBuffer` must be an Object with an [[ArrayBufferData]] internal slot');
|
||||
}
|
||||
|
||||
if (!IsDetachedBuffer(arrayBuffer)) { // node v21.0.0+ throws when you structuredClone a detached buffer
|
||||
if (typeof structuredClone === 'function') {
|
||||
structuredClone(arrayBuffer, { transfer: [arrayBuffer] });
|
||||
} else if (typeof postMessage === 'function') {
|
||||
postMessage('', '/', [arrayBuffer]); // TODO: see if this might trigger listeners
|
||||
} else if (MessageChannel) {
|
||||
(new MessageChannel()).port1.postMessage(null, [arrayBuffer]);
|
||||
} else {
|
||||
throw new $SyntaxError('DetachArrayBuffer is not supported in this environment');
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
};
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var keys = require('object-keys');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-enumerableownnames
|
||||
|
||||
module.exports = function EnumerableOwnNames(O) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
|
||||
return keys(O);
|
||||
};
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var isPropertyDescriptor = require('../helpers/records/property-descriptor');
|
||||
var fromPropertyDescriptor = require('../helpers/fromPropertyDescriptor');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-frompropertydescriptor
|
||||
|
||||
module.exports = function FromPropertyDescriptor(Desc) {
|
||||
if (typeof Desc !== 'undefined' && !isPropertyDescriptor(Desc)) {
|
||||
throw new $TypeError('Assertion failed: `Desc` must be a Property Descriptor');
|
||||
}
|
||||
|
||||
return fromPropertyDescriptor(Desc);
|
||||
};
|
||||
+24
@@ -0,0 +1,24 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var inspect = require('object-inspect');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-get-o-p
|
||||
|
||||
module.exports = function Get(O, P) {
|
||||
// 7.3.1.1
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
// 7.3.1.2
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key, got ' + inspect(P));
|
||||
}
|
||||
// 7.3.1.3
|
||||
return O[P];
|
||||
};
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
'use strict';
|
||||
|
||||
var getGlobal = require('globalthis/polyfill');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getglobalobject
|
||||
|
||||
module.exports = function GetGlobalObject() {
|
||||
return getGlobal();
|
||||
};
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var getIteratorMethod = require('../helpers/getIteratorMethod');
|
||||
var AdvanceStringIndex = require('./AdvanceStringIndex');
|
||||
var Call = require('./Call');
|
||||
var GetMethod = require('./GetMethod');
|
||||
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var ES = {
|
||||
AdvanceStringIndex: AdvanceStringIndex,
|
||||
GetMethod: GetMethod
|
||||
};
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getiterator
|
||||
|
||||
module.exports = function GetIterator(obj, method) {
|
||||
var actualMethod = method;
|
||||
if (arguments.length < 2) {
|
||||
actualMethod = getIteratorMethod(ES, obj);
|
||||
}
|
||||
var iterator = Call(actualMethod, obj);
|
||||
if (!isObject(iterator)) {
|
||||
throw new $TypeError('iterator must return an object');
|
||||
}
|
||||
|
||||
return iterator;
|
||||
};
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var GetV = require('./GetV');
|
||||
var IsCallable = require('./IsCallable');
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
var inspect = require('object-inspect');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getmethod
|
||||
|
||||
module.exports = function GetMethod(O, P) {
|
||||
// 7.3.9.1
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key');
|
||||
}
|
||||
|
||||
// 7.3.9.2
|
||||
var func = GetV(O, P);
|
||||
|
||||
// 7.3.9.4
|
||||
if (func == null) {
|
||||
return void 0;
|
||||
}
|
||||
|
||||
// 7.3.9.5
|
||||
if (!IsCallable(func)) {
|
||||
throw new $TypeError(inspect(P) + ' is not a function: ' + inspect(func));
|
||||
}
|
||||
|
||||
// 7.3.9.6
|
||||
return func;
|
||||
};
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var hasSymbols = require('has-symbols')();
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var $gOPN = GetIntrinsic('%Object.getOwnPropertyNames%', true);
|
||||
var $gOPS = hasSymbols && GetIntrinsic('%Object.getOwnPropertySymbols%', true);
|
||||
var keys = require('object-keys');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getownpropertykeys
|
||||
|
||||
module.exports = function GetOwnPropertyKeys(O, Type) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
if (Type === 'Symbol') {
|
||||
return $gOPS ? $gOPS(O) : [];
|
||||
}
|
||||
if (Type === 'String') {
|
||||
if (!$gOPN) {
|
||||
return keys(O);
|
||||
}
|
||||
return $gOPN(O);
|
||||
}
|
||||
throw new $TypeError('Assertion failed: `Type` must be `"String"` or `"Symbol"`');
|
||||
};
|
||||
+33
@@ -0,0 +1,33 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $Function = GetIntrinsic('%Function%');
|
||||
var $TypeError = require('es-errors/type');
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
|
||||
var Get = require('./Get');
|
||||
var IsConstructor = require('./IsConstructor');
|
||||
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getprototypefromconstructor
|
||||
|
||||
module.exports = function GetPrototypeFromConstructor(constructor, intrinsicDefaultProto) {
|
||||
var intrinsic = GetIntrinsic(intrinsicDefaultProto); // throws if not a valid intrinsic
|
||||
if (!isObject(intrinsic)) {
|
||||
throw new $TypeError('intrinsicDefaultProto must be an object');
|
||||
}
|
||||
if (!IsConstructor(constructor)) {
|
||||
throw new $TypeError('Assertion failed: `constructor` must be a constructor');
|
||||
}
|
||||
var proto = Get(constructor, 'prototype');
|
||||
if (!isObject(proto)) {
|
||||
if (!(constructor instanceof $Function)) {
|
||||
// ignore other realms, for now
|
||||
throw new $SyntaxError('cross-realm constructors not currently supported');
|
||||
}
|
||||
proto = intrinsic;
|
||||
}
|
||||
return proto;
|
||||
};
|
||||
+98
@@ -0,0 +1,98 @@
|
||||
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var $parseInt = GetIntrinsic('%parseInt%');
|
||||
|
||||
var inspect = require('object-inspect');
|
||||
var isInteger = require('math-intrinsics/isInteger');
|
||||
var regexTester = require('safe-regex-test');
|
||||
var callBound = require('call-bound');
|
||||
var every = require('../helpers/every');
|
||||
|
||||
var isDigit = regexTester(/^[0-9]$/);
|
||||
|
||||
var $charAt = callBound('String.prototype.charAt');
|
||||
var $strSlice = callBound('String.prototype.slice');
|
||||
|
||||
var IsArray = require('./IsArray');
|
||||
|
||||
var isStringOrUndefined = require('../helpers/isStringOrUndefined');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getsubstitution
|
||||
|
||||
// eslint-disable-next-line max-statements, max-lines-per-function
|
||||
module.exports = function GetSubstitution(matched, str, position, captures, replacement) {
|
||||
if (typeof matched !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `matched` must be a String');
|
||||
}
|
||||
var matchLength = matched.length;
|
||||
|
||||
if (typeof str !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `str` must be a String');
|
||||
}
|
||||
var stringLength = str.length;
|
||||
|
||||
if (!isInteger(position) || position < 0 || position > stringLength) {
|
||||
throw new $TypeError('Assertion failed: `position` must be a nonnegative integer, and less than or equal to the length of `string`, got ' + inspect(position));
|
||||
}
|
||||
|
||||
if (!IsArray(captures) || !every(captures, isStringOrUndefined)) {
|
||||
throw new $TypeError('Assertion failed: `captures` must be a List of Strings, got ' + inspect(captures));
|
||||
}
|
||||
|
||||
if (typeof replacement !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `replacement` must be a String');
|
||||
}
|
||||
|
||||
var tailPos = position + matchLength;
|
||||
var m = captures.length;
|
||||
|
||||
var result = '';
|
||||
for (var i = 0; i < replacement.length; i += 1) {
|
||||
// if this is a $, and it's not the end of the replacement
|
||||
var current = $charAt(replacement, i);
|
||||
var isLast = (i + 1) >= replacement.length;
|
||||
var nextIsLast = (i + 2) >= replacement.length;
|
||||
if (current === '$' && !isLast) {
|
||||
var next = $charAt(replacement, i + 1);
|
||||
if (next === '$') {
|
||||
result += '$';
|
||||
i += 1;
|
||||
} else if (next === '&') {
|
||||
result += matched;
|
||||
i += 1;
|
||||
} else if (next === '`') {
|
||||
result += position === 0 ? '' : $strSlice(str, 0, position - 1);
|
||||
i += 1;
|
||||
} else if (next === "'") {
|
||||
result += tailPos >= stringLength ? '' : $strSlice(str, tailPos);
|
||||
i += 1;
|
||||
} else {
|
||||
var nextNext = nextIsLast ? null : $charAt(replacement, i + 2);
|
||||
if (isDigit(next) && next !== '0' && (nextIsLast || !isDigit(nextNext))) {
|
||||
// $1 through $9, and not followed by a digit
|
||||
var n = $parseInt(next, 10);
|
||||
// if (n > m, impl-defined)
|
||||
result += n <= m && typeof captures[n - 1] === 'undefined' ? '' : captures[n - 1];
|
||||
i += 1;
|
||||
} else if (isDigit(next) && (nextIsLast || isDigit(nextNext))) {
|
||||
// $00 through $99
|
||||
var nn = next + nextNext;
|
||||
var nnI = $parseInt(nn, 10) - 1;
|
||||
// if nn === '00' or nn > m, impl-defined
|
||||
result += nn <= m && typeof captures[nnI] === 'undefined' ? '' : captures[nnI];
|
||||
i += 2;
|
||||
} else {
|
||||
result += '$';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// the final $, or else not a $
|
||||
result += $charAt(replacement, i);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
};
|
||||
+23
@@ -0,0 +1,23 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var inspect = require('object-inspect');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
// var ToObject = require('./ToObject');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getv
|
||||
|
||||
module.exports = function GetV(V, P) {
|
||||
// 7.3.2.1
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P is not a Property Key, got ' + inspect(P));
|
||||
}
|
||||
|
||||
// 7.3.2.2-3
|
||||
// var O = ToObject(V);
|
||||
|
||||
// 7.3.2.4
|
||||
return V[P];
|
||||
};
|
||||
+86
@@ -0,0 +1,86 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var $Uint8Array = GetIntrinsic('%Uint8Array%', true);
|
||||
|
||||
var isInteger = require('math-intrinsics/isInteger');
|
||||
var callBound = require('call-bound');
|
||||
|
||||
var $charAt = callBound('String.prototype.charAt');
|
||||
var $reverse = callBound('Array.prototype.reverse');
|
||||
var $slice = callBound('Array.prototype.slice');
|
||||
|
||||
var bytesAsFloat32 = require('../helpers/bytesAsFloat32');
|
||||
var bytesAsFloat64 = require('../helpers/bytesAsFloat64');
|
||||
var bytesAsInteger = require('../helpers/bytesAsInteger');
|
||||
var defaultEndianness = require('../helpers/defaultEndianness');
|
||||
|
||||
var IsDetachedBuffer = require('./IsDetachedBuffer');
|
||||
|
||||
var isArrayBuffer = require('is-array-buffer');
|
||||
var safeConcat = require('safe-array-concat');
|
||||
|
||||
var tableTAO = require('./tables/typed-array-objects');
|
||||
|
||||
var isUnsignedElementType = function isUnsignedElementType(type) { return $charAt(type, 0) === 'U'; };
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-getvaluefrombuffer
|
||||
|
||||
module.exports = function GetValueFromBuffer(arrayBuffer, byteIndex, type) {
|
||||
if (!isArrayBuffer(arrayBuffer)) {
|
||||
throw new $TypeError('Assertion failed: `arrayBuffer` must be an ArrayBuffer');
|
||||
}
|
||||
|
||||
if (!isInteger(byteIndex)) {
|
||||
throw new $TypeError('Assertion failed: `byteIndex` must be an integer');
|
||||
}
|
||||
|
||||
if (typeof type !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `type` must be a string');
|
||||
}
|
||||
|
||||
if (arguments.length > 3 && typeof arguments[3] !== 'boolean') {
|
||||
throw new $TypeError('Assertion failed: `isLittleEndian` must be a boolean, if present');
|
||||
}
|
||||
|
||||
if (IsDetachedBuffer(arrayBuffer)) {
|
||||
throw new $TypeError('Assertion failed: ArrayBuffer is detached'); // step 1
|
||||
}
|
||||
|
||||
// 2. Assert: There are sufficient bytes in arrayBuffer starting at byteIndex to represent a value of type.
|
||||
|
||||
if (byteIndex < 0) {
|
||||
throw new $TypeError('Assertion failed: `byteIndex` must be non-negative'); // step 3
|
||||
}
|
||||
|
||||
// 4. Let block be arrayBuffer’s [[ArrayBufferData]] internal slot.
|
||||
|
||||
var elementSize = tableTAO.size['$' + type]; // step 5
|
||||
if (!elementSize) {
|
||||
throw new $TypeError('Assertion failed: `type` must be one of ' + tableTAO.choices);
|
||||
}
|
||||
|
||||
// 6. Let rawValue be a List of elementSize containing, in order, the elementSize sequence of bytes starting with block[byteIndex].
|
||||
var rawValue = $slice(new $Uint8Array(arrayBuffer, byteIndex), 0, elementSize); // step 6
|
||||
|
||||
// 8. If isLittleEndian is not present, set isLittleEndian to either true or false. The choice is implementation dependent and should be the alternative that is most efficient for the implementation. An implementation must use the same value each time this step is executed and the same value must be used for the corresponding step in the SetValueInBuffer abstract operation.
|
||||
var isLittleEndian = arguments.length > 3 ? arguments[3] : defaultEndianness === 'little'; // step 7
|
||||
|
||||
if (!isLittleEndian) {
|
||||
$reverse(rawValue); // step 8
|
||||
}
|
||||
|
||||
var bytes = $slice(safeConcat([0, 0, 0, 0, 0, 0, 0, 0], rawValue), -elementSize);
|
||||
|
||||
if (type === 'Float32') { // step 3
|
||||
return bytesAsFloat32(bytes);
|
||||
}
|
||||
|
||||
if (type === 'Float64') { // step 4
|
||||
return bytesAsFloat64(bytes);
|
||||
}
|
||||
|
||||
return bytesAsInteger(bytes, elementSize, isUnsignedElementType(type), false);
|
||||
};
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var hasOwn = require('hasown');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-hasownproperty
|
||||
|
||||
module.exports = function HasOwnProperty(O, P) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: `O` must be an Object');
|
||||
}
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: `P` must be a Property Key');
|
||||
}
|
||||
return hasOwn(O, P);
|
||||
};
|
||||
+18
@@ -0,0 +1,18 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-hasproperty
|
||||
|
||||
module.exports = function HasProperty(O, P) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: `O` must be an Object');
|
||||
}
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: `P` must be a Property Key');
|
||||
}
|
||||
return P in O;
|
||||
};
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
'use strict';
|
||||
|
||||
var floor = require('./floor');
|
||||
var modulo = require('./modulo');
|
||||
|
||||
var timeConstants = require('../helpers/timeConstants');
|
||||
var msPerHour = timeConstants.msPerHour;
|
||||
var HoursPerDay = timeConstants.HoursPerDay;
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.10
|
||||
|
||||
module.exports = function HourFromTime(t) {
|
||||
return modulo(floor(t / msPerHour), HoursPerDay);
|
||||
};
|
||||
+19
@@ -0,0 +1,19 @@
|
||||
'use strict';
|
||||
|
||||
var $EvalError = require('es-errors/eval');
|
||||
|
||||
var DaysInYear = require('./DaysInYear');
|
||||
var YearFromTime = require('./YearFromTime');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-15.9.1.3
|
||||
|
||||
module.exports = function InLeapYear(t) {
|
||||
var days = DaysInYear(YearFromTime(t));
|
||||
if (days === 365) {
|
||||
return 0;
|
||||
}
|
||||
if (days === 366) {
|
||||
return 1;
|
||||
}
|
||||
throw new $EvalError('Assertion failed: there are not 365 or 366 days in a year, got: ' + days);
|
||||
};
|
||||
+30
@@ -0,0 +1,30 @@
|
||||
'use strict';
|
||||
|
||||
var GetIntrinsic = require('get-intrinsic');
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var $hasInstance = GetIntrinsic('%Symbol.hasInstance%', true);
|
||||
|
||||
var Call = require('./Call');
|
||||
var GetMethod = require('./GetMethod');
|
||||
var IsCallable = require('./IsCallable');
|
||||
var OrdinaryHasInstance = require('./OrdinaryHasInstance');
|
||||
var ToBoolean = require('./ToBoolean');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-instanceofoperator
|
||||
|
||||
module.exports = function InstanceofOperator(O, C) {
|
||||
if (!isObject(O)) {
|
||||
throw new $TypeError('Assertion failed: Type(O) is not Object');
|
||||
}
|
||||
var instOfHandler = $hasInstance ? GetMethod(C, $hasInstance) : void 0;
|
||||
if (typeof instOfHandler !== 'undefined') {
|
||||
return ToBoolean(Call(instOfHandler, C, [O]));
|
||||
}
|
||||
if (!IsCallable(C)) {
|
||||
throw new $TypeError('`C` is not Callable');
|
||||
}
|
||||
return OrdinaryHasInstance(C, O);
|
||||
};
|
||||
+57
@@ -0,0 +1,57 @@
|
||||
'use strict';
|
||||
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isNegativeZero = require('math-intrinsics/isNegativeZero');
|
||||
|
||||
var GetValueFromBuffer = require('./GetValueFromBuffer');
|
||||
var IsDetachedBuffer = require('./IsDetachedBuffer');
|
||||
var IsInteger = require('./IsInteger');
|
||||
|
||||
var typedArrayLength = require('typed-array-length');
|
||||
var typedArrayBuffer = require('typed-array-buffer');
|
||||
var typedArrayByteOffset = require('typed-array-byte-offset');
|
||||
var whichTypedArray = require('which-typed-array');
|
||||
|
||||
var tableTAO = require('./tables/typed-array-objects');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-integerindexedelementget
|
||||
|
||||
module.exports = function IntegerIndexedElementGet(O, index) {
|
||||
if (typeof index !== 'number') {
|
||||
throw new $TypeError('`index` must be a Number'); // step 1
|
||||
}
|
||||
var arrayTypeName = whichTypedArray(O); // step 10
|
||||
if (!arrayTypeName) {
|
||||
throw new $TypeError('`O` must be a TypedArray'); // step 2
|
||||
}
|
||||
if (arrayTypeName === 'BigInt64Array' || arrayTypeName === 'BigUint64Array') {
|
||||
throw new $SyntaxError('BigInt64Array and BigUint64Array do not exist until ES2020');
|
||||
}
|
||||
|
||||
var buffer = typedArrayBuffer(O); // step 3
|
||||
|
||||
if (IsDetachedBuffer(buffer)) {
|
||||
throw new $TypeError('`O` has a detached buffer'); // step 4
|
||||
}
|
||||
|
||||
if (!IsInteger(index) || isNegativeZero(index)) {
|
||||
return void undefined; // steps 5 - 6
|
||||
}
|
||||
|
||||
var length = typedArrayLength(O); // step 7
|
||||
|
||||
if (index < 0 || index >= length) {
|
||||
return void undefined; // step 8
|
||||
}
|
||||
|
||||
var offset = typedArrayByteOffset(O); // step 9
|
||||
|
||||
var elementType = tableTAO.name['$' + arrayTypeName]; // step 13
|
||||
|
||||
var elementSize = tableTAO.size['$' + elementType]; // step 11
|
||||
|
||||
var indexedPosition = (index * elementSize) + offset; // step 12
|
||||
|
||||
return GetValueFromBuffer(buffer, indexedPosition, elementType); // step 14
|
||||
};
|
||||
+62
@@ -0,0 +1,62 @@
|
||||
'use strict';
|
||||
|
||||
var $SyntaxError = require('es-errors/syntax');
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var IsDetachedBuffer = require('./IsDetachedBuffer');
|
||||
var IsInteger = require('./IsInteger');
|
||||
var SetValueInBuffer = require('./SetValueInBuffer');
|
||||
var ToNumber = require('./ToNumber');
|
||||
|
||||
var isNegativeZero = require('math-intrinsics/isNegativeZero');
|
||||
var typedArrayBuffer = require('typed-array-buffer');
|
||||
var typedArrayByteOffset = require('typed-array-byte-offset');
|
||||
var typedArrayLength = require('typed-array-length');
|
||||
var whichTypedArray = require('which-typed-array');
|
||||
|
||||
var tableTAO = require('./tables/typed-array-objects');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-integerindexedelementset
|
||||
|
||||
module.exports = function IntegerIndexedElementSet(O, index, value) {
|
||||
if (typeof index !== 'number') {
|
||||
throw new $TypeError('`index` must be a Number'); // step 1
|
||||
}
|
||||
var arrayTypeName = whichTypedArray(O); // step 12
|
||||
if (!arrayTypeName) {
|
||||
throw new $TypeError('`O` must be a TypedArray'); // step 2
|
||||
}
|
||||
if (arrayTypeName === 'BigInt64Array' || arrayTypeName === 'BigUint64Array') {
|
||||
throw new $SyntaxError('BigInt64Array and BigUint64Array do not exist until ES2020'); // step 2
|
||||
}
|
||||
|
||||
var numValue = ToNumber(value); // step 3
|
||||
|
||||
var buffer = typedArrayBuffer(O); // step 5
|
||||
|
||||
if (IsDetachedBuffer(buffer)) {
|
||||
throw new $TypeError('`O` has a detached buffer'); // step 6
|
||||
}
|
||||
|
||||
if (!IsInteger(index) || isNegativeZero(index)) {
|
||||
return false; // steps 7 - 8
|
||||
}
|
||||
|
||||
var length = typedArrayLength(O); // step 9
|
||||
|
||||
if (index < 0 || index >= length) {
|
||||
return false; // step 10
|
||||
}
|
||||
|
||||
var offset = typedArrayByteOffset(O); // step 11
|
||||
|
||||
var elementType = tableTAO.name['$' + arrayTypeName]; // step 15
|
||||
|
||||
var elementSize = tableTAO.size['$' + elementType]; // step 13
|
||||
|
||||
var indexedPosition = (index * elementSize) + offset; // step 14
|
||||
|
||||
SetValueInBuffer(buffer, indexedPosition, elementType, numValue); // step 16
|
||||
|
||||
return true; // step 17
|
||||
};
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
var isObject = require('es-object-atoms/isObject');
|
||||
|
||||
var Call = require('./Call');
|
||||
var CreateDataProperty = require('./CreateDataProperty');
|
||||
var EnumerableOwnNames = require('./EnumerableOwnNames');
|
||||
var Get = require('./Get');
|
||||
var IsArray = require('./IsArray');
|
||||
var ToLength = require('./ToLength');
|
||||
var ToString = require('./ToString');
|
||||
|
||||
var forEach = require('../helpers/forEach');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-internalizejsonproperty
|
||||
|
||||
// note: `reviver` was implicitly closed-over until ES2020, where it becomes a third argument
|
||||
|
||||
module.exports = function InternalizeJSONProperty(holder, name, reviver) {
|
||||
if (!isObject(holder)) {
|
||||
throw new $TypeError('Assertion failed: `holder` is not an Object');
|
||||
}
|
||||
if (typeof name !== 'string') {
|
||||
throw new $TypeError('Assertion failed: `name` is not a String');
|
||||
}
|
||||
if (typeof reviver !== 'function') {
|
||||
throw new $TypeError('Assertion failed: `reviver` is not a Function');
|
||||
}
|
||||
|
||||
var val = Get(holder, name); // step 1
|
||||
|
||||
if (isObject(val)) { // step 3
|
||||
var isArray = IsArray(val); // step 3.a
|
||||
if (isArray) { // step 3.c
|
||||
var I = 0; // step 3.c.i
|
||||
|
||||
var len = ToLength(Get(val, 'length')); // step 3.b.ii
|
||||
|
||||
while (I < len) { // step 3.b.iv
|
||||
var newElement = InternalizeJSONProperty(val, ToString(I), reviver); // step 3.b.iv.1
|
||||
|
||||
if (typeof newElement === 'undefined') { // step 3.b.iv.3
|
||||
delete val[ToString(I)]; // step 3.b.iv.3.a
|
||||
} else { // step 3.b.iv.4
|
||||
CreateDataProperty(val, ToString(I), newElement); // step 3.b.iv.4.a
|
||||
}
|
||||
|
||||
I += 1; // step 3.b.iv.6
|
||||
}
|
||||
} else {
|
||||
var keys = EnumerableOwnNames(val); // step 3.d.i
|
||||
|
||||
forEach(keys, function (P) { // step 3.d.iii
|
||||
// eslint-disable-next-line no-shadow
|
||||
var newElement = InternalizeJSONProperty(val, P, reviver); // step 3.d.iii.1
|
||||
|
||||
if (typeof newElement === 'undefined') { // step 3.d.iii.3
|
||||
delete val[P]; // step 3.d.iii.3.a
|
||||
} else { // step 3.d.iii.4
|
||||
CreateDataProperty(val, P, newElement); // step 3.d.iii.4.a
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return Call(reviver, holder, [name, val]); // step 4
|
||||
};
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var Call = require('./Call');
|
||||
var IsArray = require('./IsArray');
|
||||
var GetV = require('./GetV');
|
||||
var isPropertyKey = require('../helpers/isPropertyKey');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-invoke
|
||||
|
||||
module.exports = function Invoke(O, P) {
|
||||
if (!isPropertyKey(P)) {
|
||||
throw new $TypeError('Assertion failed: P must be a Property Key');
|
||||
}
|
||||
var argumentsList = arguments.length > 2 ? arguments[2] : [];
|
||||
if (!IsArray(argumentsList)) {
|
||||
throw new $TypeError('Assertion failed: optional `argumentsList`, if provided, must be a List');
|
||||
}
|
||||
var func = GetV(O, P);
|
||||
return Call(func, O, argumentsList);
|
||||
};
|
||||
+25
@@ -0,0 +1,25 @@
|
||||
'use strict';
|
||||
|
||||
var $TypeError = require('es-errors/type');
|
||||
|
||||
var hasOwn = require('hasown');
|
||||
|
||||
var isPropertyDescriptor = require('../helpers/records/property-descriptor');
|
||||
|
||||
// https://262.ecma-international.org/5.1/#sec-8.10.1
|
||||
|
||||
module.exports = function IsAccessorDescriptor(Desc) {
|
||||
if (typeof Desc === 'undefined') {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!isPropertyDescriptor(Desc)) {
|
||||
throw new $TypeError('Assertion failed: `Desc` must be a Property Descriptor');
|
||||
}
|
||||
|
||||
if (!hasOwn(Desc, '[[Get]]') && !hasOwn(Desc, '[[Set]]')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
+4
@@ -0,0 +1,4 @@
|
||||
'use strict';
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-isarray
|
||||
module.exports = require('../helpers/IsArray');
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
// http://262.ecma-international.org/5.1/#sec-9.11
|
||||
|
||||
module.exports = require('is-callable');
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
'use strict';
|
||||
|
||||
var ValidateAndApplyPropertyDescriptor = require('./ValidateAndApplyPropertyDescriptor');
|
||||
|
||||
// https://262.ecma-international.org/6.0/#sec-iscompatiblepropertydescriptor
|
||||
|
||||
module.exports = function IsCompatiblePropertyDescriptor(Extensible, Desc, Current) {
|
||||
return ValidateAndApplyPropertyDescriptor(undefined, undefined, Extensible, Desc, Current);
|
||||
};
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user