heyujie
2021-06-07 8f8155aa4c83f7c2577ac123add550766b6a7ce3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
"use strict";
 
var resolveException    = require("../lib/resolve-exception")
  , resolveErrorMessage = require("../lib/resolve-error-message")
  , toShortString       = require("../lib/to-short-string")
  , ensurePlainFunction = require("../plain-function/ensure")
  , is                  = require("./is");
 
var invalidItemsLimit = 3;
 
module.exports = function (value/*, options*/) {
    var options = arguments[1];
    var mainErrorMessage =
        options && options.name
            ? "Expected an iterable for %n, received %v"
            : "%v is not expected iterable";
    if (!is(value, options)) return resolveException(value, mainErrorMessage, options);
    if (!options) return value;
 
    var ensureItem = ensurePlainFunction(options.ensureItem, { isOptional: true });
    if (ensureItem) {
        var coercedValue = [];
        var iterator = value[Symbol.iterator]();
        var item, invalidItems;
        while (!(item = iterator.next()).done) {
            var newItemValue;
            try {
                newItemValue = ensureItem(item.value);
            } catch (error) {
                if (!invalidItems) invalidItems = [];
                if (invalidItems.push(item.value) === invalidItemsLimit) break;
            }
            if (invalidItems) continue;
            coercedValue.push(newItemValue);
        }
        if (invalidItems) {
            var errorMessage =
                resolveErrorMessage(mainErrorMessage, value, options) +
                ".\n           Following items are invalid:";
            for (var i = 0; i < invalidItems.length; ++i) {
                errorMessage += "\n             - " + toShortString(invalidItems[i]);
            }
            throw new TypeError(errorMessage);
        }
        return coercedValue;
    }
 
    return value;
};