UNPKG

4.92 kBTypeScriptView Raw
1import * as preact from './index';
2
3export enum HookType {
4 useState = 1,
5 useReducer = 2,
6 useEffect = 3,
7 useLayoutEffect = 4,
8 useRef = 5,
9 useImperativeHandle = 6,
10 useMemo = 7,
11 useCallback = 8,
12 useContext = 9,
13 useErrorBoundary = 10,
14 // Not a real hook, but the devtools treat is as such
15 useDebugvalue = 11
16}
17
18export interface DevSource {
19 fileName: string;
20 lineNumber: number;
21}
22
23export interface Options extends preact.Options {
24 /** Attach a hook that is invoked before render, mainly to check the arguments. */
25 _root?(
26 vnode: ComponentChild,
27 parent: Element | Document | ShadowRoot | DocumentFragment
28 ): void;
29 /** Attach a hook that is invoked before a vnode is diffed. */
30 _diff?(vnode: VNode): void;
31 /** Attach a hook that is invoked after a tree was mounted or was updated. */
32 _commit?(vnode: VNode, commitQueue: Component[]): void;
33 /** Attach a hook that is invoked before a vnode has rendered. */
34 _render?(vnode: VNode): void;
35 /** Attach a hook that is invoked before a hook's state is queried. */
36 _hook?(component: Component, index: number, type: HookType): void;
37 /** Bypass effect execution. Currenty only used in devtools for hooks inspection */
38 _skipEffects?: boolean;
39 /** Attach a hook that is invoked after an error is caught in a component but before calling lifecycle hooks */
40 _catchError(error: any, vnode: VNode, oldVNode?: VNode | undefined): void;
41}
42
43export type ComponentChild =
44 | VNode<any>
45 | string
46 | number
47 | boolean
48 | null
49 | undefined;
50export type ComponentChildren = ComponentChild[] | ComponentChild;
51
52export interface FunctionComponent<P = {}> extends preact.FunctionComponent<P> {
53 // Internally, createContext uses `contextType` on a Function component to
54 // implement the Consumer component
55 contextType?: PreactContext;
56
57 // Internally, createContext stores a ref to the context object on the Provider
58 // Function component to help devtools
59 _contextRef?: PreactContext;
60
61 // Define these properties as undefined on FunctionComponent to get rid of
62 // some errors in `diff()`
63 getDerivedStateFromProps?: undefined;
64 getDerivedStateFromError?: undefined;
65}
66
67export interface ComponentClass<P = {}> extends preact.ComponentClass<P> {
68 _contextRef?: any;
69
70 // Override public contextType with internal PreactContext type
71 contextType?: PreactContext;
72}
73
74// Redefine ComponentType using our new internal FunctionComponent interface above
75export type ComponentType<P = {}> = ComponentClass<P> | FunctionComponent<P>;
76
77export interface PreactElement extends HTMLElement {
78 _children?: VNode<any> | null;
79 /** Event listeners to support event delegation */
80 _listeners?: Record<string, (e: Event) => void>;
81
82 // Preact uses this attribute to detect SVG nodes
83 ownerSVGElement?: SVGElement | null;
84
85 // style: HTMLElement["style"]; // From HTMLElement
86
87 data?: string | number; // From Text node
88}
89
90// We use the `current` property to differentiate between the two kinds of Refs so
91// internally we'll define `current` on both to make TypeScript happy
92type RefObject<T> = { current: T | null };
93type RefCallback<T> = { (instance: T | null): void; current: undefined };
94type Ref<T> = RefObject<T> | RefCallback<T>;
95
96export interface VNode<P = {}> extends preact.VNode<P> {
97 // Redefine type here using our internal ComponentType type
98 type: string | ComponentType<P>;
99 props: P & { children: ComponentChildren };
100 ref?: Ref<any> | null;
101 _children: Array<VNode<any>> | null;
102 _parent: VNode | null;
103 _depth: number | null;
104 /**
105 * The [first (for Fragments)] DOM child of a VNode
106 */
107 _dom: PreactElement | null;
108 /**
109 * The last dom child of a Fragment, or components that return a Fragment
110 */
111 _nextDom: PreactElement | null;
112 _component: Component | null;
113 _hydrating: boolean | null;
114 constructor: undefined;
115 _original: number;
116}
117
118export interface Component<P = {}, S = {}> extends preact.Component<P, S> {
119 // When component is functional component, this is reset to functional component
120 constructor: ComponentType<P>;
121 state: S; // Override Component["state"] to not be readonly for internal use, specifically Hooks
122 base?: PreactElement;
123
124 _dirty: boolean;
125 _force?: boolean;
126 _renderCallbacks: Array<() => void>; // Only class components
127 _globalContext?: any;
128 _vnode?: VNode<P> | null;
129 _nextState?: S | null; // Only class components
130 /** Only used in the devtools to later dirty check if state has changed */
131 _prevState?: S | null;
132 /**
133 * Pointer to the parent dom node. This is only needed for top-level Fragment
134 * components or array returns.
135 */
136 _parentDom?: PreactElement | null;
137 // Always read, set only when handling error
138 _processingException?: Component<any, any> | null;
139 // Always read, set only when handling error. This is used to indicate at diffTime to set _processingException
140 _pendingError?: Component<any, any> | null;
141}
142
143export interface PreactContext extends preact.Context<any> {
144 _id: string;
145 _defaultValue: any;
146}