/** * TachUI Registry Types * * Type definitions for the TachUI modifier registry system. */ /** * Basic Signal interface for reactive values */ export interface Signal { (): T; set(value: T): void; } /** * Reactive modifier properties that can contain signals */ export type ReactiveModifierProps = { [K in keyof T]: T[K] | Signal; }; /** * Modifier factory function type */ export type ModifierFactory = (props: ReactiveModifierProps) => Modifier; /** * Lazy loader function type for on-demand modifier registration */ export type ModifierLoader = () => ModifierFactory | Promise>; /** * Base modifier interface that all modifiers must implement */ export interface Modifier { readonly type: string; readonly priority: number; readonly properties: TProps; apply(node: any, context: ModifierContext): any | undefined; } /** * Context passed to modifiers during application */ export interface ModifierContext { componentId: string; componentInstance?: any; element?: Element; parentElement?: Element; phase: 'creation' | 'update' | 'cleanup'; previousModifiers?: Modifier[]; } /** * Registry health diagnostic information */ export interface RegistryHealth { totalModifiers: number; duplicateNames: string[]; orphanedReferences: string[]; instanceId: string; createdAt: number; instanceCount: number; } /** * Feature flags for registry functionality */ export interface RegistryFeatureFlags { /** Enable proxy-based modifier system (new SwiftUI approach) */ proxyModifiers?: boolean; /** Enable automatic type generation */ autoTypeGeneration?: boolean; /** Enable HMR cache invalidation */ hmrCacheInvalidation?: boolean; /** Enable plugin system validation */ pluginValidation?: boolean; /** Enable performance monitoring */ performanceMonitoring?: boolean; /** Enable metadata registration */ metadataRegistration?: boolean; } /** * Modifier metadata for build-time type generation */ export interface ModifierMetadata { /** Modifier name (string or symbol) */ name: string | symbol; /** Plugin package name */ plugin: string; /** Priority for conflict resolution */ priority: number; /** TypeScript signature for type generation */ signature: string; /** Category for organization */ category: 'layout' | 'appearance' | 'interaction' | 'animation' | 'accessibility' | 'custom'; /** Optional description */ description?: string; /** Deprecated flag */ deprecated?: boolean; /** Deprecation message */ deprecationMessage?: string; } /** * Plugin metadata stored in the registry */ export interface PluginInfo { /** Package name of the plugin */ name: string; /** Published version identifier */ version: string; /** Author or organization maintaining the plugin */ author: string; /** Optional flag for first-party or verified plugins */ verified?: boolean; } /** * Modifier registry for registering custom modifiers */ export interface ModifierRegistry { register(name: string, factory: ModifierFactory): void; registerLazy(name: string, loader: ModifierLoader): void; get(name: string): ModifierFactory | undefined; get(name: string, options: { async: true; }): Promise | undefined>; has(name: string): boolean; list(): string[]; clear(): void; reset(): void; validateRegistry(): RegistryHealth; setFeatureFlags(flags: Partial): void; getFeatureFlags(): RegistryFeatureFlags; isFeatureEnabled(feature: keyof RegistryFeatureFlags): boolean; registerMetadata(metadata: ModifierMetadata): void; getMetadata(name: string | symbol): ModifierMetadata | undefined; getAllMetadata(): ModifierMetadata[]; getModifiersByCategory(category: ModifierMetadata['category']): ModifierMetadata[]; getConflicts(): Map; registerPlugin(metadata: PluginInfo): void; getPluginInfo(name: string): PluginInfo | undefined; listPlugins(): PluginInfo[]; /** * @deprecated Use getModifiersByCategory instead. */ getMetadataByCategory(category: ModifierMetadata['category']): ModifierMetadata[]; }