UNPKG

react-bootstrap

Version:

Bootstrap 3 components build with React

114 lines (98 loc) 3.47 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); function _toArray(arr) { return Array.isArray(arr) ? arr : Array.from(arr); } 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(), /** * 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 }; /** * 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('Invalid prop `' + propName + '` supplied to ' + '`' + 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('Invalid prop \'' + propName + '\' of value \'' + propValue + '\' ' + ('supplied to \'' + 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; } exports['default'] = CustomPropTypes; module.exports = exports['default'];