1 | var propTypes = require('react').PropTypes;
|
2 |
|
3 | var types = exports.types = {};
|
4 |
|
5 | Object.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 |
|
18 | if (types.element) {
|
19 | types.node = types.element;
|
20 | types.element = undefined;
|
21 | }
|
22 |
|
23 | exports.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 |
|
34 | function 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 |
|
50 | types.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 |
|
68 | exports.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 | }
|