@samitouri / QOS-React / commits / a209a97ed7

Add feature flag around React.createFactory (#17873)

Dominic Gannaway committed Jan 20, 2020 at 15:00 UTC a209a97ed742ced488d7edf4fc2dcbf316ba13cb
14 files changed +167 -112
packages/react-is/src/__tests__/ReactIs-test.js
+7 -3
@@ -13,6 +13,8 @@ let React;
13 let ReactDOM;
14 let ReactIs;
15
16 +const ReactFeatureFlags = require('shared/ReactFeatureFlags');
17 +
18 describe('ReactIs', () => {
19 beforeEach(() => {
20 jest.resetModules();
@@ -54,9 +56,11 @@ describe('ReactIs', () => {
56 expect(ReactIs.isValidElementType(MemoComponent)).toEqual(true);
57 expect(ReactIs.isValidElementType(Context.Provider)).toEqual(true);
58 expect(ReactIs.isValidElementType(Context.Consumer)).toEqual(true);
57 - expect(ReactIs.isValidElementType(React.createFactory('div'))).toEqual(
58 - true,
59 - );
59 + if (!ReactFeatureFlags.disableCreateFactory) {
60 + expect(ReactIs.isValidElementType(React.createFactory('div'))).toEqual(
61 + true,
62 + );
63 + }
64 expect(ReactIs.isValidElementType(React.Fragment)).toEqual(true);
65 expect(ReactIs.isValidElementType(React.StrictMode)).toEqual(true);
66 expect(ReactIs.isValidElementType(React.Suspense)).toEqual(true);
packages/react/src/React.js
+5 -1
@@ -64,6 +64,7 @@ import {
64 enableScopeAPI,
65 exposeConcurrentModeAPIs,
66 enableChunksAPI,
67 + disableCreateFactory,
68 } from 'shared/ReactFeatureFlags';
69 const React = {
70 Children: {
@@ -101,7 +102,6 @@ const React = {
102
103 createElement: __DEV__ ? createElementWithValidation : createElement,
104 cloneElement: __DEV__ ? cloneElementWithValidation : cloneElement,
104 - createFactory: __DEV__ ? createFactoryWithValidation : createFactory,
105 isValidElement: isValidElement,
106
107 version: ReactVersion,
@@ -109,6 +109,10 @@ const React = {
109 __SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: ReactSharedInternals,
110 };
111
112 +if (!disableCreateFactory) {
113 + React.createFactory = __DEV__ ? createFactoryWithValidation : createFactory;
114 +}
115 +
116 if (exposeConcurrentModeAPIs) {
117 React.useTransition = useTransition;
118 React.useDeferredValue = useDeferredValue;
packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee
+47 -35
@@ -10,10 +10,8 @@ ReactDOM = null
10 PropTypes = null
11
12 describe 'ReactCoffeeScriptClass', ->
13 - div = null
14 - span = null
13 container = null
16 - Inner = null
14 + InnerComponent = null
15 attachedListener = null;
16 renderedName = null;
17
@@ -24,15 +22,12 @@ describe 'ReactCoffeeScriptClass', ->
22 container = document.createElement 'div'
23 attachedListener = null
24 renderedName = null
27 - div = React.createFactory 'div'
28 - span = React.createFactory 'span'
29 - class InnerComponent extends React.Component
25 + InnerComponent = class extends React.Component
26 getName: -> this.props.name
27 render: ->
28 attachedListener = this.props.onClick
29 renderedName = this.props.name
34 - return div className: this.props.name
35 - Inner = React.createFactory InnerComponent
30 + return React.createElement('div', className: this.props.name)
31
32 test = (element, expectedTag, expectedClassName) ->
33 instance = ReactDOM.render(element, container)
@@ -61,8 +56,9 @@ describe 'ReactCoffeeScriptClass', ->
56 it 'renders a simple stateless component with prop', ->
57 class Foo extends React.Component
58 render: ->
64 - Inner
59 + React.createElement(InnerComponent,
60 name: @props.bar
61 + )
62
63 test React.createElement(Foo, bar: 'foo'), 'DIV', 'foo'
64 test React.createElement(Foo, bar: 'bar'), 'DIV', 'bar'
@@ -75,8 +71,9 @@ describe 'ReactCoffeeScriptClass', ->
71 @state = bar: @props.initialValue
72
73 render: ->
78 - span
74 + React.createElement('span',
75 className: @state.bar
76 + )
77
78 test React.createElement(Foo, initialValue: 'foo'), 'SPAN', 'foo'
79 undefined
@@ -91,11 +88,12 @@ describe 'ReactCoffeeScriptClass', ->
88
89 render: ->
90 if @state.bar is 'foo'
94 - return div(
91 + return React.createElement('div',
92 className: 'foo'
93 )
97 - span
94 + React.createElement('span',
95 className: @state.bar
96 + )
97
98 instance = test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
99 instance.changeState()
@@ -108,8 +106,9 @@ describe 'ReactCoffeeScriptClass', ->
106 super props
107 @state = foo: null
108 render: ->
111 - div
109 + React.createElement('div',
110 className: "#{@state.foo} #{@state.bar}"
111 + )
112 Foo.getDerivedStateFromProps = (nextProps, prevState) ->
113 {
114 foo: nextProps.foo
@@ -121,7 +120,7 @@ describe 'ReactCoffeeScriptClass', ->
120 it 'warns if getDerivedStateFromProps is not static', ->
121 class Foo extends React.Component
122 render: ->
124 - div()
123 + React.createElement('div')
124 getDerivedStateFromProps: ->
125 {}
126 expect(->
@@ -132,7 +131,7 @@ describe 'ReactCoffeeScriptClass', ->
131 it 'warns if getDerivedStateFromError is not static', ->
132 class Foo extends React.Component
133 render: ->
135 - div()
134 + React.createElement('div')
135 getDerivedStateFromError: ->
136 {}
137 expect(->
@@ -143,7 +142,7 @@ describe 'ReactCoffeeScriptClass', ->
142 it 'warns if getSnapshotBeforeUpdate is static', ->
143 class Foo extends React.Component
144 render: ->
146 - div()
145 + React.createElement('div')
146 Foo.getSnapshotBeforeUpdate = () ->
147 {}
148 expect(->
@@ -154,8 +153,9 @@ describe 'ReactCoffeeScriptClass', ->
153 it 'warns if state not initialized before static getDerivedStateFromProps', ->
154 class Foo extends React.Component
155 render: ->
157 - div
156 + React.createElement('div',
157 className: "#{@state.foo} #{@state.bar}"
158 + )
159 Foo.getDerivedStateFromProps = (nextProps, prevState) ->
160 {
161 foo: nextProps.foo
@@ -179,8 +179,9 @@ describe 'ReactCoffeeScriptClass', ->
179 foo: 'foo'
180 bar: 'bar'
181 render: ->
182 - div
182 + React.createElement('div',
183 className: "#{@state.foo} #{@state.bar}"
184 + )
185 Foo.getDerivedStateFromProps = (nextProps, prevState) ->
186 {
187 foo: "not-#{prevState.foo}"
@@ -195,8 +196,9 @@ describe 'ReactCoffeeScriptClass', ->
196 @state =
197 value: 'initial'
198 render: ->
198 - div
199 + React.createElement('div',
200 className: @state.value
201 + )
202 Foo.getDerivedStateFromProps = (nextProps, prevState) ->
203 if nextProps.update
204 return {
@@ -250,7 +252,7 @@ describe 'ReactCoffeeScriptClass', ->
252
253 render: ->
254 renderCount++
253 - span className: @state.bar
255 + React.createElement('span', className: @state.bar)
256
257 test React.createElement(Foo, initialValue: 'foo'), 'SPAN', 'bar'
258 expect(renderCount).toBe 1
@@ -263,7 +265,7 @@ describe 'ReactCoffeeScriptClass', ->
265 @state = state
266
267 render: ->
266 - span()
268 + React.createElement('span')
269
270 expect(->
271 test React.createElement(Foo), 'SPAN', ''
@@ -276,7 +278,7 @@ describe 'ReactCoffeeScriptClass', ->
278 @state = null
279
280 render: ->
279 - span()
281 + React.createElement('span')
282
283 test React.createElement(Foo), 'SPAN', ''
284 undefined
@@ -290,9 +292,10 @@ describe 'ReactCoffeeScriptClass', ->
292 @setState bar: 'bar'
293
294 render: ->
293 - Inner
295 + React.createElement(InnerComponent,
296 name: @state.bar
297 onClick: @handleClick
298 + )
299
300 test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
301 attachedListener()
@@ -308,9 +311,10 @@ describe 'ReactCoffeeScriptClass', ->
311 @setState bar: 'bar'
312
313 render: ->
311 - Inner
314 + React.createElement(InnerComponent,
315 name: @state.bar
316 onClick: @handleClick
317 + )
318
319 test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
320 expect(attachedListener).toThrow()
@@ -326,9 +330,10 @@ describe 'ReactCoffeeScriptClass', ->
330 @forceUpdate()
331
332 render: ->
329 - Inner
333 + React.createElement(InnerComponent,
334 name: @mutativeValue
335 onClick: @handleClick
336 + )
337
338 test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
339 attachedListener()
@@ -364,8 +369,9 @@ describe 'ReactCoffeeScriptClass', ->
369 lifeCycles.push 'will-unmount'
370
371 render: ->
367 - span
372 + React.createElement('span',
373 className: @props.value
374 + )
375
376 test React.createElement(Foo, value: 'foo'), 'SPAN', 'foo'
377 expect(lifeCycles).toEqual [
@@ -404,8 +410,9 @@ describe 'ReactCoffeeScriptClass', ->
410 {}
411
412 render: ->
407 - span
413 + React.createElement('span',
414 className: 'foo'
415 + )
416
417 expect(->
418 test React.createElement(Foo), 'SPAN', 'foo'
@@ -431,8 +438,9 @@ describe 'ReactCoffeeScriptClass', ->
438 {}
439
440 render: ->
434 - span
441 + React.createElement('span',
442 className: 'foo'
443 + )
444
445 test React.createElement(Foo), 'SPAN', 'foo'
446 undefined
@@ -443,8 +451,9 @@ describe 'ReactCoffeeScriptClass', ->
451 false
452
453 render: ->
446 - span
454 + React.createElement('span',
455 className: 'foo'
456 + )
457
458 expect(->
459 test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -461,8 +470,9 @@ describe 'ReactCoffeeScriptClass', ->
470 false
471
472 render: ->
464 - span
473 + React.createElement('span',
474 className: 'foo'
475 + )
476
477 expect(->
478 test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -478,8 +488,9 @@ describe 'ReactCoffeeScriptClass', ->
488 false
489
490 render: ->
481 - span
491 + React.createElement('span',
492 className: 'foo'
493 + )
494
495 expect(->
496 test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -491,7 +502,7 @@ describe 'ReactCoffeeScriptClass', ->
502
503 it 'should throw AND warn when trying to access classic APIs', ->
504 instance =
494 - test Inner(name: 'foo'), 'DIV', 'foo'
505 + test React.createElement(InnerComponent, name: 'foo'), 'DIV', 'foo'
506 expect(->
507 expect(-> instance.replaceState {}).toThrow()
508 ).toWarnDev(
@@ -511,7 +522,7 @@ describe 'ReactCoffeeScriptClass', ->
522 @contextTypes:
523 bar: PropTypes.string
524 render: ->
514 - div className: @context.bar
525 + React.createElement('div', className: @context.bar)
526
527 class Foo extends React.Component
528 @childContextTypes:
@@ -527,16 +538,17 @@ describe 'ReactCoffeeScriptClass', ->
538 it 'supports classic refs', ->
539 class Foo extends React.Component
540 render: ->
530 - Inner
541 + React.createElement(InnerComponent,
542 name: 'foo'
543 ref: 'inner'
544 + )
545
546 instance = test(React.createElement(Foo), 'DIV', 'foo')
547 expect(instance.refs.inner.getName()).toBe 'foo'
548 undefined
549
550 it 'supports drilling through to the DOM using findDOMNode', ->
539 - instance = test Inner(name: 'foo'), 'DIV', 'foo'
551 + instance = test React.createElement(InnerComponent, name: 'foo'), 'DIV', 'foo'
552 node = ReactDOM.findDOMNode(instance)
553 expect(node).toBe container.firstChild
554 undefined
packages/react/src/__tests__/ReactElement-test.js
+24 -17
@@ -13,6 +13,8 @@ let React;
13 let ReactDOM;
14 let ReactTestUtils;
15
16 +const ReactFeatureFlags = require('shared/ReactFeatureFlags');
17 +
18 describe('ReactElement', () => {
19 let ComponentClass;
20 let originalSymbol;
@@ -46,7 +48,7 @@ describe('ReactElement', () => {
48 });
49
50 it('returns a complete element according to spec', () => {
49 - const element = React.createFactory(ComponentClass)();
51 + const element = React.createElement(ComponentClass);
52 expect(element.type).toBe(ComponentClass);
53 expect(element.key).toBe(null);
54 expect(element.ref).toBe(null);
@@ -121,7 +123,7 @@ describe('ReactElement', () => {
123 });
124
125 it('allows a string to be passed as the type', () => {
124 - const element = React.createFactory('div')();
126 + const element = React.createElement('div');
127 expect(element.type).toBe('div');
128 expect(element.key).toBe(null);
129 expect(element.ref).toBe(null);
@@ -133,7 +135,7 @@ describe('ReactElement', () => {
135 });
136
137 it('returns an immutable element', () => {
136 - const element = React.createFactory(ComponentClass)();
138 + const element = React.createElement(ComponentClass);
139 if (__DEV__) {
140 expect(() => (element.type = 'div')).toThrow();
141 } else {
@@ -143,7 +145,7 @@ describe('ReactElement', () => {
145
146 it('does not reuse the original config object', () => {
147 const config = {foo: 1};
146 - const element = React.createFactory(ComponentClass)(config);
148 + const element = React.createElement(ComponentClass, config);
149 expect(element.props.foo).toBe(1);
150 config.foo = 2;
151 expect(element.props.foo).toBe(1);
@@ -151,12 +153,12 @@ describe('ReactElement', () => {
153
154 it('does not fail if config has no prototype', () => {
155 const config = Object.create(null, {foo: {value: 1, enumerable: true}});
154 - const element = React.createFactory(ComponentClass)(config);
156 + const element = React.createElement(ComponentClass, config);
157 expect(element.props.foo).toBe(1);
158 });
159
160 it('extracts key and ref from the config', () => {
159 - const element = React.createFactory(ComponentClass)({
161 + const element = React.createElement(ComponentClass, {
162 key: '12',
163 ref: '34',
164 foo: '56',
@@ -172,7 +174,7 @@ describe('ReactElement', () => {
174 });
175
176 it('extracts null key and ref', () => {
175 - const element = React.createFactory(ComponentClass)({
177 + const element = React.createElement(ComponentClass, {
178 key: null,
179 ref: null,
180 foo: '12',
@@ -193,7 +195,7 @@ describe('ReactElement', () => {
195 key: undefined,
196 ref: undefined,
197 };
196 - const element = React.createFactory(ComponentClass)(props);
198 + const element = React.createElement(ComponentClass, props);
199 expect(element.type).toBe(ComponentClass);
200 expect(element.key).toBe(null);
201 expect(element.ref).toBe(null);
@@ -212,7 +214,7 @@ describe('ReactElement', () => {
214 });
215
216 it('coerces the key to a string', () => {
215 - const element = React.createFactory(ComponentClass)({
217 + const element = React.createElement(ComponentClass, {
218 key: 12,
219 foo: '56',
220 });
@@ -227,12 +229,11 @@ describe('ReactElement', () => {
229 });
230
231 it('preserves the owner on the element', () => {
230 - const Component = React.createFactory(ComponentClass);
232 let element;
233
234 class Wrapper extends React.Component {
235 render() {
235 - element = Component();
236 + element = React.createElement(ComponentClass);
237 return element;
238 }
239 }
@@ -245,7 +246,8 @@ describe('ReactElement', () => {
246
247 it('merges an additional argument onto the children prop', () => {
248 const a = 1;
248 - const element = React.createFactory(ComponentClass)(
249 + const element = React.createElement(
250 + ComponentClass,
251 {
252 children: 'text',
253 },
@@ -255,14 +257,15 @@ describe('ReactElement', () => {
257 });
258
259 it('does not override children if no rest args are provided', () => {
258 - const element = React.createFactory(ComponentClass)({
260 + const element = React.createElement(ComponentClass, {
261 children: 'text',
262 });
263 expect(element.props.children).toBe('text');
264 });
265
266 it('overrides children if null is provided as an argument', () => {
265 - const element = React.createFactory(ComponentClass)(
267 + const element = React.createElement(
268 + ComponentClass,
269 {
270 children: 'text',
271 },
@@ -275,7 +278,7 @@ describe('ReactElement', () => {
278 const a = 1;
279 const b = 2;
280 const c = 3;
278 - const element = React.createFactory(ComponentClass)(null, a, b, c);
281 + const element = React.createElement(ComponentClass, null, a, b, c);
282 expect(element.props.children).toEqual([1, 2, 3]);
283 });
284
@@ -309,7 +312,9 @@ describe('ReactElement', () => {
312 expect(React.isValidElement(true)).toEqual(false);
313 expect(React.isValidElement({})).toEqual(false);
314 expect(React.isValidElement('string')).toEqual(false);
312 - expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
315 + if (!ReactFeatureFlags.disableCreateFactory) {
316 + expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
317 + }
318 expect(React.isValidElement(Component)).toEqual(false);
319 expect(React.isValidElement({type: 'div', props: {}})).toEqual(false);
320
@@ -467,7 +472,9 @@ describe('ReactElement', () => {
472 expect(React.isValidElement(true)).toEqual(false);
473 expect(React.isValidElement({})).toEqual(false);
474 expect(React.isValidElement('string')).toEqual(false);
470 - expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
475 + if (!ReactFeatureFlags.disableCreateFactory) {
476 + expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
477 + }
478 expect(React.isValidElement(Component)).toEqual(false);
479 expect(React.isValidElement({type: 'div', props: {}})).toEqual(false);
480
packages/react/src/__tests__/ReactElementClone-test.js
+2 -2
@@ -315,7 +315,7 @@ describe('ReactElementClone', () => {
315 });
316
317 it('should ignore undefined key and ref', () => {
318 - const element = React.createFactory(ComponentClass)({
318 + const element = React.createElement(ComponentClass, {
319 key: '12',
320 ref: '34',
321 foo: '56',
@@ -337,7 +337,7 @@ describe('ReactElementClone', () => {
337 });
338
339 it('should extract null key and ref', () => {
340 - const element = React.createFactory(ComponentClass)({
340 + const element = React.createElement(ComponentClass, {
341 key: '12',
342 ref: '34',
343 foo: '56',
packages/react/src/__tests__/ReactElementJSX-test.internal.js
+8 -3
@@ -11,9 +11,10 @@
11
12 let React;
13 let ReactDOM;
14 -let ReactFeatureFlags;
14 let ReactTestUtils;
15
16 +let ReactFeatureFlags = require('shared/ReactFeatureFlags');
17 +
18 // NOTE: We're explicitly not using JSX here. This is intended to test
19 // a new React.jsx api which does not have a JSX transformer yet.
20 // A lot of these tests are pulled from ReactElement-test because
@@ -67,7 +68,9 @@ describe('ReactElement.jsx', () => {
68 expect(React.isValidElement(true)).toEqual(false);
69 expect(React.isValidElement({})).toEqual(false);
70 expect(React.isValidElement('string')).toEqual(false);
70 - expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
71 + if (!ReactFeatureFlags.disableCreateFactory) {
72 + expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
73 + }
74 expect(React.isValidElement(Component)).toEqual(false);
75 expect(React.isValidElement({type: 'div', props: {}})).toEqual(false);
76
@@ -297,7 +300,9 @@ describe('ReactElement.jsx', () => {
300 expect(React.isValidElement(true)).toEqual(false);
301 expect(React.isValidElement({})).toEqual(false);
302 expect(React.isValidElement('string')).toEqual(false);
300 - expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
303 + if (!ReactFeatureFlags.disableCreateFactory) {
304 + expect(React.isValidElement(React.createFactory('div'))).toEqual(false);
305 + }
306 expect(React.isValidElement(Component)).toEqual(false);
307 expect(React.isValidElement({type: 'div', props: {}})).toEqual(false);
308
packages/react/src/__tests__/ReactElementValidator-test.internal.js
+52 -44
@@ -13,11 +13,12 @@
13 // classic JS without JSX.
14
15 let PropTypes;
16 -let ReactFeatureFlags;
16 let React;
17 let ReactDOM;
18 let ReactTestUtils;
19
20 +let ReactFeatureFlags = require('shared/ReactFeatureFlags');
21 +
22 describe('ReactElementValidator', () => {
23 let ComponentClass;
24
@@ -38,27 +39,29 @@ describe('ReactElementValidator', () => {
39 });
40
41 it('warns for keys for arrays of elements in rest args', () => {
41 - const Component = React.createFactory(ComponentClass);
42 -
42 expect(() => {
44 - Component(null, [Component(), Component()]);
43 + React.createElement(ComponentClass, null, [
44 + React.createElement(ComponentClass),
45 + React.createElement(ComponentClass),
46 + ]);
47 }).toErrorDev('Each child in a list should have a unique "key" prop.');
48 });
49
50 it('warns for keys for arrays of elements with owner info', () => {
49 - const Component = React.createFactory(ComponentClass);
50 -
51 class InnerClass extends React.Component {
52 render() {
53 - return Component(null, this.props.childSet);
53 + return React.createElement(ComponentClass, null, this.props.childSet);
54 }
55 }
56
57 - const InnerComponent = React.createFactory(InnerClass);
58 -
57 class ComponentWrapper extends React.Component {
58 render() {
61 - return InnerComponent({childSet: [Component(), Component()]});
59 + return React.createElement(InnerClass, {
60 + childSet: [
61 + React.createElement(ComponentClass),
62 + React.createElement(ComponentClass),
63 + ],
64 + });
65 }
66 }
67
@@ -144,34 +147,34 @@ describe('ReactElementValidator', () => {
147 });
148
149 it('warns for keys for iterables of elements in rest args', () => {
147 - const Component = React.createFactory(ComponentClass);
148 -
150 const iterable = {
151 '@@iterator': function() {
152 let i = 0;
153 return {
154 next: function() {
155 const done = ++i > 2;
155 - return {value: done ? undefined : Component(), done: done};
156 + return {
157 + value: done ? undefined : React.createElement(ComponentClass),
158 + done: done,
159 + };
160 },
161 };
162 },
163 };
164
161 - expect(() => Component(null, iterable)).toErrorDev(
162 - 'Each child in a list should have a unique "key" prop.',
163 - );
165 + expect(() =>
166 + React.createElement(ComponentClass, null, iterable),
167 + ).toErrorDev('Each child in a list should have a unique "key" prop.');
168 });
169
170 it('does not warns for arrays of elements with keys', () => {
167 - const Component = React.createFactory(ComponentClass);
168 -
169 - Component(null, [Component({key: '#1'}), Component({key: '#2'})]);
171 + React.createElement(ComponentClass, null, [
172 + React.createElement(ComponentClass, {key: '#1'}),
173 + React.createElement(ComponentClass, {key: '#2'}),
174 + ]);
175 });
176
177 it('does not warns for iterable elements with keys', () => {
173 - const Component = React.createFactory(ComponentClass);
174 -
178 const iterable = {
179 '@@iterator': function() {
180 let i = 0;
@@ -179,7 +182,9 @@ describe('ReactElementValidator', () => {
182 next: function() {
183 const done = ++i > 2;
184 return {
182 - value: done ? undefined : Component({key: '#' + i}),
185 + value: done
186 + ? undefined
187 + : React.createElement(ComponentClass, {key: '#' + i}),
188 done: done,
189 };
190 },
@@ -187,19 +192,20 @@ describe('ReactElementValidator', () => {
192 },
193 };
194
190 - Component(null, iterable);
195 + React.createElement(ComponentClass, null, iterable);
196 });
197
198 it('does not warn when the element is directly in rest args', () => {
194 - const Component = React.createFactory(ComponentClass);
195 -
196 - Component(null, Component(), Component());
199 + React.createElement(
200 + ComponentClass,
201 + null,
202 + React.createElement(ComponentClass),
203 + React.createElement(ComponentClass),
204 + );
205 });
206
207 it('does not warn when the array contains a non-element', () => {
200 - const Component = React.createFactory(ComponentClass);
201 -
202 - Component(null, [{}, {}]);
208 + React.createElement(ComponentClass, null, [{}, {}]);
209 });
210
211 it('should give context for PropType errors in nested components.', () => {
@@ -433,23 +439,25 @@ describe('ReactElementValidator', () => {
439 );
440 });
441
436 - it('should warn when accessing .type on an element factory', () => {
437 - function TestComponent() {
438 - return <div />;
439 - }
442 + if (!ReactFeatureFlags.disableCreateFactory) {
443 + it('should warn when accessing .type on an element factory', () => {
444 + function TestComponent() {
445 + return <div />;
446 + }
447
441 - let TestFactory = React.createFactory(TestComponent);
442 - expect(
443 - () => TestFactory.type,
444 - ).toWarnDev(
445 - 'Warning: Factory.type is deprecated. Access the class directly before ' +
446 - 'passing it to createFactory.',
447 - {withoutStack: true},
448 - );
448 + let TestFactory = React.createFactory(TestComponent);
449 + expect(
450 + () => TestFactory.type,
451 + ).toWarnDev(
452 + 'Warning: Factory.type is deprecated. Access the class directly before ' +
453 + 'passing it to createFactory.',
454 + {withoutStack: true},
455 + );
456
450 - // Warn once, not again
451 - expect(TestFactory.type).toBe(TestComponent);
452 - });
457 + // Warn once, not again
458 + expect(TestFactory.type).toBe(TestComponent);
459 + });
460 + }
461
462 it('does not warn when using DOM node as children', () => {
463 class DOMContainer extends React.Component {
packages/shared/ReactFeatureFlags.js
+15 -7
@@ -44,10 +44,6 @@ export function addUserTimingListener() {
44 // Disable javascript: URL strings in href for XSS protection.
45 export const disableJavaScriptURLs = false;
46
47 -// React Fire: prevent the value and checked attributes from syncing
48 -// with their related DOM properties
49 -export const disableInputAttributeSyncing = false;
50 -
47 // These APIs will no longer be "unstable" in the upcoming 16.7 release,
48 // Control this behavior with a flag to support 16.6 minor releases in the meanwhile.
49 export const exposeConcurrentModeAPIs = __EXPERIMENTAL__;
@@ -85,9 +81,6 @@ export const enableSuspenseCallback = false;
81 // from React.createElement to React.jsx
82 // https://github.com/reactjs/rfcs/blob/createlement-rfc/text/0000-create-element-changes.md
83 export const warnAboutDefaultPropsOnFunctionComponents = false;
88 -export const warnAboutStringRefs = false;
89 -
90 -export const disableLegacyContext = false;
84
85 export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
86
@@ -97,3 +90,18 @@ export const enableTrustedTypesIntegration = false;
90
91 // Flag to turn event.target and event.currentTarget in ReactNative from a reactTag to a component instance
92 export const enableNativeTargetAsInstance = false;
93 +
94 +// --------------------------
95 +// Future APIs to be deprecated
96 +// --------------------------
97 +
98 +// Prevent the value and checked attributes from syncing
99 +// with their related DOM properties
100 +export const disableInputAttributeSyncing = false;
101 +
102 +export const warnAboutStringRefs = false;
103 +
104 +export const disableLegacyContext = false;
105 +
106 +// Disables React.createFactory
107 +export const disableCreateFactory = false;
packages/shared/forks/ReactFeatureFlags.native-fb.js
+1
@@ -45,6 +45,7 @@ export const disableLegacyContext = false;
45 export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
46 export const enableTrainModelFix = false;
47 export const enableTrustedTypesIntegration = false;
48 +export const disableCreateFactory = false;
49
50 // Only used in www builds.
51 export function addUserTimingListener() {
packages/shared/forks/ReactFeatureFlags.native-oss.js
+1
@@ -40,6 +40,7 @@ export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
40 export const enableTrainModelFix = false;
41 export const enableTrustedTypesIntegration = false;
42 export const enableNativeTargetAsInstance = false;
43 +export const disableCreateFactory = false;
44
45 // Only used in www builds.
46 export function addUserTimingListener() {
packages/shared/forks/ReactFeatureFlags.persistent.js
+1
@@ -40,6 +40,7 @@ export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
40 export const enableTrainModelFix = false;
41 export const enableTrustedTypesIntegration = false;
42 export const enableNativeTargetAsInstance = false;
43 +export const disableCreateFactory = false;
44
45 // Only used in www builds.
46 export function addUserTimingListener() {
packages/shared/forks/ReactFeatureFlags.test-renderer.js
+1
@@ -40,6 +40,7 @@ export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
40 export const enableTrainModelFix = false;
41 export const enableTrustedTypesIntegration = false;
42 export const enableNativeTargetAsInstance = false;
43 +export const disableCreateFactory = false;
44
45 // Only used in www builds.
46 export function addUserTimingListener() {
packages/shared/forks/ReactFeatureFlags.test-renderer.www.js
+1
@@ -38,6 +38,7 @@ export const disableSchedulerTimeoutBasedOnReactExpirationTime = false;
38 export const enableTrainModelFix = false;
39 export const enableTrustedTypesIntegration = false;
40 export const enableNativeTargetAsInstance = false;
41 +export const disableCreateFactory = false;
42
43 // Only used in www builds.
44 export function addUserTimingListener() {
packages/shared/forks/ReactFeatureFlags.www.js
+2
@@ -90,6 +90,8 @@ export const flushSuspenseFallbacksInTests = true;
90
91 export const enableNativeTargetAsInstance = false;
92
93 +export const disableCreateFactory = false;
94 +
95 // Flow magic to verify the exports of this file match the original version.
96 // eslint-disable-next-line no-unused-vars
97 type Check<_X, Y: _X, X: Y = _X> = null;