basic-pragma
Version:
Configurable JSX pragma using a basic vdom
38 lines (37 loc) • 1.48 kB
TypeScript
/** @noSelfInFile */
import { ComponentType } from "./Component";
export declare type EmptyObject = Record<string, never>;
export declare type PropChildren<P> = P extends {
children: (infer C)[];
} ? (C[] | C | undefined) : P extends {
children: infer C;
} ? C : Children;
export declare type NodeProps<P> = Omit<P, "children"> & ("children" extends keyof P ? {
children: PropChildren<P>;
} : {
children?: PropChildren<P>;
});
export interface VNode<P = EmptyObject> {
type: string | ComponentType<P>;
props: NodeProps<P>;
key?: string | number;
}
export declare type Child = VNode<any> | string | boolean | null | undefined;
export declare type Children = Child | Children[];
declare type InputProps<P> = keyof Omit<P, "children"> extends never ? (EmptyObject | null) : P extends {
children: unknown;
} ? Omit<P, "children"> : P;
declare type InputChildren<P> = P extends {
children: (infer C)[];
} ? C[] : P extends {
children: infer C;
} ? [C] : Children[];
declare type CreateElement = {
<P>(type: ComponentType<P>, props: InputProps<P>, ...children: InputChildren<P>): VNode<any>;
<T extends keyof JSX.IntrinsicElements, P extends JSX.IntrinsicElements[T]>(type: T, props: InputProps<P>, ...children: InputChildren<P>): VNode<any>;
};
export declare const createElement: CreateElement;
export declare const Fragment: ({ children }: {
children?: Children;
}) => string | boolean | VNode<any> | Children[] | null;
export {};