@rilaykit/core 1.2.0 → 2.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 +29 -85
- package/dist/index.d.ts +29 -85
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +1 -1
package/dist/index.d.mts
CHANGED
|
@@ -17,6 +17,19 @@ declare class ril {
|
|
|
17
17
|
* @returns The ril instance for chaining
|
|
18
18
|
*/
|
|
19
19
|
addComponent<TProps = any>(type: string, config: Omit<ComponentConfig<TProps>, 'id' | 'type'>): this;
|
|
20
|
+
/**
|
|
21
|
+
* Generic method to set any renderer type easily
|
|
22
|
+
* @param rendererType - The type of renderer to set
|
|
23
|
+
* @param renderer - The renderer function
|
|
24
|
+
* @returns The ril instance for chaining
|
|
25
|
+
*/
|
|
26
|
+
setRenderer<T extends keyof (FormRenderConfig & WorkflowRenderConfig)>(rendererType: T, renderer: (FormRenderConfig & WorkflowRenderConfig)[T]): this;
|
|
27
|
+
/**
|
|
28
|
+
* Set multiple renderers at once
|
|
29
|
+
* @param renderers - Object with renderer configurations
|
|
30
|
+
* @returns The ril instance for chaining
|
|
31
|
+
*/
|
|
32
|
+
setRenderers(renderers: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
|
|
20
33
|
/**
|
|
21
34
|
* Set custom row renderer
|
|
22
35
|
* @param renderer - Custom row renderer function
|
|
@@ -58,12 +71,6 @@ declare class ril {
|
|
|
58
71
|
* @returns The ril instance for chaining
|
|
59
72
|
*/
|
|
60
73
|
setStepperRenderer(renderer: WorkflowStepperRenderer): this;
|
|
61
|
-
/**
|
|
62
|
-
* Set custom workflow navigation renderer
|
|
63
|
-
* @param renderer - Custom workflow navigation renderer function
|
|
64
|
-
* @returns The ril instance for chaining
|
|
65
|
-
*/
|
|
66
|
-
setWorkflowNavigationRenderer(renderer: WorkflowNavigationRenderer): this;
|
|
67
74
|
/**
|
|
68
75
|
* Set custom workflow next button renderer
|
|
69
76
|
* @param renderer - Custom workflow next button renderer function
|
|
@@ -103,12 +110,6 @@ declare class ril {
|
|
|
103
110
|
* @returns Component configuration or undefined
|
|
104
111
|
*/
|
|
105
112
|
getComponent(id: string): ComponentConfig | undefined;
|
|
106
|
-
/**
|
|
107
|
-
* Get components by category
|
|
108
|
-
* @param category - Component category
|
|
109
|
-
* @returns Array of matching components
|
|
110
|
-
*/
|
|
111
|
-
getComponentsByCategory(category: string): ComponentConfig[];
|
|
112
113
|
/**
|
|
113
114
|
* List all registered components
|
|
114
115
|
* @returns Array of all components
|
|
@@ -130,17 +131,6 @@ declare class ril {
|
|
|
130
131
|
* Clear all components
|
|
131
132
|
*/
|
|
132
133
|
clear(): void;
|
|
133
|
-
/**
|
|
134
|
-
* Export configuration as a plain object
|
|
135
|
-
* @returns Object with component configurations
|
|
136
|
-
*/
|
|
137
|
-
export(): Record<string, ComponentConfig>;
|
|
138
|
-
/**
|
|
139
|
-
* Import configuration from a plain object
|
|
140
|
-
* @param config - Object with component configurations
|
|
141
|
-
* @returns The ril instance for chaining
|
|
142
|
-
*/
|
|
143
|
-
import(config: Record<string, ComponentConfig>): this;
|
|
144
134
|
/**
|
|
145
135
|
* Get statistics about registered components and renderers
|
|
146
136
|
* @returns Object with comprehensive statistics
|
|
@@ -148,14 +138,12 @@ declare class ril {
|
|
|
148
138
|
getStats(): {
|
|
149
139
|
total: number;
|
|
150
140
|
byType: Record<string, number>;
|
|
151
|
-
byCategory: Record<string, number>;
|
|
152
141
|
hasCustomRenderers: {
|
|
153
142
|
row: boolean;
|
|
154
143
|
body: boolean;
|
|
155
144
|
submitButton: boolean;
|
|
156
145
|
field: boolean;
|
|
157
146
|
stepper: boolean;
|
|
158
|
-
workflowNavigation: boolean;
|
|
159
147
|
workflowNextButton: boolean;
|
|
160
148
|
workflowPreviousButton: boolean;
|
|
161
149
|
workflowSkipButton: boolean;
|
|
@@ -176,18 +164,12 @@ interface RilayLicenseConfig {
|
|
|
176
164
|
interface ValidationResult {
|
|
177
165
|
readonly isValid: boolean;
|
|
178
166
|
readonly errors: ValidationError[];
|
|
179
|
-
readonly warnings?: ValidationWarning[];
|
|
180
167
|
}
|
|
181
168
|
interface ValidationError {
|
|
182
169
|
readonly code: string;
|
|
183
170
|
readonly message: string;
|
|
184
171
|
readonly path?: string[];
|
|
185
172
|
}
|
|
186
|
-
interface ValidationWarning {
|
|
187
|
-
readonly code: string;
|
|
188
|
-
readonly message: string;
|
|
189
|
-
readonly path?: string[];
|
|
190
|
-
}
|
|
191
173
|
interface ValidationContext {
|
|
192
174
|
readonly fieldId: string;
|
|
193
175
|
readonly formData: Record<string, any>;
|
|
@@ -212,32 +194,19 @@ interface ComponentRenderProps<TProps = any> {
|
|
|
212
194
|
onChange?: (value: any) => void;
|
|
213
195
|
onBlur?: () => void;
|
|
214
196
|
error?: ValidationError[];
|
|
215
|
-
warnings?: ValidationWarning[];
|
|
216
197
|
touched?: boolean;
|
|
217
198
|
disabled?: boolean;
|
|
218
199
|
isValidating?: boolean;
|
|
219
200
|
[key: string]: any;
|
|
220
201
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
key: keyof TProps;
|
|
224
|
-
type: 'string' | 'number' | 'boolean' | 'select' | 'array';
|
|
225
|
-
label: string;
|
|
226
|
-
options?: any[];
|
|
227
|
-
default?: any;
|
|
228
|
-
}>;
|
|
229
|
-
readonly previewProps?: Partial<TProps>;
|
|
230
|
-
readonly icon?: string;
|
|
231
|
-
readonly tags?: string[];
|
|
232
|
-
}
|
|
202
|
+
type RendererChildrenFunction<TProps = any> = (props: TProps) => React.ReactNode;
|
|
203
|
+
declare function resolveRendererChildren<TProps>(children: React.ReactNode | RendererChildrenFunction<TProps> | undefined, props: TProps): React.ReactNode;
|
|
233
204
|
interface ComponentConfig<TProps = any> {
|
|
234
205
|
readonly id: string;
|
|
235
206
|
readonly type: string;
|
|
236
207
|
readonly name: string;
|
|
237
208
|
readonly description?: string;
|
|
238
|
-
readonly category?: string;
|
|
239
209
|
readonly renderer: ComponentRenderer<TProps>;
|
|
240
|
-
readonly options?: ComponentOptions<TProps>;
|
|
241
210
|
readonly validation?: ValidationConfig<TProps>;
|
|
242
211
|
readonly defaultProps?: Partial<TProps>;
|
|
243
212
|
readonly useFieldRenderer?: boolean;
|
|
@@ -293,11 +262,6 @@ interface RetryPolicy {
|
|
|
293
262
|
readonly delayMs: number;
|
|
294
263
|
readonly backoffMultiplier?: number;
|
|
295
264
|
}
|
|
296
|
-
interface ConditionalBranch {
|
|
297
|
-
readonly condition: (data: any, context: WorkflowContext) => boolean | Promise<boolean>;
|
|
298
|
-
readonly steps: StepConfig[];
|
|
299
|
-
readonly fallback?: StepConfig[];
|
|
300
|
-
}
|
|
301
265
|
interface StepConfig {
|
|
302
266
|
readonly id: string;
|
|
303
267
|
readonly title: string;
|
|
@@ -366,18 +330,6 @@ interface WorkflowAnalytics {
|
|
|
366
330
|
readonly onValidationError?: (stepId: string, errors: ValidationError[], context: WorkflowContext) => void;
|
|
367
331
|
readonly onError?: (error: Error, context: WorkflowContext) => void;
|
|
368
332
|
}
|
|
369
|
-
interface WorkflowOptimizations {
|
|
370
|
-
readonly preloadNextStep?: boolean;
|
|
371
|
-
readonly cacheValidation?: boolean;
|
|
372
|
-
readonly virtualizeSteps?: boolean;
|
|
373
|
-
readonly lazyLoadComponents?: boolean;
|
|
374
|
-
readonly maxConcurrentRequests?: number;
|
|
375
|
-
}
|
|
376
|
-
interface WorkflowVersion {
|
|
377
|
-
readonly version: string;
|
|
378
|
-
readonly migrationStrategy?: (oldData: any, newConfig: any) => any;
|
|
379
|
-
readonly compatibilityMode?: boolean;
|
|
380
|
-
}
|
|
381
333
|
interface WorkflowHooks {
|
|
382
334
|
readonly onStepChange?: (from: string, to: string, context: WorkflowContext) => void;
|
|
383
335
|
readonly onDataChange?: (data: any, context: WorkflowContext) => void;
|
|
@@ -395,13 +347,10 @@ interface WorkflowConfig {
|
|
|
395
347
|
readonly name: string;
|
|
396
348
|
readonly description?: string;
|
|
397
349
|
readonly steps: StepConfig[];
|
|
398
|
-
readonly branches?: ConditionalBranch[];
|
|
399
350
|
readonly navigation?: NavigationConfig;
|
|
400
351
|
readonly persistence?: PersistenceConfig;
|
|
401
352
|
readonly completion?: CompletionConfig;
|
|
402
353
|
readonly analytics?: WorkflowAnalytics;
|
|
403
|
-
readonly optimizations?: WorkflowOptimizations;
|
|
404
|
-
readonly version?: WorkflowVersion;
|
|
405
354
|
readonly plugins?: WorkflowPlugin[];
|
|
406
355
|
readonly renderConfig?: WorkflowRenderConfig;
|
|
407
356
|
}
|
|
@@ -423,24 +372,9 @@ interface WorkflowStepperRendererProps {
|
|
|
423
372
|
readonly onStepClick?: (stepIndex: number) => void;
|
|
424
373
|
readonly className?: string;
|
|
425
374
|
}
|
|
426
|
-
interface WorkflowNavigationRendererProps {
|
|
427
|
-
readonly currentStep: StepConfig;
|
|
428
|
-
readonly context: WorkflowContext;
|
|
429
|
-
readonly canGoNext: boolean;
|
|
430
|
-
readonly canGoPrevious: boolean;
|
|
431
|
-
readonly canSkip: boolean;
|
|
432
|
-
readonly isSubmitting: boolean;
|
|
433
|
-
readonly onNext: (event?: React.FormEvent) => void;
|
|
434
|
-
readonly onPrevious: (event?: React.FormEvent) => void;
|
|
435
|
-
readonly onSkip: (event?: React.FormEvent) => void;
|
|
436
|
-
readonly onSubmit: (event?: React.FormEvent) => void;
|
|
437
|
-
readonly className?: string;
|
|
438
|
-
}
|
|
439
375
|
type WorkflowStepperRenderer = (props: WorkflowStepperRendererProps) => React.ReactElement;
|
|
440
|
-
type WorkflowNavigationRenderer = (props: WorkflowNavigationRendererProps) => React.ReactElement;
|
|
441
376
|
interface WorkflowRenderConfig {
|
|
442
377
|
readonly stepperRenderer?: WorkflowStepperRenderer;
|
|
443
|
-
readonly navigationRenderer?: WorkflowNavigationRenderer;
|
|
444
378
|
readonly nextButtonRenderer?: WorkflowNextButtonRenderer;
|
|
445
379
|
readonly previousButtonRenderer?: WorkflowPreviousButtonRenderer;
|
|
446
380
|
readonly skipButtonRenderer?: WorkflowSkipButtonRenderer;
|
|
@@ -472,7 +406,6 @@ interface FieldRendererProps {
|
|
|
472
406
|
children: React.ReactNode;
|
|
473
407
|
id: string;
|
|
474
408
|
error?: ValidationError[];
|
|
475
|
-
warnings?: ValidationWarning[];
|
|
476
409
|
touched?: boolean;
|
|
477
410
|
disabled?: boolean;
|
|
478
411
|
isValidating?: boolean;
|
|
@@ -501,18 +434,30 @@ interface WorkflowNextButtonRendererProps {
|
|
|
501
434
|
onSubmit: (event?: React.FormEvent) => void;
|
|
502
435
|
className?: string;
|
|
503
436
|
children?: React.ReactNode;
|
|
437
|
+
currentStep: StepConfig;
|
|
438
|
+
stepData: Record<string, any>;
|
|
439
|
+
allData: Record<string, any>;
|
|
440
|
+
context: WorkflowContext;
|
|
504
441
|
}
|
|
505
442
|
interface WorkflowPreviousButtonRendererProps {
|
|
506
443
|
canGoPrevious: boolean;
|
|
507
444
|
onPrevious: (event?: React.FormEvent) => void;
|
|
508
445
|
className?: string;
|
|
509
446
|
children?: React.ReactNode;
|
|
447
|
+
currentStep: StepConfig;
|
|
448
|
+
stepData: Record<string, any>;
|
|
449
|
+
allData: Record<string, any>;
|
|
450
|
+
context: WorkflowContext;
|
|
510
451
|
}
|
|
511
452
|
interface WorkflowSkipButtonRendererProps {
|
|
512
453
|
canSkip: boolean;
|
|
513
454
|
onSkip: (event?: React.FormEvent) => void;
|
|
514
455
|
className?: string;
|
|
515
456
|
children?: React.ReactNode;
|
|
457
|
+
currentStep: StepConfig;
|
|
458
|
+
stepData: Record<string, any>;
|
|
459
|
+
allData: Record<string, any>;
|
|
460
|
+
context: WorkflowContext;
|
|
516
461
|
}
|
|
517
462
|
type WorkflowNextButtonRenderer = (props: WorkflowNextButtonRendererProps) => React.ReactElement;
|
|
518
463
|
type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProps) => React.ReactElement;
|
|
@@ -589,10 +534,9 @@ declare const commonValidators: {
|
|
|
589
534
|
* Utility to create validation result
|
|
590
535
|
* @param isValid - Whether validation passed
|
|
591
536
|
* @param errors - Array of errors (optional)
|
|
592
|
-
* @param warnings - Array of warnings (optional)
|
|
593
537
|
* @returns ValidationResult object
|
|
594
538
|
*/
|
|
595
|
-
declare const createValidationResult: (isValid: boolean, errors?: ValidationError[]
|
|
539
|
+
declare const createValidationResult: (isValid: boolean, errors?: ValidationError[]) => ValidationResult;
|
|
596
540
|
/**
|
|
597
541
|
* Utility to create validation error
|
|
598
542
|
* @param code - Error code
|
|
@@ -682,4 +626,4 @@ declare const persistence: {
|
|
|
682
626
|
*/
|
|
683
627
|
declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
|
|
684
628
|
|
|
685
|
-
export { type CompletionConfig, type ComponentConfig, type
|
|
629
|
+
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 };
|
package/dist/index.d.ts
CHANGED
|
@@ -17,6 +17,19 @@ declare class ril {
|
|
|
17
17
|
* @returns The ril instance for chaining
|
|
18
18
|
*/
|
|
19
19
|
addComponent<TProps = any>(type: string, config: Omit<ComponentConfig<TProps>, 'id' | 'type'>): this;
|
|
20
|
+
/**
|
|
21
|
+
* Generic method to set any renderer type easily
|
|
22
|
+
* @param rendererType - The type of renderer to set
|
|
23
|
+
* @param renderer - The renderer function
|
|
24
|
+
* @returns The ril instance for chaining
|
|
25
|
+
*/
|
|
26
|
+
setRenderer<T extends keyof (FormRenderConfig & WorkflowRenderConfig)>(rendererType: T, renderer: (FormRenderConfig & WorkflowRenderConfig)[T]): this;
|
|
27
|
+
/**
|
|
28
|
+
* Set multiple renderers at once
|
|
29
|
+
* @param renderers - Object with renderer configurations
|
|
30
|
+
* @returns The ril instance for chaining
|
|
31
|
+
*/
|
|
32
|
+
setRenderers(renderers: Partial<FormRenderConfig & WorkflowRenderConfig>): this;
|
|
20
33
|
/**
|
|
21
34
|
* Set custom row renderer
|
|
22
35
|
* @param renderer - Custom row renderer function
|
|
@@ -58,12 +71,6 @@ declare class ril {
|
|
|
58
71
|
* @returns The ril instance for chaining
|
|
59
72
|
*/
|
|
60
73
|
setStepperRenderer(renderer: WorkflowStepperRenderer): this;
|
|
61
|
-
/**
|
|
62
|
-
* Set custom workflow navigation renderer
|
|
63
|
-
* @param renderer - Custom workflow navigation renderer function
|
|
64
|
-
* @returns The ril instance for chaining
|
|
65
|
-
*/
|
|
66
|
-
setWorkflowNavigationRenderer(renderer: WorkflowNavigationRenderer): this;
|
|
67
74
|
/**
|
|
68
75
|
* Set custom workflow next button renderer
|
|
69
76
|
* @param renderer - Custom workflow next button renderer function
|
|
@@ -103,12 +110,6 @@ declare class ril {
|
|
|
103
110
|
* @returns Component configuration or undefined
|
|
104
111
|
*/
|
|
105
112
|
getComponent(id: string): ComponentConfig | undefined;
|
|
106
|
-
/**
|
|
107
|
-
* Get components by category
|
|
108
|
-
* @param category - Component category
|
|
109
|
-
* @returns Array of matching components
|
|
110
|
-
*/
|
|
111
|
-
getComponentsByCategory(category: string): ComponentConfig[];
|
|
112
113
|
/**
|
|
113
114
|
* List all registered components
|
|
114
115
|
* @returns Array of all components
|
|
@@ -130,17 +131,6 @@ declare class ril {
|
|
|
130
131
|
* Clear all components
|
|
131
132
|
*/
|
|
132
133
|
clear(): void;
|
|
133
|
-
/**
|
|
134
|
-
* Export configuration as a plain object
|
|
135
|
-
* @returns Object with component configurations
|
|
136
|
-
*/
|
|
137
|
-
export(): Record<string, ComponentConfig>;
|
|
138
|
-
/**
|
|
139
|
-
* Import configuration from a plain object
|
|
140
|
-
* @param config - Object with component configurations
|
|
141
|
-
* @returns The ril instance for chaining
|
|
142
|
-
*/
|
|
143
|
-
import(config: Record<string, ComponentConfig>): this;
|
|
144
134
|
/**
|
|
145
135
|
* Get statistics about registered components and renderers
|
|
146
136
|
* @returns Object with comprehensive statistics
|
|
@@ -148,14 +138,12 @@ declare class ril {
|
|
|
148
138
|
getStats(): {
|
|
149
139
|
total: number;
|
|
150
140
|
byType: Record<string, number>;
|
|
151
|
-
byCategory: Record<string, number>;
|
|
152
141
|
hasCustomRenderers: {
|
|
153
142
|
row: boolean;
|
|
154
143
|
body: boolean;
|
|
155
144
|
submitButton: boolean;
|
|
156
145
|
field: boolean;
|
|
157
146
|
stepper: boolean;
|
|
158
|
-
workflowNavigation: boolean;
|
|
159
147
|
workflowNextButton: boolean;
|
|
160
148
|
workflowPreviousButton: boolean;
|
|
161
149
|
workflowSkipButton: boolean;
|
|
@@ -176,18 +164,12 @@ interface RilayLicenseConfig {
|
|
|
176
164
|
interface ValidationResult {
|
|
177
165
|
readonly isValid: boolean;
|
|
178
166
|
readonly errors: ValidationError[];
|
|
179
|
-
readonly warnings?: ValidationWarning[];
|
|
180
167
|
}
|
|
181
168
|
interface ValidationError {
|
|
182
169
|
readonly code: string;
|
|
183
170
|
readonly message: string;
|
|
184
171
|
readonly path?: string[];
|
|
185
172
|
}
|
|
186
|
-
interface ValidationWarning {
|
|
187
|
-
readonly code: string;
|
|
188
|
-
readonly message: string;
|
|
189
|
-
readonly path?: string[];
|
|
190
|
-
}
|
|
191
173
|
interface ValidationContext {
|
|
192
174
|
readonly fieldId: string;
|
|
193
175
|
readonly formData: Record<string, any>;
|
|
@@ -212,32 +194,19 @@ interface ComponentRenderProps<TProps = any> {
|
|
|
212
194
|
onChange?: (value: any) => void;
|
|
213
195
|
onBlur?: () => void;
|
|
214
196
|
error?: ValidationError[];
|
|
215
|
-
warnings?: ValidationWarning[];
|
|
216
197
|
touched?: boolean;
|
|
217
198
|
disabled?: boolean;
|
|
218
199
|
isValidating?: boolean;
|
|
219
200
|
[key: string]: any;
|
|
220
201
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
key: keyof TProps;
|
|
224
|
-
type: 'string' | 'number' | 'boolean' | 'select' | 'array';
|
|
225
|
-
label: string;
|
|
226
|
-
options?: any[];
|
|
227
|
-
default?: any;
|
|
228
|
-
}>;
|
|
229
|
-
readonly previewProps?: Partial<TProps>;
|
|
230
|
-
readonly icon?: string;
|
|
231
|
-
readonly tags?: string[];
|
|
232
|
-
}
|
|
202
|
+
type RendererChildrenFunction<TProps = any> = (props: TProps) => React.ReactNode;
|
|
203
|
+
declare function resolveRendererChildren<TProps>(children: React.ReactNode | RendererChildrenFunction<TProps> | undefined, props: TProps): React.ReactNode;
|
|
233
204
|
interface ComponentConfig<TProps = any> {
|
|
234
205
|
readonly id: string;
|
|
235
206
|
readonly type: string;
|
|
236
207
|
readonly name: string;
|
|
237
208
|
readonly description?: string;
|
|
238
|
-
readonly category?: string;
|
|
239
209
|
readonly renderer: ComponentRenderer<TProps>;
|
|
240
|
-
readonly options?: ComponentOptions<TProps>;
|
|
241
210
|
readonly validation?: ValidationConfig<TProps>;
|
|
242
211
|
readonly defaultProps?: Partial<TProps>;
|
|
243
212
|
readonly useFieldRenderer?: boolean;
|
|
@@ -293,11 +262,6 @@ interface RetryPolicy {
|
|
|
293
262
|
readonly delayMs: number;
|
|
294
263
|
readonly backoffMultiplier?: number;
|
|
295
264
|
}
|
|
296
|
-
interface ConditionalBranch {
|
|
297
|
-
readonly condition: (data: any, context: WorkflowContext) => boolean | Promise<boolean>;
|
|
298
|
-
readonly steps: StepConfig[];
|
|
299
|
-
readonly fallback?: StepConfig[];
|
|
300
|
-
}
|
|
301
265
|
interface StepConfig {
|
|
302
266
|
readonly id: string;
|
|
303
267
|
readonly title: string;
|
|
@@ -366,18 +330,6 @@ interface WorkflowAnalytics {
|
|
|
366
330
|
readonly onValidationError?: (stepId: string, errors: ValidationError[], context: WorkflowContext) => void;
|
|
367
331
|
readonly onError?: (error: Error, context: WorkflowContext) => void;
|
|
368
332
|
}
|
|
369
|
-
interface WorkflowOptimizations {
|
|
370
|
-
readonly preloadNextStep?: boolean;
|
|
371
|
-
readonly cacheValidation?: boolean;
|
|
372
|
-
readonly virtualizeSteps?: boolean;
|
|
373
|
-
readonly lazyLoadComponents?: boolean;
|
|
374
|
-
readonly maxConcurrentRequests?: number;
|
|
375
|
-
}
|
|
376
|
-
interface WorkflowVersion {
|
|
377
|
-
readonly version: string;
|
|
378
|
-
readonly migrationStrategy?: (oldData: any, newConfig: any) => any;
|
|
379
|
-
readonly compatibilityMode?: boolean;
|
|
380
|
-
}
|
|
381
333
|
interface WorkflowHooks {
|
|
382
334
|
readonly onStepChange?: (from: string, to: string, context: WorkflowContext) => void;
|
|
383
335
|
readonly onDataChange?: (data: any, context: WorkflowContext) => void;
|
|
@@ -395,13 +347,10 @@ interface WorkflowConfig {
|
|
|
395
347
|
readonly name: string;
|
|
396
348
|
readonly description?: string;
|
|
397
349
|
readonly steps: StepConfig[];
|
|
398
|
-
readonly branches?: ConditionalBranch[];
|
|
399
350
|
readonly navigation?: NavigationConfig;
|
|
400
351
|
readonly persistence?: PersistenceConfig;
|
|
401
352
|
readonly completion?: CompletionConfig;
|
|
402
353
|
readonly analytics?: WorkflowAnalytics;
|
|
403
|
-
readonly optimizations?: WorkflowOptimizations;
|
|
404
|
-
readonly version?: WorkflowVersion;
|
|
405
354
|
readonly plugins?: WorkflowPlugin[];
|
|
406
355
|
readonly renderConfig?: WorkflowRenderConfig;
|
|
407
356
|
}
|
|
@@ -423,24 +372,9 @@ interface WorkflowStepperRendererProps {
|
|
|
423
372
|
readonly onStepClick?: (stepIndex: number) => void;
|
|
424
373
|
readonly className?: string;
|
|
425
374
|
}
|
|
426
|
-
interface WorkflowNavigationRendererProps {
|
|
427
|
-
readonly currentStep: StepConfig;
|
|
428
|
-
readonly context: WorkflowContext;
|
|
429
|
-
readonly canGoNext: boolean;
|
|
430
|
-
readonly canGoPrevious: boolean;
|
|
431
|
-
readonly canSkip: boolean;
|
|
432
|
-
readonly isSubmitting: boolean;
|
|
433
|
-
readonly onNext: (event?: React.FormEvent) => void;
|
|
434
|
-
readonly onPrevious: (event?: React.FormEvent) => void;
|
|
435
|
-
readonly onSkip: (event?: React.FormEvent) => void;
|
|
436
|
-
readonly onSubmit: (event?: React.FormEvent) => void;
|
|
437
|
-
readonly className?: string;
|
|
438
|
-
}
|
|
439
375
|
type WorkflowStepperRenderer = (props: WorkflowStepperRendererProps) => React.ReactElement;
|
|
440
|
-
type WorkflowNavigationRenderer = (props: WorkflowNavigationRendererProps) => React.ReactElement;
|
|
441
376
|
interface WorkflowRenderConfig {
|
|
442
377
|
readonly stepperRenderer?: WorkflowStepperRenderer;
|
|
443
|
-
readonly navigationRenderer?: WorkflowNavigationRenderer;
|
|
444
378
|
readonly nextButtonRenderer?: WorkflowNextButtonRenderer;
|
|
445
379
|
readonly previousButtonRenderer?: WorkflowPreviousButtonRenderer;
|
|
446
380
|
readonly skipButtonRenderer?: WorkflowSkipButtonRenderer;
|
|
@@ -472,7 +406,6 @@ interface FieldRendererProps {
|
|
|
472
406
|
children: React.ReactNode;
|
|
473
407
|
id: string;
|
|
474
408
|
error?: ValidationError[];
|
|
475
|
-
warnings?: ValidationWarning[];
|
|
476
409
|
touched?: boolean;
|
|
477
410
|
disabled?: boolean;
|
|
478
411
|
isValidating?: boolean;
|
|
@@ -501,18 +434,30 @@ interface WorkflowNextButtonRendererProps {
|
|
|
501
434
|
onSubmit: (event?: React.FormEvent) => void;
|
|
502
435
|
className?: string;
|
|
503
436
|
children?: React.ReactNode;
|
|
437
|
+
currentStep: StepConfig;
|
|
438
|
+
stepData: Record<string, any>;
|
|
439
|
+
allData: Record<string, any>;
|
|
440
|
+
context: WorkflowContext;
|
|
504
441
|
}
|
|
505
442
|
interface WorkflowPreviousButtonRendererProps {
|
|
506
443
|
canGoPrevious: boolean;
|
|
507
444
|
onPrevious: (event?: React.FormEvent) => void;
|
|
508
445
|
className?: string;
|
|
509
446
|
children?: React.ReactNode;
|
|
447
|
+
currentStep: StepConfig;
|
|
448
|
+
stepData: Record<string, any>;
|
|
449
|
+
allData: Record<string, any>;
|
|
450
|
+
context: WorkflowContext;
|
|
510
451
|
}
|
|
511
452
|
interface WorkflowSkipButtonRendererProps {
|
|
512
453
|
canSkip: boolean;
|
|
513
454
|
onSkip: (event?: React.FormEvent) => void;
|
|
514
455
|
className?: string;
|
|
515
456
|
children?: React.ReactNode;
|
|
457
|
+
currentStep: StepConfig;
|
|
458
|
+
stepData: Record<string, any>;
|
|
459
|
+
allData: Record<string, any>;
|
|
460
|
+
context: WorkflowContext;
|
|
516
461
|
}
|
|
517
462
|
type WorkflowNextButtonRenderer = (props: WorkflowNextButtonRendererProps) => React.ReactElement;
|
|
518
463
|
type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProps) => React.ReactElement;
|
|
@@ -589,10 +534,9 @@ declare const commonValidators: {
|
|
|
589
534
|
* Utility to create validation result
|
|
590
535
|
* @param isValid - Whether validation passed
|
|
591
536
|
* @param errors - Array of errors (optional)
|
|
592
|
-
* @param warnings - Array of warnings (optional)
|
|
593
537
|
* @returns ValidationResult object
|
|
594
538
|
*/
|
|
595
|
-
declare const createValidationResult: (isValid: boolean, errors?: ValidationError[]
|
|
539
|
+
declare const createValidationResult: (isValid: boolean, errors?: ValidationError[]) => ValidationResult;
|
|
596
540
|
/**
|
|
597
541
|
* Utility to create validation error
|
|
598
542
|
* @param code - Error code
|
|
@@ -682,4 +626,4 @@ declare const persistence: {
|
|
|
682
626
|
*/
|
|
683
627
|
declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
|
|
684
628
|
|
|
685
|
-
export { type CompletionConfig, type ComponentConfig, type
|
|
629
|
+
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 };
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var zod=require('zod');var h=class o{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new o}addComponent(e,r){let t={id:e,type:e,...r};return this.components.set(e,t),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}setWorkflowNavigationRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,navigationRenderer: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}}setRenderConfig(e){return this.setFormRenderConfig(e)}getComponent(e){return this.components.get(e)}getComponentsByCategory(e){return Array.from(this.components.values()).filter(r=>r.category===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();}export(){return Object.fromEntries(this.components)}import(e){for(let[r,t]of Object.entries(e))this.components.set(r,t);return this}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),{}),byCategory:e.reduce((r,t)=>{let n=t.category||"uncategorized";return r[n]=(r[n]||0)+1,r},{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNavigation:!!this.workflowRenderConfig.navigationRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(s=>s.id),n=t.filter((s,a)=>t.indexOf(s)!==a);n.length>0&&e.push(`Duplicate component IDs found: ${n.join(", ")}`);let i=r.filter(s=>!s.renderer);return i.length>0&&e.push(`Components without renderer: ${i.map(s=>s.id).join(", ")}`),e}};var f=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(t=>({code:t.code,message:t.message,path:t.path?t.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},y=o=>async(e,r,t)=>{try{let n=await o(e,r);return n===!0?{isValid:!0,errors:[]}:n===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(n)}]}}catch(n){return {isValid:false,errors:[{code:"validation_error",message:n instanceof Error?n.message:"Validation error"}]}}},k=(o,e="all")=>async(r,t,n)=>{let i=await Promise.all(o.map(l=>l(r,t,n)));if(e==="all"){let l=i.flatMap(u=>u.errors),d=i.flatMap(u=>u.warnings||[]);return {isValid:i.every(u=>u.isValid),errors:l,warnings:d.length>0?d:void 0}}if(i.some(l=>l.isValid)){let l=i.flatMap(d=>d.warnings||[]);return {isValid:true,errors:[],warnings:l.length>0?l:void 0}}return {isValid:false,errors:i.flatMap(l=>l.errors)}},v=(o,e)=>async(r,t,n)=>o(r,t)?e(r,t,n):{isValid:true,errors:[]},P={required:(o="This field is required")=>y(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>f(zod.z.string().email(o)),minLength:(o,e)=>f(zod.z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>f(zod.z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>f(zod.z.string().regex(o,e)),numberRange:(o,e,r)=>{let t=zod.z.number();return o!==void 0&&(t=t.min(o,r||`Value must be at least ${o}`)),e!==void 0&&(t=t.max(e,r||`Value must be at most ${e}`)),f(t)},url:(o="Invalid URL format")=>f(zod.z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>f(zod.z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (t,n,i)=>new Promise(s=>{let a=`${n.fieldId}-${JSON.stringify(t)}`;r.has(a)&&clearTimeout(r.get(a));let l=setTimeout(async()=>{try{let d=await o(t,n);s(d===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof d=="string"?d:"Async validation failed"}]});}catch(d){s({isValid:false,errors:[{code:"async_validation_error",message:d instanceof Error?d.message:"Async validation error"}]});}finally{r.delete(a);}},e);r.set(a,l);})}},b=(o,e=[],r)=>({isValid:o,errors:e,warnings:r}),V=(o,e,r)=>({code:o,message:e,path:r});var g=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(t){throw new Error(`Failed to save to localStorage: ${t}`)}}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 t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(!e||n.includes(e))&&r.push(n);}return r}},p=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(t){throw new Error(`Failed to save to sessionStorage: ${t}`)}}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 t=0;t<sessionStorage.length;t++){let n=sessionStorage.key(t);n&&(!e||n.includes(e))&&r.push(n);}return r}},m=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(t=>t.includes(e)):r}clear(){this.storage.clear();}},w=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let t=[this.primary,...this.fallbacks];for(let n of t)try{await n.save(e,r);return}catch(i){console.warn(`Failed to save with ${n.name}:`,i);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let t of r)try{let n=await t.load(e);if(n)return n}catch(n){console.warn(`Failed to load with ${t.name}:`,n);}return null}async remove(e){let r=[this.primary,...this.fallbacks],t=[];for(let n of r)try{await n.remove(e);}catch(i){t.push(i);}if(t.length===r.length)throw new Error(`All adapters failed to remove: ${t.map(n=>n.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let t of r)try{if(await t.exists(e))return !0}catch(n){console.warn(`Failed to check existence with ${t.name}:`,n);}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 t of this.fallbacks)try{return await t.list?.(e)||[]}catch(n){console.warn(`Failed to list with fallback ${t.name}:`,n);}return []}}};var F={localStorage(o={}){return {adapter:new g,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},sessionStorage(o={}){return {adapter:new p,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},memory(o={}){return {adapter:new m,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function W(o,e,r={}){let t=e||new m;return {adapter:{name:`resilient-${o.name}`,async save(i,s){try{await o.save(i,s);}catch(a){console.warn("Primary persistence failed, using fallback:",a),await t.save(i,s);}},async load(i){try{let s=await o.load(i);if(s)return s}catch(s){console.warn("Primary persistence load failed, trying fallback:",s);}return await t.load(i)},async remove(i){let s=[];try{await o.remove(i);}catch(a){s.push(a);}try{await t.remove(i);}catch(a){s.push(a);}if(s.length===2)throw new Error(`Both adapters failed: ${s.map(a=>a.message).join(", ")}`)},async exists(i){try{if(await o.exists(i))return !0}catch(s){console.warn("Primary persistence exists check failed:",s);}try{return await t.exists(i)}catch(s){return console.warn("Fallback persistence exists check failed:",s),false}},async list(i){try{return await o.list?.(i)||[]}catch(s){console.warn("Primary persistence list failed:",s);try{return await t.list?.(i)||[]}catch(a){return console.warn("Fallback persistence list failed:",a),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}exports.CompositeAdapter=w;exports.LocalStorageAdapter=g;exports.MemoryAdapter=m;exports.SessionStorageAdapter=p;exports.combineValidators=k;exports.commonValidators=P;exports.createConditionalValidator=v;exports.createCustomValidator=y;exports.createResilientPersistence=W;exports.createValidationError=V;exports.createValidationResult=b;exports.createZodValidator=f;exports.persistence=F;exports.ril=h;
|
|
1
|
+
'use strict';var zod=require('zod');function w(n,e){return typeof n=="function"?n(e):n}var u=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}}setRenderConfig(e){return this.setFormRenderConfig(e)}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();}},g=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=g;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=u;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {z}from'zod';var h=class o{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new o}addComponent(e,r){let t={id:e,type:e,...r};return this.components.set(e,t),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}setWorkflowNavigationRenderer(e){return this.workflowRenderConfig={...this.workflowRenderConfig,navigationRenderer: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}}setRenderConfig(e){return this.setFormRenderConfig(e)}getComponent(e){return this.components.get(e)}getComponentsByCategory(e){return Array.from(this.components.values()).filter(r=>r.category===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();}export(){return Object.fromEntries(this.components)}import(e){for(let[r,t]of Object.entries(e))this.components.set(r,t);return this}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),{}),byCategory:e.reduce((r,t)=>{let n=t.category||"uncategorized";return r[n]=(r[n]||0)+1,r},{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNavigation:!!this.workflowRenderConfig.navigationRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(s=>s.id),n=t.filter((s,a)=>t.indexOf(s)!==a);n.length>0&&e.push(`Duplicate component IDs found: ${n.join(", ")}`);let i=r.filter(s=>!s.renderer);return i.length>0&&e.push(`Components without renderer: ${i.map(s=>s.id).join(", ")}`),e}};var f=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(t=>({code:t.code,message:t.message,path:t.path?t.path.map(String):[]}))}:{isValid:false,errors:[{code:"unknown",message:r instanceof Error?r.message:"Unknown validation error"}]}}},y=o=>async(e,r,t)=>{try{let n=await o(e,r);return n===!0?{isValid:!0,errors:[]}:n===!1?{isValid:!1,errors:[{code:"validation_failed",message:"Validation failed"}]}:{isValid:!1,errors:[{code:"validation_failed",message:String(n)}]}}catch(n){return {isValid:false,errors:[{code:"validation_error",message:n instanceof Error?n.message:"Validation error"}]}}},k=(o,e="all")=>async(r,t,n)=>{let i=await Promise.all(o.map(l=>l(r,t,n)));if(e==="all"){let l=i.flatMap(u=>u.errors),d=i.flatMap(u=>u.warnings||[]);return {isValid:i.every(u=>u.isValid),errors:l,warnings:d.length>0?d:void 0}}if(i.some(l=>l.isValid)){let l=i.flatMap(d=>d.warnings||[]);return {isValid:true,errors:[],warnings:l.length>0?l:void 0}}return {isValid:false,errors:i.flatMap(l=>l.errors)}},v=(o,e)=>async(r,t,n)=>o(r,t)?e(r,t,n):{isValid:true,errors:[]},P={required:(o="This field is required")=>y(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>f(z.string().email(o)),minLength:(o,e)=>f(z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>f(z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>f(z.string().regex(o,e)),numberRange:(o,e,r)=>{let t=z.number();return o!==void 0&&(t=t.min(o,r||`Value must be at least ${o}`)),e!==void 0&&(t=t.max(e,r||`Value must be at most ${e}`)),f(t)},url:(o="Invalid URL format")=>f(z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>f(z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (t,n,i)=>new Promise(s=>{let a=`${n.fieldId}-${JSON.stringify(t)}`;r.has(a)&&clearTimeout(r.get(a));let l=setTimeout(async()=>{try{let d=await o(t,n);s(d===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof d=="string"?d:"Async validation failed"}]});}catch(d){s({isValid:false,errors:[{code:"async_validation_error",message:d instanceof Error?d.message:"Async validation error"}]});}finally{r.delete(a);}},e);r.set(a,l);})}},b=(o,e=[],r)=>({isValid:o,errors:e,warnings:r}),V=(o,e,r)=>({code:o,message:e,path:r});var g=class{constructor(){this.name="localStorage";}async save(e,r){try{localStorage.setItem(e,JSON.stringify(r));}catch(t){throw new Error(`Failed to save to localStorage: ${t}`)}}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 t=0;t<localStorage.length;t++){let n=localStorage.key(t);n&&(!e||n.includes(e))&&r.push(n);}return r}},p=class{constructor(){this.name="sessionStorage";}async save(e,r){try{sessionStorage.setItem(e,JSON.stringify(r));}catch(t){throw new Error(`Failed to save to sessionStorage: ${t}`)}}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 t=0;t<sessionStorage.length;t++){let n=sessionStorage.key(t);n&&(!e||n.includes(e))&&r.push(n);}return r}},m=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(t=>t.includes(e)):r}clear(){this.storage.clear();}},w=class{constructor(e,r=[]){this.primary=e;this.fallbacks=r;this.name="composite";}async save(e,r){let t=[this.primary,...this.fallbacks];for(let n of t)try{await n.save(e,r);return}catch(i){console.warn(`Failed to save with ${n.name}:`,i);}throw new Error("All persistence adapters failed to save")}async load(e){let r=[this.primary,...this.fallbacks];for(let t of r)try{let n=await t.load(e);if(n)return n}catch(n){console.warn(`Failed to load with ${t.name}:`,n);}return null}async remove(e){let r=[this.primary,...this.fallbacks],t=[];for(let n of r)try{await n.remove(e);}catch(i){t.push(i);}if(t.length===r.length)throw new Error(`All adapters failed to remove: ${t.map(n=>n.message).join(", ")}`)}async exists(e){let r=[this.primary,...this.fallbacks];for(let t of r)try{if(await t.exists(e))return !0}catch(n){console.warn(`Failed to check existence with ${t.name}:`,n);}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 t of this.fallbacks)try{return await t.list?.(e)||[]}catch(n){console.warn(`Failed to list with fallback ${t.name}:`,n);}return []}}};var F={localStorage(o={}){return {adapter:new g,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},sessionStorage(o={}){return {adapter:new p,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...o}},memory(o={}){return {adapter:new m,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function W(o,e,r={}){let t=e||new m;return {adapter:{name:`resilient-${o.name}`,async save(i,s){try{await o.save(i,s);}catch(a){console.warn("Primary persistence failed, using fallback:",a),await t.save(i,s);}},async load(i){try{let s=await o.load(i);if(s)return s}catch(s){console.warn("Primary persistence load failed, trying fallback:",s);}return await t.load(i)},async remove(i){let s=[];try{await o.remove(i);}catch(a){s.push(a);}try{await t.remove(i);}catch(a){s.push(a);}if(s.length===2)throw new Error(`Both adapters failed: ${s.map(a=>a.message).join(", ")}`)},async exists(i){try{if(await o.exists(i))return !0}catch(s){console.warn("Primary persistence exists check failed:",s);}try{return await t.exists(i)}catch(s){return console.warn("Fallback persistence exists check failed:",s),false}},async list(i){try{return await o.list?.(i)||[]}catch(s){console.warn("Primary persistence list failed:",s);try{return await t.list?.(i)||[]}catch(a){return console.warn("Fallback persistence list failed:",a),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}export{w as CompositeAdapter,g as LocalStorageAdapter,m as MemoryAdapter,p as SessionStorageAdapter,k as combineValidators,P as commonValidators,v as createConditionalValidator,y as createCustomValidator,W as createResilientPersistence,V as createValidationError,b as createValidationResult,f as createZodValidator,F as persistence,h as ril};
|
|
1
|
+
import {z}from'zod';function w(n,e){return typeof n=="function"?n(e):n}var u=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}}setRenderConfig(e){return this.setFormRenderConfig(e)}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();}},g=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{g 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,u as ril};
|