import { Sheets } from "./css.js"; export type SchemaFunction = (...args: any) => any; export type SchemaConstructor = new (...args: any) => any; export type SchemaEvent = { new (type: string, eventInitDict?: EventInit): Event; }; export type SchemaRecord = { [index: string | number | symbol]: any }; export type SchemaEventConfig = EventInit & { base?: SchemaEvent; detail?: any; }; export type SchemaEventInit = SchemaEventConfig & { type?: string; }; export type SchemaSerializable = | StringConstructor | BooleanConstructor | NumberConstructor | ArrayConstructor | ObjectConstructor | DateConstructor; export type SchemaPropType = SchemaFunction | SchemaConstructor; export type ShemaProp = SchemaPropType | TypeWithConfig; export interface CustomType { new (): Type; } export type TypeWithConfig = { type: Type; value?: () => Value; reflect?: boolean; }; export type Type< Type extends abstract new (...args: any[]) => any, Value = unknown > = | Type | TypeWithConfig< Type, Value extends unknown ? InstanceType : unknown >; export interface PropTypes { [prop: string]: | Types | TypeString | TypeNumber | TypeBoolean | TypePromise | TypeArray | TypeObject | TypeFunction; } export interface SchemaComponentStylesConfig { styles?: Sheets; } export interface SchemaComponentFormConfig { form?: boolean; } export interface SchemaComponentGenericConfig extends SchemaComponentStylesConfig, SchemaComponentFormConfig {} export interface SchemaComponentConfig extends SchemaComponentGenericConfig { props: PropTypes; } export interface EventConfig extends EventInit { detail?: Detail; base?: SchemaEvent; } export type PropTypeFromType = Type extends EventProp ? (detail: E) => boolean : Type extends DateConstructor ? Date : Type extends (...args: any[]) => infer R ? R : Type extends abstract new (...args: any[]) => infer R ? R : unknown; export type PropType = Type extends { value: () => infer R; } ? R extends PropTypeFromType ? R : PropTypeFromType : PropTypeFromType; export type Prop = Type extends TypeWithConfig ? PropType : Type extends SchemaPropType ? PropType<{ type: Type }> : unknown; export type KeyofPropsWithConfigValue = { [prop in keyof Props]-?: Props[prop] extends { value: any; } ? prop : never; }[keyof Props]; export type KeyofPropsWithEvents = { [prop in keyof Props]-?: Props[prop] extends EventProp ? prop : never; }[keyof Props]; export type KeyofAttrsFromProps = { [prop in keyof Props]-?: Props[prop] extends TypeWithConfig ? Props[prop]["type"] extends SchemaSerializable ? CamelToKebab : never : Props[prop] extends SchemaSerializable ? CamelToKebab : never; }[keyof Props]; export type InferEvents = { [prop in KeyofPropsWithEvents as `on${string & prop}`]: Props[prop] extends EventProp ? (event: CustomEvent) => any : unknown; }; export type InferPropsWithEvents = InferProps< Omit> > & InferEvents; export type CamelToKebab = S extends `${infer T}${infer U}` ? `${T extends Lowercase ? "" : "-"}${Lowercase}${CamelToKebab}` : S; export type InferAttrsFromProps = Record< Exclude, keyof Props>, string >; export type InferProps = { [prop in keyof Props]?: Prop; } & { [prop in KeyofPropsWithConfigValue]: Prop; }; export interface EventProp { type: FunctionConstructor; value: () => Detail extends null ? () => boolean : (detail: Detail extends boolean ? boolean : Detail) => boolean; } export type Global = typeof globalThis; export type GlobalIgnore = | SchemaSerializable | PromiseConstructor | SymbolConstructor | FunctionConstructor; export type GlobalKeys = | "Event" | "URL" | "Range" | "Image" | "Crypto" | "File" | "Date" | "Set" | "Blob" | "BlobEvent" | "Map" | "RegExp" | "Animation" | `WebSocket` | `BroadcastChannel` | `AbortController` | `Request` | `Response` | `Worker` | `SharedWorker` | `CSSStyleSheet` | `${string}Event` | `${string}Array` | `Event${string}` | `Payment${string}` | `Event${string}` | `Clipboard${string}` | `Animation${string}` | `Form${string}` | `Font${string}` | `DOM${string}` | `Touch${string}` | `Mutation${string}` | `Intersection${string}` | `Message${string}` | `Text${string}` | `HTML${string}` | `SVG${string}` | `Audio${string}` | `Document${string}` | `Weak${string}` | `File${string}`; export type GlobalConstructors = Pick< Global, { [name in keyof Global]-?: Global[name] extends abstract new ( ...args: any[] ) => any ? name extends GlobalKeys ? name : never : never; }[keyof Global] >; export type Types = | { [name in keyof GlobalConstructors]-?: Type; }[keyof GlobalConstructors] | CustomType; export type TypeString = Type; export type TypeBoolean = Type; export type TypeNumber = Type; export type TypeArray = Type; export type TypePromise = Type>; export type TypeObject = Type; export type TypeFunction = Type;