const ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED'; let loggedTypeFailures = {}; /** * Reset the history of which prop type warnings have been logged. */ export function resetPropWarnings() { loggedTypeFailures = {}; } /** * Assert that the values match with the type specs. * Error messages are memorized and will only be shown once. * * Adapted from https://github.com/facebook/prop-types/blob/master/checkPropTypes.js * * @param {object} typeSpecs Map of name to a ReactPropType * @param {object} values Runtime values that need to be type-checked * @param {string} location e.g. "prop", "context", "child context" * @param {string} componentName Name of the component for error messages. * @param {?Function} getStack Returns the component stack. */ export function checkPropTypes( typeSpecs, values, location, componentName, getStack ) { Object.keys(typeSpecs).forEach(typeSpecName => { let error; try { error = typeSpecs[typeSpecName]( values, typeSpecName, componentName, location, null, ReactPropTypesSecret ); } catch (e) { error = e; } if (error && !(error.message in loggedTypeFailures)) { loggedTypeFailures[error.message] = true; console.error( `Failed ${location} type: ${error.message}${(getStack && `\n${getStack()}`) || ''}` ); } }); }