@mr_hugo/boredom
Version:
Another boring JavaScript framework.
101 lines (92 loc) • 2.05 kB
text/typescript
import type { Bored } from "./dom";
import type { webComponent } from "./index";
export type WebComponentDetail = {
index: number;
name: string;
data?: any;
};
export type WebComponentInitParams<S> = {
detail: WebComponentDetail;
state: S;
refs: Refs;
self: Bored;
on: (
eventName: string,
eventHandler: (options: {
state: S | undefined;
e: CustomEvent["detail"];
detail: WebComponentDetail;
}) => void,
) => void;
};
export type WebComponentRenderParams<S> = {
detail: WebComponentDetail;
state: S;
refs: Refs;
slots: Slots;
self: Bored;
makeComponent: (
tag: string,
options?: { detail?: WebComponentDetail },
) => Bored;
};
// A boreDOM component life is made of these functions:
/** The function returned by `webComponent`, used to create subscribers and call the initialize function */
export type LoadedFunction = ReturnType<typeof webComponent>;
/** The function passed as parameter to `webComponent`, used to initialize the component and create the render function */
export type InitFunction<S> = (
options: WebComponentInitParams<S>,
) => RenderFunction<S>;
/** The function used to render function and update it visually */
export type RenderFunction<S> = (
renderOpts: WebComponentRenderParams<S>,
) => void;
export type AppState<S> = {
app: S | undefined;
internal: {
customTags: string[];
components: Map<string, LoadedFunction | null>;
updates: {
path: string[];
value: object[];
raf: number | undefined;
subscribers: Map<string, ((s?: S) => void)[]>;
};
};
};
type Letter =
| "a"
| "b"
| "c"
| "d"
| "e"
| "f"
| "g"
| "h"
| "i"
| "j"
| "k"
| "l"
| "m"
| "n"
| "o"
| "p"
| "q"
| "r"
| "s"
| "t"
| "u"
| "v"
| "w"
| "x"
| "y"
| "z";
export type Refs = {
[key: `${Letter}${string}`]: HTMLElement;
};
export type Slots = {
[key: `${Letter}${string}`]: HTMLElement;
};
export type ReadonlyProxy<T extends object> = {
readonly [P in keyof T]: T[P];
};