/** * 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 */ import type {Fiber} from 'react-reconciler/src/ReactInternalTypes'; export type ReactNode = | React$Element | ReactPortal | ReactText | ReactFragment | ReactProvider | ReactConsumer; export type ReactEmpty = null | void | boolean; export type ReactFragment = ReactEmpty | Iterable; export type ReactNodeList = ReactEmpty | React$Node; export type ReactText = string | number; export type ReactProvider = { $$typeof: symbol | number, type: ReactProviderType, key: null | string, ref: null, props: { value: T, children?: ReactNodeList, ... }, ... }; export type ReactProviderType = { $$typeof: symbol | number, _context: ReactContext, ... }; export type ReactConsumer = { $$typeof: symbol | number, type: ReactContext, key: null | string, ref: null, props: { children: (value: T) => ReactNodeList, ... }, ... }; export type ReactContext = { $$typeof: symbol | number, Consumer: ReactContext, Provider: ReactProviderType, _currentValue: T, _currentValue2: T, _threadCount: number, // DEV only _currentRenderer?: Object | null, _currentRenderer2?: Object | null, // This value may be added by application code // to improve DEV tooling display names displayName?: string, // only used by ServerContext _defaultValue: T, _globalName: string, ... }; export type ServerContextJSONValue = | string | boolean | number | null | $ReadOnlyArray | {+[key: string]: ServerContextJSONValue}; export type ReactServerContext = ReactContext; export type ReactPortal = { $$typeof: symbol | number, key: null | string, containerInfo: any, children: ReactNodeList, // TODO: figure out the API for cross-renderer implementation. implementation: any, ... }; export type RefObject = { current: any, }; export type ReactScope = { $$typeof: symbol | number, }; export type ReactScopeQuery = ( type: string, props: {[string]: mixed, ...}, instance: mixed, ) => boolean; export type ReactScopeInstance = { DO_NOT_USE_queryAllNodes(ReactScopeQuery): null | Array, DO_NOT_USE_queryFirstNode(ReactScopeQuery): null | Object, containsNode(Object): boolean, getChildContextValues: (context: ReactContext) => Array, }; // Mutable source version can be anything (e.g. number, string, immutable data structure) // so long as it changes every time any part of the source changes. export type MutableSourceVersion = $NonMaybeType; export type MutableSourceGetSnapshotFn< Source: $NonMaybeType, Snapshot, > = (source: Source) => Snapshot; export type MutableSourceSubscribeFn, Snapshot> = ( source: Source, callback: (snapshot: Snapshot) => void, ) => () => void; export type MutableSourceGetVersionFn = ( source: $NonMaybeType, ) => MutableSourceVersion; export type MutableSource> = { _source: Source, _getVersion: MutableSourceGetVersionFn, // Tracks the version of this source at the time it was most recently read. // Used to determine if a source is safe to read from before it has been subscribed to. // Version number is only used during mount, // since the mechanism for determining safety after subscription is expiration time. // // As a workaround to support multiple concurrent renderers, // we categorize some renderers as primary and others as secondary. // We only expect there to be two concurrent renderers at most: // React Native (primary) and Fabric (secondary); // React DOM (primary) and React ART (secondary). // Secondary renderers store their context values on separate fields. // We use the same approach for Context. _workInProgressVersionPrimary: null | MutableSourceVersion, _workInProgressVersionSecondary: null | MutableSourceVersion, // DEV only // Used to detect multiple renderers using the same mutable source. _currentPrimaryRenderer?: Object | null, _currentSecondaryRenderer?: Object | null, // DEV only // Used to detect side effects that update a mutable source during render. // See https://github.com/facebook/react/issues/19948 _currentlyRenderingFiber?: Fiber | null, _initialVersionAsOfFirstRender?: MutableSourceVersion | null, }; // The subset of a Thenable required by things thrown by Suspense. // This doesn't require a value to be passed to either handler. export interface Wakeable { then(onFulfill: () => mixed, onReject: () => mixed): void | Wakeable; } // The subset of a Promise that React APIs rely on. This resolves a value. // This doesn't require a return value neither from the handler nor the // then function. interface ThenableImpl { then( onFulfill: (value: T) => mixed, onReject: (error: mixed) => mixed, ): void | Wakeable; } interface UntrackedThenable extends ThenableImpl { status?: void; } export interface PendingThenable extends ThenableImpl { status: 'pending'; } export interface FulfilledThenable extends ThenableImpl { status: 'fulfilled'; value: T; } export interface RejectedThenable extends ThenableImpl { status: 'rejected'; reason: mixed; } export type Thenable = | UntrackedThenable | PendingThenable | FulfilledThenable | RejectedThenable; export type OffscreenMode = | 'hidden' | 'unstable-defer-without-hiding' | 'visible' | 'manual'; export type StartTransitionOptions = { name?: string, }; export type Usable = Thenable | ReactContext;