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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
"use strict";
 
var resolveException    = require("../lib/resolve-exception")
  , resolveErrorMessage = require("../lib/resolve-error-message")
  , ensurePlainFunction = require("../plain-function/ensure")
  , ensureArray         = require("../array/ensure")
  , is                  = require("./is");
 
var objHasOwnProperty = Object.prototype.hasOwnProperty, invalidItemsLimit = 3;
 
module.exports = function (value/*, options*/) {
    var options = arguments[1];
    var mainErrorMessage =
        options && options.name
            ? "Expected a plain object for %n, received %v"
            : "%v is not a plain object";
    if (!is(value)) return resolveException(value, mainErrorMessage, options);
    if (!options) return value;
 
    var invalidKeys, key, errorMessage;
    var allowedKeys = ensureArray(options.allowedKeys, { isOptional: true });
    if (allowedKeys) {
        for (key in value) {
            if (!objHasOwnProperty.call(value, key)) continue;
            if (allowedKeys.indexOf(key) > -1) continue;
            if (!invalidKeys) invalidKeys = [];
            if (invalidKeys.push(key) === invalidItemsLimit) break;
        }
        if (invalidKeys) {
            errorMessage =
                resolveErrorMessage(mainErrorMessage, value, options) +
                ".\n           Following keys are unexpected: " +
                invalidKeys.join(", ");
            throw new TypeError(errorMessage);
        }
    }
 
    var ensurePropertyValue = ensurePlainFunction(options.ensurePropertyValue, {
        isOptional: true
    });
    if (ensurePropertyValue) {
        var coercedValue = {};
        for (key in value) {
            if (!objHasOwnProperty.call(value, key)) continue;
            var coercedPropertyValue;
            try {
                coercedPropertyValue = ensurePropertyValue(value[key]);
            } catch (error) {
                if (!invalidKeys) invalidKeys = [];
                if (invalidKeys.push(key) === invalidItemsLimit) break;
            }
            if (invalidKeys) continue;
            coercedValue[key] = coercedPropertyValue;
        }
        if (invalidKeys) {
            errorMessage =
                resolveErrorMessage(mainErrorMessage, value, options) +
                ".\n           Values for following keys are invalid: " +
                invalidKeys.join(", ");
            throw new TypeError(errorMessage);
        }
 
        return coercedValue;
    }
 
    return value;
};