react-bootstrap
Version:
Bootstrap 3 components build with React
194 lines (159 loc) • 5.65 kB
JavaScript
;
Object.defineProperty(exports, '__esModule', {
value: true
});
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); }
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var ANONYMOUS = '<<anonymous>>';
var CustomPropTypes = {
isRequiredForA11y: function isRequiredForA11y(propType) {
return function (props, propName, componentName) {
if (props[propName] === null) {
return new Error('The prop `' + propName + '` is required to make ' + componentName + ' accessible ' + 'for users using assistive technologies such as screen readers `');
}
return propType(props, propName, componentName);
};
},
/**
* Checks whether a prop provides a DOM element
*
* The element can be provided in two forms:
* - Directly passed
* - Or passed an object that has a `render` method
*
* @param props
* @param propName
* @param componentName
* @returns {Error|undefined}
*/
mountable: createMountableChecker(),
/**
* Checks whether a prop provides a type of element.
*
* The type of element can be provided in two forms:
* - tag name (string)
* - a return value of React.createClass(...)
*
* @param props
* @param propName
* @param componentName
* @returns {Error|undefined}
*/
elementType: createElementTypeChecker(),
/**
* Checks whether a prop matches a key of an associated object
*
* @param props
* @param propName
* @param componentName
* @returns {Error|undefined}
*/
keyOf: createKeyOfChecker,
/**
* Checks if only one of the listed properties is in use. An error is given
* if multiple have a value
*
* @param props
* @param propName
* @param componentName
* @returns {Error|undefined}
*/
singlePropFrom: createSinglePropFromChecker,
all: all
};
function errMsg(props, propName, componentName, msgContinuation) {
return 'Invalid prop \'' + propName + '\' of value \'' + props[propName] + '\'' + (' supplied to \'' + componentName + '\'' + msgContinuation);
}
/**
* 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].render !== 'function' && props[propName].nodeType !== 1) {
return new Error(errMsg(props, propName, componentName, ', expected a DOM element or an object that has a `render` method'));
}
}
return createChainableTypeChecker(validate);
}
function createKeyOfChecker(obj) {
function validate(props, propName, componentName) {
var propValue = props[propName];
if (!obj.hasOwnProperty(propValue)) {
var valuesString = JSON.stringify(Object.keys(obj));
return new Error(errMsg(props, propName, componentName, ', expected one of ' + valuesString + '.'));
}
}
return createChainableTypeChecker(validate);
}
function createSinglePropFromChecker(arrOfProps) {
function validate(props, propName, componentName) {
var usedPropCount = arrOfProps.map(function (listedProp) {
return props[listedProp];
}).reduce(function (acc, curr) {
return acc + (curr !== undefined ? 1 : 0);
}, 0);
if (usedPropCount > 1) {
var _arrOfProps = _toArray(arrOfProps);
var first = _arrOfProps[0];
var others = _arrOfProps.slice(1);
var message = '' + others.join(', ') + ' and ' + first;
return new Error('Invalid prop \'' + propName + '\', only one of the following ' + ('may be provided: ' + message));
}
}
return validate;
}
function all(propTypes) {
if (propTypes === undefined) {
throw new Error('No validations provided');
}
if (!(propTypes instanceof Array)) {
throw new Error('Invalid argument must be an array');
}
if (propTypes.length === 0) {
throw new Error('No validations provided');
}
return function (props, propName, componentName) {
for (var i = 0; i < propTypes.length; i++) {
var result = propTypes[i](props, propName, componentName);
if (result !== undefined && result !== null) {
return result;
}
}
};
}
function createElementTypeChecker() {
function validate(props, propName, componentName) {
var errBeginning = errMsg(props, propName, componentName, '. Expected an Element `type`');
if (typeof props[propName] !== 'function') {
if (_react2['default'].isValidElement(props[propName])) {
return new Error(errBeginning + ', not an actual Element');
}
if (typeof props[propName] !== 'string') {
return new Error(errBeginning + ' such as a tag name or return value of React.createClass(...)');
}
}
}
return createChainableTypeChecker(validate);
}
exports['default'] = CustomPropTypes;
module.exports = exports['default'];