| 'use strict'; |
| |
| var ES = require('es-abstract/es2017'); |
| |
| var ThrowCompletion = function Throw(error) { |
| throw error; |
| }; |
| |
| var legacyAssign = function assign(obj, entries) { |
| for (var i = 0; i < entries.length; ++i) { |
| var entry = entries[i]; |
| if (ES.Type(entry) !== 'Object') { |
| throw new TypeError('iterator returned a non-object; entry expected'); |
| } |
| |
| var key = ES.Get(entry, '0'); |
| var value = ES.Get(entry, '1'); |
| var propertyKey = ES.ToPropertyKey(key); |
| ES.CreateDataPropertyOrThrow(obj, propertyKey, value); |
| } |
| }; |
| |
| /* global Symbol */ |
| |
| var hasSymbols = typeof Symbol === 'function' && typeof Symbol('foo') === 'symbol'; |
| |
| module.exports = function fromEntries(iterable) { |
| ES.RequireObjectCoercible(iterable); |
| |
| var obj = {}; |
| |
| // this part isn't in the spec, it's for a reasonable fallback for pre-ES6 environments |
| if (!hasSymbols) { |
| if (!ES.IsArray(iterable)) { |
| throw new TypeError('this environment lacks native Symbols, and can not support non-Array iterables'); |
| } |
| legacyAssign(obj, iterable); |
| return obj; |
| } |
| |
| /* |
| return ES.AddEntriesFromIterable(obj, iterable, ES.CreateBuiltinFunction('CreateDataPropertyOnObject')); |
| function adder(key, value) { |
| var O = this; |
| var propertyKey = ES.ToPropertyKey(key); |
| CreateDataPropertyOrThrow(O, propertyKey, value); |
| } |
| */ |
| |
| var iter = ES.GetIterator(iterable); |
| while (true) { // eslint-disable-line no-constant-condition |
| var next = ES.IteratorStep(iter); |
| if (next === false) { |
| return obj; |
| } |
| |
| var nextItem = ES.IteratorValue(next); |
| if (ES.Type(nextItem) !== 'Object') { |
| var error = new TypeError('iterator returned a non-object; entry expected'); |
| return ES.IteratorClose(iter, ThrowCompletion(error)); |
| } |
| |
| try { |
| var key = ES.Get(nextItem, '0'); |
| var value = ES.Get(nextItem, '1'); |
| var propertyKey = ES.ToPropertyKey(key); |
| ES.CreateDataPropertyOrThrow(obj, propertyKey, value); |
| } catch (e) { |
| return ES.IteratorClose(iter, ThrowCompletion(e)); |
| } |
| } |
| }; |