UNPKG

react-moment-proptypes

Version:
120 lines (96 loc) 3.81 kB
var messages = { invalidPredicate: '`predicate` must be a function', invalidPropValidator: '`propValidator` must be a function', requiredCore: 'is marked as required', invalidTypeCore: 'Invalid input type', predicateFailureCore: 'Failed to succeed with predicate', anonymousMessage: '<<anonymous>>', baseInvalidMessage: 'Invalid ', }; function constructPropValidatorVariations(propValidator) { if (typeof propValidator !== 'function') { throw new Error(messages.invalidPropValidator); } var requiredPropValidator = propValidator.bind(null, false, null); requiredPropValidator.isRequired = propValidator.bind(null, true, null); requiredPropValidator.withPredicate = function predicateApplication(predicate) { if (typeof predicate !== 'function') { throw new Error(messages.invalidPredicate); } var basePropValidator = propValidator.bind(null, false, predicate); basePropValidator.isRequired = propValidator.bind(null, true, predicate); return basePropValidator; }; return requiredPropValidator; } function createInvalidRequiredErrorMessage(propName, componentName, value) { return new Error( 'The prop `' + propName + '` ' + messages.requiredCore + ' in `' + componentName + '`, but its value is `' + value + '`.' ); } var independentGuardianValue = -1; function preValidationRequireCheck(isRequired, componentName, propFullName, propValue) { var isPropValueUndefined = typeof propValue === 'undefined'; var isPropValueNull = propValue === null; if (isRequired) { if (isPropValueUndefined) { return createInvalidRequiredErrorMessage(propFullName, componentName, 'undefined'); } else if (isPropValueNull) { return createInvalidRequiredErrorMessage(propFullName, componentName, 'null'); } } if (isPropValueUndefined || isPropValueNull) { return null; } return independentGuardianValue; } function createMomentChecker(type, typeValidator, validator, momentType) { function propValidator( isRequired, // Bound parameter to indicate with the propType is required predicate, // Bound parameter to allow user to add dynamic validation props, propName, componentName, location, propFullName ) { var propValue = props[ propName ]; var propType = typeof propValue; componentName = componentName || messages.anonymousMessage; propFullName = propFullName || propName; var preValidationRequireCheckValue = preValidationRequireCheck( isRequired, componentName, propFullName, propValue ); if (preValidationRequireCheckValue !== independentGuardianValue) { return preValidationRequireCheckValue; } if (typeValidator && !typeValidator(propValue)) { return new Error( messages.invalidTypeCore + ': `' + propName + '` of type `' + propType + '` ' + 'supplied to `' + componentName + '`, expected `' + type + '`.' ); } if (!validator(propValue)) { return new Error( messages.baseInvalidMessage + location + ' `' + propName + '` of type `' + propType + '` ' + 'supplied to `' + componentName + '`, expected `' + momentType + '`.' ); } if (predicate && !predicate(propValue)) { var predicateName = predicate.name || messages.anonymousMessage; return new Error( messages.baseInvalidMessage + location + ' `' + propName + '` of type `' + propType + '` ' + 'supplied to `' + componentName + '`. ' + messages.predicateFailureCore + ' `' + predicateName + '`.' ); } return null; } return constructPropValidatorVariations(propValidator); } module.exports = { constructPropValidatorVariations: constructPropValidatorVariations, createMomentChecker: createMomentChecker, messages: messages, };