Source: propTypes.js

/**
 * @module InputRange/maxMinValuePropType
 */

import { isNumber, objectOf } from './util';

/**
 * A prop type accepting a range of numeric values or a single numeric value
 * @param {Object} props - React component props
 * @return {?Error} Return Error if validation fails
 */
export function maxMinValuePropType(props) {
  const maxValue = props.maxValue;
  const minValue = props.minValue;
  const value = props.value;
  const defaultValue = props.defaultValue;
  const isValueNumber = isNumber(value);
  const isDefaultValueNumber = isNumber(defaultValue);
  const isValueNumberObject = objectOf(value, isNumber);
  const isDefaultValueNumberObject = objectOf(defaultValue, isNumber);

  if (value === undefined) {
    return new Error('`value` must be defined');
  }

  if (!isValueNumber && !isDefaultValueNumber &&
      !isValueNumberObject && !isDefaultValueNumberObject) {
    return new Error('`value` or `defaultValue` must be a number or an array');
  }

  if (minValue >= maxValue) {
    return new Error('`minValue` must be smaller than `maxValue`');
  }

  if (maxValue <= minValue) {
    return new Error('`maxValue` must be larger than `minValue`');
  }

  if (value < minValue || value > maxValue) {
    return new Error('`value` must be within `minValue` and `maxValue`');
  }
}