export declare type Ref = { value: T; }; export declare type UnwrapState = { [key in keyof State]: (State[key] & Ref)['value']; }; /** * Component definition */ export declare type ConstructorType = NumberConstructor | StringConstructor | BooleanConstructor | ObjectConstructor | ArrayConstructor; export declare type ComponentProps = { [key in keyof Props]: { type?: NumberConstructor; default?: number | (() => number); } | { type?: StringConstructor; default?: string | (() => string); } | { type?: BooleanConstructor; default?: boolean | (() => boolean); } | { type?: ObjectConstructor; default?: object | (() => object); } | { type?: ArrayConstructor; default?: unknown[] | (() => unknown[]); }; }; export declare type UnwrapProps = { [key in keyof ComponentProps]: ComponentProps[key]['default'] | null; }; export interface EmitFn { (eventName: string, ...args: any[]): void; } export interface SlotFn { (name?: string): T; } export interface HasSlotFn { (name?: string): boolean; } export interface ProvideFn { (identifier: string | symbol, value: T, dependencies?: any[]): void; } export interface InjectFn { (identifier: string | symbol, defaultValue?: T | (() => T)): T | undefined; } export interface SetupContext { emit: EmitFn; hasSlot: HasSlotFn; provide: ProvideFn; inject: InjectFn; } export interface RenderContext { slot: SlotFn; hasSlot: HasSlotFn; } export interface ComponentDefinition = {}, State extends Record = {}, VNode = any> { name?: string; slots?: string[]; emits?: string[]; props?: ComponentProps; setup?(props: Props, context: SetupContext): State; render(state: Props & State, context: RenderContext): VNode; } /** * Providers */ export interface Providers { [key: string | symbol]: { state: any; setState(newValue: any): void; notify(newValue: any): void; }; } export interface RegisterProviderFn { (identifier: string | symbol, value: T): void; } export interface UpdateProviderFn { (identifier: string | symbol, value: T): void; } /** * Function types */ export interface DefineComponentFn { (definition: ComponentDefinition): ComponentType; } export interface RefFn { (initialValue: T): Ref; } export interface ComputedFn { (computeFn: () => T, dependencies?: any[]): Ref; } export interface WatchFn { (dependency: () => T, callback: (newValue: T) => void): void; } export interface HoistFn { (type: string | D, props?: Record, ...children: (C | C[] | Record (C | C[])>)[]): T; } export interface FragmentFn { (props: { children?: C | C[]; }): C | C[] | undefined; } /** * Plugin types */ export interface DefinePluginContext { provide: ProvideFn; } export interface DefinePluginFn { (setup: (options: Options, context: DefinePluginContext) => void): Plugin; } /** * Storybook types */ export interface CreateStoryFn { (component: T, storyArgs?: { class?: string; }): any; }