From 90bde6505e43434596ff6398c2c8acb67ced815b Mon Sep 17 00:00:00 2001 From: Brian Vaughn Date: Thu, 25 Feb 2021 16:22:33 -0500 Subject: [PATCH] Add SuspenseList to react-is (#20874) This commit also adds explicit index.stable and index.experimental forks to the react-is package so that we can avoid exporting references to SuspenseList in a stable release. --- packages/react-is/index.experimental.js | 41 +++++++++++++++++++ packages/react-is/index.stable.js | 39 ++++++++++++++++++ packages/react-is/src/ReactIs.js | 4 ++ .../react-is/src/__tests__/ReactIs-test.js | 18 ++++++++ 4 files changed, 102 insertions(+) create mode 100644 packages/react-is/index.experimental.js create mode 100644 packages/react-is/index.stable.js 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(