diff --git a/packages/create-subscription/src/createSubscription.js b/packages/create-subscription/src/createSubscription.js index 38febd017c..b8fc7425dd 100644 --- a/packages/create-subscription/src/createSubscription.js +++ b/packages/create-subscription/src/createSubscription.js @@ -36,14 +36,18 @@ export function createSubscription( }> { const {getCurrentValue, subscribe} = config; - warningWithoutStack( - typeof getCurrentValue === 'function', - 'Subscription must specify a getCurrentValue function', - ); - warningWithoutStack( - typeof subscribe === 'function', - 'Subscription must specify a subscribe function', - ); + if (__DEV__) { + warningWithoutStack( + typeof getCurrentValue === 'function', + 'Subscription must specify a getCurrentValue function', + ); + } + if (__DEV__) { + warningWithoutStack( + typeof subscribe === 'function', + 'Subscription must specify a subscribe function', + ); + } type Props = { children: (value: Value) => React$Element, diff --git a/packages/legacy-events/SyntheticEvent.js b/packages/legacy-events/SyntheticEvent.js index 78812c15db..8dae2867ec 100644 --- a/packages/legacy-events/SyntheticEvent.js +++ b/packages/legacy-events/SyntheticEvent.js @@ -284,16 +284,18 @@ function getPooledWarningPropertyDefinition(propName, getVal) { function warn(action, result) { const warningCondition = false; - warningWithoutStack( - warningCondition, - "This synthetic event is reused for performance reasons. If you're seeing this, " + - "you're %s `%s` on a released/nullified synthetic event. %s. " + - 'If you must keep the original synthetic event around, use event.persist(). ' + - 'See https://fb.me/react-event-pooling for more information.', - action, - propName, - result, - ); + if (__DEV__) { + warningWithoutStack( + warningCondition, + "This synthetic event is reused for performance reasons. If you're seeing this, " + + "you're %s `%s` on a released/nullified synthetic event. %s. " + + 'If you must keep the original synthetic event around, use event.persist(). ' + + 'See https://fb.me/react-event-pooling for more information.', + action, + propName, + result, + ); + } } } diff --git a/packages/react-dom/src/client/ReactDOM.js b/packages/react-dom/src/client/ReactDOM.js index b27de7a241..db21f2207d 100644 --- a/packages/react-dom/src/client/ReactDOM.js +++ b/packages/react-dom/src/client/ReactDOM.js @@ -144,13 +144,15 @@ const ReactDOM: Object = { unstable_createPortal(...args) { if (!didWarnAboutUnstableCreatePortal) { didWarnAboutUnstableCreatePortal = true; - lowPriorityWarningWithoutStack( - false, - 'The ReactDOM.unstable_createPortal() alias has been deprecated, ' + - 'and will be removed in React 17+. Update your code to use ' + - 'ReactDOM.createPortal() instead. It has the exact same API, ' + - 'but without the "unstable_" prefix.', - ); + if (__DEV__) { + lowPriorityWarningWithoutStack( + false, + 'The ReactDOM.unstable_createPortal() alias has been deprecated, ' + + 'and will be removed in React 17+. Update your code to use ' + + 'ReactDOM.createPortal() instead. It has the exact same API, ' + + 'but without the "unstable_" prefix.', + ); + } } return createPortal(...args); }, diff --git a/packages/react-dom/src/client/ReactDOMSelect.js b/packages/react-dom/src/client/ReactDOMSelect.js index 3bc982d77c..48f9e2e04c 100644 --- a/packages/react-dom/src/client/ReactDOMSelect.js +++ b/packages/react-dom/src/client/ReactDOMSelect.js @@ -49,21 +49,25 @@ function checkSelectPropTypes(props) { } const isArray = Array.isArray(props[propName]); if (props.multiple && !isArray) { - warning( - false, - 'The `%s` prop supplied to must be an array if ' + + '`multiple` is true.%s', + propName, + getDeclarationErrorAddendum(), + ); + } } else if (!props.multiple && isArray) { - warning( - false, - 'The `%s` prop supplied to must be a scalar ' + + 'value if `multiple` is false.%s', + propName, + getDeclarationErrorAddendum(), + ); + } } } } diff --git a/packages/react-dom/src/server/ReactPartialRenderer.js b/packages/react-dom/src/server/ReactPartialRenderer.js index d6310caffa..3bb7692e4b 100644 --- a/packages/react-dom/src/server/ReactPartialRenderer.js +++ b/packages/react-dom/src/server/ReactPartialRenderer.js @@ -687,12 +687,14 @@ function resolve( ); } } else { - warningWithoutStack( - false, - '%s.getChildContext(): childContextTypes must be defined in order to ' + - 'use getChildContext().', - getComponentName(Component) || 'Unknown', - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s.getChildContext(): childContextTypes must be defined in order to ' + + 'use getChildContext().', + getComponentName(Component) || 'Unknown', + ); + } } } if (childContext) { diff --git a/packages/react-dom/src/server/ReactPartialRendererHooks.js b/packages/react-dom/src/server/ReactPartialRendererHooks.js index d054caf530..58c386c1d6 100644 --- a/packages/react-dom/src/server/ReactPartialRendererHooks.js +++ b/packages/react-dom/src/server/ReactPartialRendererHooks.js @@ -393,15 +393,17 @@ export function useLayoutEffect( if (__DEV__) { currentHookNameInDev = 'useLayoutEffect'; } - warning( - false, - 'useLayoutEffect does nothing on the server, because its effect cannot ' + - "be encoded into the server renderer's output format. This will lead " + - 'to a mismatch between the initial, non-hydrated UI and the intended ' + - 'UI. To avoid this, useLayoutEffect should only be used in ' + - 'components that render exclusively on the client. ' + - 'See https://fb.me/react-uselayouteffect-ssr for common fixes.', - ); + if (__DEV__) { + warning( + false, + 'useLayoutEffect does nothing on the server, because its effect cannot ' + + "be encoded into the server renderer's output format. This will lead " + + 'to a mismatch between the initial, non-hydrated UI and the intended ' + + 'UI. To avoid this, useLayoutEffect should only be used in ' + + 'components that render exclusively on the client. ' + + 'See https://fb.me/react-uselayouteffect-ssr for common fixes.', + ); + } } function dispatchAction( diff --git a/packages/react-dom/src/shared/CSSPropertyOperations.js b/packages/react-dom/src/shared/CSSPropertyOperations.js index 38589fd19d..8adcb8d9c0 100644 --- a/packages/react-dom/src/shared/CSSPropertyOperations.js +++ b/packages/react-dom/src/shared/CSSPropertyOperations.js @@ -148,17 +148,19 @@ export function validateShorthandPropertyCollisionInDev( continue; } warnedAbout[warningKey] = true; - warning( - false, - '%s a style property during rerender (%s) when a ' + - 'conflicting property is set (%s) can lead to styling bugs. To ' + - "avoid this, don't mix shorthand and non-shorthand properties " + - 'for the same value; instead, replace the shorthand with ' + - 'separate values.', - isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', - originalKey, - correctOriginalKey, - ); + if (__DEV__) { + warning( + false, + '%s a style property during rerender (%s) when a ' + + 'conflicting property is set (%s) can lead to styling bugs. To ' + + "avoid this, don't mix shorthand and non-shorthand properties " + + 'for the same value; instead, replace the shorthand with ' + + 'separate values.', + isValueEmpty(styleUpdates[originalKey]) ? 'Removing' : 'Updating', + originalKey, + correctOriginalKey, + ); + } } } } diff --git a/packages/react-dom/src/shared/ReactDOMInvalidARIAHook.js b/packages/react-dom/src/shared/ReactDOMInvalidARIAHook.js index 59a7720c0a..e82f6485d4 100644 --- a/packages/react-dom/src/shared/ReactDOMInvalidARIAHook.js +++ b/packages/react-dom/src/shared/ReactDOMInvalidARIAHook.js @@ -31,22 +31,26 @@ function validateProperty(tagName, name) { // If this is an aria-* attribute, but is not listed in the known DOM // DOM properties, then it is an invalid aria-* attribute. if (correctName == null) { - warning( - false, - 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', - name, - ); + if (__DEV__) { + warning( + false, + 'Invalid ARIA attribute `%s`. ARIA attributes follow the pattern aria-* and must be lowercase.', + name, + ); + } warnedProperties[name] = true; return true; } // aria-* attributes should be lowercase; suggest the lowercase version. if (name !== correctName) { - warning( - false, - 'Invalid ARIA attribute `%s`. Did you mean `%s`?', - name, - correctName, - ); + if (__DEV__) { + warning( + false, + 'Invalid ARIA attribute `%s`. Did you mean `%s`?', + name, + correctName, + ); + } warnedProperties[name] = true; return true; } @@ -66,12 +70,14 @@ function validateProperty(tagName, name) { } // aria-* attributes should be lowercase; suggest the lowercase version. if (name !== standardName) { - warning( - false, - 'Unknown ARIA attribute `%s`. Did you mean `%s`?', - name, - standardName, - ); + if (__DEV__) { + warning( + false, + 'Unknown ARIA attribute `%s`. Did you mean `%s`?', + name, + standardName, + ); + } warnedProperties[name] = true; return true; } @@ -95,21 +101,25 @@ function warnInvalidARIAProps(type, props) { .join(', '); if (invalidProps.length === 1) { - warning( - false, - 'Invalid aria prop %s on <%s> tag. ' + - 'For details, see https://fb.me/invalid-aria-prop', - unknownPropString, - type, - ); + if (__DEV__) { + warning( + false, + 'Invalid aria prop %s on <%s> tag. ' + + 'For details, see https://fb.me/invalid-aria-prop', + unknownPropString, + type, + ); + } } else if (invalidProps.length > 1) { - warning( - false, - 'Invalid aria props %s on <%s> tag. ' + - 'For details, see https://fb.me/invalid-aria-prop', - unknownPropString, - type, - ); + if (__DEV__) { + warning( + false, + 'Invalid aria props %s on <%s> tag. ' + + 'For details, see https://fb.me/invalid-aria-prop', + unknownPropString, + type, + ); + } } } diff --git a/packages/react-dom/src/shared/ReactDOMNullInputValuePropHook.js b/packages/react-dom/src/shared/ReactDOMNullInputValuePropHook.js index 95f407b7da..5787ca0565 100644 --- a/packages/react-dom/src/shared/ReactDOMNullInputValuePropHook.js +++ b/packages/react-dom/src/shared/ReactDOMNullInputValuePropHook.js @@ -17,21 +17,25 @@ export function validateProperties(type, props) { if (props != null && props.value === null && !didWarnValueNull) { didWarnValueNull = true; if (type === 'select' && props.multiple) { - warning( - false, - '`value` prop on `%s` should not be null. ' + - 'Consider using an empty array when `multiple` is set to `true` ' + - 'to clear the component or `undefined` for uncontrolled components.', - type, - ); + if (__DEV__) { + warning( + false, + '`value` prop on `%s` should not be null. ' + + 'Consider using an empty array when `multiple` is set to `true` ' + + 'to clear the component or `undefined` for uncontrolled components.', + type, + ); + } } else { - warning( - false, - '`value` prop on `%s` should not be null. ' + - 'Consider using an empty string to clear the component or `undefined` ' + - 'for uncontrolled components.', - type, - ); + if (__DEV__) { + warning( + false, + '`value` prop on `%s` should not be null. ' + + 'Consider using an empty string to clear the component or `undefined` ' + + 'for uncontrolled components.', + type, + ); + } } } } diff --git a/packages/react-dom/src/shared/ReactDOMUnknownPropertyHook.js b/packages/react-dom/src/shared/ReactDOMUnknownPropertyHook.js index 3498111261..60bb3c49f5 100644 --- a/packages/react-dom/src/shared/ReactDOMUnknownPropertyHook.js +++ b/packages/react-dom/src/shared/ReactDOMUnknownPropertyHook.js @@ -267,23 +267,27 @@ const warnUnknownProperties = function(type, props, canUseEventSystem) { .map(prop => '`' + prop + '`') .join(', '); if (unknownProps.length === 1) { - warning( - false, - 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + - 'or pass a string or number value to keep it in the DOM. ' + - 'For details, see https://fb.me/react-attribute-behavior', - unknownPropString, - type, - ); + if (__DEV__) { + warning( + false, + 'Invalid value for prop %s on <%s> tag. Either remove it from the element, ' + + 'or pass a string or number value to keep it in the DOM. ' + + 'For details, see https://fb.me/react-attribute-behavior', + unknownPropString, + type, + ); + } } else if (unknownProps.length > 1) { - warning( - false, - 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + - 'or pass a string or number value to keep them in the DOM. ' + - 'For details, see https://fb.me/react-attribute-behavior', - unknownPropString, - type, - ); + if (__DEV__) { + warning( + false, + 'Invalid values for props %s on <%s> tag. Either remove them from the element, ' + + 'or pass a string or number value to keep them in the DOM. ' + + 'For details, see https://fb.me/react-attribute-behavior', + unknownPropString, + type, + ); + } } }; diff --git a/packages/react-dom/src/test-utils/ReactTestUtils.js b/packages/react-dom/src/test-utils/ReactTestUtils.js index 58bfb04f8a..1aee6e0daf 100644 --- a/packages/react-dom/src/test-utils/ReactTestUtils.js +++ b/packages/react-dom/src/test-utils/ReactTestUtils.js @@ -361,12 +361,14 @@ const ReactTestUtils = { mockComponent: function(module, mockTagName) { if (!hasWarnedAboutDeprecatedMockComponent) { hasWarnedAboutDeprecatedMockComponent = true; - lowPriorityWarningWithoutStack( - false, - 'ReactTestUtils.mockComponent() is deprecated. ' + - 'Use shallow rendering or jest.mock() instead.\n\n' + - 'See https://fb.me/test-utils-mock-component for more information.', - ); + if (__DEV__) { + lowPriorityWarningWithoutStack( + false, + 'ReactTestUtils.mockComponent() is deprecated. ' + + 'Use shallow rendering or jest.mock() instead.\n\n' + + 'See https://fb.me/test-utils-mock-component for more information.', + ); + } } mockTagName = mockTagName || module.mockTagName || 'div'; diff --git a/packages/react-native-renderer/src/NativeMethodsMixin.js b/packages/react-native-renderer/src/NativeMethodsMixin.js index 27d928cee4..823ccd3fe5 100644 --- a/packages/react-native-renderer/src/NativeMethodsMixin.js +++ b/packages/react-native-renderer/src/NativeMethodsMixin.js @@ -179,12 +179,14 @@ export default function( } if (maybeInstance.canonical) { - warningWithoutStack( - false, - 'Warning: measureLayout on components using NativeMethodsMixin ' + - 'or ReactNative.NativeComponent is not currently supported in Fabric. ' + - 'measureLayout must be called on a native ref. Consider using forwardRef.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: measureLayout on components using NativeMethodsMixin ' + + 'or ReactNative.NativeComponent is not currently supported in Fabric. ' + + 'measureLayout must be called on a native ref. Consider using forwardRef.', + ); + } return; } else { let relativeNode; @@ -197,10 +199,12 @@ export default function( } if (relativeNode == null) { - warningWithoutStack( - false, - 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', + ); + } return; } @@ -243,10 +247,12 @@ export default function( } if (maybeInstance.canonical) { - warningWithoutStack( - false, - 'Warning: setNativeProps is not currently supported in Fabric', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: setNativeProps is not currently supported in Fabric', + ); + } return; } diff --git a/packages/react-native-renderer/src/ReactFabric.js b/packages/react-native-renderer/src/ReactFabric.js index ba4c6306b7..d8e9ec6d58 100644 --- a/packages/react-native-renderer/src/ReactFabric.js +++ b/packages/react-native-renderer/src/ReactFabric.js @@ -165,11 +165,13 @@ const ReactFabric: ReactFabricType = { handle._nativeTag == null || handle._internalInstanceHandle == null; if (invalid) { - warningWithoutStack( - !invalid, - "dispatchCommand was called with a ref that isn't a " + - 'native component. Use React.forwardRef to get access to the underlying native component', - ); + if (__DEV__) { + warningWithoutStack( + !invalid, + "dispatchCommand was called with a ref that isn't a " + + 'native component. Use React.forwardRef to get access to the underlying native component', + ); + } return; } diff --git a/packages/react-native-renderer/src/ReactFabricHostConfig.js b/packages/react-native-renderer/src/ReactFabricHostConfig.js index 0731867150..8c1afecaf8 100644 --- a/packages/react-native-renderer/src/ReactFabricHostConfig.js +++ b/packages/react-native-renderer/src/ReactFabricHostConfig.js @@ -159,10 +159,12 @@ class ReactFabricHostComponent { typeof relativeToNativeNode === 'number' || !(relativeToNativeNode instanceof ReactFabricHostComponent) ) { - warningWithoutStack( - false, - 'Warning: ref.measureLayout must be called with a ref to a native component.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: ref.measureLayout must be called with a ref to a native component.', + ); + } return; } @@ -176,10 +178,12 @@ class ReactFabricHostComponent { } setNativeProps(nativeProps: Object) { - warningWithoutStack( - false, - 'Warning: setNativeProps is not currently supported in Fabric', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: setNativeProps is not currently supported in Fabric', + ); + } return; } diff --git a/packages/react-native-renderer/src/ReactNativeComponent.js b/packages/react-native-renderer/src/ReactNativeComponent.js index 52dfab9589..d9eb73b4b8 100644 --- a/packages/react-native-renderer/src/ReactNativeComponent.js +++ b/packages/react-native-renderer/src/ReactNativeComponent.js @@ -190,12 +190,14 @@ export default function( } if (maybeInstance.canonical) { - warningWithoutStack( - false, - 'Warning: measureLayout on components using NativeMethodsMixin ' + - 'or ReactNative.NativeComponent is not currently supported in Fabric. ' + - 'measureLayout must be called on a native ref. Consider using forwardRef.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: measureLayout on components using NativeMethodsMixin ' + + 'or ReactNative.NativeComponent is not currently supported in Fabric. ' + + 'measureLayout must be called on a native ref. Consider using forwardRef.', + ); + } return; } else { let relativeNode; @@ -208,10 +210,12 @@ export default function( } if (relativeNode == null) { - warningWithoutStack( - false, - 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', + ); + } return; } @@ -254,10 +258,12 @@ export default function( } if (maybeInstance.canonical) { - warningWithoutStack( - false, - 'Warning: setNativeProps is not currently supported in Fabric', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: setNativeProps is not currently supported in Fabric', + ); + } return; } diff --git a/packages/react-native-renderer/src/ReactNativeFiberHostComponent.js b/packages/react-native-renderer/src/ReactNativeFiberHostComponent.js index 4bee7c7e10..dfe9d12617 100644 --- a/packages/react-native-renderer/src/ReactNativeFiberHostComponent.js +++ b/packages/react-native-renderer/src/ReactNativeFiberHostComponent.js @@ -85,10 +85,12 @@ class ReactNativeFiberHostComponent { } if (relativeNode == null) { - warningWithoutStack( - false, - 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Warning: ref.measureLayout must be called with a node handle or a ref to a native component.', + ); + } return; } diff --git a/packages/react-native-renderer/src/ReactNativeRenderer.js b/packages/react-native-renderer/src/ReactNativeRenderer.js index 4e64cbc902..55c34304f4 100644 --- a/packages/react-native-renderer/src/ReactNativeRenderer.js +++ b/packages/react-native-renderer/src/ReactNativeRenderer.js @@ -172,11 +172,13 @@ const ReactNativeRenderer: ReactNativeType = { dispatchCommand(handle: any, command: string, args: Array) { if (handle._nativeTag == null) { - warningWithoutStack( - handle._nativeTag != null, - "dispatchCommand was called with a ref that isn't a " + - 'native component. Use React.forwardRef to get access to the underlying native component', - ); + if (__DEV__) { + warningWithoutStack( + handle._nativeTag != null, + "dispatchCommand was called with a ref that isn't a " + + 'native component. Use React.forwardRef to get access to the underlying native component', + ); + } return; } diff --git a/packages/react-reconciler/src/ReactChildFiber.js b/packages/react-reconciler/src/ReactChildFiber.js index fb94fe1df1..eb097266fb 100644 --- a/packages/react-reconciler/src/ReactChildFiber.js +++ b/packages/react-reconciler/src/ReactChildFiber.js @@ -243,12 +243,14 @@ function warnOnFunctionType() { } ownerHasFunctionTypeWarning[currentComponentErrorInfo] = true; - warning( - false, - 'Functions are not valid as a React child. This may happen if ' + - 'you return a Component instead of from render. ' + - 'Or maybe you meant to call this function rather than return it.', - ); + if (__DEV__) { + warning( + false, + 'Functions are not valid as a React child. This may happen if ' + + 'you return a Component instead of from render. ' + + 'Or maybe you meant to call this function rather than return it.', + ); + } } // This wrapper function exists because I expect to clone the code in each path diff --git a/packages/react-reconciler/src/ReactFiberBeginWork.js b/packages/react-reconciler/src/ReactFiberBeginWork.js index 1df6aa55bf..0c78e10d46 100644 --- a/packages/react-reconciler/src/ReactFiberBeginWork.js +++ b/packages/react-reconciler/src/ReactFiberBeginWork.js @@ -1398,11 +1398,13 @@ function mountIndeterminateComponent( function validateFunctionComponentInDev(workInProgress: Fiber, Component: any) { if (Component) { - warningWithoutStack( - !Component.childContextTypes, - '%s(...): childContextTypes cannot be defined on a function component.', - Component.displayName || Component.name || 'Component', - ); + if (__DEV__) { + warningWithoutStack( + !Component.childContextTypes, + '%s(...): childContextTypes cannot be defined on a function component.', + Component.displayName || Component.name || 'Component', + ); + } } if (workInProgress.ref !== null) { let info = ''; @@ -1418,13 +1420,15 @@ function validateFunctionComponentInDev(workInProgress: Fiber, Component: any) { } if (!didWarnAboutFunctionRefs[warningKey]) { didWarnAboutFunctionRefs[warningKey] = true; - warning( - false, - 'Function components cannot be given refs. ' + - 'Attempts to access this ref will fail. ' + - 'Did you mean to use React.forwardRef()?%s', - info, - ); + if (__DEV__) { + warning( + false, + 'Function components cannot be given refs. ' + + 'Attempts to access this ref will fail. ' + + 'Did you mean to use React.forwardRef()?%s', + info, + ); + } } } @@ -1435,12 +1439,14 @@ function validateFunctionComponentInDev(workInProgress: Fiber, Component: any) { const componentName = getComponentName(Component) || 'Unknown'; if (!didWarnAboutDefaultPropsOnFunctionComponent[componentName]) { - warningWithoutStack( - false, - '%s: Support for defaultProps will be removed from function components ' + - 'in a future major release. Use JavaScript default parameters instead.', - componentName, - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s: Support for defaultProps will be removed from function components ' + + 'in a future major release. Use JavaScript default parameters instead.', + componentName, + ); + } didWarnAboutDefaultPropsOnFunctionComponent[componentName] = true; } } @@ -1449,11 +1455,13 @@ function validateFunctionComponentInDev(workInProgress: Fiber, Component: any) { const componentName = getComponentName(Component) || 'Unknown'; if (!didWarnAboutGetDerivedStateOnFunctionComponent[componentName]) { - warningWithoutStack( - false, - '%s: Function components do not support getDerivedStateFromProps.', - componentName, - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s: Function components do not support getDerivedStateFromProps.', + componentName, + ); + } didWarnAboutGetDerivedStateOnFunctionComponent[componentName] = true; } } @@ -1465,11 +1473,13 @@ function validateFunctionComponentInDev(workInProgress: Fiber, Component: any) { const componentName = getComponentName(Component) || 'Unknown'; if (!didWarnAboutContextTypeOnFunctionComponent[componentName]) { - warningWithoutStack( - false, - '%s: Function components do not support contextType.', - componentName, - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s: Function components do not support contextType.', + componentName, + ); + } didWarnAboutContextTypeOnFunctionComponent[componentName] = true; } } diff --git a/packages/react-reconciler/src/ReactFiberReconciler.js b/packages/react-reconciler/src/ReactFiberReconciler.js index 6ebac0dace..e33a35c26f 100644 --- a/packages/react-reconciler/src/ReactFiberReconciler.js +++ b/packages/react-reconciler/src/ReactFiberReconciler.js @@ -280,12 +280,14 @@ export function updateContainer( callback = callback === undefined ? null : callback; if (callback !== null) { - warningWithoutStack( - typeof callback === 'function', - 'render(...): Expected the last optional `callback` argument to be a ' + - 'function. Instead received: %s.', - callback, - ); + if (__DEV__) { + warningWithoutStack( + typeof callback === 'function', + 'render(...): Expected the last optional `callback` argument to be a ' + + 'function. Instead received: %s.', + callback, + ); + } update.callback = callback; } diff --git a/packages/react-test-renderer/src/ReactShallowRenderer.js b/packages/react-test-renderer/src/ReactShallowRenderer.js index 6da6467698..8460e9912e 100644 --- a/packages/react-test-renderer/src/ReactShallowRenderer.js +++ b/packages/react-test-renderer/src/ReactShallowRenderer.js @@ -61,29 +61,33 @@ function areHookInputsEqual( prevDeps: Array | null, ) { if (prevDeps === null) { - warning( - false, - '%s received a final argument during this render, but not during ' + - 'the previous render. Even though the final argument is optional, ' + - 'its type cannot change between renders.', - currentHookNameInDev, - ); + if (__DEV__) { + warning( + false, + '%s received a final argument during this render, but not during ' + + 'the previous render. Even though the final argument is optional, ' + + 'its type cannot change between renders.', + currentHookNameInDev, + ); + } return false; } // Don't bother comparing lengths in prod because these arrays should be // passed inline. if (nextDeps.length !== prevDeps.length) { - warning( - false, - 'The final argument passed to %s changed size between renders. The ' + - 'order and size of this array must remain constant.\n\n' + - 'Previous: %s\n' + - 'Incoming: %s', - currentHookNameInDev, - `[${nextDeps.join(', ')}]`, - `[${prevDeps.join(', ')}]`, - ); + if (__DEV__) { + warning( + false, + 'The final argument passed to %s changed size between renders. The ' + + 'order and size of this array must remain constant.\n\n' + + 'Previous: %s\n' + + 'Incoming: %s', + currentHookNameInDev, + `[${nextDeps.join(', ')}]`, + `[${prevDeps.join(', ')}]`, + ); + } } for (let i = 0; i < prevDeps.length && i < nextDeps.length; i++) { if (is(nextDeps[i], prevDeps[i])) { diff --git a/packages/react/src/ReactElement.js b/packages/react/src/ReactElement.js index e900527b53..70f82848dc 100644 --- a/packages/react/src/ReactElement.js +++ b/packages/react/src/ReactElement.js @@ -50,14 +50,16 @@ function defineKeyPropWarningGetter(props, displayName) { const warnAboutAccessingKey = function() { if (!specialPropKeyWarningShown) { specialPropKeyWarningShown = true; - warningWithoutStack( - false, - '%s: `key` is not a prop. Trying to access it will result ' + - 'in `undefined` being returned. If you need to access the same ' + - 'value within the child component, you should pass it as a different ' + - 'prop. (https://fb.me/react-special-props)', - displayName, - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s: `key` is not a prop. Trying to access it will result ' + + 'in `undefined` being returned. If you need to access the same ' + + 'value within the child component, you should pass it as a different ' + + 'prop. (https://fb.me/react-special-props)', + displayName, + ); + } } }; warnAboutAccessingKey.isReactWarning = true; @@ -71,14 +73,16 @@ function defineRefPropWarningGetter(props, displayName) { const warnAboutAccessingRef = function() { if (!specialPropRefWarningShown) { specialPropRefWarningShown = true; - warningWithoutStack( - false, - '%s: `ref` is not a prop. Trying to access it will result ' + - 'in `undefined` being returned. If you need to access the same ' + - 'value within the child component, you should pass it as a different ' + - 'prop. (https://fb.me/react-special-props)', - displayName, - ); + if (__DEV__) { + warningWithoutStack( + false, + '%s: `ref` is not a prop. Trying to access it will result ' + + 'in `undefined` being returned. If you need to access the same ' + + 'value within the child component, you should pass it as a different ' + + 'prop. (https://fb.me/react-special-props)', + displayName, + ); + } } }; warnAboutAccessingRef.isReactWarning = true; diff --git a/packages/react/src/ReactElementValidator.js b/packages/react/src/ReactElementValidator.js index 954d4e3be7..0a2d0e5f8e 100644 --- a/packages/react/src/ReactElementValidator.js +++ b/packages/react/src/ReactElementValidator.js @@ -225,18 +225,22 @@ function validatePropTypes(element) { setCurrentlyValidatingElement(null); } else if (type.PropTypes !== undefined && !propTypesMisspellWarningShown) { propTypesMisspellWarningShown = true; - warningWithoutStack( - false, - 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', - name || 'Unknown', - ); + if (__DEV__) { + warningWithoutStack( + false, + 'Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?', + name || 'Unknown', + ); + } } if (typeof type.getDefaultProps === 'function') { - warningWithoutStack( - type.getDefaultProps.isReactClassApproved, - 'getDefaultProps is only used on classic React.createClass ' + - 'definitions. Use a static property named `defaultProps` instead.', - ); + if (__DEV__) { + warningWithoutStack( + type.getDefaultProps.isReactClassApproved, + 'getDefaultProps is only used on classic React.createClass ' + + 'definitions. Use a static property named `defaultProps` instead.', + ); + } } } @@ -251,18 +255,22 @@ function validateFragmentProps(fragment) { for (let i = 0; i < keys.length; i++) { const key = keys[i]; if (key !== 'children' && key !== 'key') { - warning( - false, - 'Invalid prop `%s` supplied to `React.Fragment`. ' + - 'React.Fragment can only have `key` and `children` props.', - key, - ); + if (__DEV__) { + warning( + false, + 'Invalid prop `%s` supplied to `React.Fragment`. ' + + 'React.Fragment can only have `key` and `children` props.', + key, + ); + } break; } } if (fragment.ref !== null) { - warning(false, 'Invalid attribute `ref` supplied to `React.Fragment`.'); + if (__DEV__) { + warning(false, 'Invalid attribute `ref` supplied to `React.Fragment`.'); + } } setCurrentlyValidatingElement(null); @@ -313,14 +321,16 @@ export function jsxWithValidation( typeString = typeof type; } - warning( - false, - 'React.jsx: type is invalid -- expected a string (for ' + - 'built-in components) or a class/function (for composite ' + - 'components) but got: %s.%s', - typeString, - info, - ); + if (__DEV__) { + warning( + false, + 'React.jsx: type is invalid -- expected a string (for ' + + 'built-in components) or a class/function (for composite ' + + 'components) but got: %s.%s', + typeString, + info, + ); + } } const element = jsxDEV(type, props, key, source, self); @@ -350,12 +360,14 @@ export function jsxWithValidation( Object.freeze(children); } } else { - warning( - false, - 'React.jsx: Static children should always be an array. ' + - 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + - 'Use the Babel transform instead.', - ); + if (__DEV__) { + warning( + false, + 'React.jsx: Static children should always be an array. ' + + 'You are likely explicitly calling React.jsxs or React.jsxDEV. ' + + 'Use the Babel transform instead.', + ); + } } } else { validateChildKeys(children, type); @@ -364,12 +376,14 @@ export function jsxWithValidation( } if (hasOwnProperty.call(props, 'key')) { - warning( - false, - 'React.jsx: Spreading a key to JSX is a deprecated pattern. ' + - 'Explicitly pass a key after spreading props in your JSX call. ' + - 'E.g. ', - ); + if (__DEV__) { + warning( + false, + 'React.jsx: Spreading a key to JSX is a deprecated pattern. ' + + 'Explicitly pass a key after spreading props in your JSX call. ' + + 'E.g. ', + ); + } } if (type === REACT_FRAGMENT_TYPE) { @@ -431,14 +445,16 @@ export function createElementWithValidation(type, props, children) { typeString = typeof type; } - warning( - false, - 'React.createElement: type is invalid -- expected a string (for ' + - 'built-in components) or a class/function (for composite ' + - 'components) but got: %s.%s', - typeString, - info, - ); + if (__DEV__) { + warning( + false, + 'React.createElement: type is invalid -- expected a string (for ' + + 'built-in components) or a class/function (for composite ' + + 'components) but got: %s.%s', + typeString, + info, + ); + } } const element = createElement.apply(this, arguments);