export type Key = FreText; export interface RefObject { current: T; } export interface RefCallback { (instance: T | null): void; } export type Ref = RefCallback | RefObject | null; export interface IntrinsicAttributes extends Record { key?: Key; ref?: Ref; children?: FreNode; } export interface Attributes extends Record { key?: Key; ref?: Ref; children?: Fiber[]; } export interface FC

{ (props: P): Fiber | FreText | null | undefined; fiber?: Fiber; type?: string; memo?: boolean; shouldUpdate?: (newProps: P, oldProps: P) => boolean; } export interface Hooks { list: HookList[]; layout: HookEffect[]; effect: HookEffect[]; } export type HookList = HookMemo | HookEffect | HookReducer; export type HookMemo = [value: V, deps: DependencyList]; export type HookEffect = [ cb: EffectCallback, deps: DependencyList, cleanup?: () => any ]; export type HookReducer = [value: V, dispatch: Dispatch]; export type FiberFinish = FiberHostFinish | FiberCompFinish; type FiberHostFinish = FiberBaseFinish & FiberHost & { node: HTMLElementEx; }; type FiberCompFinish = FiberBaseFinish & FiberComp & { node: undefined; }; interface FiberBaseFinish extends FiberBase { kids?: FiberFinish[]; parent?: FiberFinish; sibling?: FiberFinish; child?: FiberFinish; old?: FiberFinish; } export type Fiber = FiberHost | FiberComp | FiberBase; export interface FiberHost extends FiberBase { type?: string; props: PropsOf; isComp: false; } export interface FiberComp extends FiberBase { type: FC; props: PropsOf; isComp: true; } export type PropsOf = T extends FC ? P : T extends string ? Attributes : never; interface FiberBase { key?: string; type?: string | FC; memo?: boolean; props?: PropsOf; isComp?: boolean; node?: HTMLElementEx; kids?: Fiber[]; alternate?: Fiber; dirty?: boolean; parent?: Fiber; sibling?: Fiber; child?: Fiber; ref?: Ref; hooks?: Hooks; action?: Action | null; lane?: number; suspend?: boolean; hydrating?: boolean; } export interface Action { op: TAG; cur?: Fiber; ref?: Fiber; } export declare const enum TAG { UPDATE = 2, INSERT = 4, REMOVE = 8, SVG = 16, DIRTY = 32, MOVE = 64, REPLACE = 128 } export type HTMLElementEx = HTMLElement | Text | SVGElement; export type FreText = string | number; export type FreNode = Child[] | Child; export type Child = Fiber | FreText | null | undefined | boolean; export type SetStateAction = S | ((prevState: S) => S); export type Dispatch = (value: A) => void; export type Reducer = (prevState: S, action: A) => S; export type EffectCallback = () => any | (() => () => any); export type DependencyList = ReadonlyArray; export type TaskCallback = (() => TaskCallback) | null | undefined; export interface Task { callback?: TaskCallback; } export {};