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 const enum TAG { UPDATE = 1 << 1, INSERT = 1 << 2, REMOVE = 1 << 3, SVG = 1 << 4, DIRTY = 1 << 5, MOVE = 1 << 6, REPLACE = 1 << 7, } 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 }