@rilaykit/core 3.0.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -20,118 +20,73 @@ declare class ril<C> {
20
20
  [K in NewType]: TProps;
21
21
  }>;
22
22
  /**
23
- * Generic method to set any renderer type easily
24
- * @param rendererType - The type of renderer to set
25
- * @param renderer - The renderer function
26
- * @returns The ril instance for chaining
27
- */
28
- setRenderer<T extends keyof (FormRenderConfig & WorkflowRenderConfig)>(rendererType: T, renderer: (FormRenderConfig & WorkflowRenderConfig)[T]): this;
29
- /**
30
- * Set multiple renderers at once
31
- * @param renderers - Object with renderer configurations
32
- * @returns The ril instance for chaining
33
- */
34
- setRenderers(renderers: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
35
- /**
36
- * Set custom row renderer
37
- * @param renderer - Custom row renderer function
38
- * @returns The ril instance for chaining
39
- */
40
- setRowRenderer(renderer: FormRowRenderer): this;
41
- /**
42
- * Set custom body renderer
43
- * @param renderer - Custom body renderer function
44
- * @returns The ril instance for chaining
45
- */
46
- setBodyRenderer(renderer: FormBodyRenderer): this;
47
- /**
48
- * Set custom submit button renderer
49
- * @param renderer - Custom submit button renderer function
50
- * @returns The ril instance for chaining
51
- */
52
- setSubmitButtonRenderer(renderer: FormSubmitButtonRenderer): this;
53
- /**
54
- * Set custom field renderer
55
- * @param renderer - Custom field renderer function
56
- * @returns The ril instance for chaining
57
- */
58
- setFieldRenderer(renderer: FieldRenderer): this;
59
- /**
60
- * Set complete form render configuration
61
- * @param config - Form render configuration
62
- * @returns The ril instance for chaining
63
- */
64
- setFormRenderConfig(config: FormRenderConfig): this;
65
- /**
66
- * Get current form render configuration
67
- * @returns Current form render configuration
23
+ * Universal configuration method for all renderer types
24
+ *
25
+ * This method provides a unified API to configure both form and workflow renderers
26
+ * in a single call, automatically categorizing and applying the appropriate configurations.
27
+ *
28
+ * @param config - Configuration object containing renderer settings
29
+ * @param config.rowRenderer - Custom renderer for form rows (form-specific)
30
+ * @param config.bodyRenderer - Custom renderer for form body container (form-specific)
31
+ * @param config.submitButtonRenderer - Custom renderer for form submit buttons (form-specific)
32
+ * @param config.fieldRenderer - Custom renderer for individual form fields (form-specific)
33
+ * @param config.stepperRenderer - Custom renderer for workflow step navigation (workflow-specific)
34
+ * @param config.nextButtonRenderer - Custom renderer for workflow next buttons (workflow-specific)
35
+ * @param config.previousButtonRenderer - Custom renderer for workflow previous buttons (workflow-specific)
36
+ * @param config.skipButtonRenderer - Custom renderer for workflow skip buttons (workflow-specific)
37
+ *
38
+ * @returns The ril instance for method chaining
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // Configure form renderers only
43
+ * const config = ril.create()
44
+ * .configure({
45
+ * rowRenderer: CustomRowRenderer,
46
+ * submitButtonRenderer: CustomSubmitButton
47
+ * });
48
+ *
49
+ * // Configure workflow renderers only
50
+ * const config = ril.create()
51
+ * .configure({
52
+ * stepperRenderer: CustomStepper,
53
+ * nextButtonRenderer: CustomNextButton
54
+ * });
55
+ *
56
+ * // Configure both form and workflow renderers
57
+ * const config = ril.create()
58
+ * .configure({
59
+ * // Form renderers
60
+ * rowRenderer: CustomRowRenderer,
61
+ * fieldRenderer: CustomFieldRenderer,
62
+ * // Workflow renderers
63
+ * stepperRenderer: CustomStepper,
64
+ * nextButtonRenderer: CustomNextButton
65
+ * });
66
+ * ```
67
+ *
68
+ * @remarks
69
+ * - Renderers are automatically categorized into form or workflow configurations
70
+ * - Existing configurations are merged, not replaced entirely
71
+ * - Invalid renderer keys are silently ignored
72
+ * - This method replaces individual setter methods for better DX
73
+ */
74
+ configure(config: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
75
+ /**
76
+ * Configuration getters
68
77
  */
69
78
  getFormRenderConfig(): FormRenderConfig;
70
- /**
71
- * Set custom stepper renderer for workflows
72
- * @param renderer - Custom stepper renderer function
73
- * @returns The ril instance for chaining
74
- */
75
- setStepperRenderer(renderer: WorkflowStepperRenderer): this;
76
- /**
77
- * Set custom workflow next button renderer
78
- * @param renderer - Custom workflow next button renderer function
79
- * @returns The ril instance for chaining
80
- */
81
- setWorkflowNextButtonRenderer(renderer: WorkflowNextButtonRenderer): this;
82
- /**
83
- * Set custom workflow previous button renderer
84
- * @param renderer - Custom workflow previous button renderer function
85
- * @returns The ril instance for chaining
86
- */
87
- setWorkflowPreviousButtonRenderer(renderer: WorkflowPreviousButtonRenderer): this;
88
- /**
89
- * Set custom workflow skip button renderer
90
- * @param renderer - Custom workflow skip button renderer function
91
- * @returns The ril instance for chaining
92
- */
93
- setWorkflowSkipButtonRenderer(renderer: WorkflowSkipButtonRenderer): this;
94
- /**
95
- * Set complete workflow render configuration
96
- * @param config - Workflow render configuration
97
- * @returns The ril instance for chaining
98
- */
99
- setWorkflowRenderConfig(config: WorkflowRenderConfig): this;
100
- /**
101
- * Get current workflow render configuration
102
- * @returns Current workflow render configuration
103
- */
104
79
  getWorkflowRenderConfig(): WorkflowRenderConfig;
105
80
  /**
106
- * Get a component by its ID
107
- * @param id - Component ID (which is its type)
108
- * @returns Component configuration or undefined
81
+ * Component management methods
109
82
  */
110
83
  getComponent<T extends keyof C & string>(id: T): ComponentConfig<C[T]> | undefined;
111
- /**
112
- * List all registered components
113
- * @returns Array of all components
114
- */
115
84
  getAllComponents(): ComponentConfig[];
116
- /**
117
- * Check if a component exists
118
- * @param id - Component ID
119
- * @returns True if component exists
120
- */
121
85
  hasComponent(id: string): boolean;
122
- /**
123
- * Remove a component from the configuration
124
- * @param id - Component ID
125
- * @returns True if component was removed
126
- */
127
86
  removeComponent(id: string): boolean;
128
- /**
129
- * Clear all components
130
- */
131
87
  clear(): void;
132
88
  /**
133
- * Get statistics about registered components and renderers
134
- * @returns Object with comprehensive statistics
89
+ * Enhanced statistics with more detailed information
135
90
  */
136
91
  getStats(): {
137
92
  total: number;
@@ -148,8 +103,7 @@ declare class ril<C> {
148
103
  };
149
104
  };
150
105
  /**
151
- * Validate the configuration
152
- * @returns Array of validation errors
106
+ * Enhanced validation using shared utilities
153
107
  */
154
108
  validate(): string[];
155
109
  }
@@ -462,7 +416,61 @@ type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProp
462
416
  type WorkflowSkipButtonRenderer = (props: WorkflowSkipButtonRendererProps) => React.ReactElement;
463
417
 
464
418
  /**
465
- * Create a Zod-based validator
419
+ * Utility for merging partial configurations into existing objects
420
+ * Eliminates repetitive object spread operations
421
+ */
422
+ declare function mergeInto<T>(target: T, partial: Partial<T>): T;
423
+ /**
424
+ * Validates uniqueness of identifiers and throws descriptive errors
425
+ */
426
+ declare function ensureUnique(ids: string[], entityName: string): void;
427
+ /**
428
+ * Validates required fields exist in configurations
429
+ */
430
+ declare function validateRequired<T>(items: T[], requiredFields: (keyof T)[], entityName: string): void;
431
+ /**
432
+ * Auto-generates IDs when not provided
433
+ */
434
+ declare class IdGenerator {
435
+ private counters;
436
+ next(prefix: string): string;
437
+ reset(prefix?: string): void;
438
+ }
439
+ /**
440
+ * Validation error builder for consistent error handling
441
+ */
442
+ declare class ValidationErrorBuilder {
443
+ private errors;
444
+ add(code: string, message: string, path?: string[]): this;
445
+ addIf(condition: boolean, code: string, message: string, path?: string[]): this;
446
+ build(): ValidationError[];
447
+ hasErrors(): boolean;
448
+ clear(): this;
449
+ }
450
+ /**
451
+ * Common validation patterns
452
+ */
453
+ declare const ValidationPatterns: {
454
+ hasValue: (value: any) => boolean;
455
+ isArray: (value: any) => value is any[];
456
+ arrayMinLength: (value: any[], min: number) => boolean;
457
+ arrayMaxLength: (value: any[], max: number) => boolean;
458
+ };
459
+ /**
460
+ * Polymorphic helper for handling single items or arrays
461
+ */
462
+ declare function normalizeToArray<T>(input: T | T[]): T[];
463
+ /**
464
+ * Deep clone utility for configuration objects
465
+ */
466
+ declare function deepClone<T>(obj: T): T;
467
+ /**
468
+ * Generic configuration merger with type safety
469
+ */
470
+ declare function configureObject<T>(target: T, updates: Partial<T>, allowedKeys?: (keyof T)[]): T;
471
+
472
+ /**
473
+ * Create a `Zod`-based validator
466
474
  * @param schema - Zod schema to validate against
467
475
  * @returns Validator function
468
476
  */
@@ -624,4 +632,4 @@ declare const persistence: {
624
632
  */
625
633
  declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
626
634
 
627
- export { type CompletionConfig, type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, type FieldRenderer, type FieldRendererProps, type FormBodyRenderer, type FormBodyRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, LocalStorageAdapter, MemoryAdapter, type NavigationConfig, type PersistenceAdapter, type PersistenceConfig, type RendererChildrenFunction, type RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, resolveRendererChildren, ril };
635
+ export { type CompletionConfig, type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, type FieldRenderer, type FieldRendererProps, type FormBodyRenderer, type FormBodyRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, IdGenerator, LocalStorageAdapter, MemoryAdapter, type NavigationConfig, type PersistenceAdapter, type PersistenceConfig, type RendererChildrenFunction, type RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, ValidationErrorBuilder, ValidationPatterns, type ValidationResult, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, combineValidators, commonValidators, configureObject, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, deepClone, ensureUnique, mergeInto, normalizeToArray, persistence, resolveRendererChildren, ril, validateRequired };
package/dist/index.d.ts CHANGED
@@ -20,118 +20,73 @@ declare class ril<C> {
20
20
  [K in NewType]: TProps;
21
21
  }>;
22
22
  /**
23
- * Generic method to set any renderer type easily
24
- * @param rendererType - The type of renderer to set
25
- * @param renderer - The renderer function
26
- * @returns The ril instance for chaining
27
- */
28
- setRenderer<T extends keyof (FormRenderConfig & WorkflowRenderConfig)>(rendererType: T, renderer: (FormRenderConfig & WorkflowRenderConfig)[T]): this;
29
- /**
30
- * Set multiple renderers at once
31
- * @param renderers - Object with renderer configurations
32
- * @returns The ril instance for chaining
33
- */
34
- setRenderers(renderers: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
35
- /**
36
- * Set custom row renderer
37
- * @param renderer - Custom row renderer function
38
- * @returns The ril instance for chaining
39
- */
40
- setRowRenderer(renderer: FormRowRenderer): this;
41
- /**
42
- * Set custom body renderer
43
- * @param renderer - Custom body renderer function
44
- * @returns The ril instance for chaining
45
- */
46
- setBodyRenderer(renderer: FormBodyRenderer): this;
47
- /**
48
- * Set custom submit button renderer
49
- * @param renderer - Custom submit button renderer function
50
- * @returns The ril instance for chaining
51
- */
52
- setSubmitButtonRenderer(renderer: FormSubmitButtonRenderer): this;
53
- /**
54
- * Set custom field renderer
55
- * @param renderer - Custom field renderer function
56
- * @returns The ril instance for chaining
57
- */
58
- setFieldRenderer(renderer: FieldRenderer): this;
59
- /**
60
- * Set complete form render configuration
61
- * @param config - Form render configuration
62
- * @returns The ril instance for chaining
63
- */
64
- setFormRenderConfig(config: FormRenderConfig): this;
65
- /**
66
- * Get current form render configuration
67
- * @returns Current form render configuration
23
+ * Universal configuration method for all renderer types
24
+ *
25
+ * This method provides a unified API to configure both form and workflow renderers
26
+ * in a single call, automatically categorizing and applying the appropriate configurations.
27
+ *
28
+ * @param config - Configuration object containing renderer settings
29
+ * @param config.rowRenderer - Custom renderer for form rows (form-specific)
30
+ * @param config.bodyRenderer - Custom renderer for form body container (form-specific)
31
+ * @param config.submitButtonRenderer - Custom renderer for form submit buttons (form-specific)
32
+ * @param config.fieldRenderer - Custom renderer for individual form fields (form-specific)
33
+ * @param config.stepperRenderer - Custom renderer for workflow step navigation (workflow-specific)
34
+ * @param config.nextButtonRenderer - Custom renderer for workflow next buttons (workflow-specific)
35
+ * @param config.previousButtonRenderer - Custom renderer for workflow previous buttons (workflow-specific)
36
+ * @param config.skipButtonRenderer - Custom renderer for workflow skip buttons (workflow-specific)
37
+ *
38
+ * @returns The ril instance for method chaining
39
+ *
40
+ * @example
41
+ * ```typescript
42
+ * // Configure form renderers only
43
+ * const config = ril.create()
44
+ * .configure({
45
+ * rowRenderer: CustomRowRenderer,
46
+ * submitButtonRenderer: CustomSubmitButton
47
+ * });
48
+ *
49
+ * // Configure workflow renderers only
50
+ * const config = ril.create()
51
+ * .configure({
52
+ * stepperRenderer: CustomStepper,
53
+ * nextButtonRenderer: CustomNextButton
54
+ * });
55
+ *
56
+ * // Configure both form and workflow renderers
57
+ * const config = ril.create()
58
+ * .configure({
59
+ * // Form renderers
60
+ * rowRenderer: CustomRowRenderer,
61
+ * fieldRenderer: CustomFieldRenderer,
62
+ * // Workflow renderers
63
+ * stepperRenderer: CustomStepper,
64
+ * nextButtonRenderer: CustomNextButton
65
+ * });
66
+ * ```
67
+ *
68
+ * @remarks
69
+ * - Renderers are automatically categorized into form or workflow configurations
70
+ * - Existing configurations are merged, not replaced entirely
71
+ * - Invalid renderer keys are silently ignored
72
+ * - This method replaces individual setter methods for better DX
73
+ */
74
+ configure(config: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
75
+ /**
76
+ * Configuration getters
68
77
  */
69
78
  getFormRenderConfig(): FormRenderConfig;
70
- /**
71
- * Set custom stepper renderer for workflows
72
- * @param renderer - Custom stepper renderer function
73
- * @returns The ril instance for chaining
74
- */
75
- setStepperRenderer(renderer: WorkflowStepperRenderer): this;
76
- /**
77
- * Set custom workflow next button renderer
78
- * @param renderer - Custom workflow next button renderer function
79
- * @returns The ril instance for chaining
80
- */
81
- setWorkflowNextButtonRenderer(renderer: WorkflowNextButtonRenderer): this;
82
- /**
83
- * Set custom workflow previous button renderer
84
- * @param renderer - Custom workflow previous button renderer function
85
- * @returns The ril instance for chaining
86
- */
87
- setWorkflowPreviousButtonRenderer(renderer: WorkflowPreviousButtonRenderer): this;
88
- /**
89
- * Set custom workflow skip button renderer
90
- * @param renderer - Custom workflow skip button renderer function
91
- * @returns The ril instance for chaining
92
- */
93
- setWorkflowSkipButtonRenderer(renderer: WorkflowSkipButtonRenderer): this;
94
- /**
95
- * Set complete workflow render configuration
96
- * @param config - Workflow render configuration
97
- * @returns The ril instance for chaining
98
- */
99
- setWorkflowRenderConfig(config: WorkflowRenderConfig): this;
100
- /**
101
- * Get current workflow render configuration
102
- * @returns Current workflow render configuration
103
- */
104
79
  getWorkflowRenderConfig(): WorkflowRenderConfig;
105
80
  /**
106
- * Get a component by its ID
107
- * @param id - Component ID (which is its type)
108
- * @returns Component configuration or undefined
81
+ * Component management methods
109
82
  */
110
83
  getComponent<T extends keyof C & string>(id: T): ComponentConfig<C[T]> | undefined;
111
- /**
112
- * List all registered components
113
- * @returns Array of all components
114
- */
115
84
  getAllComponents(): ComponentConfig[];
116
- /**
117
- * Check if a component exists
118
- * @param id - Component ID
119
- * @returns True if component exists
120
- */
121
85
  hasComponent(id: string): boolean;
122
- /**
123
- * Remove a component from the configuration
124
- * @param id - Component ID
125
- * @returns True if component was removed
126
- */
127
86
  removeComponent(id: string): boolean;
128
- /**
129
- * Clear all components
130
- */
131
87
  clear(): void;
132
88
  /**
133
- * Get statistics about registered components and renderers
134
- * @returns Object with comprehensive statistics
89
+ * Enhanced statistics with more detailed information
135
90
  */
136
91
  getStats(): {
137
92
  total: number;
@@ -148,8 +103,7 @@ declare class ril<C> {
148
103
  };
149
104
  };
150
105
  /**
151
- * Validate the configuration
152
- * @returns Array of validation errors
106
+ * Enhanced validation using shared utilities
153
107
  */
154
108
  validate(): string[];
155
109
  }
@@ -462,7 +416,61 @@ type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProp
462
416
  type WorkflowSkipButtonRenderer = (props: WorkflowSkipButtonRendererProps) => React.ReactElement;
463
417
 
464
418
  /**
465
- * Create a Zod-based validator
419
+ * Utility for merging partial configurations into existing objects
420
+ * Eliminates repetitive object spread operations
421
+ */
422
+ declare function mergeInto<T>(target: T, partial: Partial<T>): T;
423
+ /**
424
+ * Validates uniqueness of identifiers and throws descriptive errors
425
+ */
426
+ declare function ensureUnique(ids: string[], entityName: string): void;
427
+ /**
428
+ * Validates required fields exist in configurations
429
+ */
430
+ declare function validateRequired<T>(items: T[], requiredFields: (keyof T)[], entityName: string): void;
431
+ /**
432
+ * Auto-generates IDs when not provided
433
+ */
434
+ declare class IdGenerator {
435
+ private counters;
436
+ next(prefix: string): string;
437
+ reset(prefix?: string): void;
438
+ }
439
+ /**
440
+ * Validation error builder for consistent error handling
441
+ */
442
+ declare class ValidationErrorBuilder {
443
+ private errors;
444
+ add(code: string, message: string, path?: string[]): this;
445
+ addIf(condition: boolean, code: string, message: string, path?: string[]): this;
446
+ build(): ValidationError[];
447
+ hasErrors(): boolean;
448
+ clear(): this;
449
+ }
450
+ /**
451
+ * Common validation patterns
452
+ */
453
+ declare const ValidationPatterns: {
454
+ hasValue: (value: any) => boolean;
455
+ isArray: (value: any) => value is any[];
456
+ arrayMinLength: (value: any[], min: number) => boolean;
457
+ arrayMaxLength: (value: any[], max: number) => boolean;
458
+ };
459
+ /**
460
+ * Polymorphic helper for handling single items or arrays
461
+ */
462
+ declare function normalizeToArray<T>(input: T | T[]): T[];
463
+ /**
464
+ * Deep clone utility for configuration objects
465
+ */
466
+ declare function deepClone<T>(obj: T): T;
467
+ /**
468
+ * Generic configuration merger with type safety
469
+ */
470
+ declare function configureObject<T>(target: T, updates: Partial<T>, allowedKeys?: (keyof T)[]): T;
471
+
472
+ /**
473
+ * Create a `Zod`-based validator
466
474
  * @param schema - Zod schema to validate against
467
475
  * @returns Validator function
468
476
  */
@@ -624,4 +632,4 @@ declare const persistence: {
624
632
  */
625
633
  declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
626
634
 
627
- export { type CompletionConfig, type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, type FieldRenderer, type FieldRendererProps, type FormBodyRenderer, type FormBodyRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, LocalStorageAdapter, MemoryAdapter, type NavigationConfig, type PersistenceAdapter, type PersistenceConfig, type RendererChildrenFunction, type RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, resolveRendererChildren, ril };
635
+ export { type CompletionConfig, type ComponentConfig, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, type FieldRenderer, type FieldRendererProps, type FormBodyRenderer, type FormBodyRendererProps, type FormConfiguration, type FormFieldConfig, type FormFieldRow, type FormRenderConfig, type FormRowRenderer, type FormRowRendererProps, type FormSubmitButtonRenderer, type FormSubmitButtonRendererProps, IdGenerator, LocalStorageAdapter, MemoryAdapter, type NavigationConfig, type PersistenceAdapter, type PersistenceConfig, type RendererChildrenFunction, type RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, ValidationErrorBuilder, ValidationPatterns, type ValidationResult, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, combineValidators, commonValidators, configureObject, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, deepClone, ensureUnique, mergeInto, normalizeToArray, persistence, resolveRendererChildren, ril, validateRequired };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';var zod=require('zod');function w(n,e){return typeof n=="function"?n(e):n}var g=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let o={id:e,type:e,...r};return this.components.set(e,o),this}setRenderer(e,r){return e in this.formRenderConfig?this.formRenderConfig={...this.formRenderConfig,[e]:r}:e in this.workflowRenderConfig&&(this.workflowRenderConfig={...this.workflowRenderConfig,[e]:r}),this}setRenderers(e){let r={},o={};for(let[t,i]of Object.entries(e))["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"].includes(t)?r[t]=i:o[t]=i;return this.formRenderConfig={...this.formRenderConfig,...r},this.workflowRenderConfig={...this.workflowRenderConfig,...o},this}setRowRenderer(e){return this.formRenderConfig={...this.formRenderConfig,rowRenderer:e},this}setBodyRenderer(e){return this.formRenderConfig={...this.formRenderConfig,bodyRenderer:e},this}setSubmitButtonRenderer(e){return this.formRenderConfig={...this.formRenderConfig,submitButtonRenderer:e},this}setFieldRenderer(e){return this.formRenderConfig={...this.formRenderConfig,fieldRenderer:e},this}setFormRenderConfig(e){return this.formRenderConfig=e,this}getFormRenderConfig(){return {...this.formRenderConfig}}setStepperRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,stepperRenderer:e},this}setWorkflowNextButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,nextButtonRenderer:e},this}setWorkflowPreviousButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,previousButtonRenderer:e},this}setWorkflowSkipButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,skipButtonRenderer:e},this}setWorkflowRenderConfig(e){return this.workflowRenderConfig=e,this}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){return this.components.delete(e)}clear(){this.components.clear();}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,o)=>(r[o.type]=(r[o.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()),o=r.map(a=>a.id),t=o.filter((a,s)=>o.indexOf(a)!==s);t.length>0&&e.push(`Duplicate component IDs found: ${t.join(", ")}`);let i=r.filter(a=>!a.renderer);return i.length>0&&e.push(`Components without renderer: ${i.map(a=>a.id).join(", ")}`),e}};var f=n=>async e=>{try{return await n.parseAsync(e),{isValid:!0,errors:[]}}catch(r){return r&&typeof r=="object"&&"errors"in r&&Array.isArray(r.errors)?{isValid:false,errors:r.errors.map(o=>({code:o.code,message:o.message,path:o.path?o.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},R=n=>async(e,r,o)=>{try{let t=await n(e,r);return t===!0?{isValid:!0,errors:[]}:t===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(t)}]}}catch(t){return {isValid:false,errors:[{code:"validation_error",message:t instanceof Error?t.message:"Validation error"}]}}},P=(n,e="all")=>async(r,o,t)=>{let i=await Promise.all(n.map(d=>d(r,o,t)));if(e==="all"){let d=i.flatMap(l=>l.errors);return {isValid:i.every(l=>l.isValid),errors:d}}return i.some(d=>d.isValid)?{isValid:true,errors:[]}:{isValid:false,errors:i.flatMap(d=>d.errors)}},x=(n,e)=>async(r,o,t)=>n(r,o)?e(r,o,t):{isValid:true,errors:[]},v={required:(n="This field is required")=>R(e=>e==null||e===""?n:!0),email:(n="Invalid email format")=>f(zod.z.string().email(n)),minLength:(n,e)=>f(zod.z.string().min(n,e||`Minimum ${n} characters required`)),maxLength:(n,e)=>f(zod.z.string().max(n,e||`Maximum ${n} characters allowed`)),pattern:(n,e="Invalid format")=>f(zod.z.string().regex(n,e)),numberRange:(n,e,r)=>{let o=zod.z.number();return n!==void 0&&(o=o.min(n,r||`Value must be at least ${n}`)),e!==void 0&&(o=o.max(e,r||`Value must be at most ${e}`)),f(o)},url:(n="Invalid URL format")=>f(zod.z.string().url(n)),phoneNumber:(n="Invalid phone number format")=>f(zod.z.string().regex(/^\+?[\d\s\-\(\)]+$/,n)),asyncValidation:(n,e=300)=>{let r=new Map;return (o,t,i)=>new Promise(a=>{let s=`${t.fieldId}-${JSON.stringify(o)}`;r.has(s)&&clearTimeout(r.get(s));let d=setTimeout(async()=>{try{let l=await n(o,t);a(l===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof l=="string"?l:"Async validation failed"}]});}catch(l){a({isValid:false,errors:[{code:"async_validation_error",message:l instanceof Error?l.message:"Async validation error"}]});}finally{r.delete(s);}},e);r.set(s,d);})}},b=(n,e=[])=>({isValid:n,errors:e}),S=(n,e,r)=>({code:n,message:e,path:r});var m=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(o){throw new Error(`Failed to save to localStorage: ${o}`)}}async load(e){try{let r=localStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from localStorage: ${r}`)}}async remove(e){try{localStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from localStorage: ${r}`)}}async exists(e){return localStorage.getItem(e)!==null}async list(e){let r=[];for(let o=0;o<localStorage.length;o++){let t=localStorage.key(o);t&&(!e||t.includes(e))&&r.push(t);}return r}},y=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(o){throw new Error(`Failed to save to sessionStorage: ${o}`)}}async load(e){try{let r=sessionStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from sessionStorage: ${r}`)}}async remove(e){try{sessionStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from sessionStorage: ${r}`)}}async exists(e){return sessionStorage.getItem(e)!==null}async list(e){let r=[];for(let o=0;o<sessionStorage.length;o++){let t=sessionStorage.key(o);t&&(!e||t.includes(e))&&r.push(t);}return r}},p=class{constructor(){this.name="memory";this.storage=new Map;}async save(e,r){this.storage.set(e,{...r});}async load(e){let r=this.storage.get(e);return r?{...r}:null}async remove(e){this.storage.delete(e);}async exists(e){return this.storage.has(e)}async list(e){let r=Array.from(this.storage.keys());return e?r.filter(o=>o.includes(e)):r}clear(){this.storage.clear();}},u=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let o=[this.primary,...this.fallbacks];for(let t of o)try{await t.save(e,r);return}catch(i){console.warn(`Failed to save with ${t.name}:`,i);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let o of r)try{let t=await o.load(e);if(t)return t}catch(t){console.warn(`Failed to load with ${o.name}:`,t);}return null}async remove(e){let r=[this.primary,...this.fallbacks],o=[];for(let t of r)try{await t.remove(e);}catch(i){o.push(i);}if(o.length===r.length)throw new Error(`All adapters failed to remove: ${o.map(t=>t.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let o of r)try{if(await o.exists(e))return !0}catch(t){console.warn(`Failed to check existence with ${o.name}:`,t);}return false}async list(e){try{return await this.primary.list?.(e)||[]}catch(r){console.warn("Failed to list with primary adapter:",r);for(let o of this.fallbacks)try{return await o.list?.(e)||[]}catch(t){console.warn(`Failed to list with fallback ${o.name}:`,t);}return []}}};var B={localStorage(n={}){return {adapter:new m,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...n}},sessionStorage(n={}){return {adapter:new y,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...n}},memory(n={}){return {adapter:new p,debounceMs:0,autoSave:true,saveOnStepChange:true,...n}},custom(n,e={}){return {adapter:n,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function E(n,e,r={}){let o=e||new p;return {adapter:{name:`resilient-${n.name}`,async save(i,a){try{await n.save(i,a);}catch(s){console.warn("Primary persistence failed, using fallback:",s),await o.save(i,a);}},async load(i){try{let a=await n.load(i);if(a)return a}catch(a){console.warn("Primary persistence load failed, trying fallback:",a);}return await o.load(i)},async remove(i){let a=[];try{await n.remove(i);}catch(s){a.push(s);}try{await o.remove(i);}catch(s){a.push(s);}if(a.length===2)throw new Error(`Both adapters failed: ${a.map(s=>s.message).join(", ")}`)},async exists(i){try{if(await n.exists(i))return !0}catch(a){console.warn("Primary persistence exists check failed:",a);}try{return await o.exists(i)}catch(a){return console.warn("Fallback persistence exists check failed:",a),false}},async list(i){try{return await n.list?.(i)||[]}catch(a){console.warn("Primary persistence list failed:",a);try{return await o.list?.(i)||[]}catch(s){return console.warn("Fallback persistence list failed:",s),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}exports.CompositeAdapter=u;exports.LocalStorageAdapter=m;exports.MemoryAdapter=p;exports.SessionStorageAdapter=y;exports.combineValidators=P;exports.commonValidators=v;exports.createConditionalValidator=x;exports.createCustomValidator=R;exports.createResilientPersistence=E;exports.createValidationError=S;exports.createValidationResult=b;exports.createZodValidator=f;exports.persistence=B;exports.resolveRendererChildren=w;exports.ril=g;
1
+ 'use strict';var zod=require('zod');function P(o,e){return typeof o=="function"?o(e):o}function b(o,e){return {...o,...e}}function h(o,e){let r=o.filter((n,t)=>o.indexOf(n)!==t);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function S(o,e,r){if(o.filter(t=>e.some(a=>!t[a])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var R=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();}},y=class{constructor(){this.errors=[];}add(e,r,n){return this.errors.push({code:e,message:r,path:n}),this}addIf(e,r,n,t){return e&&this.add(r,n,t),this}build(){return [...this.errors]}hasErrors(){return this.errors.length>0}clear(){return this.errors=[],this}},V={hasValue:o=>o!=null&&o!=="",isArray:o=>Array.isArray(o),arrayMinLength:(o,e)=>o.length>=e,arrayMaxLength:(o,e)=>o.length<=e};function F(o){return Array.isArray(o)?o:[o]}function C(o){if(o===null||typeof o!="object")return o;if(o instanceof Date)return new Date(o.getTime());if(Array.isArray(o))return o.map(r=>C(r));let e={};for(let r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=C(o[r]));return e}function g(o,e,r){let n={...o};for(let t in e)r&&!r.includes(t)||e[t]!==void 0&&(n[t]=e[t]);return n}var w=class o{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new o}addComponent(e,r){let n={id:e,type:e,...r};return this.components.set(e,n),this}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],n=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],t={},a={};for(let[i,s]of Object.entries(e))r.includes(i)?t[i]=s:n.includes(i)&&(a[i]=s);return this.formRenderConfig=g(this.formRenderConfig,t),this.workflowRenderConfig=g(this.workflowRenderConfig,a),this}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){return this.components.delete(e)}clear(){this.components.clear();}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=new y,r=Array.from(this.components.values()),n=r.map(a=>a.id);try{h(n,"component");}catch(a){e.add("DUPLICATE_IDS",a instanceof Error?a.message:String(a));}let t=r.filter(a=>!a.renderer);return e.addIf(t.length>0,"MISSING_RENDERER",`Components without renderer: ${t.map(a=>a.id).join(", ")}`),e.build().map(a=>a.message)}};var p=o=>async e=>{try{return await o.parseAsync(e),{isValid:!0,errors:[]}}catch(r){return r&&typeof r=="object"&&"errors"in r&&Array.isArray(r.errors)?{isValid:false,errors:r.errors.map(n=>({code:n.code,message:n.message,path:n.path?n.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},k=o=>async(e,r,n)=>{try{let t=await o(e,r);return t===!0?{isValid:!0,errors:[]}:t===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(t)}]}}catch(t){return {isValid:false,errors:[{code:"validation_error",message:t instanceof Error?t.message:"Validation error"}]}}},D=(o,e="all")=>async(r,n,t)=>{let a=await Promise.all(o.map(d=>d(r,n,t)));if(e==="all"){let d=a.flatMap(l=>l.errors);return {isValid:a.every(l=>l.isValid),errors:d}}return a.some(d=>d.isValid)?{isValid:true,errors:[]}:{isValid:false,errors:a.flatMap(d=>d.errors)}},N=(o,e)=>async(r,n,t)=>o(r,n)?e(r,n,t):{isValid:true,errors:[]},I={required:(o="This field is required")=>k(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>p(zod.z.string().email(o)),minLength:(o,e)=>p(zod.z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>p(zod.z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>p(zod.z.string().regex(o,e)),numberRange:(o,e,r)=>{let n=zod.z.number();return o!==void 0&&(n=n.min(o,r||`Value must be at least ${o}`)),e!==void 0&&(n=n.max(e,r||`Value must be at most ${e}`)),p(n)},url:(o="Invalid URL format")=>p(zod.z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>p(zod.z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (n,t,a)=>new Promise(i=>{let s=`${t.fieldId}-${JSON.stringify(n)}`;r.has(s)&&clearTimeout(r.get(s));let d=setTimeout(async()=>{try{let l=await o(n,t);i(l===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof l=="string"?l:"Async validation failed"}]});}catch(l){i({isValid:false,errors:[{code:"async_validation_error",message:l instanceof Error?l.message:"Async validation error"}]});}finally{r.delete(s);}},e);r.set(s,d);})}},A=(o,e=[])=>({isValid:o,errors:e}),$=(o,e,r)=>({code:o,message:e,path:r});var m=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(n){throw new Error(`Failed to save to localStorage: ${n}`)}}async load(e){try{let r=localStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from localStorage: ${r}`)}}async remove(e){try{localStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from localStorage: ${r}`)}}async exists(e){return localStorage.getItem(e)!==null}async list(e){let r=[];for(let n=0;n<localStorage.length;n++){let t=localStorage.key(n);t&&(!e||t.includes(e))&&r.push(t);}return r}},u=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(n){throw new Error(`Failed to save to sessionStorage: ${n}`)}}async load(e){try{let r=sessionStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from sessionStorage: ${r}`)}}async remove(e){try{sessionStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from sessionStorage: ${r}`)}}async exists(e){return sessionStorage.getItem(e)!==null}async list(e){let r=[];for(let n=0;n<sessionStorage.length;n++){let t=sessionStorage.key(n);t&&(!e||t.includes(e))&&r.push(t);}return r}},f=class{constructor(){this.name="memory";this.storage=new Map;}async save(e,r){this.storage.set(e,{...r});}async load(e){let r=this.storage.get(e);return r?{...r}:null}async remove(e){this.storage.delete(e);}async exists(e){return this.storage.has(e)}async list(e){let r=Array.from(this.storage.keys());return e?r.filter(n=>n.includes(e)):r}clear(){this.storage.clear();}},x=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let n=[this.primary,...this.fallbacks];for(let t of n)try{await t.save(e,r);return}catch(a){console.warn(`Failed to save with ${t.name}:`,a);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let n of r)try{let t=await n.load(e);if(t)return t}catch(t){console.warn(`Failed to load with ${n.name}:`,t);}return null}async remove(e){let r=[this.primary,...this.fallbacks],n=[];for(let t of r)try{await t.remove(e);}catch(a){n.push(a);}if(n.length===r.length)throw new Error(`All adapters failed to remove: ${n.map(t=>t.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let n of r)try{if(await n.exists(e))return !0}catch(t){console.warn(`Failed to check existence with ${n.name}:`,t);}return false}async list(e){try{return await this.primary.list?.(e)||[]}catch(r){console.warn("Failed to list with primary adapter:",r);for(let n of this.fallbacks)try{return await n.list?.(e)||[]}catch(t){console.warn(`Failed to list with fallback ${n.name}:`,t);}return []}}};var q={localStorage(o={}){return {adapter:new m,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},sessionStorage(o={}){return {adapter:new u,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},memory(o={}){return {adapter:new f,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function _(o,e,r={}){let n=e||new f;return {adapter:{name:`resilient-${o.name}`,async save(a,i){try{await o.save(a,i);}catch(s){console.warn("Primary persistence failed, using fallback:",s),await n.save(a,i);}},async load(a){try{let i=await o.load(a);if(i)return i}catch(i){console.warn("Primary persistence load failed, trying fallback:",i);}return await n.load(a)},async remove(a){let i=[];try{await o.remove(a);}catch(s){i.push(s);}try{await n.remove(a);}catch(s){i.push(s);}if(i.length===2)throw new Error(`Both adapters failed: ${i.map(s=>s.message).join(", ")}`)},async exists(a){try{if(await o.exists(a))return !0}catch(i){console.warn("Primary persistence exists check failed:",i);}try{return await n.exists(a)}catch(i){return console.warn("Fallback persistence exists check failed:",i),false}},async list(a){try{return await o.list?.(a)||[]}catch(i){console.warn("Primary persistence list failed:",i);try{return await n.list?.(a)||[]}catch(s){return console.warn("Fallback persistence list failed:",s),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}exports.CompositeAdapter=x;exports.IdGenerator=R;exports.LocalStorageAdapter=m;exports.MemoryAdapter=f;exports.SessionStorageAdapter=u;exports.ValidationErrorBuilder=y;exports.ValidationPatterns=V;exports.combineValidators=D;exports.commonValidators=I;exports.configureObject=g;exports.createConditionalValidator=N;exports.createCustomValidator=k;exports.createResilientPersistence=_;exports.createValidationError=$;exports.createValidationResult=A;exports.createZodValidator=p;exports.deepClone=C;exports.ensureUnique=h;exports.mergeInto=b;exports.normalizeToArray=F;exports.persistence=q;exports.resolveRendererChildren=P;exports.ril=w;exports.validateRequired=S;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import {z}from'zod';function w(n,e){return typeof n=="function"?n(e):n}var g=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let o={id:e,type:e,...r};return this.components.set(e,o),this}setRenderer(e,r){return e in this.formRenderConfig?this.formRenderConfig={...this.formRenderConfig,[e]:r}:e in this.workflowRenderConfig&&(this.workflowRenderConfig={...this.workflowRenderConfig,[e]:r}),this}setRenderers(e){let r={},o={};for(let[t,i]of Object.entries(e))["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"].includes(t)?r[t]=i:o[t]=i;return this.formRenderConfig={...this.formRenderConfig,...r},this.workflowRenderConfig={...this.workflowRenderConfig,...o},this}setRowRenderer(e){return this.formRenderConfig={...this.formRenderConfig,rowRenderer:e},this}setBodyRenderer(e){return this.formRenderConfig={...this.formRenderConfig,bodyRenderer:e},this}setSubmitButtonRenderer(e){return this.formRenderConfig={...this.formRenderConfig,submitButtonRenderer:e},this}setFieldRenderer(e){return this.formRenderConfig={...this.formRenderConfig,fieldRenderer:e},this}setFormRenderConfig(e){return this.formRenderConfig=e,this}getFormRenderConfig(){return {...this.formRenderConfig}}setStepperRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,stepperRenderer:e},this}setWorkflowNextButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,nextButtonRenderer:e},this}setWorkflowPreviousButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,previousButtonRenderer:e},this}setWorkflowSkipButtonRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,skipButtonRenderer:e},this}setWorkflowRenderConfig(e){return this.workflowRenderConfig=e,this}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){return this.components.delete(e)}clear(){this.components.clear();}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,o)=>(r[o.type]=(r[o.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()),o=r.map(a=>a.id),t=o.filter((a,s)=>o.indexOf(a)!==s);t.length>0&&e.push(`Duplicate component IDs found: ${t.join(", ")}`);let i=r.filter(a=>!a.renderer);return i.length>0&&e.push(`Components without renderer: ${i.map(a=>a.id).join(", ")}`),e}};var f=n=>async e=>{try{return await n.parseAsync(e),{isValid:!0,errors:[]}}catch(r){return r&&typeof r=="object"&&"errors"in r&&Array.isArray(r.errors)?{isValid:false,errors:r.errors.map(o=>({code:o.code,message:o.message,path:o.path?o.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},R=n=>async(e,r,o)=>{try{let t=await n(e,r);return t===!0?{isValid:!0,errors:[]}:t===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(t)}]}}catch(t){return {isValid:false,errors:[{code:"validation_error",message:t instanceof Error?t.message:"Validation error"}]}}},P=(n,e="all")=>async(r,o,t)=>{let i=await Promise.all(n.map(d=>d(r,o,t)));if(e==="all"){let d=i.flatMap(l=>l.errors);return {isValid:i.every(l=>l.isValid),errors:d}}return i.some(d=>d.isValid)?{isValid:true,errors:[]}:{isValid:false,errors:i.flatMap(d=>d.errors)}},x=(n,e)=>async(r,o,t)=>n(r,o)?e(r,o,t):{isValid:true,errors:[]},v={required:(n="This field is required")=>R(e=>e==null||e===""?n:!0),email:(n="Invalid email format")=>f(z.string().email(n)),minLength:(n,e)=>f(z.string().min(n,e||`Minimum ${n} characters required`)),maxLength:(n,e)=>f(z.string().max(n,e||`Maximum ${n} characters allowed`)),pattern:(n,e="Invalid format")=>f(z.string().regex(n,e)),numberRange:(n,e,r)=>{let o=z.number();return n!==void 0&&(o=o.min(n,r||`Value must be at least ${n}`)),e!==void 0&&(o=o.max(e,r||`Value must be at most ${e}`)),f(o)},url:(n="Invalid URL format")=>f(z.string().url(n)),phoneNumber:(n="Invalid phone number format")=>f(z.string().regex(/^\+?[\d\s\-\(\)]+$/,n)),asyncValidation:(n,e=300)=>{let r=new Map;return (o,t,i)=>new Promise(a=>{let s=`${t.fieldId}-${JSON.stringify(o)}`;r.has(s)&&clearTimeout(r.get(s));let d=setTimeout(async()=>{try{let l=await n(o,t);a(l===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof l=="string"?l:"Async validation failed"}]});}catch(l){a({isValid:false,errors:[{code:"async_validation_error",message:l instanceof Error?l.message:"Async validation error"}]});}finally{r.delete(s);}},e);r.set(s,d);})}},b=(n,e=[])=>({isValid:n,errors:e}),S=(n,e,r)=>({code:n,message:e,path:r});var m=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(o){throw new Error(`Failed to save to localStorage: ${o}`)}}async load(e){try{let r=localStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from localStorage: ${r}`)}}async remove(e){try{localStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from localStorage: ${r}`)}}async exists(e){return localStorage.getItem(e)!==null}async list(e){let r=[];for(let o=0;o<localStorage.length;o++){let t=localStorage.key(o);t&&(!e||t.includes(e))&&r.push(t);}return r}},y=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(o){throw new Error(`Failed to save to sessionStorage: ${o}`)}}async load(e){try{let r=sessionStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from sessionStorage: ${r}`)}}async remove(e){try{sessionStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from sessionStorage: ${r}`)}}async exists(e){return sessionStorage.getItem(e)!==null}async list(e){let r=[];for(let o=0;o<sessionStorage.length;o++){let t=sessionStorage.key(o);t&&(!e||t.includes(e))&&r.push(t);}return r}},p=class{constructor(){this.name="memory";this.storage=new Map;}async save(e,r){this.storage.set(e,{...r});}async load(e){let r=this.storage.get(e);return r?{...r}:null}async remove(e){this.storage.delete(e);}async exists(e){return this.storage.has(e)}async list(e){let r=Array.from(this.storage.keys());return e?r.filter(o=>o.includes(e)):r}clear(){this.storage.clear();}},u=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let o=[this.primary,...this.fallbacks];for(let t of o)try{await t.save(e,r);return}catch(i){console.warn(`Failed to save with ${t.name}:`,i);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let o of r)try{let t=await o.load(e);if(t)return t}catch(t){console.warn(`Failed to load with ${o.name}:`,t);}return null}async remove(e){let r=[this.primary,...this.fallbacks],o=[];for(let t of r)try{await t.remove(e);}catch(i){o.push(i);}if(o.length===r.length)throw new Error(`All adapters failed to remove: ${o.map(t=>t.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let o of r)try{if(await o.exists(e))return !0}catch(t){console.warn(`Failed to check existence with ${o.name}:`,t);}return false}async list(e){try{return await this.primary.list?.(e)||[]}catch(r){console.warn("Failed to list with primary adapter:",r);for(let o of this.fallbacks)try{return await o.list?.(e)||[]}catch(t){console.warn(`Failed to list with fallback ${o.name}:`,t);}return []}}};var B={localStorage(n={}){return {adapter:new m,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...n}},sessionStorage(n={}){return {adapter:new y,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...n}},memory(n={}){return {adapter:new p,debounceMs:0,autoSave:true,saveOnStepChange:true,...n}},custom(n,e={}){return {adapter:n,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function E(n,e,r={}){let o=e||new p;return {adapter:{name:`resilient-${n.name}`,async save(i,a){try{await n.save(i,a);}catch(s){console.warn("Primary persistence failed, using fallback:",s),await o.save(i,a);}},async load(i){try{let a=await n.load(i);if(a)return a}catch(a){console.warn("Primary persistence load failed, trying fallback:",a);}return await o.load(i)},async remove(i){let a=[];try{await n.remove(i);}catch(s){a.push(s);}try{await o.remove(i);}catch(s){a.push(s);}if(a.length===2)throw new Error(`Both adapters failed: ${a.map(s=>s.message).join(", ")}`)},async exists(i){try{if(await n.exists(i))return !0}catch(a){console.warn("Primary persistence exists check failed:",a);}try{return await o.exists(i)}catch(a){return console.warn("Fallback persistence exists check failed:",a),false}},async list(i){try{return await n.list?.(i)||[]}catch(a){console.warn("Primary persistence list failed:",a);try{return await o.list?.(i)||[]}catch(s){return console.warn("Fallback persistence list failed:",s),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}export{u as CompositeAdapter,m as LocalStorageAdapter,p as MemoryAdapter,y as SessionStorageAdapter,P as combineValidators,v as commonValidators,x as createConditionalValidator,R as createCustomValidator,E as createResilientPersistence,S as createValidationError,b as createValidationResult,f as createZodValidator,B as persistence,w as resolveRendererChildren,g as ril};
1
+ import {z}from'zod';function P(o,e){return typeof o=="function"?o(e):o}function b(o,e){return {...o,...e}}function h(o,e){let r=o.filter((n,t)=>o.indexOf(n)!==t);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function S(o,e,r){if(o.filter(t=>e.some(a=>!t[a])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var R=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();}},y=class{constructor(){this.errors=[];}add(e,r,n){return this.errors.push({code:e,message:r,path:n}),this}addIf(e,r,n,t){return e&&this.add(r,n,t),this}build(){return [...this.errors]}hasErrors(){return this.errors.length>0}clear(){return this.errors=[],this}},V={hasValue:o=>o!=null&&o!=="",isArray:o=>Array.isArray(o),arrayMinLength:(o,e)=>o.length>=e,arrayMaxLength:(o,e)=>o.length<=e};function F(o){return Array.isArray(o)?o:[o]}function C(o){if(o===null||typeof o!="object")return o;if(o instanceof Date)return new Date(o.getTime());if(Array.isArray(o))return o.map(r=>C(r));let e={};for(let r in o)Object.prototype.hasOwnProperty.call(o,r)&&(e[r]=C(o[r]));return e}function g(o,e,r){let n={...o};for(let t in e)r&&!r.includes(t)||e[t]!==void 0&&(n[t]=e[t]);return n}var w=class o{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new o}addComponent(e,r){let n={id:e,type:e,...r};return this.components.set(e,n),this}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],n=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],t={},a={};for(let[i,s]of Object.entries(e))r.includes(i)?t[i]=s:n.includes(i)&&(a[i]=s);return this.formRenderConfig=g(this.formRenderConfig,t),this.workflowRenderConfig=g(this.workflowRenderConfig,a),this}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){return this.components.delete(e)}clear(){this.components.clear();}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=new y,r=Array.from(this.components.values()),n=r.map(a=>a.id);try{h(n,"component");}catch(a){e.add("DUPLICATE_IDS",a instanceof Error?a.message:String(a));}let t=r.filter(a=>!a.renderer);return e.addIf(t.length>0,"MISSING_RENDERER",`Components without renderer: ${t.map(a=>a.id).join(", ")}`),e.build().map(a=>a.message)}};var p=o=>async e=>{try{return await o.parseAsync(e),{isValid:!0,errors:[]}}catch(r){return r&&typeof r=="object"&&"errors"in r&&Array.isArray(r.errors)?{isValid:false,errors:r.errors.map(n=>({code:n.code,message:n.message,path:n.path?n.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},k=o=>async(e,r,n)=>{try{let t=await o(e,r);return t===!0?{isValid:!0,errors:[]}:t===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(t)}]}}catch(t){return {isValid:false,errors:[{code:"validation_error",message:t instanceof Error?t.message:"Validation error"}]}}},D=(o,e="all")=>async(r,n,t)=>{let a=await Promise.all(o.map(d=>d(r,n,t)));if(e==="all"){let d=a.flatMap(l=>l.errors);return {isValid:a.every(l=>l.isValid),errors:d}}return a.some(d=>d.isValid)?{isValid:true,errors:[]}:{isValid:false,errors:a.flatMap(d=>d.errors)}},N=(o,e)=>async(r,n,t)=>o(r,n)?e(r,n,t):{isValid:true,errors:[]},I={required:(o="This field is required")=>k(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>p(z.string().email(o)),minLength:(o,e)=>p(z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>p(z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>p(z.string().regex(o,e)),numberRange:(o,e,r)=>{let n=z.number();return o!==void 0&&(n=n.min(o,r||`Value must be at least ${o}`)),e!==void 0&&(n=n.max(e,r||`Value must be at most ${e}`)),p(n)},url:(o="Invalid URL format")=>p(z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>p(z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (n,t,a)=>new Promise(i=>{let s=`${t.fieldId}-${JSON.stringify(n)}`;r.has(s)&&clearTimeout(r.get(s));let d=setTimeout(async()=>{try{let l=await o(n,t);i(l===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof l=="string"?l:"Async validation failed"}]});}catch(l){i({isValid:false,errors:[{code:"async_validation_error",message:l instanceof Error?l.message:"Async validation error"}]});}finally{r.delete(s);}},e);r.set(s,d);})}},A=(o,e=[])=>({isValid:o,errors:e}),$=(o,e,r)=>({code:o,message:e,path:r});var m=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(n){throw new Error(`Failed to save to localStorage: ${n}`)}}async load(e){try{let r=localStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from localStorage: ${r}`)}}async remove(e){try{localStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from localStorage: ${r}`)}}async exists(e){return localStorage.getItem(e)!==null}async list(e){let r=[];for(let n=0;n<localStorage.length;n++){let t=localStorage.key(n);t&&(!e||t.includes(e))&&r.push(t);}return r}},u=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(n){throw new Error(`Failed to save to sessionStorage: ${n}`)}}async load(e){try{let r=sessionStorage.getItem(e);return r?JSON.parse(r):null}catch(r){throw new Error(`Failed to load from sessionStorage: ${r}`)}}async remove(e){try{sessionStorage.removeItem(e);}catch(r){throw new Error(`Failed to remove from sessionStorage: ${r}`)}}async exists(e){return sessionStorage.getItem(e)!==null}async list(e){let r=[];for(let n=0;n<sessionStorage.length;n++){let t=sessionStorage.key(n);t&&(!e||t.includes(e))&&r.push(t);}return r}},f=class{constructor(){this.name="memory";this.storage=new Map;}async save(e,r){this.storage.set(e,{...r});}async load(e){let r=this.storage.get(e);return r?{...r}:null}async remove(e){this.storage.delete(e);}async exists(e){return this.storage.has(e)}async list(e){let r=Array.from(this.storage.keys());return e?r.filter(n=>n.includes(e)):r}clear(){this.storage.clear();}},x=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let n=[this.primary,...this.fallbacks];for(let t of n)try{await t.save(e,r);return}catch(a){console.warn(`Failed to save with ${t.name}:`,a);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let n of r)try{let t=await n.load(e);if(t)return t}catch(t){console.warn(`Failed to load with ${n.name}:`,t);}return null}async remove(e){let r=[this.primary,...this.fallbacks],n=[];for(let t of r)try{await t.remove(e);}catch(a){n.push(a);}if(n.length===r.length)throw new Error(`All adapters failed to remove: ${n.map(t=>t.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let n of r)try{if(await n.exists(e))return !0}catch(t){console.warn(`Failed to check existence with ${n.name}:`,t);}return false}async list(e){try{return await this.primary.list?.(e)||[]}catch(r){console.warn("Failed to list with primary adapter:",r);for(let n of this.fallbacks)try{return await n.list?.(e)||[]}catch(t){console.warn(`Failed to list with fallback ${n.name}:`,t);}return []}}};var q={localStorage(o={}){return {adapter:new m,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},sessionStorage(o={}){return {adapter:new u,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},memory(o={}){return {adapter:new f,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function _(o,e,r={}){let n=e||new f;return {adapter:{name:`resilient-${o.name}`,async save(a,i){try{await o.save(a,i);}catch(s){console.warn("Primary persistence failed, using fallback:",s),await n.save(a,i);}},async load(a){try{let i=await o.load(a);if(i)return i}catch(i){console.warn("Primary persistence load failed, trying fallback:",i);}return await n.load(a)},async remove(a){let i=[];try{await o.remove(a);}catch(s){i.push(s);}try{await n.remove(a);}catch(s){i.push(s);}if(i.length===2)throw new Error(`Both adapters failed: ${i.map(s=>s.message).join(", ")}`)},async exists(a){try{if(await o.exists(a))return !0}catch(i){console.warn("Primary persistence exists check failed:",i);}try{return await n.exists(a)}catch(i){return console.warn("Fallback persistence exists check failed:",i),false}},async list(a){try{return await o.list?.(a)||[]}catch(i){console.warn("Primary persistence list failed:",i);try{return await n.list?.(a)||[]}catch(s){return console.warn("Fallback persistence list failed:",s),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}export{x as CompositeAdapter,R as IdGenerator,m as LocalStorageAdapter,f as MemoryAdapter,u as SessionStorageAdapter,y as ValidationErrorBuilder,V as ValidationPatterns,D as combineValidators,I as commonValidators,g as configureObject,N as createConditionalValidator,k as createCustomValidator,_ as createResilientPersistence,$ as createValidationError,A as createValidationResult,p as createZodValidator,C as deepClone,h as ensureUnique,b as mergeInto,F as normalizeToArray,q as persistence,P as resolveRendererChildren,w as ril,S as validateRequired};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/core",
3
- "version": "3.0.0",
3
+ "version": "4.0.0",
4
4
  "description": "Core types, configurations, and utilities for the RilayKit form library",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",