diff --git a/packages/react-is/index.experimental.js b/packages/react-is/index.experimental.js new file mode 100644 index 0000000000000..560283842b594 --- /dev/null +++ b/packages/react-is/index.experimental.js @@ -0,0 +1,41 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +'use strict'; + +export { + isValidElementType, + typeOf, + ContextConsumer, + ContextProvider, + Element, + ForwardRef, + Fragment, + Lazy, + Memo, + Portal, + Profiler, + StrictMode, + Suspense, + unstable_SuspenseList, + isAsyncMode, + isConcurrentMode, + isContextConsumer, + isContextProvider, + isElement, + isForwardRef, + isFragment, + isLazy, + isMemo, + isPortal, + isProfiler, + isStrictMode, + isSuspense, + unstable_isSuspenseList, +} from './src/ReactIs'; diff --git a/packages/react-is/index.stable.js b/packages/react-is/index.stable.js new file mode 100644 index 0000000000000..ad64178a1c537 --- /dev/null +++ b/packages/react-is/index.stable.js @@ -0,0 +1,39 @@ +/** + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + * + * @flow + */ + +'use strict'; + +export { + isValidElementType, + typeOf, + ContextConsumer, + ContextProvider, + Element, + ForwardRef, + Fragment, + Lazy, + Memo, + Portal, + Profiler, + StrictMode, + Suspense, + isAsyncMode, + isConcurrentMode, + isContextConsumer, + isContextProvider, + isElement, + isForwardRef, + isFragment, + isLazy, + isMemo, + isPortal, + isProfiler, + isStrictMode, + isSuspense, +} from './src/ReactIs'; diff --git a/packages/react-is/src/ReactIs.js b/packages/react-is/src/ReactIs.js index 2f132ba5de9a0..1958043bb2243 100644 --- a/packages/react-is/src/ReactIs.js +++ b/packages/react-is/src/ReactIs.js @@ -72,6 +72,7 @@ export const Portal = REACT_PORTAL_TYPE; export const Profiler = REACT_PROFILER_TYPE; export const StrictMode = REACT_STRICT_MODE_TYPE; export const Suspense = REACT_SUSPENSE_TYPE; +export const unstable_SuspenseList = REACT_SUSPENSE_LIST_TYPE; export {isValidElementType}; @@ -142,3 +143,6 @@ export function isStrictMode(object: any) { export function isSuspense(object: any) { return typeOf(object) === REACT_SUSPENSE_TYPE; } +export function unstable_isSuspenseList(object: any) { + return typeOf(object) === REACT_SUSPENSE_LIST_TYPE; +} diff --git a/packages/react-is/src/__tests__/ReactIs-test.js b/packages/react-is/src/__tests__/ReactIs-test.js index cddd479c4344e..e054cdbc4d485 100644 --- a/packages/react-is/src/__tests__/ReactIs-test.js +++ b/packages/react-is/src/__tests__/ReactIs-test.js @@ -186,6 +186,24 @@ describe('ReactIs', () => { expect(ReactIs.isSuspense(
)).toBe(false); }); + // @gate experimental + it('should identify suspense list', () => { + expect(ReactIs.isValidElementType(React.unstable_SuspenseList)).toBe(true); + expect(ReactIs.typeOf()).toBe( + ReactIs.unstable_SuspenseList, + ); + expect( + ReactIs.unstable_isSuspenseList(), + ).toBe(true); + expect( + ReactIs.unstable_isSuspenseList({type: ReactIs.unstable_SuspenseList}), + ).toBe(false); + expect(ReactIs.unstable_isSuspenseList('React.unstable_SuspenseList')).toBe( + false, + ); + expect(ReactIs.unstable_isSuspenseList(
)).toBe(false); + }); + it('should identify profile root', () => { expect(ReactIs.isValidElementType(React.Profiler)).toBe(true); expect(