element-vir
Version:
Heroic. Reactive. Declarative. Type safe. Web components without compromise.
66 lines (65 loc) • 2.89 kB
TypeScript
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>;