UNPKG

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