@rilaykit/core 8.1.0 → 9.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -43,8 +43,8 @@ interface AsyncValidationResult {
43
43
  warnings?: string[];
44
44
  }
45
45
  /**
46
- * Interface publique pour les instances Rilay
47
- * Expose uniquement les méthodes nécessaires à l'API publique
46
+ * Public interface for Rilay instances
47
+ * Exposes only the methods necessary for the public API
48
48
  */
49
49
  interface RilayInstance<C> {
50
50
  addComponent<NewType extends string, TProps = any>(type: NewType, config: Omit<ComponentConfig<TProps>, 'id' | 'type'>): RilayInstance<C & {
@@ -99,7 +99,7 @@ declare class ril<C> implements RilayInstance<C> {
99
99
  *
100
100
  * @example
101
101
  * ```typescript
102
- * // Component avec validation par défaut
102
+ * // Component with default validation
103
103
  * const factory = ril.create()
104
104
  * .addComponent('email', {
105
105
  * name: 'Email Input',
@@ -475,6 +475,125 @@ type WorkflowStepperRenderer = RendererChildrenFunction<WorkflowStepperRendererP
475
475
  type WorkflowNextButtonRenderer = RendererChildrenFunction<WorkflowNextButtonRendererProps>;
476
476
  type WorkflowPreviousButtonRenderer = RendererChildrenFunction<WorkflowPreviousButtonRendererProps>;
477
477
  type WorkflowSkipButtonRenderer = RendererChildrenFunction<WorkflowSkipButtonRendererProps>;
478
+ interface PerformanceMetrics {
479
+ readonly timestamp: number;
480
+ readonly duration: number;
481
+ readonly memoryUsage?: number;
482
+ readonly renderCount?: number;
483
+ readonly reRenderCount?: number;
484
+ }
485
+ interface ComponentPerformanceMetrics extends PerformanceMetrics {
486
+ readonly componentId: string;
487
+ readonly componentType: string;
488
+ readonly propsSize?: number;
489
+ readonly childrenCount?: number;
490
+ }
491
+ interface FormPerformanceMetrics extends PerformanceMetrics {
492
+ readonly formId: string;
493
+ readonly fieldCount: number;
494
+ readonly validationDuration: number;
495
+ readonly renderDuration: number;
496
+ readonly validationErrors: number;
497
+ }
498
+ interface WorkflowPerformanceMetrics extends PerformanceMetrics {
499
+ readonly workflowId: string;
500
+ readonly stepCount: number;
501
+ readonly currentStepIndex: number;
502
+ readonly navigationDuration: number;
503
+ readonly persistenceDuration?: number;
504
+ readonly conditionEvaluationDuration: number;
505
+ }
506
+ type MonitoringEventType = 'component_render' | 'component_update' | 'form_validation' | 'form_submission' | 'workflow_navigation' | 'workflow_persistence' | 'condition_evaluation' | 'error' | 'performance_warning';
507
+ interface MonitoringEvent {
508
+ readonly id: string;
509
+ readonly type: MonitoringEventType;
510
+ readonly timestamp: number;
511
+ readonly source: string;
512
+ readonly data: Record<string, any>;
513
+ readonly metrics?: PerformanceMetrics;
514
+ readonly severity?: 'low' | 'medium' | 'high' | 'critical';
515
+ }
516
+ interface ErrorMonitoringEvent extends MonitoringEvent {
517
+ readonly type: 'error';
518
+ readonly error: Error;
519
+ readonly stack?: string;
520
+ readonly context?: ValidationContext | WorkflowContext;
521
+ }
522
+ interface PerformanceWarningEvent extends MonitoringEvent {
523
+ readonly type: 'performance_warning';
524
+ readonly threshold: number;
525
+ readonly actualValue: number;
526
+ readonly recommendation?: string;
527
+ }
528
+ interface MonitoringConfig {
529
+ readonly enabled: boolean;
530
+ readonly enablePerformanceTracking?: boolean;
531
+ readonly enableErrorTracking?: boolean;
532
+ readonly enableMemoryTracking?: boolean;
533
+ readonly performanceThresholds?: PerformanceThresholds;
534
+ readonly sampleRate?: number;
535
+ readonly bufferSize?: number;
536
+ readonly flushInterval?: number;
537
+ readonly onEvent?: (event: MonitoringEvent) => void;
538
+ readonly onBatch?: (events: MonitoringEvent[]) => void;
539
+ readonly onError?: (error: Error) => void;
540
+ }
541
+ interface PerformanceThresholds {
542
+ readonly componentRenderTime?: number;
543
+ readonly formValidationTime?: number;
544
+ readonly workflowNavigationTime?: number;
545
+ readonly memoryUsage?: number;
546
+ readonly reRenderCount?: number;
547
+ }
548
+ interface MonitoringAdapter {
549
+ readonly name: string;
550
+ readonly version?: string;
551
+ send: (events: MonitoringEvent[]) => Promise<void>;
552
+ flush?: () => Promise<void>;
553
+ configure?: (config: Record<string, any>) => void;
554
+ }
555
+ interface ConsoleMonitoringAdapter extends MonitoringAdapter {
556
+ readonly name: 'console';
557
+ readonly logLevel?: 'debug' | 'info' | 'warn' | 'error';
558
+ }
559
+ interface RemoteMonitoringAdapter extends MonitoringAdapter {
560
+ readonly name: 'remote';
561
+ readonly endpoint: string;
562
+ readonly apiKey?: string;
563
+ readonly headers?: Record<string, string>;
564
+ readonly batchSize?: number;
565
+ readonly retryAttempts?: number;
566
+ }
567
+ interface MonitoringContext {
568
+ readonly sessionId: string;
569
+ readonly userId?: string;
570
+ readonly userAgent?: string;
571
+ readonly url?: string;
572
+ readonly environment: 'development' | 'production' | 'test';
573
+ readonly version?: string;
574
+ readonly metadata?: Record<string, any>;
575
+ }
576
+ interface PerformanceProfiler {
577
+ start: (label: string, metadata?: Record<string, any>) => void;
578
+ end: (label: string) => PerformanceMetrics | null;
579
+ mark: (name: string) => void;
580
+ measure: (name: string, startMark: string, endMark?: string) => number;
581
+ getMetrics: (label: string) => PerformanceMetrics | null;
582
+ getAllMetrics: () => Record<string, PerformanceMetrics>;
583
+ clear: (label?: string) => void;
584
+ }
585
+ interface EnhancedWorkflowAnalytics extends WorkflowAnalytics {
586
+ readonly monitoring?: MonitoringConfig;
587
+ readonly onPerformanceWarning?: (event: PerformanceWarningEvent) => void;
588
+ readonly onMemoryLeak?: (metrics: ComponentPerformanceMetrics) => void;
589
+ }
590
+ interface EnhancedFormAnalytics {
591
+ readonly onFormRender?: (metrics: FormPerformanceMetrics) => void;
592
+ readonly onFormValidation?: (metrics: FormPerformanceMetrics) => void;
593
+ readonly onFormSubmission?: (metrics: FormPerformanceMetrics) => void;
594
+ readonly onFieldChange?: (fieldId: string, metrics: ComponentPerformanceMetrics) => void;
595
+ readonly monitoring?: MonitoringConfig;
596
+ }
478
597
 
479
598
  declare function ComponentRendererWrapper<TProps = any>({ children, renderAs, renderer, name, props: baseProps, }: ComponentRendererWrapperProps<TProps>): React$1.ReactNode;
480
599
 
@@ -799,4 +918,129 @@ declare function validateWhen<T>(condition: (value: T, context: ValidationContex
799
918
  */
800
919
  declare function async<T>(validateFn: (value: T, context: ValidationContext) => Promise<boolean>, message: string, code?: string): FieldValidator<T>;
801
920
 
802
- export { type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, type ComponentRendererBaseProps, ComponentRendererWrapper, type ComponentRendererWrapperProps, type ConditionBuilder as Condition, type ConditionBuilder, type ConditionConfig, type ConditionEvaluator, type ConditionOperator, type ConditionValue, type ConditionalBehavior, type CustomStepRenderer, type FieldRenderer, type FieldRendererProps, type FieldValidationConfig, type FieldValidator, type FormBodyRenderer, type FormBodyRendererProps, type FormComponentRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, type FormValidationConfig, type FormValidator, IdGenerator, type LogicalOperator, type RendererChildrenFunction, type RilayLicenseConfig, type StepConditionalBehavior, type StepConfig, type StepDataHelper, type ValidationAdapter, type ValidationContext, type ValidationError, type ValidationResult, type ValidationSchema, type WorkflowAnalytics, type WorkflowComponentRendererBaseProps, type WorkflowConfig, type WorkflowContext, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, async, combineValidationResults, configureObject, createValidationContext, createValidationResult, custom, deepClone, email, ensureUnique, evaluateCondition, matchField, max, maxLength, mergeInto, min, minLength, normalizeToArray, number, pattern, required, resolveRendererChildren, ril, runValidators, runValidatorsAsync, url, validateRequired, validateWhen, when };
921
+ /**
922
+ * Core monitoring system for Rilay
923
+ * Tracks performance metrics, events, and errors across forms and workflows
924
+ */
925
+ declare class RilayMonitor {
926
+ private config;
927
+ private context;
928
+ private adapters;
929
+ private eventBuffer;
930
+ private flushTimer?;
931
+ private profiler;
932
+ constructor(config: MonitoringConfig, context?: Partial<MonitoringContext>);
933
+ /**
934
+ * Add a monitoring adapter
935
+ */
936
+ addAdapter(adapter: MonitoringAdapter): void;
937
+ /**
938
+ * Remove a monitoring adapter
939
+ */
940
+ removeAdapter(adapterName: string): void;
941
+ /**
942
+ * Track a monitoring event
943
+ */
944
+ track(type: MonitoringEventType, source: string, data: Record<string, any>, metrics?: PerformanceMetrics, severity?: 'low' | 'medium' | 'high' | 'critical'): void;
945
+ /**
946
+ * Track an error
947
+ */
948
+ trackError(error: Error, source: string, context?: any): void;
949
+ /**
950
+ * Get the performance profiler
951
+ */
952
+ getProfiler(): PerformanceProfiler;
953
+ /**
954
+ * Update monitoring context
955
+ */
956
+ updateContext(updates: Partial<MonitoringContext>): void;
957
+ /**
958
+ * Flush all buffered events
959
+ */
960
+ flush(): Promise<void>;
961
+ /**
962
+ * Destroy the monitor and clean up resources
963
+ */
964
+ destroy(): Promise<void>;
965
+ private startFlushTimer;
966
+ private checkPerformanceThresholds;
967
+ private createPerformanceWarning;
968
+ }
969
+ /**
970
+ * Initialize global monitoring
971
+ */
972
+ declare function initializeMonitoring(config: MonitoringConfig, context?: Partial<MonitoringContext>): RilayMonitor;
973
+ /**
974
+ * Get the global monitor instance
975
+ */
976
+ declare function getGlobalMonitor(): RilayMonitor | null;
977
+ /**
978
+ * Destroy global monitoring
979
+ */
980
+ declare function destroyGlobalMonitoring(): Promise<void>;
981
+
982
+ /**
983
+ * Console monitoring adapter
984
+ * Logs events to the browser console
985
+ */
986
+ declare class ConsoleAdapter implements ConsoleMonitoringAdapter {
987
+ readonly name = "console";
988
+ readonly logLevel: 'debug' | 'info' | 'warn' | 'error';
989
+ constructor(logLevel?: 'debug' | 'info' | 'warn' | 'error');
990
+ send(events: MonitoringEvent[]): Promise<void>;
991
+ private logEvent;
992
+ private shouldLog;
993
+ }
994
+ /**
995
+ * Remote monitoring adapter
996
+ * Sends events to a remote endpoint
997
+ */
998
+ declare class RemoteAdapter implements RemoteMonitoringAdapter {
999
+ readonly name = "remote";
1000
+ readonly endpoint: string;
1001
+ readonly apiKey?: string;
1002
+ readonly headers: Record<string, string>;
1003
+ readonly batchSize: number;
1004
+ readonly retryAttempts: number;
1005
+ private eventQueue;
1006
+ private isProcessing;
1007
+ constructor(config: {
1008
+ endpoint: string;
1009
+ apiKey?: string;
1010
+ headers?: Record<string, string>;
1011
+ batchSize?: number;
1012
+ retryAttempts?: number;
1013
+ });
1014
+ send(events: MonitoringEvent[]): Promise<void>;
1015
+ flush(): Promise<void>;
1016
+ configure(config: Record<string, any>): void;
1017
+ private processQueue;
1018
+ private sendBatch;
1019
+ private delay;
1020
+ }
1021
+ /**
1022
+ * Local storage adapter for offline support
1023
+ */
1024
+ declare class LocalStorageAdapter implements MonitoringAdapter {
1025
+ readonly name = "localStorage";
1026
+ private readonly storageKey;
1027
+ private readonly maxEvents;
1028
+ constructor(maxEvents?: number);
1029
+ send(events: MonitoringEvent[]): Promise<void>;
1030
+ flush(): Promise<void>;
1031
+ getStoredEvents(): MonitoringEvent[];
1032
+ clearStoredEvents(): void;
1033
+ getEventCount(): number;
1034
+ }
1035
+ /**
1036
+ * Development adapter that provides detailed logging
1037
+ */
1038
+ declare class DevelopmentAdapter implements MonitoringAdapter {
1039
+ readonly name = "development";
1040
+ private readonly console;
1041
+ send(events: MonitoringEvent[]): Promise<void>;
1042
+ private logPerformanceSummary;
1043
+ private logErrorSummary;
1044
+ }
1045
+
1046
+ export { type ComponentConfig, type ComponentPerformanceMetrics, type ComponentRenderProps, type ComponentRenderer, type ComponentRendererBaseProps, ComponentRendererWrapper, type ComponentRendererWrapperProps, type ConditionBuilder as Condition, type ConditionBuilder, type ConditionConfig, type ConditionEvaluator, type ConditionOperator, type ConditionValue, type ConditionalBehavior, ConsoleAdapter, type ConsoleMonitoringAdapter, type CustomStepRenderer, DevelopmentAdapter, type EnhancedFormAnalytics, type EnhancedWorkflowAnalytics, type ErrorMonitoringEvent, type FieldRenderer, type FieldRendererProps, type FieldValidationConfig, type FieldValidator, type FormBodyRenderer, type FormBodyRendererProps, type FormComponentRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormPerformanceMetrics, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, type FormValidationConfig, type FormValidator, IdGenerator, LocalStorageAdapter, type LogicalOperator, type MonitoringAdapter, type MonitoringConfig, type MonitoringContext, type MonitoringEvent, type MonitoringEventType, type PerformanceMetrics, type PerformanceProfiler, type PerformanceThresholds, type PerformanceWarningEvent, RemoteAdapter, type RemoteMonitoringAdapter, type RendererChildrenFunction, type RilayInstance, type RilayLicenseConfig, RilayMonitor, type StepConditionalBehavior, type StepConfig, type StepDataHelper, type ValidationAdapter, type ValidationContext, type ValidationError, type ValidationResult, type ValidationSchema, type WorkflowAnalytics, type WorkflowComponentRendererBaseProps, type WorkflowConfig, type WorkflowContext, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPerformanceMetrics, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, async, combineValidationResults, configureObject, createValidationContext, createValidationResult, custom, deepClone, destroyGlobalMonitoring, email, ensureUnique, evaluateCondition, getGlobalMonitor, initializeMonitoring, matchField, max, maxLength, mergeInto, min, minLength, normalizeToArray, number, pattern, required, resolveRendererChildren, ril, runValidators, runValidatorsAsync, url, validateRequired, validateWhen, when };
package/dist/index.d.ts CHANGED
@@ -43,8 +43,8 @@ interface AsyncValidationResult {
43
43
  warnings?: string[];
44
44
  }
45
45
  /**
46
- * Interface publique pour les instances Rilay
47
- * Expose uniquement les méthodes nécessaires à l'API publique
46
+ * Public interface for Rilay instances
47
+ * Exposes only the methods necessary for the public API
48
48
  */
49
49
  interface RilayInstance<C> {
50
50
  addComponent<NewType extends string, TProps = any>(type: NewType, config: Omit<ComponentConfig<TProps>, 'id' | 'type'>): RilayInstance<C & {
@@ -99,7 +99,7 @@ declare class ril<C> implements RilayInstance<C> {
99
99
  *
100
100
  * @example
101
101
  * ```typescript
102
- * // Component avec validation par défaut
102
+ * // Component with default validation
103
103
  * const factory = ril.create()
104
104
  * .addComponent('email', {
105
105
  * name: 'Email Input',
@@ -475,6 +475,125 @@ type WorkflowStepperRenderer = RendererChildrenFunction<WorkflowStepperRendererP
475
475
  type WorkflowNextButtonRenderer = RendererChildrenFunction<WorkflowNextButtonRendererProps>;
476
476
  type WorkflowPreviousButtonRenderer = RendererChildrenFunction<WorkflowPreviousButtonRendererProps>;
477
477
  type WorkflowSkipButtonRenderer = RendererChildrenFunction<WorkflowSkipButtonRendererProps>;
478
+ interface PerformanceMetrics {
479
+ readonly timestamp: number;
480
+ readonly duration: number;
481
+ readonly memoryUsage?: number;
482
+ readonly renderCount?: number;
483
+ readonly reRenderCount?: number;
484
+ }
485
+ interface ComponentPerformanceMetrics extends PerformanceMetrics {
486
+ readonly componentId: string;
487
+ readonly componentType: string;
488
+ readonly propsSize?: number;
489
+ readonly childrenCount?: number;
490
+ }
491
+ interface FormPerformanceMetrics extends PerformanceMetrics {
492
+ readonly formId: string;
493
+ readonly fieldCount: number;
494
+ readonly validationDuration: number;
495
+ readonly renderDuration: number;
496
+ readonly validationErrors: number;
497
+ }
498
+ interface WorkflowPerformanceMetrics extends PerformanceMetrics {
499
+ readonly workflowId: string;
500
+ readonly stepCount: number;
501
+ readonly currentStepIndex: number;
502
+ readonly navigationDuration: number;
503
+ readonly persistenceDuration?: number;
504
+ readonly conditionEvaluationDuration: number;
505
+ }
506
+ type MonitoringEventType = 'component_render' | 'component_update' | 'form_validation' | 'form_submission' | 'workflow_navigation' | 'workflow_persistence' | 'condition_evaluation' | 'error' | 'performance_warning';
507
+ interface MonitoringEvent {
508
+ readonly id: string;
509
+ readonly type: MonitoringEventType;
510
+ readonly timestamp: number;
511
+ readonly source: string;
512
+ readonly data: Record<string, any>;
513
+ readonly metrics?: PerformanceMetrics;
514
+ readonly severity?: 'low' | 'medium' | 'high' | 'critical';
515
+ }
516
+ interface ErrorMonitoringEvent extends MonitoringEvent {
517
+ readonly type: 'error';
518
+ readonly error: Error;
519
+ readonly stack?: string;
520
+ readonly context?: ValidationContext | WorkflowContext;
521
+ }
522
+ interface PerformanceWarningEvent extends MonitoringEvent {
523
+ readonly type: 'performance_warning';
524
+ readonly threshold: number;
525
+ readonly actualValue: number;
526
+ readonly recommendation?: string;
527
+ }
528
+ interface MonitoringConfig {
529
+ readonly enabled: boolean;
530
+ readonly enablePerformanceTracking?: boolean;
531
+ readonly enableErrorTracking?: boolean;
532
+ readonly enableMemoryTracking?: boolean;
533
+ readonly performanceThresholds?: PerformanceThresholds;
534
+ readonly sampleRate?: number;
535
+ readonly bufferSize?: number;
536
+ readonly flushInterval?: number;
537
+ readonly onEvent?: (event: MonitoringEvent) => void;
538
+ readonly onBatch?: (events: MonitoringEvent[]) => void;
539
+ readonly onError?: (error: Error) => void;
540
+ }
541
+ interface PerformanceThresholds {
542
+ readonly componentRenderTime?: number;
543
+ readonly formValidationTime?: number;
544
+ readonly workflowNavigationTime?: number;
545
+ readonly memoryUsage?: number;
546
+ readonly reRenderCount?: number;
547
+ }
548
+ interface MonitoringAdapter {
549
+ readonly name: string;
550
+ readonly version?: string;
551
+ send: (events: MonitoringEvent[]) => Promise<void>;
552
+ flush?: () => Promise<void>;
553
+ configure?: (config: Record<string, any>) => void;
554
+ }
555
+ interface ConsoleMonitoringAdapter extends MonitoringAdapter {
556
+ readonly name: 'console';
557
+ readonly logLevel?: 'debug' | 'info' | 'warn' | 'error';
558
+ }
559
+ interface RemoteMonitoringAdapter extends MonitoringAdapter {
560
+ readonly name: 'remote';
561
+ readonly endpoint: string;
562
+ readonly apiKey?: string;
563
+ readonly headers?: Record<string, string>;
564
+ readonly batchSize?: number;
565
+ readonly retryAttempts?: number;
566
+ }
567
+ interface MonitoringContext {
568
+ readonly sessionId: string;
569
+ readonly userId?: string;
570
+ readonly userAgent?: string;
571
+ readonly url?: string;
572
+ readonly environment: 'development' | 'production' | 'test';
573
+ readonly version?: string;
574
+ readonly metadata?: Record<string, any>;
575
+ }
576
+ interface PerformanceProfiler {
577
+ start: (label: string, metadata?: Record<string, any>) => void;
578
+ end: (label: string) => PerformanceMetrics | null;
579
+ mark: (name: string) => void;
580
+ measure: (name: string, startMark: string, endMark?: string) => number;
581
+ getMetrics: (label: string) => PerformanceMetrics | null;
582
+ getAllMetrics: () => Record<string, PerformanceMetrics>;
583
+ clear: (label?: string) => void;
584
+ }
585
+ interface EnhancedWorkflowAnalytics extends WorkflowAnalytics {
586
+ readonly monitoring?: MonitoringConfig;
587
+ readonly onPerformanceWarning?: (event: PerformanceWarningEvent) => void;
588
+ readonly onMemoryLeak?: (metrics: ComponentPerformanceMetrics) => void;
589
+ }
590
+ interface EnhancedFormAnalytics {
591
+ readonly onFormRender?: (metrics: FormPerformanceMetrics) => void;
592
+ readonly onFormValidation?: (metrics: FormPerformanceMetrics) => void;
593
+ readonly onFormSubmission?: (metrics: FormPerformanceMetrics) => void;
594
+ readonly onFieldChange?: (fieldId: string, metrics: ComponentPerformanceMetrics) => void;
595
+ readonly monitoring?: MonitoringConfig;
596
+ }
478
597
 
479
598
  declare function ComponentRendererWrapper<TProps = any>({ children, renderAs, renderer, name, props: baseProps, }: ComponentRendererWrapperProps<TProps>): React$1.ReactNode;
480
599
 
@@ -799,4 +918,129 @@ declare function validateWhen<T>(condition: (value: T, context: ValidationContex
799
918
  */
800
919
  declare function async<T>(validateFn: (value: T, context: ValidationContext) => Promise<boolean>, message: string, code?: string): FieldValidator<T>;
801
920
 
802
- export { type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, type ComponentRendererBaseProps, ComponentRendererWrapper, type ComponentRendererWrapperProps, type ConditionBuilder as Condition, type ConditionBuilder, type ConditionConfig, type ConditionEvaluator, type ConditionOperator, type ConditionValue, type ConditionalBehavior, type CustomStepRenderer, type FieldRenderer, type FieldRendererProps, type FieldValidationConfig, type FieldValidator, type FormBodyRenderer, type FormBodyRendererProps, type FormComponentRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, type FormValidationConfig, type FormValidator, IdGenerator, type LogicalOperator, type RendererChildrenFunction, type RilayLicenseConfig, type StepConditionalBehavior, type StepConfig, type StepDataHelper, type ValidationAdapter, type ValidationContext, type ValidationError, type ValidationResult, type ValidationSchema, type WorkflowAnalytics, type WorkflowComponentRendererBaseProps, type WorkflowConfig, type WorkflowContext, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, async, combineValidationResults, configureObject, createValidationContext, createValidationResult, custom, deepClone, email, ensureUnique, evaluateCondition, matchField, max, maxLength, mergeInto, min, minLength, normalizeToArray, number, pattern, required, resolveRendererChildren, ril, runValidators, runValidatorsAsync, url, validateRequired, validateWhen, when };
921
+ /**
922
+ * Core monitoring system for Rilay
923
+ * Tracks performance metrics, events, and errors across forms and workflows
924
+ */
925
+ declare class RilayMonitor {
926
+ private config;
927
+ private context;
928
+ private adapters;
929
+ private eventBuffer;
930
+ private flushTimer?;
931
+ private profiler;
932
+ constructor(config: MonitoringConfig, context?: Partial<MonitoringContext>);
933
+ /**
934
+ * Add a monitoring adapter
935
+ */
936
+ addAdapter(adapter: MonitoringAdapter): void;
937
+ /**
938
+ * Remove a monitoring adapter
939
+ */
940
+ removeAdapter(adapterName: string): void;
941
+ /**
942
+ * Track a monitoring event
943
+ */
944
+ track(type: MonitoringEventType, source: string, data: Record<string, any>, metrics?: PerformanceMetrics, severity?: 'low' | 'medium' | 'high' | 'critical'): void;
945
+ /**
946
+ * Track an error
947
+ */
948
+ trackError(error: Error, source: string, context?: any): void;
949
+ /**
950
+ * Get the performance profiler
951
+ */
952
+ getProfiler(): PerformanceProfiler;
953
+ /**
954
+ * Update monitoring context
955
+ */
956
+ updateContext(updates: Partial<MonitoringContext>): void;
957
+ /**
958
+ * Flush all buffered events
959
+ */
960
+ flush(): Promise<void>;
961
+ /**
962
+ * Destroy the monitor and clean up resources
963
+ */
964
+ destroy(): Promise<void>;
965
+ private startFlushTimer;
966
+ private checkPerformanceThresholds;
967
+ private createPerformanceWarning;
968
+ }
969
+ /**
970
+ * Initialize global monitoring
971
+ */
972
+ declare function initializeMonitoring(config: MonitoringConfig, context?: Partial<MonitoringContext>): RilayMonitor;
973
+ /**
974
+ * Get the global monitor instance
975
+ */
976
+ declare function getGlobalMonitor(): RilayMonitor | null;
977
+ /**
978
+ * Destroy global monitoring
979
+ */
980
+ declare function destroyGlobalMonitoring(): Promise<void>;
981
+
982
+ /**
983
+ * Console monitoring adapter
984
+ * Logs events to the browser console
985
+ */
986
+ declare class ConsoleAdapter implements ConsoleMonitoringAdapter {
987
+ readonly name = "console";
988
+ readonly logLevel: 'debug' | 'info' | 'warn' | 'error';
989
+ constructor(logLevel?: 'debug' | 'info' | 'warn' | 'error');
990
+ send(events: MonitoringEvent[]): Promise<void>;
991
+ private logEvent;
992
+ private shouldLog;
993
+ }
994
+ /**
995
+ * Remote monitoring adapter
996
+ * Sends events to a remote endpoint
997
+ */
998
+ declare class RemoteAdapter implements RemoteMonitoringAdapter {
999
+ readonly name = "remote";
1000
+ readonly endpoint: string;
1001
+ readonly apiKey?: string;
1002
+ readonly headers: Record<string, string>;
1003
+ readonly batchSize: number;
1004
+ readonly retryAttempts: number;
1005
+ private eventQueue;
1006
+ private isProcessing;
1007
+ constructor(config: {
1008
+ endpoint: string;
1009
+ apiKey?: string;
1010
+ headers?: Record<string, string>;
1011
+ batchSize?: number;
1012
+ retryAttempts?: number;
1013
+ });
1014
+ send(events: MonitoringEvent[]): Promise<void>;
1015
+ flush(): Promise<void>;
1016
+ configure(config: Record<string, any>): void;
1017
+ private processQueue;
1018
+ private sendBatch;
1019
+ private delay;
1020
+ }
1021
+ /**
1022
+ * Local storage adapter for offline support
1023
+ */
1024
+ declare class LocalStorageAdapter implements MonitoringAdapter {
1025
+ readonly name = "localStorage";
1026
+ private readonly storageKey;
1027
+ private readonly maxEvents;
1028
+ constructor(maxEvents?: number);
1029
+ send(events: MonitoringEvent[]): Promise<void>;
1030
+ flush(): Promise<void>;
1031
+ getStoredEvents(): MonitoringEvent[];
1032
+ clearStoredEvents(): void;
1033
+ getEventCount(): number;
1034
+ }
1035
+ /**
1036
+ * Development adapter that provides detailed logging
1037
+ */
1038
+ declare class DevelopmentAdapter implements MonitoringAdapter {
1039
+ readonly name = "development";
1040
+ private readonly console;
1041
+ send(events: MonitoringEvent[]): Promise<void>;
1042
+ private logPerformanceSummary;
1043
+ private logErrorSummary;
1044
+ }
1045
+
1046
+ export { type ComponentConfig, type ComponentPerformanceMetrics, type ComponentRenderProps, type ComponentRenderer, type ComponentRendererBaseProps, ComponentRendererWrapper, type ComponentRendererWrapperProps, type ConditionBuilder as Condition, type ConditionBuilder, type ConditionConfig, type ConditionEvaluator, type ConditionOperator, type ConditionValue, type ConditionalBehavior, ConsoleAdapter, type ConsoleMonitoringAdapter, type CustomStepRenderer, DevelopmentAdapter, type EnhancedFormAnalytics, type EnhancedWorkflowAnalytics, type ErrorMonitoringEvent, type FieldRenderer, type FieldRendererProps, type FieldValidationConfig, type FieldValidator, type FormBodyRenderer, type FormBodyRendererProps, type FormComponentRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormPerformanceMetrics, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, type FormValidationConfig, type FormValidator, IdGenerator, LocalStorageAdapter, type LogicalOperator, type MonitoringAdapter, type MonitoringConfig, type MonitoringContext, type MonitoringEvent, type MonitoringEventType, type PerformanceMetrics, type PerformanceProfiler, type PerformanceThresholds, type PerformanceWarningEvent, RemoteAdapter, type RemoteMonitoringAdapter, type RendererChildrenFunction, type RilayInstance, type RilayLicenseConfig, RilayMonitor, type StepConditionalBehavior, type StepConfig, type StepDataHelper, type ValidationAdapter, type ValidationContext, type ValidationError, type ValidationResult, type ValidationSchema, type WorkflowAnalytics, type WorkflowComponentRendererBaseProps, type WorkflowConfig, type WorkflowContext, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPerformanceMetrics, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, async, combineValidationResults, configureObject, createValidationContext, createValidationResult, custom, deepClone, destroyGlobalMonitoring, email, ensureUnique, evaluateCondition, getGlobalMonitor, initializeMonitoring, matchField, max, maxLength, mergeInto, min, minLength, normalizeToArray, number, pattern, required, resolveRendererChildren, ril, runValidators, runValidatorsAsync, url, validateRequired, validateWhen, when };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function y(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function A(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return y(t)}async function k(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return y(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var R=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new R(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?r.includes(n.value):false;case "notContains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?!r.includes(n.value):false;case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}exports.ComponentRendererWrapper=z;exports.IdGenerator=b;exports.async=S;exports.combineValidationResults=y;exports.configureObject=Y;exports.createValidationContext=B;exports.createValidationResult=m;exports.custom=D;exports.deepClone=x;exports.email=N;exports.ensureUnique=V;exports.evaluateCondition=v;exports.matchField=M;exports.max=L;exports.maxLength=I;exports.mergeInto=j;exports.min=q;exports.minLength=F;exports.normalizeToArray=X;exports.number=$;exports.pattern=O;exports.required=E;exports.resolveRendererChildren=T;exports.ril=h;exports.runValidators=A;exports.runValidatorsAsync=k;exports.url=P;exports.validateRequired=H;exports.validateWhen=W;exports.when=se;
1
+ 'use strict';function E(t,e){return typeof t=="function"?t(e):t}function re({children:t,renderAs:e,renderer:r,name:n,props:o}){if(e==="children"||e===true){if(typeof t!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${n}`);return t(o)}if(!r)throw new Error(`No renderer provided for ${n}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${n}`);let s={...o,children:E(t,o)};return r(s)}function ne(t,e){return {...t,...e}}function P(t,e){let r=t.filter((n,o)=>t.indexOf(n)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function oe(t,e,r){if(t.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var V=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function ie(t){return Array.isArray(t)?t:[t]}function k(t){if(t===null||typeof t!="object")return t;if(t instanceof Date)return new Date(t.getTime());if(Array.isArray(t))return t.map(r=>k(r));let e={};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=k(t[r]));return e}function se(t,e,r){let n={...t};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(n[o]=e[o]);return n}var C=class extends Error{constructor(r,n,o){super(r);this.code=n;this.meta=o;this.name="RilayError";}},p=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function m(t,e){let r={...t};for(let n in e){let o=e[n],i=r[n];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[n]=m(i,o):r[n]=o;}return r}var v=class t{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new t}addComponent(e,r){let n={id:e,type:e,...r},o=new t;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,n),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],n=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[a,f]of Object.entries(e))r.includes(a)?o[a]=f:n.includes(a)&&(i[a]=f);let s=new t;return s.components=new Map(this.components),s.formRenderConfig=m(this.formRenderConfig,o),s.workflowRenderConfig=m(this.workflowRenderConfig,i),s}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new t;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new t;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new t;return e.components=new Map(this.components),e.formRenderConfig=m({},this.formRenderConfig),e.workflowRenderConfig=m({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,n)=>(r[n.type]=(r[n.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),n=r.map(c=>c.id);try{P(n,"component");}catch(c){e.push(c instanceof Error?c.message:String(c));}let o=r.filter(c=>!c.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(c=>c.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),s=Object.keys(this.workflowRenderConfig),a=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],f=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(c=>!a.includes(c)),h=s.filter(c=>!f.includes(c));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),h.length>0&&e.push(`Invalid workflow renderer keys: ${h.join(", ")}`),e}async validateAsync(){let e=[],r=[],n=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=n.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),a=(await Promise.all(i)).filter(l=>l!==null);e.push(...a),n.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let f={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!f.isValid)throw new p("Ril configuration validation failed",{errors:e,warnings:r,componentCount:n.length});return f}catch(o){throw o instanceof p?o:new p("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function y(t,e=[]){return {isValid:t,errors:[...e]}}function d(){return y(true,[])}function u(t,e,r){return y(false,[{message:t,code:e,path:r}])}function R(t){let e=[],r=true;for(let n of t)n.isValid||(r=false),e.push(...n.errors);return y(r,e)}function O(t,e,r){let n=t.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return R(n)}async function N(t,e,r){let n=await Promise.all(t.map(o=>o(e,r)));return R(n)}function $(t={}){return {fieldId:t.fieldId,formId:t.formId,stepId:t.stepId,workflowId:t.workflowId,allFormData:t.allFormData||{},stepData:t.stepData||{},workflowData:t.workflowData||{}}}function S(t="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?u(t,"REQUIRED"):d()}function L(t,e){return r=>!r||r.length<t?u(e||`Must be at least ${t} characters long`,"MIN_LENGTH",`length.${t}`):d()}function D(t,e){return r=>r&&r.length>t?u(e||`Must be no more than ${t} characters long`,"MAX_LENGTH",`length.${t}`):d()}function W(t,e){return r=>r&&!t.test(r)?u(e||"Invalid format","PATTERN_MISMATCH",`pattern.${t.source}`):d()}function q(t="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?u(t,"INVALID_EMAIL"):d()}function _(t="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?u(t,"INVALID_URL"):d()}function U(t="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?u(t,"INVALID_NUMBER"):d()}}function z(t,e){return r=>{let n=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(n)&&n<t?u(e||`Must be at least ${t}`,"MIN_VALUE",`min.${t}`):d()}}function K(t,e){return r=>{let n=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(n)&&n>t?u(e||`Must be no more than ${t}`,"MAX_VALUE",`max.${t}`):d()}}function j(t,e,r){return (n,o)=>t(n,o)?d():u(e,r||"CUSTOM_VALIDATION_FAILED")}function Q(t,e){return (r,n)=>{let o=n.allFormData?.[t];return r!==o?u(e||"Fields must match","FIELD_MISMATCH",`match.${t}`):d()}}function H(t,e){return (r,n)=>t(r,n)?e(r,n):d()}function Z(t,e,r){return async(n,o)=>{try{return await t(n,o)?d():u(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return u(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var J=0,M=()=>`event_${Date.now()}_${++J}`,G=()=>`session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,w=class{constructor(e,r){this.adapters=[];this.eventBuffer=[];this.config={bufferSize:100,flushInterval:5e3,sampleRate:1,enablePerformanceTracking:true,enableErrorTracking:true,enableMemoryTracking:false,...e},this.context={sessionId:G(),environment:"production",userAgent:typeof window<"u"?window.navigator?.userAgent:void 0,url:typeof window<"u"?window.location?.href:void 0,...r},this.profiler=new T,this.config.enabled&&this.startFlushTimer();}addAdapter(e){this.adapters.push(e);}removeAdapter(e){this.adapters=this.adapters.filter(r=>r.name!==e);}track(e,r,n,o,i="low"){if(!this.config.enabled||Math.random()>(this.config.sampleRate||1))return;let s={id:M(),type:e,timestamp:Date.now(),source:r,data:{...n,context:this.context},metrics:o,severity:i};if(o&&this.config.performanceThresholds&&this.checkPerformanceThresholds(s,o),this.eventBuffer.push(s),this.config.onEvent)try{this.config.onEvent(s);}catch(a){console.error("Error in monitoring event callback:",a);}this.eventBuffer.length>=(this.config.bufferSize||100)&&this.flush();}trackError(e,r,n){this.track("error",r,{message:e.message,name:e.name,stack:e.stack,context:n},void 0,"high");}getProfiler(){return this.profiler}updateContext(e){this.context={...this.context,...e};}async flush(){if(this.eventBuffer.length===0)return;let e=[...this.eventBuffer];if(this.eventBuffer=[],this.config.onBatch)try{this.config.onBatch(e);}catch(r){console.error("Error in monitoring batch callback:",r);}await Promise.all(this.adapters.map(async r=>{try{await r.send(e);}catch(n){console.error(`Error sending events to adapter ${r.name}:`,n),this.config.onError&&this.config.onError(n);}}));}async destroy(){this.flushTimer&&clearInterval(this.flushTimer),await this.flush(),await Promise.all(this.adapters.map(async e=>{if(e.flush)try{await e.flush();}catch(r){console.error(`Error flushing adapter ${e.name}:`,r);}}));}startFlushTimer(){this.config.flushInterval&&this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval));}checkPerformanceThresholds(e,r){let n=this.config.performanceThresholds;n.componentRenderTime&&e.type==="component_render"&&r.duration>n.componentRenderTime&&this.createPerformanceWarning("Component render time exceeded threshold",n.componentRenderTime,r.duration,"Consider memoizing component or optimizing render logic"),n.formValidationTime&&e.type==="form_validation"&&r.duration>n.formValidationTime&&this.createPerformanceWarning("Form validation time exceeded threshold",n.formValidationTime,r.duration,"Consider debouncing validation or optimizing validators"),n.workflowNavigationTime&&e.type==="workflow_navigation"&&r.duration>n.workflowNavigationTime&&this.createPerformanceWarning("Workflow navigation time exceeded threshold",n.workflowNavigationTime,r.duration,"Consider optimizing step transitions or condition evaluation"),n.memoryUsage&&r.memoryUsage&&r.memoryUsage>n.memoryUsage&&this.createPerformanceWarning("Memory usage exceeded threshold",n.memoryUsage,r.memoryUsage,"Check for memory leaks or optimize data structures"),n.reRenderCount&&r.reRenderCount&&r.reRenderCount>n.reRenderCount&&this.createPerformanceWarning("Component re-render count exceeded threshold",n.reRenderCount,r.reRenderCount,"Consider using React.memo or optimizing dependencies");}createPerformanceWarning(e,r,n,o){let i={id:M(),type:"performance_warning",timestamp:Date.now(),source:"rilay_monitor",data:{message:e,context:this.context},threshold:r,actualValue:n,recommendation:o,severity:"medium"};if(this.eventBuffer.push(i),this.config.onEvent)try{this.config.onEvent(i);}catch(s){console.error("Error in performance warning callback:",s);}}},T=class{constructor(){this.metrics=new Map;this.startTimes=new Map;}start(e,r={}){this.startTimes.set(e,performance.now()),this.metrics.set(e,{timestamp:Date.now(),duration:0,renderCount:r.renderCount||0,reRenderCount:r.reRenderCount||0,memoryUsage:this.getMemoryUsage()});}end(e){let r=this.startTimes.get(e);if(!r)return null;let n=performance.now()-r,o=this.metrics.get(e);if(!o)return null;let i={...o,duration:n,memoryUsage:this.getMemoryUsage()};return this.metrics.set(e,i),this.startTimes.delete(e),i}mark(e){typeof performance<"u"&&performance.mark&&performance.mark(e);}measure(e,r,n){if(typeof performance<"u"&&performance.measure){performance.measure(e,r,n);let o=performance.getEntriesByName(e,"measure");return o.length>0?o[o.length-1].duration:0}return 0}getMetrics(e){return this.metrics.get(e)||null}getAllMetrics(){let e={};return this.metrics.forEach((r,n)=>{e[n]=r;}),e}clear(e){e?(this.metrics.delete(e),this.startTimes.delete(e)):(this.metrics.clear(),this.startTimes.clear());}getMemoryUsage(){if(typeof performance<"u"&&performance.memory)return performance.memory.usedJSHeapSize}},g=null;function he(t,e){return g&&g.destroy(),g=new w(t,e),g}function ye(){return g}async function Ce(){g&&(await g.destroy(),g=null);}var b=class{constructor(e="info"){this.name="console";this.logLevel=e;}async send(e){for(let r of e)this.logEvent(r);}logEvent(e){let r={id:e.id,type:e.type,timestamp:new Date(e.timestamp).toISOString(),source:e.source,severity:e.severity,data:e.data,metrics:e.metrics};switch(e.severity){case "critical":case "high":this.shouldLog("error")&&console.error(`[Rilay Monitor] ${e.type}:`,r);break;case "medium":this.shouldLog("warn")&&console.warn(`[Rilay Monitor] ${e.type}:`,r);break;default:this.shouldLog("info")&&console.info(`[Rilay Monitor] ${e.type}:`,r);break}if(e.type==="performance_warning"&&this.shouldLog("warn")){let n=e;console.warn(`[Rilay Performance Warning] ${n.data.message}`,{threshold:n.threshold,actual:n.actualValue,recommendation:n.recommendation});}}shouldLog(e){let r=["debug","info","warn","error"],n=r.indexOf(this.logLevel);return r.indexOf(e)>=n}},A=class{constructor(e){this.name="remote";this.eventQueue=[];this.isProcessing=false;this.endpoint=e.endpoint,this.apiKey=e.apiKey,this.headers={"Content-Type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers},this.batchSize=e.batchSize||50,this.retryAttempts=e.retryAttempts||3;}async send(e){this.eventQueue.push(...e),this.isProcessing||await this.processQueue();}async flush(){await this.processQueue();}configure(e){e.headers&&Object.assign(this.headers,e.headers);}async processQueue(){if(!(this.isProcessing||this.eventQueue.length===0)){this.isProcessing=true;try{for(;this.eventQueue.length>0;){let e=this.eventQueue.splice(0,this.batchSize);await this.sendBatch(e);}}finally{this.isProcessing=false;}}}async sendBatch(e){let r={events:e,timestamp:Date.now(),source:"rilay-monitoring"},n=null;for(let o=1;o<=this.retryAttempts;o++)try{let i=await fetch(this.endpoint,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);return}catch(i){if(n=i,i instanceof Error&&i.message.includes("HTTP 4"))break;o<this.retryAttempts&&await this.delay(2**o*1e3);}throw console.error("Failed to send monitoring events to remote endpoint:",n),n}delay(e){return new Promise(r=>setTimeout(r,e))}},B=class{constructor(e=1e3){this.name="localStorage";this.storageKey="rilay_monitoring_events";this.maxEvents=e;}async send(e){try{let o=[...this.getStoredEvents(),...e].slice(-this.maxEvents);localStorage.setItem(this.storageKey,JSON.stringify(o));}catch(r){console.error("Failed to store monitoring events:",r);}}async flush(){}getStoredEvents(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("Failed to retrieve stored monitoring events:",e),[]}}clearStoredEvents(){localStorage.removeItem(this.storageKey);}getEventCount(){return this.getStoredEvents().length}},F=class{constructor(){this.name="development";this.console=new b("debug");}async send(e){await this.console.send(e),this.logPerformanceSummary(e),this.logErrorSummary(e);}logPerformanceSummary(e){let r=e.filter(s=>s.metrics);if(r.length===0)return;console.group("[Rilay Performance Summary]");let n=r.reduce((s,a)=>s+(a.metrics?.duration||0),0)/r.length,o=Math.max(...r.map(s=>s.metrics?.duration||0));console.info(`Average duration: ${n.toFixed(2)}ms`),console.info(`Max duration: ${o.toFixed(2)}ms`);let i={};for(let s of r)i[s.type]||(i[s.type]=[]),i[s.type].push(s);for(let[s,a]of Object.entries(i)){let f=a.reduce((l,h)=>l+(h.metrics?.duration||0),0)/a.length;console.info(`${s}: ${f.toFixed(2)}ms avg (${a.length} events)`);}console.groupEnd();}logErrorSummary(e){let r=e.filter(o=>o.type==="error");if(r.length===0)return;console.group("[Rilay Error Summary]"),console.error(`${r.length} errors detected`);let n={};for(let o of r)n[o.source]=(n[o.source]||0)+1;for(let[o,i]of Object.entries(n))console.error(`${o}: ${i} errors`);console.groupEnd();}};var x=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,n={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[n,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,n={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[n,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return I(this,e)}};function we(t){return new x(t)}function I(t,e){if(t.conditions&&t.conditions.length>0){let n=t.conditions.map(o=>I(o,e));return t.logicalOperator==="or"?n.some(o=>o):n.every(o=>o)}let r=X(e,t.field);switch(t.operator){case "equals":return r===t.value;case "notEquals":return r!==t.value;case "greaterThan":return typeof r=="number"&&typeof t.value=="number"&&r>t.value;case "lessThan":return typeof r=="number"&&typeof t.value=="number"&&r<t.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof t.value=="number"&&r>=t.value;case "lessThanOrEqual":return typeof r=="number"&&typeof t.value=="number"&&r<=t.value;case "contains":return typeof r=="string"&&typeof t.value=="string"||Array.isArray(r)?r.includes(t.value):false;case "notContains":return typeof r=="string"&&typeof t.value=="string"||Array.isArray(r)?!r.includes(t.value):false;case "in":return Array.isArray(t.value)&&t.value.includes(r);case "notIn":return Array.isArray(t.value)&&!t.value.includes(r);case "matches":return typeof r!="string"||typeof t.value!="string"?false:new RegExp(t.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function X(t,e){let r=e.split("."),n=t;for(let o of r)if(n&&typeof n=="object"&&o in n)n=n[o];else return;return n}exports.ComponentRendererWrapper=re;exports.ConsoleAdapter=b;exports.DevelopmentAdapter=F;exports.IdGenerator=V;exports.LocalStorageAdapter=B;exports.RemoteAdapter=A;exports.RilayMonitor=w;exports.async=Z;exports.combineValidationResults=R;exports.configureObject=se;exports.createValidationContext=$;exports.createValidationResult=y;exports.custom=j;exports.deepClone=k;exports.destroyGlobalMonitoring=Ce;exports.email=q;exports.ensureUnique=P;exports.evaluateCondition=I;exports.getGlobalMonitor=ye;exports.initializeMonitoring=he;exports.matchField=Q;exports.max=K;exports.maxLength=D;exports.mergeInto=ne;exports.min=z;exports.minLength=L;exports.normalizeToArray=ie;exports.number=U;exports.pattern=W;exports.required=S;exports.resolveRendererChildren=E;exports.ril=v;exports.runValidators=O;exports.runValidatorsAsync=N;exports.url=_;exports.validateRequired=oe;exports.validateWhen=H;exports.when=we;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function y(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function A(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return y(t)}async function k(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return y(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var R=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new R(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?r.includes(n.value):false;case "notContains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?!r.includes(n.value):false;case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}export{z as ComponentRendererWrapper,b as IdGenerator,S as async,y as combineValidationResults,Y as configureObject,B as createValidationContext,m as createValidationResult,D as custom,x as deepClone,N as email,V as ensureUnique,v as evaluateCondition,M as matchField,L as max,I as maxLength,j as mergeInto,q as min,F as minLength,X as normalizeToArray,$ as number,O as pattern,E as required,T as resolveRendererChildren,h as ril,A as runValidators,k as runValidatorsAsync,P as url,H as validateRequired,W as validateWhen,se as when};
1
+ function E(t,e){return typeof t=="function"?t(e):t}function re({children:t,renderAs:e,renderer:r,name:n,props:o}){if(e==="children"||e===true){if(typeof t!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${n}`);return t(o)}if(!r)throw new Error(`No renderer provided for ${n}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${n}`);let s={...o,children:E(t,o)};return r(s)}function ne(t,e){return {...t,...e}}function P(t,e){let r=t.filter((n,o)=>t.indexOf(n)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function oe(t,e,r){if(t.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var V=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function ie(t){return Array.isArray(t)?t:[t]}function k(t){if(t===null||typeof t!="object")return t;if(t instanceof Date)return new Date(t.getTime());if(Array.isArray(t))return t.map(r=>k(r));let e={};for(let r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=k(t[r]));return e}function se(t,e,r){let n={...t};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(n[o]=e[o]);return n}var C=class extends Error{constructor(r,n,o){super(r);this.code=n;this.meta=o;this.name="RilayError";}},p=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function m(t,e){let r={...t};for(let n in e){let o=e[n],i=r[n];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[n]=m(i,o):r[n]=o;}return r}var v=class t{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new t}addComponent(e,r){let n={id:e,type:e,...r},o=new t;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,n),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],n=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[a,f]of Object.entries(e))r.includes(a)?o[a]=f:n.includes(a)&&(i[a]=f);let s=new t;return s.components=new Map(this.components),s.formRenderConfig=m(this.formRenderConfig,o),s.workflowRenderConfig=m(this.workflowRenderConfig,i),s}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new t;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new t;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new t;return e.components=new Map(this.components),e.formRenderConfig=m({},this.formRenderConfig),e.workflowRenderConfig=m({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,n)=>(r[n.type]=(r[n.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),n=r.map(c=>c.id);try{P(n,"component");}catch(c){e.push(c instanceof Error?c.message:String(c));}let o=r.filter(c=>!c.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(c=>c.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),s=Object.keys(this.workflowRenderConfig),a=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],f=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(c=>!a.includes(c)),h=s.filter(c=>!f.includes(c));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),h.length>0&&e.push(`Invalid workflow renderer keys: ${h.join(", ")}`),e}async validateAsync(){let e=[],r=[],n=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=n.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),a=(await Promise.all(i)).filter(l=>l!==null);e.push(...a),n.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let f={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!f.isValid)throw new p("Ril configuration validation failed",{errors:e,warnings:r,componentCount:n.length});return f}catch(o){throw o instanceof p?o:new p("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function y(t,e=[]){return {isValid:t,errors:[...e]}}function d(){return y(true,[])}function u(t,e,r){return y(false,[{message:t,code:e,path:r}])}function R(t){let e=[],r=true;for(let n of t)n.isValid||(r=false),e.push(...n.errors);return y(r,e)}function O(t,e,r){let n=t.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return R(n)}async function N(t,e,r){let n=await Promise.all(t.map(o=>o(e,r)));return R(n)}function $(t={}){return {fieldId:t.fieldId,formId:t.formId,stepId:t.stepId,workflowId:t.workflowId,allFormData:t.allFormData||{},stepData:t.stepData||{},workflowData:t.workflowData||{}}}function S(t="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?u(t,"REQUIRED"):d()}function L(t,e){return r=>!r||r.length<t?u(e||`Must be at least ${t} characters long`,"MIN_LENGTH",`length.${t}`):d()}function D(t,e){return r=>r&&r.length>t?u(e||`Must be no more than ${t} characters long`,"MAX_LENGTH",`length.${t}`):d()}function W(t,e){return r=>r&&!t.test(r)?u(e||"Invalid format","PATTERN_MISMATCH",`pattern.${t.source}`):d()}function q(t="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?u(t,"INVALID_EMAIL"):d()}function _(t="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?u(t,"INVALID_URL"):d()}function U(t="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?u(t,"INVALID_NUMBER"):d()}}function z(t,e){return r=>{let n=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(n)&&n<t?u(e||`Must be at least ${t}`,"MIN_VALUE",`min.${t}`):d()}}function K(t,e){return r=>{let n=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(n)&&n>t?u(e||`Must be no more than ${t}`,"MAX_VALUE",`max.${t}`):d()}}function j(t,e,r){return (n,o)=>t(n,o)?d():u(e,r||"CUSTOM_VALIDATION_FAILED")}function Q(t,e){return (r,n)=>{let o=n.allFormData?.[t];return r!==o?u(e||"Fields must match","FIELD_MISMATCH",`match.${t}`):d()}}function H(t,e){return (r,n)=>t(r,n)?e(r,n):d()}function Z(t,e,r){return async(n,o)=>{try{return await t(n,o)?d():u(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return u(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var J=0,M=()=>`event_${Date.now()}_${++J}`,G=()=>`session_${Date.now()}_${Math.random().toString(36).substr(2,9)}`,w=class{constructor(e,r){this.adapters=[];this.eventBuffer=[];this.config={bufferSize:100,flushInterval:5e3,sampleRate:1,enablePerformanceTracking:true,enableErrorTracking:true,enableMemoryTracking:false,...e},this.context={sessionId:G(),environment:"production",userAgent:typeof window<"u"?window.navigator?.userAgent:void 0,url:typeof window<"u"?window.location?.href:void 0,...r},this.profiler=new T,this.config.enabled&&this.startFlushTimer();}addAdapter(e){this.adapters.push(e);}removeAdapter(e){this.adapters=this.adapters.filter(r=>r.name!==e);}track(e,r,n,o,i="low"){if(!this.config.enabled||Math.random()>(this.config.sampleRate||1))return;let s={id:M(),type:e,timestamp:Date.now(),source:r,data:{...n,context:this.context},metrics:o,severity:i};if(o&&this.config.performanceThresholds&&this.checkPerformanceThresholds(s,o),this.eventBuffer.push(s),this.config.onEvent)try{this.config.onEvent(s);}catch(a){console.error("Error in monitoring event callback:",a);}this.eventBuffer.length>=(this.config.bufferSize||100)&&this.flush();}trackError(e,r,n){this.track("error",r,{message:e.message,name:e.name,stack:e.stack,context:n},void 0,"high");}getProfiler(){return this.profiler}updateContext(e){this.context={...this.context,...e};}async flush(){if(this.eventBuffer.length===0)return;let e=[...this.eventBuffer];if(this.eventBuffer=[],this.config.onBatch)try{this.config.onBatch(e);}catch(r){console.error("Error in monitoring batch callback:",r);}await Promise.all(this.adapters.map(async r=>{try{await r.send(e);}catch(n){console.error(`Error sending events to adapter ${r.name}:`,n),this.config.onError&&this.config.onError(n);}}));}async destroy(){this.flushTimer&&clearInterval(this.flushTimer),await this.flush(),await Promise.all(this.adapters.map(async e=>{if(e.flush)try{await e.flush();}catch(r){console.error(`Error flushing adapter ${e.name}:`,r);}}));}startFlushTimer(){this.config.flushInterval&&this.config.flushInterval>0&&(this.flushTimer=setInterval(()=>{this.flush();},this.config.flushInterval));}checkPerformanceThresholds(e,r){let n=this.config.performanceThresholds;n.componentRenderTime&&e.type==="component_render"&&r.duration>n.componentRenderTime&&this.createPerformanceWarning("Component render time exceeded threshold",n.componentRenderTime,r.duration,"Consider memoizing component or optimizing render logic"),n.formValidationTime&&e.type==="form_validation"&&r.duration>n.formValidationTime&&this.createPerformanceWarning("Form validation time exceeded threshold",n.formValidationTime,r.duration,"Consider debouncing validation or optimizing validators"),n.workflowNavigationTime&&e.type==="workflow_navigation"&&r.duration>n.workflowNavigationTime&&this.createPerformanceWarning("Workflow navigation time exceeded threshold",n.workflowNavigationTime,r.duration,"Consider optimizing step transitions or condition evaluation"),n.memoryUsage&&r.memoryUsage&&r.memoryUsage>n.memoryUsage&&this.createPerformanceWarning("Memory usage exceeded threshold",n.memoryUsage,r.memoryUsage,"Check for memory leaks or optimize data structures"),n.reRenderCount&&r.reRenderCount&&r.reRenderCount>n.reRenderCount&&this.createPerformanceWarning("Component re-render count exceeded threshold",n.reRenderCount,r.reRenderCount,"Consider using React.memo or optimizing dependencies");}createPerformanceWarning(e,r,n,o){let i={id:M(),type:"performance_warning",timestamp:Date.now(),source:"rilay_monitor",data:{message:e,context:this.context},threshold:r,actualValue:n,recommendation:o,severity:"medium"};if(this.eventBuffer.push(i),this.config.onEvent)try{this.config.onEvent(i);}catch(s){console.error("Error in performance warning callback:",s);}}},T=class{constructor(){this.metrics=new Map;this.startTimes=new Map;}start(e,r={}){this.startTimes.set(e,performance.now()),this.metrics.set(e,{timestamp:Date.now(),duration:0,renderCount:r.renderCount||0,reRenderCount:r.reRenderCount||0,memoryUsage:this.getMemoryUsage()});}end(e){let r=this.startTimes.get(e);if(!r)return null;let n=performance.now()-r,o=this.metrics.get(e);if(!o)return null;let i={...o,duration:n,memoryUsage:this.getMemoryUsage()};return this.metrics.set(e,i),this.startTimes.delete(e),i}mark(e){typeof performance<"u"&&performance.mark&&performance.mark(e);}measure(e,r,n){if(typeof performance<"u"&&performance.measure){performance.measure(e,r,n);let o=performance.getEntriesByName(e,"measure");return o.length>0?o[o.length-1].duration:0}return 0}getMetrics(e){return this.metrics.get(e)||null}getAllMetrics(){let e={};return this.metrics.forEach((r,n)=>{e[n]=r;}),e}clear(e){e?(this.metrics.delete(e),this.startTimes.delete(e)):(this.metrics.clear(),this.startTimes.clear());}getMemoryUsage(){if(typeof performance<"u"&&performance.memory)return performance.memory.usedJSHeapSize}},g=null;function he(t,e){return g&&g.destroy(),g=new w(t,e),g}function ye(){return g}async function Ce(){g&&(await g.destroy(),g=null);}var b=class{constructor(e="info"){this.name="console";this.logLevel=e;}async send(e){for(let r of e)this.logEvent(r);}logEvent(e){let r={id:e.id,type:e.type,timestamp:new Date(e.timestamp).toISOString(),source:e.source,severity:e.severity,data:e.data,metrics:e.metrics};switch(e.severity){case "critical":case "high":this.shouldLog("error")&&console.error(`[Rilay Monitor] ${e.type}:`,r);break;case "medium":this.shouldLog("warn")&&console.warn(`[Rilay Monitor] ${e.type}:`,r);break;default:this.shouldLog("info")&&console.info(`[Rilay Monitor] ${e.type}:`,r);break}if(e.type==="performance_warning"&&this.shouldLog("warn")){let n=e;console.warn(`[Rilay Performance Warning] ${n.data.message}`,{threshold:n.threshold,actual:n.actualValue,recommendation:n.recommendation});}}shouldLog(e){let r=["debug","info","warn","error"],n=r.indexOf(this.logLevel);return r.indexOf(e)>=n}},A=class{constructor(e){this.name="remote";this.eventQueue=[];this.isProcessing=false;this.endpoint=e.endpoint,this.apiKey=e.apiKey,this.headers={"Content-Type":"application/json",...e.apiKey?{Authorization:`Bearer ${e.apiKey}`}:{},...e.headers},this.batchSize=e.batchSize||50,this.retryAttempts=e.retryAttempts||3;}async send(e){this.eventQueue.push(...e),this.isProcessing||await this.processQueue();}async flush(){await this.processQueue();}configure(e){e.headers&&Object.assign(this.headers,e.headers);}async processQueue(){if(!(this.isProcessing||this.eventQueue.length===0)){this.isProcessing=true;try{for(;this.eventQueue.length>0;){let e=this.eventQueue.splice(0,this.batchSize);await this.sendBatch(e);}}finally{this.isProcessing=false;}}}async sendBatch(e){let r={events:e,timestamp:Date.now(),source:"rilay-monitoring"},n=null;for(let o=1;o<=this.retryAttempts;o++)try{let i=await fetch(this.endpoint,{method:"POST",headers:this.headers,body:JSON.stringify(r)});if(!i.ok)throw new Error(`HTTP ${i.status}: ${i.statusText}`);return}catch(i){if(n=i,i instanceof Error&&i.message.includes("HTTP 4"))break;o<this.retryAttempts&&await this.delay(2**o*1e3);}throw console.error("Failed to send monitoring events to remote endpoint:",n),n}delay(e){return new Promise(r=>setTimeout(r,e))}},B=class{constructor(e=1e3){this.name="localStorage";this.storageKey="rilay_monitoring_events";this.maxEvents=e;}async send(e){try{let o=[...this.getStoredEvents(),...e].slice(-this.maxEvents);localStorage.setItem(this.storageKey,JSON.stringify(o));}catch(r){console.error("Failed to store monitoring events:",r);}}async flush(){}getStoredEvents(){try{let e=localStorage.getItem(this.storageKey);return e?JSON.parse(e):[]}catch(e){return console.error("Failed to retrieve stored monitoring events:",e),[]}}clearStoredEvents(){localStorage.removeItem(this.storageKey);}getEventCount(){return this.getStoredEvents().length}},F=class{constructor(){this.name="development";this.console=new b("debug");}async send(e){await this.console.send(e),this.logPerformanceSummary(e),this.logErrorSummary(e);}logPerformanceSummary(e){let r=e.filter(s=>s.metrics);if(r.length===0)return;console.group("[Rilay Performance Summary]");let n=r.reduce((s,a)=>s+(a.metrics?.duration||0),0)/r.length,o=Math.max(...r.map(s=>s.metrics?.duration||0));console.info(`Average duration: ${n.toFixed(2)}ms`),console.info(`Max duration: ${o.toFixed(2)}ms`);let i={};for(let s of r)i[s.type]||(i[s.type]=[]),i[s.type].push(s);for(let[s,a]of Object.entries(i)){let f=a.reduce((l,h)=>l+(h.metrics?.duration||0),0)/a.length;console.info(`${s}: ${f.toFixed(2)}ms avg (${a.length} events)`);}console.groupEnd();}logErrorSummary(e){let r=e.filter(o=>o.type==="error");if(r.length===0)return;console.group("[Rilay Error Summary]"),console.error(`${r.length} errors detected`);let n={};for(let o of r)n[o.source]=(n[o.source]||0)+1;for(let[o,i]of Object.entries(n))console.error(`${o}: ${i} errors`);console.groupEnd();}};var x=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,n={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[n,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,n={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[n,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return I(this,e)}};function we(t){return new x(t)}function I(t,e){if(t.conditions&&t.conditions.length>0){let n=t.conditions.map(o=>I(o,e));return t.logicalOperator==="or"?n.some(o=>o):n.every(o=>o)}let r=X(e,t.field);switch(t.operator){case "equals":return r===t.value;case "notEquals":return r!==t.value;case "greaterThan":return typeof r=="number"&&typeof t.value=="number"&&r>t.value;case "lessThan":return typeof r=="number"&&typeof t.value=="number"&&r<t.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof t.value=="number"&&r>=t.value;case "lessThanOrEqual":return typeof r=="number"&&typeof t.value=="number"&&r<=t.value;case "contains":return typeof r=="string"&&typeof t.value=="string"||Array.isArray(r)?r.includes(t.value):false;case "notContains":return typeof r=="string"&&typeof t.value=="string"||Array.isArray(r)?!r.includes(t.value):false;case "in":return Array.isArray(t.value)&&t.value.includes(r);case "notIn":return Array.isArray(t.value)&&!t.value.includes(r);case "matches":return typeof r!="string"||typeof t.value!="string"?false:new RegExp(t.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function X(t,e){let r=e.split("."),n=t;for(let o of r)if(n&&typeof n=="object"&&o in n)n=n[o];else return;return n}export{re as ComponentRendererWrapper,b as ConsoleAdapter,F as DevelopmentAdapter,V as IdGenerator,B as LocalStorageAdapter,A as RemoteAdapter,w as RilayMonitor,Z as async,R as combineValidationResults,se as configureObject,$ as createValidationContext,y as createValidationResult,j as custom,k as deepClone,Ce as destroyGlobalMonitoring,q as email,P as ensureUnique,I as evaluateCondition,ye as getGlobalMonitor,he as initializeMonitoring,Q as matchField,K as max,D as maxLength,ne as mergeInto,z as min,L as minLength,ie as normalizeToArray,U as number,W as pattern,S as required,E as resolveRendererChildren,v as ril,O as runValidators,N as runValidatorsAsync,_ as url,oe as validateRequired,H as validateWhen,we as when};
package/package.json CHANGED
@@ -1,9 +1,17 @@
1
1
  {
2
2
  "name": "@rilaykit/core",
3
- "version": "8.1.0",
3
+ "version": "9.0.1",
4
4
  "description": "Core types, configurations, and utilities for the RilayKit form library",
5
5
  "main": "dist/index.js",
6
+ "module": "dist/index.mjs",
6
7
  "types": "dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
7
15
  "files": [
8
16
  "dist"
9
17
  ],
@@ -30,8 +38,8 @@
30
38
  },
31
39
  "devDependencies": {
32
40
  "@types/react": "^18.3.23",
33
- "react": "^19.1.0",
34
- "typescript": "^5.3.0"
41
+ "react": "^18.3.1",
42
+ "typescript": "^5.8.3"
35
43
  },
36
44
  "publishConfig": {
37
45
  "access": "public"