react-bootstrap
Version:
Bootstrap 3 components build with React
64 lines (55 loc) • 1.81 kB
JavaScript
define(function (require, exports, module) {var React = require('react');
var ANONYMOUS = '<<anonymous>>';
var CustomPropTypes = {
/**
* Checks whether a prop provides a DOM element
*
* The element can be provided in two forms:
* - Directly passed
* - Or passed an object which has a `getDOMNode` method which will return the required DOM element
*
* @param props
* @param propName
* @param componentName
* @returns {Error|undefined}
*/
mountable: createMountableChecker()
};
/**
* Create chain-able isRequired validator
*
* Largely copied directly from:
* https://github.com/facebook/react/blob/0.11-stable/src/core/ReactPropTypes.js#L94
*/
function createChainableTypeChecker(validate) {
function checkType(isRequired, props, propName, componentName) {
componentName = componentName || ANONYMOUS;
if (props[propName] == null) {
if (isRequired) {
return new Error(
'Required prop `' + propName + '` was not specified in ' +
'`' + componentName + '`.'
);
}
} else {
return validate(props, propName, componentName);
}
}
var chainedCheckType = checkType.bind(null, false);
chainedCheckType.isRequired = checkType.bind(null, true);
return chainedCheckType;
}
function createMountableChecker() {
function validate(props, propName, componentName) {
if (typeof props[propName] !== 'object' ||
typeof props[propName].getDOMNode !== 'function' && props[propName].nodeType !== 1) {
return new Error(
'Invalid prop `' + propName + '` supplied to ' +
'`' + componentName + '`, expected a DOM element or an object that has a `getDOMNode` method'
);
}
}
return createChainableTypeChecker(validate);
}
module.exports = CustomPropTypes;
});