Skip to content

Commit a22880e

Browse files
pleunvbvaughn
authored andcommitted
Add support for Suspense & lazy() to the react-is package (#14423)
* Add support for lazy & Suspense to react-is
1 parent 947bddd commit a22880e

2 files changed

Lines changed: 38 additions & 6 deletions

File tree

‎packages/react-is/src/ReactIs.js‎

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ import {
1616
REACT_ELEMENT_TYPE,
1717
REACT_FORWARD_REF_TYPE,
1818
REACT_FRAGMENT_TYPE,
19+
REACT_LAZY_TYPE,
1920
REACT_MEMO_TYPE,
2021
REACT_PORTAL_TYPE,
2122
REACT_PROFILER_TYPE,
2223
REACT_PROVIDER_TYPE,
2324
REACT_STRICT_MODE_TYPE,
25+
REACT_SUSPENSE_TYPE,
2426
}from'shared/ReactSymbols';
2527
importisValidElementTypefrom'shared/isValidElementType';
2628
importlowPriorityWarningfrom'shared/lowPriorityWarning';
@@ -38,6 +40,7 @@ export function typeOf(object: any) {
3840
caseREACT_FRAGMENT_TYPE:
3941
caseREACT_PROFILER_TYPE:
4042
caseREACT_STRICT_MODE_TYPE:
43+
caseREACT_SUSPENSE_TYPE:
4144
returntype;
4245
default:
4346
const$$typeofType=type&&type.$$typeof;
@@ -51,6 +54,7 @@ export function typeOf(object: any) {
5154
return$$typeof;
5255
}
5356
}
57+
caseREACT_LAZY_TYPE:
5458
caseREACT_MEMO_TYPE:
5559
caseREACT_PORTAL_TYPE:
5660
return$$typeof;
@@ -68,10 +72,12 @@ export const ContextProvider = REACT_PROVIDER_TYPE;
6872
exportconstElement=REACT_ELEMENT_TYPE;
6973
exportconstForwardRef=REACT_FORWARD_REF_TYPE;
7074
exportconstFragment=REACT_FRAGMENT_TYPE;
71-
exportconstProfiler=REACT_PROFILER_TYPE;
72-
exportconstPortal=REACT_PORTAL_TYPE;
75+
exportconstLazy=REACT_LAZY_TYPE;
7376
exportconstMemo=REACT_MEMO_TYPE;
77+
exportconstPortal=REACT_PORTAL_TYPE;
78+
exportconstProfiler=REACT_PROFILER_TYPE;
7479
exportconstStrictMode=REACT_STRICT_MODE_TYPE;
80+
exportconstSuspense=REACT_SUSPENSE_TYPE;
7581

7682
export{isValidElementType};
7783

@@ -114,15 +120,21 @@ export function isForwardRef(object: any) {
114120
exportfunctionisFragment(object: any){
115121
returntypeOf(object)===REACT_FRAGMENT_TYPE;
116122
}
117-
exportfunctionisProfiler(object: any){
118-
returntypeOf(object)===REACT_PROFILER_TYPE;
123+
exportfunctionisLazy(object: any){
124+
returntypeOf(object)===REACT_LAZY_TYPE;
119125
}
120126
exportfunctionisMemo(object: any){
121127
returntypeOf(object)===REACT_MEMO_TYPE;
122128
}
123129
exportfunctionisPortal(object: any){
124130
returntypeOf(object)===REACT_PORTAL_TYPE;
125131
}
132+
exportfunctionisProfiler(object: any){
133+
returntypeOf(object)===REACT_PROFILER_TYPE;
134+
}
126135
exportfunctionisStrictMode(object: any){
127136
returntypeOf(object)===REACT_STRICT_MODE_TYPE;
128137
}
138+
exportfunctionisSuspense(object: any){
139+
returntypeOf(object)===REACT_SUSPENSE_TYPE;
140+
}

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

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,17 +39,19 @@ describe('ReactIs', () => {
3939
}
4040

4141
constFunctionComponent=()=>React.createElement('div');
42-
4342
constForwardRefComponent=React.forwardRef((props,ref)=>
4443
React.createElement(Component,{forwardedRef: ref, ...props}),
4544
);
46-
45+
constLazyComponent=React.lazy(()=>Component);
46+
constMemoComponent=React.memo(Component);
4747
constContext=React.createContext(false);
4848

4949
expect(ReactIs.isValidElementType('div')).toEqual(true);
5050
expect(ReactIs.isValidElementType(Component)).toEqual(true);
5151
expect(ReactIs.isValidElementType(FunctionComponent)).toEqual(true);
5252
expect(ReactIs.isValidElementType(ForwardRefComponent)).toEqual(true);
53+
expect(ReactIs.isValidElementType(LazyComponent)).toEqual(true);
54+
expect(ReactIs.isValidElementType(MemoComponent)).toEqual(true);
5355
expect(ReactIs.isValidElementType(Context.Provider)).toEqual(true);
5456
expect(ReactIs.isValidElementType(Context.Consumer)).toEqual(true);
5557
expect(ReactIs.isValidElementType(React.createFactory('div'))).toEqual(
@@ -60,6 +62,7 @@ describe('ReactIs', () => {
6062
true,
6163
);
6264
expect(ReactIs.isValidElementType(React.StrictMode)).toEqual(true);
65+
expect(ReactIs.isValidElementType(React.Suspense)).toEqual(true);
6366

6467
expect(ReactIs.isValidElementType(true)).toEqual(false);
6568
expect(ReactIs.isValidElementType(123)).toEqual(false);
@@ -116,6 +119,7 @@ describe('ReactIs', () => {
116119
expect(ReactIs.isElement(<React.Fragment/>)).toBe(true);
117120
expect(ReactIs.isElement(<React.unstable_ConcurrentMode/>)).toBe(true);
118121
expect(ReactIs.isElement(<React.StrictMode/>)).toBe(true);
122+
expect(ReactIs.isElement(<React.Suspense/>)).toBe(true);
119123
});
120124

121125
it('should identify ref forwarding component',()=>{
@@ -152,6 +156,14 @@ describe('ReactIs', () => {
152156
expect(ReactIs.isMemo(Component)).toBe(false);
153157
});
154158

159+
it('should identify lazy',()=>{
160+
constComponent=()=>React.createElement('div');
161+
constlazyComponent=React.lazy(()=>Component);
162+
expect(ReactIs.typeOf(lazyComponent)).toBe(ReactIs.Lazy);
163+
expect(ReactIs.isLazy(lazyComponent)).toBe(true);
164+
expect(ReactIs.isLazy(Component)).toBe(false);
165+
});
166+
155167
it('should identify strict mode',()=>{
156168
expect(ReactIs.typeOf(<React.StrictMode/>)).toBe(ReactIs.StrictMode);
157169
expect(ReactIs.isStrictMode(<React.StrictMode/>)).toBe(true);
@@ -160,6 +172,14 @@ describe('ReactIs', () => {
160172
expect(ReactIs.isStrictMode(<div/>)).toBe(false);
161173
});
162174

175+
it('should identify suspense',()=>{
176+
expect(ReactIs.typeOf(<React.Suspense/>)).toBe(ReactIs.Suspense);
177+
expect(ReactIs.isSuspense(<React.Suspense/>)).toBe(true);
178+
expect(ReactIs.isSuspense({type: ReactIs.Suspense})).toBe(false);
179+
expect(ReactIs.isSuspense('React.Suspense')).toBe(false);
180+
expect(ReactIs.isSuspense(<div/>)).toBe(false);
181+
});
182+
163183
it('should identify profile root',()=>{
164184
expect(
165185
ReactIs.typeOf(<React.unstable_Profilerid="foo"onRender={jest.fn()}/>),

0 commit comments

Comments
 (0)