mirror of
https://github.com/facebook/react.git
synced 2025-11-01 09:12:30 +00:00
230 lines
5.9 KiB
JavaScript
230 lines
5.9 KiB
JavaScript
// @flow
|
|
|
|
import type { ElementType } from 'src/devtools/types';
|
|
import type { InspectedElement } from 'src/devtools/views/Components/types';
|
|
|
|
type BundleType =
|
|
| 0 // PROD
|
|
| 1; // DEV
|
|
|
|
export type WorkTag = number;
|
|
export type SideEffectTag = number;
|
|
export type ExpirationTime = number;
|
|
export type RefObject = {|
|
|
current: any,
|
|
|};
|
|
export type Source = {
|
|
fileName: string,
|
|
lineNumber: number,
|
|
};
|
|
export type HookType =
|
|
| 'useState'
|
|
| 'useReducer'
|
|
| 'useContext'
|
|
| 'useRef'
|
|
| 'useEffect'
|
|
| 'useLayoutEffect'
|
|
| 'useCallback'
|
|
| 'useMemo'
|
|
| 'useImperativeHandle'
|
|
| 'useDebugValue';
|
|
|
|
// The Fiber type is copied from React and should be kept in sync:
|
|
// https://github.com/facebook/react/blob/master/packages/react-reconciler/src/ReactFiber.js
|
|
// The properties we don't use in DevTools are omitted.
|
|
export type Fiber = {|
|
|
tag: WorkTag,
|
|
|
|
key: null | string,
|
|
|
|
elementType: any,
|
|
|
|
type: any,
|
|
|
|
stateNode: any,
|
|
|
|
return: Fiber | null,
|
|
|
|
child: Fiber | null,
|
|
sibling: Fiber | null,
|
|
index: number,
|
|
|
|
ref: null | (((handle: mixed) => void) & { _stringRef: ?string }) | RefObject,
|
|
|
|
pendingProps: any, // This type will be more specific once we overload the tag.
|
|
memoizedProps: any, // The props used to create the output.
|
|
|
|
memoizedState: any,
|
|
|
|
effectTag: SideEffectTag,
|
|
|
|
alternate: Fiber | null,
|
|
|
|
actualDuration?: number,
|
|
|
|
actualStartTime?: number,
|
|
|
|
treeBaseDuration?: number,
|
|
|
|
_debugSource?: Source | null,
|
|
_debugOwner?: Fiber | null,
|
|
|};
|
|
|
|
// TODO: If it's useful for the frontend to know which types of data an Element has
|
|
// (e.g. props, state, context, hooks) then we could add a bitmask field for this
|
|
// to keep the number of attributes small.
|
|
export type FiberData = {|
|
|
key: string | null,
|
|
displayName: string | null,
|
|
type: ElementType,
|
|
|};
|
|
|
|
export type NativeType = {};
|
|
export type RendererID = number;
|
|
|
|
type Dispatcher = any;
|
|
|
|
export type ReactRenderer = {
|
|
findHostInstanceByFiber: (fiber: Object) => ?NativeType,
|
|
findFiberByHostInstance: (hostInstance: NativeType) => ?Fiber,
|
|
version: string,
|
|
bundleType: BundleType,
|
|
|
|
// 16.9+
|
|
overrideHookState?: ?(
|
|
fiber: Object,
|
|
id: number,
|
|
path: Array<string | number>,
|
|
value: any
|
|
) => void,
|
|
|
|
// 16.7+
|
|
overrideProps?: ?(
|
|
fiber: Object,
|
|
path: Array<string | number>,
|
|
value: any
|
|
) => void,
|
|
|
|
// 16.9+
|
|
scheduleUpdate?: ?(fiber: Object) => void,
|
|
setSuspenseHandler?: ?(shouldSuspend: (fiber: Object) => boolean) => void,
|
|
|
|
// Only injected by React v16.8+ in order to support hooks inspection.
|
|
currentDispatcherRef?: {| current: null | Dispatcher |},
|
|
};
|
|
|
|
export type Interaction = {|
|
|
id: number,
|
|
name: string,
|
|
timestamp: number,
|
|
|};
|
|
|
|
export type CommitDetails = {|
|
|
actualDurations: Array<number>,
|
|
commitIndex: number,
|
|
interactions: Array<Interaction>,
|
|
rootID: number,
|
|
|};
|
|
|
|
export type FiberCommits = {|
|
|
commitDurations: Array<number>,
|
|
fiberID: number,
|
|
rootID: number,
|
|
|};
|
|
|
|
export type InteractionWithCommits = {|
|
|
...Interaction,
|
|
commits: Array<number>,
|
|
|};
|
|
|
|
export type Interactions = {|
|
|
interactions: Array<InteractionWithCommits>,
|
|
rootID: number,
|
|
|};
|
|
|
|
export type ProfilingSummary = {|
|
|
commitDurations: Array<number>,
|
|
commitTimes: Array<number>,
|
|
initialTreeBaseDurations: Array<number>,
|
|
interactionCount: number,
|
|
rootID: number,
|
|
|};
|
|
|
|
export type PathFrame = {|
|
|
key: string | null,
|
|
index: number,
|
|
displayName: string | null,
|
|
|};
|
|
|
|
export type PathMatch = {|
|
|
id: number,
|
|
isFullMatch: boolean,
|
|
|};
|
|
|
|
export type RendererInterface = {
|
|
cleanup: () => void,
|
|
findNativeByFiberID: (id: number) => ?NativeType,
|
|
flushInitialOperations: () => void,
|
|
getBestMatchForTrackedPath: () => PathMatch | null,
|
|
getCommitDetails: (rootID: number, commitIndex: number) => CommitDetails,
|
|
getFiberIDFromNative: (
|
|
component: NativeType,
|
|
findNearestUnfilteredAncestor?: boolean
|
|
) => number | null,
|
|
getFiberCommits: (rootID: number, fiberID: number) => FiberCommits,
|
|
getInteractions: (rootID: number) => Interactions,
|
|
getProfilingDataForDownload: (rootID: number) => Object,
|
|
getProfilingSummary: (rootID: number) => ProfilingSummary,
|
|
getPathForElement: (id: number) => Array<PathFrame> | null,
|
|
handleCommitFiberRoot: (fiber: Object) => void,
|
|
handleCommitFiberUnmount: (fiber: Object) => void,
|
|
inspectElement: (id: number) => InspectedElement | null,
|
|
logElementToConsole: (id: number) => void,
|
|
overrideSuspense: (id: number, forceFallback: boolean) => void,
|
|
prepareViewElementSource: (id: number) => void,
|
|
renderer: ReactRenderer | null,
|
|
selectElement: (id: number) => void,
|
|
setInContext: (id: number, path: Array<string | number>, value: any) => void,
|
|
setInHook: (
|
|
id: number,
|
|
index: number,
|
|
path: Array<string | number>,
|
|
value: any
|
|
) => void,
|
|
setInProps: (id: number, path: Array<string | number>, value: any) => void,
|
|
setInState: (id: number, path: Array<string | number>, value: any) => void,
|
|
setTrackedPath: (path: Array<PathFrame> | null) => void,
|
|
startProfiling: () => void,
|
|
stopProfiling: () => void,
|
|
};
|
|
|
|
export type Handler = (data: any) => void;
|
|
|
|
export type DevToolsHook = {
|
|
listeners: { [key: string]: Array<Handler> },
|
|
rendererInterfaces: Map<RendererID, RendererInterface>,
|
|
renderers: Map<RendererID, ReactRenderer>,
|
|
|
|
emit: (event: string, data: any) => void,
|
|
getFiberRoots: (rendererID: RendererID) => Set<Object>,
|
|
inject: (renderer: ReactRenderer) => number | null,
|
|
on: (event: string, handler: Handler) => void,
|
|
off: (event: string, handler: Handler) => void,
|
|
reactDevtoolsAgent?: ?Object,
|
|
sub: (event: string, handler: Handler) => () => void,
|
|
|
|
// React uses these methods.
|
|
checkDCE: (fn: Function) => void,
|
|
onCommitFiberUnmount: (rendererID: RendererID, fiber: Object) => void,
|
|
onCommitFiberRoot: (rendererID: RendererID, fiber: Object) => void,
|
|
};
|
|
|
|
export type HooksNode = {
|
|
id: number,
|
|
isStateEditable: boolean,
|
|
name: string,
|
|
value: mixed,
|
|
subHooks: Array<HooksNode>,
|
|
};
|
|
export type HooksTree = Array<HooksNode>;
|