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
}