Skip to content

Commit a209a97

Browse files
authored
Add feature flag around React.createFactory (#17873)
1 parent 95bd7aa commit a209a97

14 files changed

+167
-112
lines changed

packages/react-is/src/__tests__/ReactIs-test.js

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ let React;
1313
let ReactDOM;
1414
let ReactIs;
1515

16+
const ReactFeatureFlags = require('shared/ReactFeatureFlags');
17+
1618
describe('ReactIs', () => {
1719
beforeEach(() => {
1820
jest.resetModules();
@@ -54,9 +56,11 @@ describe('ReactIs', () => {
5456
expect(ReactIs.isValidElementType(MemoComponent)).toEqual(true);
5557
expect(ReactIs.isValidElementType(Context.Provider)).toEqual(true);
5658
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+
}
6064
expect(ReactIs.isValidElementType(React.Fragment)).toEqual(true);
6165
expect(ReactIs.isValidElementType(React.StrictMode)).toEqual(true);
6266
expect(ReactIs.isValidElementType(React.Suspense)).toEqual(true);

packages/react/src/React.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import {
6464
enableScopeAPI,
6565
exposeConcurrentModeAPIs,
6666
enableChunksAPI,
67+
disableCreateFactory,
6768
} from 'shared/ReactFeatureFlags';
6869
const React = {
6970
Children: {
@@ -101,14 +102,17 @@ const React = {
101102

102103
createElement: __DEV__ ? createElementWithValidation : createElement,
103104
cloneElement: __DEV__ ? cloneElementWithValidation : cloneElement,
104-
createFactory: __DEV__ ? createFactoryWithValidation : createFactory,
105105
isValidElement: isValidElement,
106106

107107
version: ReactVersion,
108108

109109
__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED: ReactSharedInternals,
110110
};
111111

112+
if (!disableCreateFactory) {
113+
React.createFactory = __DEV__ ? createFactoryWithValidation : createFactory;
114+
}
115+
112116
if (exposeConcurrentModeAPIs) {
113117
React.useTransition = useTransition;
114118
React.useDeferredValue = useDeferredValue;

packages/react/src/__tests__/ReactCoffeeScriptClass-test.coffee

Lines changed: 47 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -10,10 +10,8 @@ ReactDOM = null
1010
PropTypes = null
1111

1212
describe 'ReactCoffeeScriptClass', ->
13-
div = null
14-
span = null
1513
container = null
16-
Inner = null
14+
InnerComponent = null
1715
attachedListener = null;
1816
renderedName = null;
1917

@@ -24,15 +22,12 @@ describe 'ReactCoffeeScriptClass', ->
2422
container = document.createElement 'div'
2523
attachedListener = null
2624
renderedName = null
27-
div = React.createFactory 'div'
28-
span = React.createFactory 'span'
29-
class InnerComponent extends React.Component
25+
InnerComponent = class extends React.Component
3026
getName: -> this.props.name
3127
render: ->
3228
attachedListener = this.props.onClick
3329
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)
3631

3732
test = (element, expectedTag, expectedClassName) ->
3833
instance = ReactDOM.render(element, container)
@@ -61,8 +56,9 @@ describe 'ReactCoffeeScriptClass', ->
6156
it 'renders a simple stateless component with prop', ->
6257
class Foo extends React.Component
6358
render: ->
64-
Inner
59+
React.createElement(InnerComponent,
6560
name: @props.bar
61+
)
6662

6763
test React.createElement(Foo, bar: 'foo'), 'DIV', 'foo'
6864
test React.createElement(Foo, bar: 'bar'), 'DIV', 'bar'
@@ -75,8 +71,9 @@ describe 'ReactCoffeeScriptClass', ->
7571
@state = bar: @props.initialValue
7672

7773
render: ->
78-
span
74+
React.createElement('span',
7975
className: @state.bar
76+
)
8077

8178
test React.createElement(Foo, initialValue: 'foo'), 'SPAN', 'foo'
8279
undefined
@@ -91,11 +88,12 @@ describe 'ReactCoffeeScriptClass', ->
9188

9289
render: ->
9390
if @state.bar is 'foo'
94-
return div(
91+
return React.createElement('div',
9592
className: 'foo'
9693
)
97-
span
94+
React.createElement('span',
9895
className: @state.bar
96+
)
9997

10098
instance = test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
10199
instance.changeState()
@@ -108,8 +106,9 @@ describe 'ReactCoffeeScriptClass', ->
108106
super props
109107
@state = foo: null
110108
render: ->
111-
div
109+
React.createElement('div',
112110
className: "#{@state.foo} #{@state.bar}"
111+
)
113112
Foo.getDerivedStateFromProps = (nextProps, prevState) ->
114113
{
115114
foo: nextProps.foo
@@ -121,7 +120,7 @@ describe 'ReactCoffeeScriptClass', ->
121120
it 'warns if getDerivedStateFromProps is not static', ->
122121
class Foo extends React.Component
123122
render: ->
124-
div()
123+
React.createElement('div')
125124
getDerivedStateFromProps: ->
126125
{}
127126
expect(->
@@ -132,7 +131,7 @@ describe 'ReactCoffeeScriptClass', ->
132131
it 'warns if getDerivedStateFromError is not static', ->
133132
class Foo extends React.Component
134133
render: ->
135-
div()
134+
React.createElement('div')
136135
getDerivedStateFromError: ->
137136
{}
138137
expect(->
@@ -143,7 +142,7 @@ describe 'ReactCoffeeScriptClass', ->
143142
it 'warns if getSnapshotBeforeUpdate is static', ->
144143
class Foo extends React.Component
145144
render: ->
146-
div()
145+
React.createElement('div')
147146
Foo.getSnapshotBeforeUpdate = () ->
148147
{}
149148
expect(->
@@ -154,8 +153,9 @@ describe 'ReactCoffeeScriptClass', ->
154153
it 'warns if state not initialized before static getDerivedStateFromProps', ->
155154
class Foo extends React.Component
156155
render: ->
157-
div
156+
React.createElement('div',
158157
className: "#{@state.foo} #{@state.bar}"
158+
)
159159
Foo.getDerivedStateFromProps = (nextProps, prevState) ->
160160
{
161161
foo: nextProps.foo
@@ -179,8 +179,9 @@ describe 'ReactCoffeeScriptClass', ->
179179
foo: 'foo'
180180
bar: 'bar'
181181
render: ->
182-
div
182+
React.createElement('div',
183183
className: "#{@state.foo} #{@state.bar}"
184+
)
184185
Foo.getDerivedStateFromProps = (nextProps, prevState) ->
185186
{
186187
foo: "not-#{prevState.foo}"
@@ -195,8 +196,9 @@ describe 'ReactCoffeeScriptClass', ->
195196
@state =
196197
value: 'initial'
197198
render: ->
198-
div
199+
React.createElement('div',
199200
className: @state.value
201+
)
200202
Foo.getDerivedStateFromProps = (nextProps, prevState) ->
201203
if nextProps.update
202204
return {
@@ -250,7 +252,7 @@ describe 'ReactCoffeeScriptClass', ->
250252

251253
render: ->
252254
renderCount++
253-
span className: @state.bar
255+
React.createElement('span', className: @state.bar)
254256

255257
test React.createElement(Foo, initialValue: 'foo'), 'SPAN', 'bar'
256258
expect(renderCount).toBe 1
@@ -263,7 +265,7 @@ describe 'ReactCoffeeScriptClass', ->
263265
@state = state
264266

265267
render: ->
266-
span()
268+
React.createElement('span')
267269

268270
expect(->
269271
test React.createElement(Foo), 'SPAN', ''
@@ -276,7 +278,7 @@ describe 'ReactCoffeeScriptClass', ->
276278
@state = null
277279

278280
render: ->
279-
span()
281+
React.createElement('span')
280282

281283
test React.createElement(Foo), 'SPAN', ''
282284
undefined
@@ -290,9 +292,10 @@ describe 'ReactCoffeeScriptClass', ->
290292
@setState bar: 'bar'
291293

292294
render: ->
293-
Inner
295+
React.createElement(InnerComponent,
294296
name: @state.bar
295297
onClick: @handleClick
298+
)
296299

297300
test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
298301
attachedListener()
@@ -308,9 +311,10 @@ describe 'ReactCoffeeScriptClass', ->
308311
@setState bar: 'bar'
309312

310313
render: ->
311-
Inner
314+
React.createElement(InnerComponent,
312315
name: @state.bar
313316
onClick: @handleClick
317+
)
314318

315319
test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
316320
expect(attachedListener).toThrow()
@@ -326,9 +330,10 @@ describe 'ReactCoffeeScriptClass', ->
326330
@forceUpdate()
327331

328332
render: ->
329-
Inner
333+
React.createElement(InnerComponent,
330334
name: @mutativeValue
331335
onClick: @handleClick
336+
)
332337

333338
test React.createElement(Foo, initialValue: 'foo'), 'DIV', 'foo'
334339
attachedListener()
@@ -364,8 +369,9 @@ describe 'ReactCoffeeScriptClass', ->
364369
lifeCycles.push 'will-unmount'
365370

366371
render: ->
367-
span
372+
React.createElement('span',
368373
className: @props.value
374+
)
369375

370376
test React.createElement(Foo, value: 'foo'), 'SPAN', 'foo'
371377
expect(lifeCycles).toEqual [
@@ -404,8 +410,9 @@ describe 'ReactCoffeeScriptClass', ->
404410
{}
405411

406412
render: ->
407-
span
413+
React.createElement('span',
408414
className: 'foo'
415+
)
409416

410417
expect(->
411418
test React.createElement(Foo), 'SPAN', 'foo'
@@ -431,8 +438,9 @@ describe 'ReactCoffeeScriptClass', ->
431438
{}
432439

433440
render: ->
434-
span
441+
React.createElement('span',
435442
className: 'foo'
443+
)
436444

437445
test React.createElement(Foo), 'SPAN', 'foo'
438446
undefined
@@ -443,8 +451,9 @@ describe 'ReactCoffeeScriptClass', ->
443451
false
444452

445453
render: ->
446-
span
454+
React.createElement('span',
447455
className: 'foo'
456+
)
448457

449458
expect(->
450459
test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -461,8 +470,9 @@ describe 'ReactCoffeeScriptClass', ->
461470
false
462471

463472
render: ->
464-
span
473+
React.createElement('span',
465474
className: 'foo'
475+
)
466476

467477
expect(->
468478
test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -478,8 +488,9 @@ describe 'ReactCoffeeScriptClass', ->
478488
false
479489

480490
render: ->
481-
span
491+
React.createElement('span',
482492
className: 'foo'
493+
)
483494

484495
expect(->
485496
test React.createElement(NamedComponent), 'SPAN', 'foo'
@@ -491,7 +502,7 @@ describe 'ReactCoffeeScriptClass', ->
491502

492503
it 'should throw AND warn when trying to access classic APIs', ->
493504
instance =
494-
test Inner(name: 'foo'), 'DIV', 'foo'
505+
test React.createElement(InnerComponent, name: 'foo'), 'DIV', 'foo'
495506
expect(->
496507
expect(-> instance.replaceState {}).toThrow()
497508
).toWarnDev(
@@ -511,7 +522,7 @@ describe 'ReactCoffeeScriptClass', ->
511522
@contextTypes:
512523
bar: PropTypes.string
513524
render: ->
514-
div className: @context.bar
525+
React.createElement('div', className: @context.bar)
515526

516527
class Foo extends React.Component
517528
@childContextTypes:
@@ -527,16 +538,17 @@ describe 'ReactCoffeeScriptClass', ->
527538
it 'supports classic refs', ->
528539
class Foo extends React.Component
529540
render: ->
530-
Inner
541+
React.createElement(InnerComponent,
531542
name: 'foo'
532543
ref: 'inner'
544+
)
533545

534546
instance = test(React.createElement(Foo), 'DIV', 'foo')
535547
expect(instance.refs.inner.getName()).toBe 'foo'
536548
undefined
537549

538550
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'
540552
node = ReactDOM.findDOMNode(instance)
541553
expect(node).toBe container.firstChild
542554
undefined

0 commit comments

Comments
 (0)