UNPKG

@opentui/core

Version:

OpenTUI is a TypeScript library for building terminal user interfaces (TUIs)

47 lines (46 loc) 3.33 kB
import { Renderable, type RenderableOptions } from "../../Renderable"; import type { RenderContext } from "../../types"; export type VChild = VNode | Renderable | VChild[] | null | undefined | false; export interface PendingCall { method: string; args: any[]; isProperty?: boolean; } declare const BrandedVNode: unique symbol; export interface VNode<P = any, C = VChild[]> { [BrandedVNode]: true; type: Construct<P>; props?: P; children?: C; __delegateMap?: Record<string, string>; __pendingCalls?: PendingCall[]; } export type ProxiedVNode<TCtor extends RenderableConstructor<any>> = VNode<TCtor extends RenderableConstructor<infer P> ? P : any> & { [K in keyof InstanceType<TCtor>]: InstanceType<TCtor>[K] extends (...args: infer Args) => any ? (...args: Args) => ProxiedVNode<TCtor> : InstanceType<TCtor>[K]; }; export interface RenderableConstructor<P extends RenderableOptions<any> = RenderableOptions<any>> { new (ctx: RenderContext, options: P): Renderable; } export type FunctionalConstruct<P = any> = (props: P, children?: VChild[]) => VNode; export type Construct<P = any> = RenderableConstructor<P extends RenderableOptions<any> ? P : never> | FunctionalConstruct<P>; export declare function h<TCtor extends RenderableConstructor<any>>(type: TCtor, props?: TCtor extends RenderableConstructor<infer P> ? P : never, ...children: VChild[]): ProxiedVNode<TCtor>; export declare function h<P>(type: FunctionalConstruct<P>, props?: P, ...children: VChild[]): VNode<P>; export declare function h<P>(type: Construct<P>, props?: P, ...children: VChild[]): VNode<P> | ProxiedVNode<any>; export declare function isVNode(node: any): node is VNode; export declare function maybeMakeRenderable(ctx: RenderContext, node: Renderable | VNode<any, any[]> | unknown): Renderable | null; export declare function wrapWithDelegates<T extends InstanceType<RenderableConstructor>>(instance: T, delegateMap: Record<string, string> | undefined): T; export type InstantiateFn<NodeType extends VNode | Renderable> = Renderable & { __node?: NodeType; }; export declare function instantiate<NodeType extends VNode | Renderable>(ctx: RenderContext, node: NodeType): InstantiateFn<NodeType>; export type DelegateMap<T> = Partial<Record<keyof T, string>>; export type ValidateShape<Given, AllowedKeys> = { [K in keyof Given]: K extends keyof AllowedKeys ? NonNullable<Given[K]> : never; }; type InferNode<T> = T extends InstantiateFn<infer U> ? U : never; export declare function delegate<Factory extends InstantiateFn<any>, InnerNode extends InferNode<Factory>, TargetMap extends Record<keyof InnerNode, string>, const Mapping extends Partial<TargetMap>>(mapping: ValidateShape<Mapping, TargetMap>, vnode: Factory): Renderable; export declare function delegate<ConstructorType extends RenderableConstructor<any>, TargetMap extends Record<keyof InstanceType<ConstructorType>, string>, const Mapping extends Partial<TargetMap>>(mapping: ValidateShape<Mapping, TargetMap>, vnode: ProxiedVNode<ConstructorType>): ProxiedVNode<ConstructorType>; export declare function delegate<ConstructorType extends RenderableConstructor<any>, const Mapping extends DelegateMap<InstanceType<ConstructorType>>>(mapping: ValidateShape<Mapping, string>, vnode: VNode & { type: ConstructorType; }): VNode; export {};