Skip to content

Commit 14156e5

Browse files
authored
Strip PropTypes checkers in production build (#8066)
* Strip PropTypes in production build * Revert "Warn if PropType function is called manually (#7132)" This reverts commit e75e8dc.
1 parent e1ee94c commit 14156e5

File tree

7 files changed

+280
-290
lines changed

7 files changed

+280
-290
lines changed

src/addons/link/__tests__/ReactLinkPropTypes-test.js

-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
var emptyFunction = require('emptyFunction');
1515
var LinkPropTypes = require('ReactLink').PropTypes;
1616
var React = require('React');
17-
var ReactPropTypesSecret = require('ReactPropTypesSecret');
1817

1918
var invalidMessage = 'Invalid prop `testProp` supplied to `testComponent`.';
2019
var requiredMessage = 'The prop `testProp` is marked as required in ' +
@@ -27,8 +26,6 @@ function typeCheckFail(declaration, value, message) {
2726
'testProp',
2827
'testComponent',
2928
'prop',
30-
null,
31-
ReactPropTypesSecret
3229
);
3330
expect(error instanceof Error).toBe(true);
3431
expect(error.message).toBe(message);
@@ -41,8 +38,6 @@ function typeCheckPass(declaration, value) {
4138
'testProp',
4239
'testComponent',
4340
'prop',
44-
null,
45-
ReactPropTypesSecret
4641
);
4742
expect(error).toBe(null);
4843
}

src/isomorphic/classic/types/ReactPropTypes.js

+59-76
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@
1313

1414
var ReactElement = require('ReactElement');
1515
var ReactPropTypeLocationNames = require('ReactPropTypeLocationNames');
16-
var ReactPropTypesSecret = require('ReactPropTypesSecret');
1716

1817
var emptyFunction = require('emptyFunction');
1918
var getIteratorFn = require('getIteratorFn');
19+
var invariant = require('invariant');
2020
var warning = require('warning');
2121

2222
/**
@@ -68,25 +68,57 @@ var warning = require('warning');
6868

6969
var ANONYMOUS = '<<anonymous>>';
7070

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+
}
90122

91123
/**
92124
* inlined Object.is polyfill to avoid requiring consumers ship their own
@@ -120,42 +152,16 @@ function PropTypeError(message) {
120152
PropTypeError.prototype = Error.prototype;
121153

122154
function createChainableTypeChecker(validate) {
123-
if (__DEV__) {
124-
var manualPropTypeCallCache = {};
125-
}
126155
function checkType(
127156
isRequired,
128157
props,
129158
propName,
130159
componentName,
131160
location,
132-
propFullName,
133-
secret
161+
propFullName
134162
) {
135163
componentName = componentName || ANONYMOUS;
136164
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-
}
159165
if (props[propName] == null) {
160166
var locationName = ReactPropTypeLocationNames[location];
161167
if (isRequired) {
@@ -172,13 +178,7 @@ function createChainableTypeChecker(validate) {
172178
}
173179
return null;
174180
} else {
175-
return validate(
176-
props,
177-
propName,
178-
componentName,
179-
location,
180-
propFullName,
181-
);
181+
return validate(props, propName, componentName, location, propFullName);
182182
}
183183
}
184184

@@ -189,14 +189,7 @@ function createChainableTypeChecker(validate) {
189189
}
190190

191191
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) {
200193
var propValue = props[propName];
201194
var propType = getPropType(propValue);
202195
if (propType !== expectedType) {
@@ -243,8 +236,7 @@ function createArrayOfTypeChecker(typeChecker) {
243236
i,
244237
componentName,
245238
location,
246-
`${propFullName}[${i}]`,
247-
ReactPropTypesSecret
239+
`${propFullName}[${i}]`
248240
);
249241
if (error instanceof Error) {
250242
return error;
@@ -335,8 +327,7 @@ function createObjectOfTypeChecker(typeChecker) {
335327
key,
336328
componentName,
337329
location,
338-
`${propFullName}.${key}`,
339-
ReactPropTypesSecret
330+
`${propFullName}.${key}`
340331
);
341332
if (error instanceof Error) {
342333
return error;
@@ -358,14 +349,7 @@ function createUnionTypeChecker(arrayOfTypeCheckers) {
358349
for (var i = 0; i < arrayOfTypeCheckers.length; i++) {
359350
var checker = arrayOfTypeCheckers[i];
360351
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
369353
) {
370354
return null;
371355
}
@@ -415,8 +399,7 @@ function createShapeTypeChecker(shapeTypes) {
415399
key,
416400
componentName,
417401
location,
418-
`${propFullName}.${key}`,
419-
ReactPropTypesSecret
402+
`${propFullName}.${key}`
420403
);
421404
if (error) {
422405
return error;

0 commit comments

Comments
 (0)