UNPKG

1.74 kBJavaScriptView Raw
1var propTypes = require('prop-types');
2
3var types = exports.types = {};
4
5Object.keys(propTypes).forEach(function(key) {
6 types[key] = propTypes[key].isRequired || function(arg) {
7 return propTypes[key](arg).isRequired;
8 };
9 types[key].isOptional = propTypes[key];
10});
11
12exports.createCustomChecker = function(isValid) {
13 return function(props, propName, componentName, location, propFullName) {
14 if (!isValid(props[propName])) {
15 return new Error(
16 'Invalid `' + propName + '` supplied to `' + componentName + '`'
17 )
18 }
19 return null;
20 }
21}
22
23function keysDiff(o1, o2) {
24 var map1 = {};
25 var map2 = {};
26 for (var key in o1) if (Object.prototype.hasOwnProperty.call(o1, key)) map1[key] = true;
27 for (key in o2) if (Object.prototype.hasOwnProperty.call(o2, key)) {
28 map1[key] ? delete map1[key] : map2[key] = true;
29 }
30 var left = Object.keys(map1);
31 var right = Object.keys(map2);
32 if (left.length === 0 && right.length === 0) return null;
33 var errorMessages = [];
34 if (left.length) errorMessages.push('missing keys: ' + JSON.stringify(left));
35 if (right.length) errorMessages.push('extra keys: ' + JSON.stringify(right));
36 return errorMessages.join('\n');
37}
38
39types.exactShape = function(shape) {
40 return function(props, propName, componentName, location, propFullName) {
41 var diff = keysDiff(shape, props[propName]);
42 if (diff) {
43 return new Error(diff);
44 }
45 return types.shape(shape).apply(this, arguments);
46 }
47}
48
49exports.check = function(propTypeValidator) {
50 var curriedCheck = function(value) {
51 var testObj = { value: value };
52 return propTypeValidator(testObj, 'value', 'zan check');
53 };
54 return arguments.length > 1 ? curriedCheck(arguments[1]) : curriedCheck;
55}