| 'use strict'; |
| |
| var GetIntrinsic = require('get-intrinsic'); |
| |
| var callBound = require('call-bind/callBound'); |
| |
| var $TypeError = GetIntrinsic('%TypeError%'); |
| var $indexOf = callBound('Array.prototype.indexOf', true) || callBound('String.prototype.indexOf'); |
| var $push = callBound('Array.prototype.push'); |
| |
| var Get = require('./Get'); |
| var IsArray = require('./IsArray'); |
| var ToLength = require('./ToLength'); |
| var ToString = require('./ToString'); |
| var Type = require('./Type'); |
| |
| // https://ecma-international.org/ecma-262/6.0/#sec-createlistfromarraylike |
| module.exports = function CreateListFromArrayLike(obj) { |
| var elementTypes = arguments.length > 1 |
| ? arguments[1] |
| : ['Undefined', 'Null', 'Boolean', 'String', 'Symbol', 'Number', 'Object']; |
| |
| if (Type(obj) !== 'Object') { |
| 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'); |
| } |
| $push(list, next); |
| index += 1; |
| } |
| return list; |
| }; |