UNPKG

element-vir

Version:

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

63 lines (62 loc) 1.89 kB
import { defineTypedEvent, } from '../../typed-event/typed-event.js'; /** * 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 function defineElementEvent() { return defineTypedEvent(); } /** * 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 function createEventDescriptorMap(tagName, eventsInit) { if (!eventsInit) { return {}; } return (Object.keys(eventsInit) /** Verify event keys. */ .filter((currentElementEventKey) => { if (typeof currentElementEventKey !== 'string') { throw new TypeError(`Expected event key of type string but got type '${typeof currentElementEventKey}' for key ${String(currentElementEventKey)}`); } else if (currentElementEventKey === '') { throw new Error('Got empty string for events key.'); } return true; }) .reduce((accum, currentElementEventKey) => { const eventObject = defineTypedEvent()([ tagName, currentElementEventKey, ].join('-')); accum[currentElementEventKey] = eventObject; return accum; }, {})); }