UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

194 lines (159 loc) 5.65 kB
'use strict'; 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'];