| /** |
| * Copyright (c) 2013-present, Facebook, Inc. |
| * |
| * This source code is licensed under the MIT license found in the |
| * LICENSE file in the root directory of this source tree. |
| */ |
| |
| 'use strict'; |
| |
| var printWarning = function() {}; |
| |
| if (process.env.NODE_ENV !== 'production') { |
| var ReactPropTypesSecret = require('./lib/ReactPropTypesSecret'); |
| var loggedTypeFailures = {}; |
| var has = Function.call.bind(Object.prototype.hasOwnProperty); |
| |
| printWarning = function(text) { |
| var message = 'Warning: ' + text; |
| if (typeof console !== 'undefined') { |
| console.error(message); |
| } |
| try { |
| // --- Welcome to debugging React --- |
| // This error was thrown as a convenience so that you can use this stack |
| // to find the callsite that caused this warning to fire. |
| throw new Error(message); |
| } catch (x) {} |
| }; |
| } |
| |
| /** |
| * Assert that the values match with the type specs. |
| * Error messages are memorized and will only be shown once. |
| * |
| * @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. |
| * @private |
| */ |
| function checkPropTypes(typeSpecs, values, location, componentName, getStack) { |
| if (process.env.NODE_ENV !== 'production') { |
| for (var typeSpecName in typeSpecs) { |
| if (has(typeSpecs, typeSpecName)) { |
| var error; |
| // Prop type validation may throw. In case they do, we don't want to |
| // fail the render phase where it didn't fail before. So we log it. |
| // After these have been cleaned up, we'll let them throw. |
| try { |
| // This is intentionally an invariant that gets caught. It's the same |
| // behavior as without this statement except with a better message. |
| if (typeof typeSpecs[typeSpecName] !== 'function') { |
| var err = Error( |
| (componentName || 'React class') + ': ' + location + ' type `' + typeSpecName + '` is invalid; ' + |
| 'it must be a function, usually from the `prop-types` package, but received `' + typeof typeSpecs[typeSpecName] + '`.' |
| ); |
| err.name = 'Invariant Violation'; |
| throw err; |
| } |
| error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret); |
| } catch (ex) { |
| error = ex; |
| } |
| if (error && !(error instanceof Error)) { |
| printWarning( |
| (componentName || 'React class') + ': type specification of ' + |
| location + ' `' + typeSpecName + '` is invalid; the type checker ' + |
| 'function must return `null` or an `Error` but returned a ' + typeof error + '. ' + |
| 'You may have forgotten to pass an argument to the type checker ' + |
| 'creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and ' + |
| 'shape all require an argument).' |
| ); |
| } |
| if (error instanceof Error && !(error.message in loggedTypeFailures)) { |
| // Only monitor this failure once because there tends to be a lot of the |
| // same error. |
| loggedTypeFailures[error.message] = true; |
| |
| var stack = getStack ? getStack() : ''; |
| |
| printWarning( |
| 'Failed ' + location + ' type: ' + error.message + (stack != null ? stack : '') |
| ); |
| } |
| } |
| } |
| } |
| } |
| |
| /** |
| * Resets warning cache when testing. |
| * |
| * @private |
| */ |
| checkPropTypes.resetWarningCache = function() { |
| if (process.env.NODE_ENV !== 'production') { |
| loggedTypeFailures = {}; |
| } |
| } |
| |
| module.exports = checkPropTypes; |