es2019.js 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. 'use strict';
  2. var trimStart = require('string.prototype.trimleft');
  3. var trimEnd = require('string.prototype.trimright');
  4. var inspect = require('object-inspect');
  5. var ES2018 = require('./es2018');
  6. var assign = require('./helpers/assign');
  7. var GetIntrinsic = require('./GetIntrinsic');
  8. var $TypeError = GetIntrinsic('%TypeError%');
  9. var $Number = GetIntrinsic('%Number%');
  10. var MAX_SAFE_INTEGER = $Number.MAX_SAFE_INTEGER || Math.pow(2, 53) - 1;
  11. var ES2019 = assign(assign({}, ES2018), {
  12. // https://tc39.es/ecma262/#sec-add-entries-from-iterable
  13. AddEntriesFromIterable: function AddEntriesFromIterable(target, iterable, adder) {
  14. if (!this.IsCallable(adder)) {
  15. throw new $TypeError('Assertion failed: `adder` is not callable');
  16. }
  17. if (iterable == null) {
  18. throw new $TypeError('Assertion failed: `iterable` is present, and not nullish');
  19. }
  20. var iteratorRecord = this.GetIterator(iterable);
  21. while (true) { // eslint-disable-line no-constant-condition
  22. var next = this.IteratorStep(iteratorRecord);
  23. if (!next) {
  24. return target;
  25. }
  26. var nextItem = this.IteratorValue(next);
  27. if (this.Type(nextItem) !== 'Object') {
  28. var error = new $TypeError('iterator next must return an Object, got ' + inspect(nextItem));
  29. return this.IteratorClose(
  30. iteratorRecord,
  31. function () { throw error; } // eslint-disable-line no-loop-func
  32. );
  33. }
  34. try {
  35. var k = this.Get(nextItem, '0');
  36. var v = this.Get(nextItem, '1');
  37. this.Call(adder, target, [k, v]);
  38. } catch (e) {
  39. return this.IteratorClose(
  40. iteratorRecord,
  41. function () { throw e; } // eslint-disable-line no-loop-func
  42. );
  43. }
  44. }
  45. },
  46. // https://ecma-international.org/ecma-262/10.0/#sec-flattenintoarray
  47. // eslint-disable-next-line max-params, max-statements
  48. FlattenIntoArray: function FlattenIntoArray(target, source, sourceLen, start, depth) {
  49. var mapperFunction;
  50. if (arguments.length > 5) {
  51. mapperFunction = arguments[5];
  52. }
  53. var targetIndex = start;
  54. var sourceIndex = 0;
  55. while (sourceIndex < sourceLen) {
  56. var P = this.ToString(sourceIndex);
  57. var exists = this.HasProperty(source, P);
  58. if (exists === true) {
  59. var element = this.Get(source, P);
  60. if (typeof mapperFunction !== 'undefined') {
  61. if (arguments.length <= 6) {
  62. throw new $TypeError('Assertion failed: thisArg is required when mapperFunction is provided');
  63. }
  64. element = this.Call(mapperFunction, arguments[6], [element, sourceIndex, source]);
  65. }
  66. var shouldFlatten = false;
  67. if (depth > 0) {
  68. shouldFlatten = this.IsArray(element);
  69. }
  70. if (shouldFlatten) {
  71. var elementLen = this.ToLength(this.Get(element, 'length'));
  72. targetIndex = this.FlattenIntoArray(target, element, elementLen, targetIndex, depth - 1);
  73. } else {
  74. if (targetIndex >= MAX_SAFE_INTEGER) {
  75. throw new $TypeError('index too large');
  76. }
  77. this.CreateDataPropertyOrThrow(target, this.ToString(targetIndex), element);
  78. targetIndex += 1;
  79. }
  80. }
  81. sourceIndex += 1;
  82. }
  83. return targetIndex;
  84. },
  85. // https://ecma-international.org/ecma-262/10.0/#sec-trimstring
  86. TrimString: function TrimString(string, where) {
  87. var str = this.RequireObjectCoercible(string);
  88. var S = this.ToString(str);
  89. var T;
  90. if (where === 'start') {
  91. T = trimStart(S);
  92. } else if (where === 'end') {
  93. T = trimEnd(S);
  94. } else if (where === 'start+end') {
  95. T = trimStart(trimEnd(S));
  96. } else {
  97. throw new $TypeError('Assertion failed: invalid `where` value; must be "start", "end", or "start+end"');
  98. }
  99. return T;
  100. }
  101. });
  102. module.exports = ES2019;