55 lines
1.3 KiB
JavaScript
55 lines
1.3 KiB
JavaScript
|
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()}`) || ''
|
||
|
}`
|
||
|
);
|
||
|
}
|
||
|
});
|
||
|
}
|