1 | var propTypes = require('prop-types');
|
2 |
|
3 | var types = exports.types = {};
|
4 |
|
5 | Object.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 |
|
12 | exports.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 |
|
23 | function 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 |
|
39 | types.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 |
|
49 | exports.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 | }
|