import { createPortal, lazy, Fragment, JSX, Suspense } from 'preact/compat'; import type { VNode } from 'preact'; export { createContext, createElement, createPortal, getType, getProps, intercept, lazy, render, Boundary, Fragment, Suspense }; export type { Component, ComponentCtrl, ComponentCtrlGetter, Context, Props, PropsOf, RefObject, VNode }; declare global { namespace JSX { interface IntrinsicElements extends preact.JSX.IntrinsicElements { } interface IntrinsicAttributes extends preact.JSX.IntrinsicAttributes { } type Element = any; } } interface Props extends Record { } interface Component

{ (p: P): JSX.Element | any | (() => JSX.Element); } interface ComponentCtrl { afterMount(task: () => void): void; beforeUpdate(task: () => void): void; afterUpdate(task: () => void): void; beforeUnmount(task: () => void): void; shouldUpdate(pred: (prevProps: Props, nextProps: Props) => boolean): void; getUpdater: () => (force?: boolean) => void; consumeContext(ctx: Context): () => T; } declare type ComponentCtrlGetter = (intention: 0 | 1 | 2) => ComponentCtrl; declare type PropsOf = T extends Component ? P : never; declare type RefObject = { current: T | null; }; declare type Context = { contextName: string; defaultValue: T; }; declare function intercept(params: { onCreateElement?(next: () => void, type: string | Function, props: Props): void; onInit?(next: () => void, componentId: string, getCtrl: ComponentCtrlGetter): void; onRender?(next: () => void, componentId: string, getCtrl: ComponentCtrlGetter | null): void; }): void; declare function render(content: JSX.Element, container: Element | string): void; declare function createElement

(type: string | Component, props: P, ...children: VNode[]): JSX.Element; declare function createContext(contextName: string, defaultValue: T): [Context, Component<{ value: T; }>]; declare function Boundary(props: { fallback: VNode; }): VNode; declare function getType(vnode: VNode): string | Component | null; declare function getProps(vnode: VNode): Props | null;