@samitouri / QOS-React / commits / 14156e56b9

Strip PropTypes checkers in production build (#8066)

* Strip PropTypes in production build * Revert "Warn if PropType function is called manually (#7132)" This reverts commit e75e8dcbebca63cff2b478d8f7ff58e0a2926465.

Dan Abramov committed Oct 24, 2016 at 18:43 UTC 14156e56b9cf18ac86963185c5af4abddf3ff811
7 files changed +280 -290
src/addons/link/__tests__/ReactLinkPropTypes-test.js
-5
@@ -14,7 +14,6 @@
14 var emptyFunction = require('emptyFunction');
15 var LinkPropTypes = require('ReactLink').PropTypes;
16 var React = require('React');
17 -var ReactPropTypesSecret = require('ReactPropTypesSecret');
17
18 var invalidMessage = 'Invalid prop `testProp` supplied to `testComponent`.';
19 var requiredMessage = 'The prop `testProp` is marked as required in ' +
@@ -27,8 +26,6 @@ function typeCheckFail(declaration, value, message) {
26 'testProp',
27 'testComponent',
28 'prop',
30 - null,
31 - ReactPropTypesSecret
29 );
30 expect(error instanceof Error).toBe(true);
31 expect(error.message).toBe(message);
@@ -41,8 +38,6 @@ function typeCheckPass(declaration, value) {
38 'testProp',
39 'testComponent',
40 'prop',
44 - null,
45 - ReactPropTypesSecret
41 );
42 expect(error).toBe(null);
43 }
src/isomorphic/classic/types/ReactPropTypes.js
+59 -76
@@ -13,10 +13,10 @@
13
14 var ReactElement = require('ReactElement');
15 var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames');
16 -var ReactPropTypesSecret = require('ReactPropTypesSecret');
16
17 var emptyFunction = require('emptyFunction');
18 var getIteratorFn = require('getIteratorFn');
19 +var invariant = require('invariant');
20 var warning = require('warning');
21
22 /**
@@ -68,25 +68,57 @@ var warning = require('warning');
68
69 var ANONYMOUS = '<<anonymous>>';
70
71 -var ReactPropTypes = {
72 - array: createPrimitiveTypeChecker('array'),
73 - bool: createPrimitiveTypeChecker('boolean'),
74 - func: createPrimitiveTypeChecker('function'),
75 - number: createPrimitiveTypeChecker('number'),
76 - object: createPrimitiveTypeChecker('object'),
77 - string: createPrimitiveTypeChecker('string'),
78 - symbol: createPrimitiveTypeChecker('symbol'),
79 -
80 - any: createAnyTypeChecker(),
81 - arrayOf: createArrayOfTypeChecker,
82 - element: createElementTypeChecker(),
83 - instanceOf: createInstanceTypeChecker,
84 - node: createNodeChecker(),
85 - objectOf: createObjectOfTypeChecker,
86 - oneOf: createEnumTypeChecker,
87 - oneOfType: createUnionTypeChecker,
88 - shape: createShapeTypeChecker,
89 -};
71 +if (__DEV__) {
72 + // Keep in sync with production version below
73 + var ReactPropTypes = {
74 + array: createPrimitiveTypeChecker('array'),
75 + bool: createPrimitiveTypeChecker('boolean'),
76 + func: createPrimitiveTypeChecker('function'),
77 + number: createPrimitiveTypeChecker('number'),
78 + object: createPrimitiveTypeChecker('object'),
79 + string: createPrimitiveTypeChecker('string'),
80 + symbol: createPrimitiveTypeChecker('symbol'),
81 +
82 + any: createAnyTypeChecker(),
83 + arrayOf: createArrayOfTypeChecker,
84 + element: createElementTypeChecker(),
85 + instanceOf: createInstanceTypeChecker,
86 + node: createNodeChecker(),
87 + objectOf: createObjectOfTypeChecker,
88 + oneOf: createEnumTypeChecker,
89 + oneOfType: createUnionTypeChecker,
90 + shape: createShapeTypeChecker,
91 + };
92 +} else {
93 + var productionTypeChecker = function() {
94 + invariant(
95 + false,
96 + 'React.PropTypes type checking code is stripped in production.'
97 + );
98 + };
99 + productionTypeChecker.isRequired = productionTypeChecker;
100 + var getProductionTypeChecker = () => productionTypeChecker;
101 + // Keep in sync with development version above
102 + var ReactPropTypes = {
103 + array: productionTypeChecker,
104 + bool: productionTypeChecker,
105 + func: productionTypeChecker,
106 + number: productionTypeChecker,
107 + object: productionTypeChecker,
108 + string: productionTypeChecker,
109 + symbol: productionTypeChecker,
110 +
111 + any: productionTypeChecker,
112 + arrayOf: getProductionTypeChecker,
113 + element: productionTypeChecker,
114 + instanceOf: getProductionTypeChecker,
115 + node: productionTypeChecker,
116 + objectOf: getProductionTypeChecker,
117 + oneOf: getProductionTypeChecker,
118 + oneOfType: getProductionTypeChecker,
119 + shape: getProductionTypeChecker,
120 + };
121 +}
122
123 /**
124 * inlined Object.is polyfill to avoid requiring consumers ship their own
@@ -120,42 +152,16 @@ function PropTypeError(message) {
152 PropTypeError.prototype = Error.prototype;
153
154 function createChainableTypeChecker(validate) {
123 - if (__DEV__) {
124 - var manualPropTypeCallCache = {};
125 - }
155 function checkType(
156 isRequired,
157 props,
158 propName,
159 componentName,
160 location,
132 - propFullName,
133 - secret
161 + propFullName
162 ) {
163 componentName = componentName || ANONYMOUS;
164 propFullName = propFullName || propName;
137 - if (__DEV__) {
138 - if (
139 - secret !== ReactPropTypesSecret &&
140 - typeof console !== 'undefined'
141 - ) {
142 - var cacheKey = `${componentName}:${propName}`;
143 - if (!manualPropTypeCallCache[cacheKey]) {
144 - warning(
145 - false,
146 - 'You are manually calling a React.PropTypes validation ' +
147 - 'function for the `%s` prop on `%s`. This is deprecated ' +
148 - 'and will not work in production with the next major version. ' +
149 - 'You may be seeing this warning due to a third-party PropTypes ' +
150 - 'library. See https://fb.me/react-warning-dont-call-proptypes ' +
151 - 'for details.',
152 - propFullName,
153 - componentName
154 - );
155 - manualPropTypeCallCache[cacheKey] = true;
156 - }
157 - }
158 - }
165 if (props[propName] == null) {
166 var locationName = ReactPropTypeLocationNames[location];
167 if (isRequired) {
@@ -172,13 +178,7 @@ function createChainableTypeChecker(validate) {
178 }
179 return null;
180 } else {
175 - return validate(
176 - props,
177 - propName,
178 - componentName,
179 - location,
180 - propFullName,
181 - );
181 + return validate(props, propName, componentName, location, propFullName);
182 }
183 }
184
@@ -189,14 +189,7 @@ function createChainableTypeChecker(validate) {
189 }
190
191 function createPrimitiveTypeChecker(expectedType) {
192 - function validate(
193 - props,
194 - propName,
195 - componentName,
196 - location,
197 - propFullName,
198 - secret
199 - ) {
192 + function validate(props, propName, componentName, location, propFullName) {
193 var propValue = props[propName];
194 var propType = getPropType(propValue);
195 if (propType !== expectedType) {
@@ -243,8 +236,7 @@ function createArrayOfTypeChecker(typeChecker) {
236 i,
237 componentName,
238 location,
246 - `${propFullName}[${i}]`,
247 - ReactPropTypesSecret
239 + `${propFullName}[${i}]`
240 );
241 if (error instanceof Error) {
242 return error;
@@ -335,8 +327,7 @@ function createObjectOfTypeChecker(typeChecker) {
327 key,
328 componentName,
329 location,
338 - `${propFullName}.${key}`,
339 - ReactPropTypesSecret
330 + `${propFullName}.${key}`
331 );
332 if (error instanceof Error) {
333 return error;
@@ -358,14 +349,7 @@ function createUnionTypeChecker(arrayOfTypeCheckers) {
349 for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
350 var checker = arrayOfTypeCheckers[i];
351 if (
361 - checker(
362 - props,
363 - propName,
364 - componentName,
365 - location,
366 - propFullName,
367 - ReactPropTypesSecret
368 - ) == null
352 + checker(props, propName, componentName, location, propFullName) == null
353 ) {
354 return null;
355 }
@@ -415,8 +399,7 @@ function createShapeTypeChecker(shapeTypes) {
399 key,
400 componentName,
401 location,
418 - `${propFullName}.${key}`,
419 - ReactPropTypesSecret
402 + `${propFullName}.${key}`
403 );
404 if (error) {
405 return error;
src/isomorphic/classic/types/__tests__/ReactPropTypes-test.js
-187
@@ -15,7 +15,6 @@ var PropTypes;
15 var React;
16 var ReactFragment;
17 var ReactTestUtils;
18 -var ReactPropTypesSecret;
18
19 var Component;
20 var MyComponent;
@@ -27,8 +26,6 @@ function typeCheckFail(declaration, value, message) {
26 'testProp',
27 'testComponent',
28 'prop',
30 - null,
31 - ReactPropTypesSecret
29 );
30 expect(error instanceof Error).toBe(true);
31 expect(error.message).toBe(message);
@@ -45,8 +42,6 @@ function typeCheckFailRequiredValues(declaration) {
42 'testProp',
43 'testComponent',
44 'prop',
48 - null,
49 - ReactPropTypesSecret
45 );
46 expect(error1 instanceof Error).toBe(true);
47 expect(error1.message).toBe(specifiedButIsNullMsg);
@@ -56,8 +51,6 @@ function typeCheckFailRequiredValues(declaration) {
51 'testProp',
52 'testComponent',
53 'prop',
59 - null,
60 - ReactPropTypesSecret
54 );
55 expect(error2 instanceof Error).toBe(true);
56 expect(error2.message).toBe(unspecifiedMsg);
@@ -67,8 +60,6 @@ function typeCheckFailRequiredValues(declaration) {
60 'testProp',
61 'testComponent',
62 'prop',
70 - null,
71 - ReactPropTypesSecret
63 );
64 expect(error3 instanceof Error).toBe(true);
65 expect(error3.message).toBe(unspecifiedMsg);
@@ -81,38 +72,16 @@ function typeCheckPass(declaration, value) {
72 'testProp',
73 'testComponent',
74 'prop',
84 - null,
85 - ReactPropTypesSecret
75 );
76 expect(error).toBe(null);
77 }
78
90 -function expectWarningInDevelopment(declaration, value) {
91 - var props = {testProp: value};
92 - var propName = 'testProp' + Math.random().toString();
93 - var componentName = 'testComponent' + Math.random().toString();
94 - for (var i = 0; i < 3; i ++) {
95 - declaration(
96 - props,
97 - propName,
98 - componentName,
99 - 'prop'
100 - );
101 - }
102 - expect(console.error.calls.count()).toBe(1);
103 - expect(console.error.calls.argsFor(0)[0]).toContain(
104 - 'You are manually calling a React.PropTypes validation '
105 - );
106 - console.error.calls.reset();
107 -}
108 -
79 describe('ReactPropTypes', () => {
80 beforeEach(() => {
81 PropTypes = require('ReactPropTypes');
82 React = require('React');
83 ReactFragment = require('ReactFragment');
84 ReactTestUtils = require('ReactTestUtils');
115 - ReactPropTypesSecret = require('ReactPropTypesSecret');
85 });
86
87 describe('Primitive Types', () => {
@@ -184,52 +153,6 @@ describe('ReactPropTypes', () => {
153 it('should warn for missing required values', () => {
154 typeCheckFailRequiredValues(PropTypes.string.isRequired);
155 });
187 -
188 - it('should warn if called manually in development', () => {
189 - spyOn(console, 'error');
190 - expectWarningInDevelopment(PropTypes.array, /please/);
191 - expectWarningInDevelopment(PropTypes.array, []);
192 - expectWarningInDevelopment(PropTypes.array.isRequired, /please/);
193 - expectWarningInDevelopment(PropTypes.array.isRequired, []);
194 - expectWarningInDevelopment(PropTypes.array.isRequired, null);
195 - expectWarningInDevelopment(PropTypes.array.isRequired, undefined);
196 - expectWarningInDevelopment(PropTypes.bool, []);
197 - expectWarningInDevelopment(PropTypes.bool, true);
198 - expectWarningInDevelopment(PropTypes.bool.isRequired, []);
199 - expectWarningInDevelopment(PropTypes.bool.isRequired, true);
200 - expectWarningInDevelopment(PropTypes.bool.isRequired, null);
201 - expectWarningInDevelopment(PropTypes.bool.isRequired, undefined);
202 - expectWarningInDevelopment(PropTypes.func, false);
203 - expectWarningInDevelopment(PropTypes.func, function() {});
204 - expectWarningInDevelopment(PropTypes.func.isRequired, false);
205 - expectWarningInDevelopment(PropTypes.func.isRequired, function() {});
206 - expectWarningInDevelopment(PropTypes.func.isRequired, null);
207 - expectWarningInDevelopment(PropTypes.func.isRequired, undefined);
208 - expectWarningInDevelopment(PropTypes.number, function() {});
209 - expectWarningInDevelopment(PropTypes.number, 42);
210 - expectWarningInDevelopment(PropTypes.number.isRequired, function() {});
211 - expectWarningInDevelopment(PropTypes.number.isRequired, 42);
212 - expectWarningInDevelopment(PropTypes.number.isRequired, null);
213 - expectWarningInDevelopment(PropTypes.number.isRequired, undefined);
214 - expectWarningInDevelopment(PropTypes.string, 0);
215 - expectWarningInDevelopment(PropTypes.string, 'foo');
216 - expectWarningInDevelopment(PropTypes.string.isRequired, 0);
217 - expectWarningInDevelopment(PropTypes.string.isRequired, 'foo');
218 - expectWarningInDevelopment(PropTypes.string.isRequired, null);
219 - expectWarningInDevelopment(PropTypes.string.isRequired, undefined);
220 - expectWarningInDevelopment(PropTypes.symbol, 0);
221 - expectWarningInDevelopment(PropTypes.symbol, Symbol('Foo'));
222 - expectWarningInDevelopment(PropTypes.symbol.isRequired, 0);
223 - expectWarningInDevelopment(PropTypes.symbol.isRequired, Symbol('Foo'));
224 - expectWarningInDevelopment(PropTypes.symbol.isRequired, null);
225 - expectWarningInDevelopment(PropTypes.symbol.isRequired, undefined);
226 - expectWarningInDevelopment(PropTypes.object, '');
227 - expectWarningInDevelopment(PropTypes.object, {foo: 'bar'});
228 - expectWarningInDevelopment(PropTypes.object.isRequired, '');
229 - expectWarningInDevelopment(PropTypes.object.isRequired, {foo: 'bar'});
230 - expectWarningInDevelopment(PropTypes.object.isRequired, null);
231 - expectWarningInDevelopment(PropTypes.object.isRequired, undefined);
232 - });
156 });
157
158 describe('Any type', () => {
@@ -248,13 +171,6 @@ describe('ReactPropTypes', () => {
171 it('should warn for missing required values', () => {
172 typeCheckFailRequiredValues(PropTypes.any.isRequired);
173 });
251 -
252 - it('should warn if called manually in development', () => {
253 - spyOn(console, 'error');
254 - expectWarningInDevelopment(PropTypes.any, null);
255 - expectWarningInDevelopment(PropTypes.any.isRequired, null);
256 - expectWarningInDevelopment(PropTypes.any.isRequired, undefined);
257 - });
174 });
175
176 describe('ArrayOf Type', () => {
@@ -342,24 +258,6 @@ describe('ReactPropTypes', () => {
258 PropTypes.arrayOf(PropTypes.number).isRequired
259 );
260 });
345 -
346 - it('should warn if called manually in development', () => {
347 - spyOn(console, 'error');
348 - expectWarningInDevelopment(
349 - PropTypes.arrayOf({ foo: PropTypes.string }),
350 - { foo: 'bar' }
351 - );
352 - expectWarningInDevelopment(
353 - PropTypes.arrayOf(PropTypes.number),
354 - [1, 2, 'b']
355 - );
356 - expectWarningInDevelopment(
357 - PropTypes.arrayOf(PropTypes.number),
358 - {'0': 'maybe-array', length: 1}
359 - );
360 - expectWarningInDevelopment(PropTypes.arrayOf(PropTypes.number).isRequired, null);
361 - expectWarningInDevelopment(PropTypes.arrayOf(PropTypes.number).isRequired, undefined);
362 - });
261 });
262
263 describe('Component Type', () => {
@@ -432,18 +330,6 @@ describe('ReactPropTypes', () => {
330 it('should warn for missing required values', () => {
331 typeCheckFailRequiredValues(PropTypes.element.isRequired);
332 });
435 -
436 - it('should warn if called manually in development', () => {
437 - spyOn(console, 'error');
438 - expectWarningInDevelopment(PropTypes.element, [<div />, <div />]);
439 - expectWarningInDevelopment(PropTypes.element, <div />);
440 - expectWarningInDevelopment(PropTypes.element, 123);
441 - expectWarningInDevelopment(PropTypes.element, 'foo');
442 - expectWarningInDevelopment(PropTypes.element, false);
443 - expectWarningInDevelopment(PropTypes.element.isRequired, null);
444 - expectWarningInDevelopment(PropTypes.element.isRequired, undefined);
445 - });
446 -
333 });
334
335 describe('Instance Types', () => {
@@ -518,15 +404,6 @@ describe('ReactPropTypes', () => {
404 it('should warn for missing required values', () => {
405 typeCheckFailRequiredValues(PropTypes.instanceOf(String).isRequired);
406 });
521 -
522 - it('should warn if called manually in development', () => {
523 - spyOn(console, 'error');
524 - expectWarningInDevelopment(PropTypes.instanceOf(Date), {});
525 - expectWarningInDevelopment(PropTypes.instanceOf(Date), new Date());
526 - expectWarningInDevelopment(PropTypes.instanceOf(Date).isRequired, {});
527 - expectWarningInDevelopment(PropTypes.instanceOf(Date).isRequired, new Date());
528 - });
529 -
407 });
408
409 describe('React Component Types', () => {
@@ -625,16 +502,6 @@ describe('ReactPropTypes', () => {
502 it('should accept empty array for required props', () => {
503 typeCheckPass(PropTypes.node.isRequired, []);
504 });
628 -
629 - it('should warn if called manually in development', () => {
630 - spyOn(console, 'error');
631 - expectWarningInDevelopment(PropTypes.node, 'node');
632 - expectWarningInDevelopment(PropTypes.node, {});
633 - expectWarningInDevelopment(PropTypes.node.isRequired, 'node');
634 - expectWarningInDevelopment(PropTypes.node.isRequired, undefined);
635 - expectWarningInDevelopment(PropTypes.node.isRequired, undefined);
636 - });
637 -
505 });
506
507 describe('ObjectOf Type', () => {
@@ -737,21 +604,6 @@ describe('ReactPropTypes', () => {
604 PropTypes.objectOf(PropTypes.number).isRequired
605 );
606 });
740 -
741 - it('should warn if called manually in development', () => {
742 - spyOn(console, 'error');
743 - expectWarningInDevelopment(
744 - PropTypes.objectOf({ foo: PropTypes.string }),
745 - { foo: 'bar' }
746 - );
747 - expectWarningInDevelopment(
748 - PropTypes.objectOf(PropTypes.number),
749 - {a: 1, b: 2, c: 'b'}
750 - );
751 - expectWarningInDevelopment(PropTypes.objectOf(PropTypes.number), [1, 2]);
752 - expectWarningInDevelopment(PropTypes.objectOf(PropTypes.number), null);
753 - expectWarningInDevelopment(PropTypes.objectOf(PropTypes.number), undefined);
754 - });
607 });
608
609 describe('OneOf Types', () => {
@@ -808,13 +660,6 @@ describe('ReactPropTypes', () => {
660 it('should warn for missing required values', () => {
661 typeCheckFailRequiredValues(PropTypes.oneOf(['red', 'blue']).isRequired);
662 });
811 -
812 - it('should warn if called manually in development', () => {
813 - spyOn(console, 'error');
814 - expectWarningInDevelopment(PropTypes.oneOf(['red', 'blue']), true);
815 - expectWarningInDevelopment(PropTypes.oneOf(['red', 'blue']), null);
816 - expectWarningInDevelopment(PropTypes.oneOf(['red', 'blue']), undefined);
817 - });
663 });
664
665 describe('Union Types', () => {
@@ -879,23 +724,6 @@ describe('ReactPropTypes', () => {
724 PropTypes.oneOfType([PropTypes.string, PropTypes.number]).isRequired
725 );
726 });
882 -
883 - it('should warn if called manually in development', () => {
884 - spyOn(console, 'error');
885 - expectWarningInDevelopment(
886 - PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
887 - []
888 - );
889 - expectWarningInDevelopment(
890 - PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
891 - null
892 - );
893 - expectWarningInDevelopment(
894 - PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
895 - undefined
896 - );
897 - });
898 -
727 });
728
729 describe('Shape Types', () => {
@@ -975,21 +803,6 @@ describe('ReactPropTypes', () => {
803 PropTypes.shape({key: PropTypes.number}).isRequired
804 );
805 });
978 -
979 - it('should warn if called manually in development', () => {
980 - spyOn(console, 'error');
981 - expectWarningInDevelopment(PropTypes.shape({}), 'some string');
982 - expectWarningInDevelopment(PropTypes.shape({ foo: PropTypes.number }), { foo: 42 });
983 - expectWarningInDevelopment(
984 - PropTypes.shape({key: PropTypes.number}).isRequired,
985 - null
986 - );
987 - expectWarningInDevelopment(
988 - PropTypes.shape({key: PropTypes.number}).isRequired,
989 - undefined
990 - );
991 - expectWarningInDevelopment(PropTypes.element, <div />);
992 - });
806 });
807
808 describe('Symbol Type', () => {
src/isomorphic/classic/types/__tests__/ReactPropTypesProduction-test.js new
+220
@@ -0,0 +1,220 @@
1 +/**
2 + * Copyright 2013-present, Facebook, Inc.
3 + * All rights reserved.
4 + *
5 + * This source code is licensed under the BSD-style license found in the
6 + * LICENSE file in the root directory of this source tree. An additional grant
7 + * of patent rights can be found in the PATENTS file in the same directory.
8 + *
9 + * @emails react-core
10 + */
11 +
12 +'use strict';
13 +
14 +describe('ReactPropTypesProduction', function() {
15 + var oldProcess;
16 +
17 + var PropTypes;
18 + var React;
19 + var ReactPropTypeLocations;
20 + var ReactTestUtils;
21 +
22 + beforeEach(function() {
23 + __DEV__ = false;
24 + oldProcess = process;
25 + global.process = {env: {NODE_ENV: 'production'}};
26 +
27 + jest.resetModuleRegistry();
28 + PropTypes = require('ReactPropTypes');
29 + React = require('React');
30 + ReactPropTypeLocations = require('ReactPropTypeLocations');
31 + ReactTestUtils = require('ReactTestUtils');
32 + });
33 +
34 + afterEach(function() {
35 + __DEV__ = true;
36 + global.process = oldProcess;
37 + });
38 +
39 + function expectThrowsInProduction(declaration, value) {
40 + var props = {testProp: value};
41 + expect(() => {
42 + declaration(
43 + props,
44 + 'testProp',
45 + 'testComponent',
46 + ReactPropTypeLocations.prop
47 + );
48 + }).toThrowError(
49 + 'React.PropTypes type checking code is stripped in production.'
50 + );
51 + }
52 +
53 + describe('Primitive Types', function() {
54 + it('should be a no-op', function() {
55 + expectThrowsInProduction(PropTypes.array, /please/);
56 + expectThrowsInProduction(PropTypes.array.isRequired, /please/);
57 + expectThrowsInProduction(PropTypes.array.isRequired, null);
58 + expectThrowsInProduction(PropTypes.array.isRequired, undefined);
59 + expectThrowsInProduction(PropTypes.bool, []);
60 + expectThrowsInProduction(PropTypes.bool.isRequired, []);
61 + expectThrowsInProduction(PropTypes.bool.isRequired, null);
62 + expectThrowsInProduction(PropTypes.bool.isRequired, undefined);
63 + expectThrowsInProduction(PropTypes.func, false);
64 + expectThrowsInProduction(PropTypes.func.isRequired, false);
65 + expectThrowsInProduction(PropTypes.func.isRequired, null);
66 + expectThrowsInProduction(PropTypes.func.isRequired, undefined);
67 + expectThrowsInProduction(PropTypes.number, function() {});
68 + expectThrowsInProduction(PropTypes.number.isRequired, function() {});
69 + expectThrowsInProduction(PropTypes.number.isRequired, null);
70 + expectThrowsInProduction(PropTypes.number.isRequired, undefined);
71 + expectThrowsInProduction(PropTypes.string, 0);
72 + expectThrowsInProduction(PropTypes.string.isRequired, 0);
73 + expectThrowsInProduction(PropTypes.string.isRequired, null);
74 + expectThrowsInProduction(PropTypes.string.isRequired, undefined);
75 + expectThrowsInProduction(PropTypes.symbol, 0);
76 + expectThrowsInProduction(PropTypes.symbol.isRequired, 0);
77 + expectThrowsInProduction(PropTypes.symbol.isRequired, null);
78 + expectThrowsInProduction(PropTypes.symbol.isRequired, undefined);
79 + expectThrowsInProduction(PropTypes.object, '');
80 + expectThrowsInProduction(PropTypes.object.isRequired, '');
81 + expectThrowsInProduction(PropTypes.object.isRequired, null);
82 + expectThrowsInProduction(PropTypes.object.isRequired, undefined);
83 + });
84 + });
85 +
86 + describe('Any Type', function() {
87 + it('should be a no-op', function() {
88 + expectThrowsInProduction(PropTypes.any, null);
89 + expectThrowsInProduction(PropTypes.any.isRequired, null);
90 + expectThrowsInProduction(PropTypes.any.isRequired, undefined);
91 + });
92 + });
93 +
94 + describe('ArrayOf Type', function() {
95 + it('should be a no-op', function() {
96 + expectThrowsInProduction(
97 + PropTypes.arrayOf({ foo: PropTypes.string }),
98 + { foo: 'bar' }
99 + );
100 + expectThrowsInProduction(
101 + PropTypes.arrayOf(PropTypes.number),
102 + [1, 2, 'b']
103 + );
104 + expectThrowsInProduction(
105 + PropTypes.arrayOf(PropTypes.number),
106 + {'0': 'maybe-array', length: 1}
107 + );
108 + expectThrowsInProduction(PropTypes.arrayOf(PropTypes.number).isRequired, null);
109 + expectThrowsInProduction(PropTypes.arrayOf(PropTypes.number).isRequired, undefined);
110 + });
111 + });
112 +
113 + describe('Component Type', function() {
114 + it('should be a no-op', function() {
115 + expectThrowsInProduction(PropTypes.element, [<div />, <div />]);
116 + expectThrowsInProduction(PropTypes.element, 123);
117 + expectThrowsInProduction(PropTypes.element, 'foo');
118 + expectThrowsInProduction(PropTypes.element, false);
119 + expectThrowsInProduction(PropTypes.element.isRequired, null);
120 + expectThrowsInProduction(PropTypes.element.isRequired, undefined);
121 + });
122 + });
123 +
124 + describe('Instance Types', function() {
125 + it('should be a no-op', function() {
126 + expectThrowsInProduction(PropTypes.instanceOf(Date), {});
127 + expectThrowsInProduction(PropTypes.instanceOf(Date).isRequired, {});
128 + });
129 + });
130 +
131 + describe('React Component Types', function() {
132 + it('should be a no-op', function() {
133 + expectThrowsInProduction(PropTypes.node, {});
134 + expectThrowsInProduction(PropTypes.node.isRequired, null);
135 + expectThrowsInProduction(PropTypes.node.isRequired, undefined);
136 + });
137 + });
138 +
139 + describe('ObjectOf Type', function() {
140 + it('should be a no-op', function() {
141 + expectThrowsInProduction(
142 + PropTypes.objectOf({ foo: PropTypes.string }),
143 + { foo: 'bar' }
144 + );
145 + expectThrowsInProduction(
146 + PropTypes.objectOf(PropTypes.number),
147 + {a: 1, b: 2, c: 'b'}
148 + );
149 + expectThrowsInProduction(PropTypes.objectOf(PropTypes.number), [1, 2]);
150 + expectThrowsInProduction(PropTypes.objectOf(PropTypes.number), null);
151 + expectThrowsInProduction(PropTypes.objectOf(PropTypes.number), undefined);
152 + });
153 + });
154 +
155 + describe('OneOf Types', function() {
156 + it('should be a no-op', function() {
157 + expectThrowsInProduction(PropTypes.oneOf('red', 'blue'), 'red');
158 + expectThrowsInProduction(PropTypes.oneOf(['red', 'blue']), true);
159 + expectThrowsInProduction(PropTypes.oneOf(['red', 'blue']), null);
160 + expectThrowsInProduction(PropTypes.oneOf(['red', 'blue']), undefined);
161 + });
162 + });
163 +
164 + describe('Union Types', function() {
165 + it('should be a no-op', function() {
166 + expectThrowsInProduction(
167 + PropTypes.oneOfType(PropTypes.string, PropTypes.number),
168 + 'red'
169 + );
170 + expectThrowsInProduction(
171 + PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
172 + []
173 + );
174 + expectThrowsInProduction(
175 + PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
176 + null
177 + );
178 + expectThrowsInProduction(
179 + PropTypes.oneOfType([PropTypes.string, PropTypes.number]),
180 + undefined
181 + );
182 + });
183 + });
184 +
185 + describe('Shape Types', function() {
186 + it('should be a no-op', function() {
187 + expectThrowsInProduction(PropTypes.shape({}), 'some string');
188 + expectThrowsInProduction(
189 + PropTypes.shape({key: PropTypes.number}).isRequired,
190 + null
191 + );
192 + expectThrowsInProduction(
193 + PropTypes.shape({key: PropTypes.number}).isRequired,
194 + undefined
195 + );
196 + });
197 + });
198 +
199 + describe('Custom validator', function() {
200 + beforeEach(function() {
201 + jest.resetModuleRegistry();
202 + });
203 +
204 + it('should not have been called', function() {
205 + var spy = jest.fn();
206 + var Component = React.createClass({
207 + propTypes: {num: spy},
208 +
209 + render: function() {
210 + return <div />;
211 + },
212 + });
213 +
214 + var instance = <Component num={5} />;
215 + instance = ReactTestUtils.renderIntoDocument(instance);
216 +
217 + expect(spy).not.toBeCalled();
218 + });
219 + });
220 +});
src/renderers/dom/client/wrappers/LinkedValueUtils.js
-3
@@ -12,7 +12,6 @@
12 'use strict';
13
14 var React = require('React');
15 -var ReactPropTypesSecret = require('ReactPropTypesSecret');
15
16 var invariant = require('invariant');
17 var warning = require('warning');
@@ -110,8 +109,6 @@ var LinkedValueUtils = {
109 propName,
110 tagName,
111 'prop',
113 - null,
114 - ReactPropTypesSecret
112 );
113 }
114 if (error instanceof Error && !(error.message in loggedTypeFailures)) {
src/shared/types/ReactPropTypesSecret.js deleted
-17
@@ -1,17 +0,0 @@
1 -/**
2 - * Copyright 2013-present, Facebook, Inc.
3 - * All rights reserved.
4 - *
5 - * This source code is licensed under the BSD-style license found in the
6 - * LICENSE file in the root directory of this source tree. An additional grant
7 - * of patent rights can be found in the PATENTS file in the same directory.
8 - *
9 - * @flow
10 - * @providesModule ReactPropTypesSecret
11 - */
12 -
13 -'use strict';
14 -
15 -const ReactPropTypesSecret = 'SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED';
16 -
17 -module.exports = ReactPropTypesSecret;
src/shared/types/checkReactTypeSpec.js
+1 -2
@@ -12,7 +12,6 @@
12 'use strict';
13
14 var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames');
15 -var ReactPropTypesSecret = require('ReactPropTypesSecret');
15
16 var invariant = require('invariant');
17 var warning = require('warning');
@@ -73,7 +72,7 @@ function checkReactTypeSpec(
72 ReactPropTypeLocationNames[location],
73 typeSpecName
74 );
76 - error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location, null, ReactPropTypesSecret);
75 + error = typeSpecs[typeSpecName](values, typeSpecName, componentName, location);
76 } catch (ex) {
77 error = ex;
78 }