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;