1 | ;
|
2 |
|
3 | var isObject = require('./object'),
|
4 | isFunction = require('./function'),
|
5 | handleCurry = require('./utils/handleCurry');
|
6 |
|
7 | /**
|
8 | * Checks whether every enumerable property of object satisfies a predicate
|
9 | *
|
10 | * **Aliases** _objOf_
|
11 | *
|
12 | * @function objectOf
|
13 | *
|
14 | * @example
|
15 | * var is = require('predicates');
|
16 | *
|
17 | * var isObjectOfStrings = is.objectOf(is.string);
|
18 | *
|
19 | * isObjectOfStrings({key: 'value', key1: 'value'}); // true
|
20 | * // same as
|
21 | * is.objectOf(is.string, {key: 'value', key1: 'value'}); // true
|
22 | *
|
23 | * isObjectOfStrings({key: 1, key1: 'value'}); // false
|
24 | *
|
25 | * @param {Predicate} predicate
|
26 | * @param {Object} [object]
|
27 | * @param {...*} [additionalArgs] additional arguments passed to the predicate
|
28 | * @returns {(Boolean|Predicate)} returns bool if at least two arguments provided, otherwise a predicate
|
29 | */
|
30 | module.exports = function isObjectOf(predicate) {
|
31 | if (!isFunction(predicate)) {
|
32 | throw new TypeError('Predicate must be a function');
|
33 | }
|
34 |
|
35 | return handleCurry.call(this, arguments, function isObjectOfPredicate(object) {
|
36 | var args = Array.prototype.slice.call(arguments, 1);
|
37 | return isObject(object) && Object
|
38 | .keys(object)
|
39 | .every(function isObjectOfPredicateTestingProperty(key) {
|
40 | return predicate.apply(this, [object[key]].concat(args));
|
41 | }, this);
|
42 | });
|
43 | };
|