UNPKG

element-vir

Version:

Heroic. Reactive. Declarative. Type safe. Web components without compromise.

66 lines (65 loc) 2.89 kB
import { type DefinedTypedEvent, type DefineEvent, type TypedEvent } from '../../typed-event/typed-event.js'; import { type CustomElementTagName } from '../custom-tag-name.js'; /** * Base type for defining element events inside of an element definition. * * @category Internal */ export type EventsInitMap = Record<string, DefineEvent<any>>; /** * Used to define element events, with a type. * * @category Element Definition * @example * * ```ts * import {html, defineElement, defineElementEvent, listen} from 'element-vir'; * * const MyElement = defineElement()({ * tagName: 'my-element', * events: { * myOutput: defineElementEvent<number>(), * }, * render({events, dispatch}) { * return html` * <div * ${listen('click', () => { * dispatch(new events.myOutput(1)); * })} * > * Some div * </div> * `; * }, * }); * ``` */ export declare function defineElementEvent<EventDetailGeneric>(): DefineEvent<EventDetailGeneric>; /** * Extracts the detail type of the given event name from the given event init map. * * @category Internal */ export type EventInitMapEventDetailExtractor<EventTypeNameGeneric extends keyof EventsInitGeneric, EventsInitGeneric extends EventsInitMap> = EventsInitGeneric[EventTypeNameGeneric] extends DefineEvent<infer Detail> ? Detail : never; /** * Maps the given element tag name and map of event names to their run-time event type strings. * * @category Internal */ export type EventDescriptorMap<TagName extends CustomElementTagName, EventsInitGeneric extends EventsInitMap> = { [CurrentEventTypeName in keyof EventsInitGeneric]: DefinedTypedEvent<CurrentEventTypeName extends string ? `${TagName}-${CurrentEventTypeName}` : never, EventInitMapEventDetailExtractor<CurrentEventTypeName, EventsInitGeneric>>; }; /** * Extract the event detail type from a {@link TypedEvent}, {@link DefinedTypedEvent}, or * `CustomEvent. * * @category Internal */ export type EventDetail<ElementEvent extends TypedEvent<any, any> | DefinedTypedEvent<any, any> | CustomEvent> = ElementEvent extends TypedEvent<string, infer Detail> ? Detail : ElementEvent extends DefinedTypedEvent<any, infer Detail> ? Detail : ElementEvent extends CustomEvent<infer Detail> ? Detail : 'TYPE ERROR: failed to extract event detail type'; /** * Maps an element definition initialization's tag name and event map to a map of ready-to-construct * event classes. This also verifies that the input event init map has valid keys. * * @category Internal */ export declare function createEventDescriptorMap<TagName extends CustomElementTagName, EventsInitGeneric extends EventsInitMap>(tagName: CustomElementTagName, eventsInit: EventsInitGeneric | undefined): EventDescriptorMap<TagName, EventsInitGeneric>;