@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 +248 -4
- package/dist/index.d.ts +248 -4
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +11 -3
package/dist/index.d.mts
CHANGED
|
@@ -43,8 +43,8 @@ interface AsyncValidationResult {
|
|
|
43
43
|
warnings?: string[];
|
|
44
44
|
}
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
47
|
-
*
|
|
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
|
|
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
|
-
|
|
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
|
-
*
|
|
47
|
-
*
|
|
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
|
|
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
|
-
|
|
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": "
|
|
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": "^
|
|
34
|
-
"typescript": "^5.3
|
|
41
|
+
"react": "^18.3.1",
|
|
42
|
+
"typescript": "^5.8.3"
|
|
35
43
|
},
|
|
36
44
|
"publishConfig": {
|
|
37
45
|
"access": "public"
|