@zeix/ui-element
Version:
UIElement - a HTML-first library for reactive Web Components
32 lines (31 loc) • 2.09 kB
TypeScript
import { type MaybeSignal, type Signal } from '@zeix/cause-effect';
import { type Extractor, type Helpers, type Parser } from './core/dom';
import { type Effects } from './core/reactive';
type ReservedWords = 'constructor' | 'prototype' | '__proto__' | 'toString' | 'valueOf' | 'hasOwnProperty' | 'isPrototypeOf' | 'propertyIsEnumerable' | 'toLocaleString';
type ValidPropertyKey<T> = T extends keyof HTMLElement | ReservedWords ? never : T;
type ValidateComponentProps<P> = {
[K in keyof P]: ValidPropertyKey<K> extends never ? never : P[K];
};
type ComponentProps = {
[K in string as ValidPropertyKey<K>]: unknown & {};
};
type Component<P extends ComponentProps> = HTMLElement & P & {
attributeChangedCallback<K extends keyof P & string>(name: K, oldValue: string | null, newValue: string | null): void;
debug?: boolean;
getSignal<K extends keyof P & string>(prop: K): Signal<P[K]>;
setSignal<K extends keyof P & string>(prop: K, signal: Signal<P[K]>): void;
};
type Initializer<T extends {}, C extends HTMLElement> = T | Parser<T, C> | Extractor<MaybeSignal<T>, C> | ((host: C) => void);
type Setup<P extends ComponentProps> = (host: Component<P>, helpers: Helpers<P>) => Effects<P, Component<P>>;
/**
* Define a component with dependency resolution and setup function (connectedCallback)
*
* @since 0.14.0
* @param {string} name - Name of the custom element
* @param {{ [K in keyof P]: Initializer<NonNullable<P[K]>, Component<P>> }} init - Signals of the component
* @param {Setup<P>} setup - Setup function to be called after dependencies are resolved
* @throws {InvalidComponentNameError} If component name is invalid
* @throws {InvalidPropertyNameError} If property name is invalid
*/
declare function component<P extends ComponentProps & ValidateComponentProps<P>>(name: string, init: { [K in keyof P]: Initializer<NonNullable<P[K]>, Component<P>>; } | undefined, setup: Setup<P>): void;
export { type Component, type ComponentProps, type ReservedWords, type ValidPropertyKey, type ValidateComponentProps, type Initializer, type Setup, component, };