fluxel
Version:
An ultra-lightweight, high-performance library for efficient DOM building and dynamic web UIs
61 lines (60 loc) • 3.67 kB
TypeScript
import type ReactiveDependency from "./reactiveDependency.js";
export type { ReactiveDependency };
export type NotFunctionProps<T> = {
[key in keyof T]: Exclude<T[key], null | undefined> extends Function ? never : key;
}[keyof T];
export type FunctionProps<T> = {
[key in keyof T]: Exclude<T[key], null | undefined> extends Function ? key : never;
}[keyof T];
export type ChildrenType<T extends Node = Node> = FixedLengthChildrenType<T> | ReactiveDependency<string[]> | ReactiveDependency<T[]> | ReactiveDependency<(string | T)[]>;
export type FixedLengthChildrenType<T extends Node = Node> = SingleChildType<T> | (string | T | ReactiveDependency<string> | ReactiveDependency<T>)[];
export type SingleChildType<T extends Node = Node> = string | T | ReactiveDependency<string> | ReactiveDependency<T>;
export type CanBeReactiveMap<T> = {
[key in keyof T]: CanBeReactive<T[key]>;
};
export type CanBeReactive<T> = T | ReactiveDependency<T>;
export type FluxelInternalOptions<K extends keyof HTMLElementTagNameMap, C = ChildrenType> = FluxelInternalOptionsFromNode<HTMLElementTagNameMap[K], C>;
export type FluxelInternalOptionsFromNode<K extends Node, C = ChildrenType> = Omit<{
[key in NotFunctionProps<K>]?: CanBeReactive<K[key]>;
}, "children" | "style" | "textContent" | "className" | "classList" | "dataset"> & Omit<{
[key in Exclude<FunctionProps<K>, keyof Node>]?: key extends `on${string}` ? K[key] | K[key][] : K[key] extends Function ? never : K[key];
}, "toString"> & {
children?: C | null | undefined;
style?: Partial<CanBeReactiveMap<CSSStyleDeclaration>> | null | undefined;
classList?: CanBeReactive<string | DOMTokenList | (string | false | null | undefined)[] | Set<string | false | null | undefined>> | CanBeReactive<string | false | null | undefined>[] | null | undefined;
dataset?: Record<string, string | ReactiveDependency<string>> | null | undefined;
};
export type StateParamListenTargetEventType<T extends object> = {
[key in keyof T]: CustomEvent<{
oldValue?: Readonly<T[key]>;
newValue: Readonly<T[key]>;
}>;
};
export type StateParam<T extends object> = T & {
render: () => void;
use: ReactiveDependencyUse<T>;
useWithMemo<K extends keyof T>(key: K): [ReactiveDependency<T[K]>, <MT>(factory: () => MT, deps: any[], pure?: boolean) => MT];
listenTarget: TypedEventTarget<StateParamListenTargetEventType<T>>;
};
export type MemoizeFunction = <MT>(factory: () => MT, deps: any[], pure?: boolean) => MT;
export interface ReactiveDependencyUse<T extends object> {
<K extends keyof T>(key: K): ReactiveDependency<T[K]>;
<K extends keyof T, R>(key: K, deriveFn: (v: T[K], memo: MemoizeFunction) => R): ReactiveDependency<R>;
<K extends (keyof T)[], R>(key: K, deriveFn: (v: {
[key in K[number]]: T[key];
}, memo: MemoizeFunction) => R): ReactiveDependency<R>;
}
export type FluxelComponent<P extends object, R extends ChildrenType | FluxelJSXElement> = (props?: P) => R;
declare const FluxelJSXElementSymbol: unique symbol;
export declare class FluxelJSXElement {
[FluxelJSXElementSymbol]: true;
}
export type HydrationMetadata = {
getElementByEid(eid: string): HTMLElement;
count: number;
};
export declare class TypedEventTarget<T extends Record<string, Event>> {
addEventListener<K extends keyof T>(type: K, listener: (this: TypedEventTarget<T>, ev: T[K]) => any, options?: boolean | AddEventListenerOptions): void;
removeEventListener<K extends keyof T>(type: K, listener: (this: TypedEventTarget<T>, ev: T[K]) => any, options?: boolean | EventListenerOptions): void;
dispatchEvent<K extends keyof T>(event: T[K]): boolean;
}