@rilaykit/core 1.0.0 → 1.2.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
@@ -35,6 +35,12 @@ declare class ril {
35
35
  * @returns The ril instance for chaining
36
36
  */
37
37
  setSubmitButtonRenderer(renderer: FormSubmitButtonRenderer): this;
38
+ /**
39
+ * Set custom field renderer
40
+ * @param renderer - Custom field renderer function
41
+ * @returns The ril instance for chaining
42
+ */
43
+ setFieldRenderer(renderer: FieldRenderer): this;
38
44
  /**
39
45
  * Set complete form render configuration
40
46
  * @param config - Form render configuration
@@ -58,6 +64,24 @@ declare class ril {
58
64
  * @returns The ril instance for chaining
59
65
  */
60
66
  setWorkflowNavigationRenderer(renderer: WorkflowNavigationRenderer): this;
67
+ /**
68
+ * Set custom workflow next button renderer
69
+ * @param renderer - Custom workflow next button renderer function
70
+ * @returns The ril instance for chaining
71
+ */
72
+ setWorkflowNextButtonRenderer(renderer: WorkflowNextButtonRenderer): this;
73
+ /**
74
+ * Set custom workflow previous button renderer
75
+ * @param renderer - Custom workflow previous button renderer function
76
+ * @returns The ril instance for chaining
77
+ */
78
+ setWorkflowPreviousButtonRenderer(renderer: WorkflowPreviousButtonRenderer): this;
79
+ /**
80
+ * Set custom workflow skip button renderer
81
+ * @param renderer - Custom workflow skip button renderer function
82
+ * @returns The ril instance for chaining
83
+ */
84
+ setWorkflowSkipButtonRenderer(renderer: WorkflowSkipButtonRenderer): this;
61
85
  /**
62
86
  * Set complete workflow render configuration
63
87
  * @param config - Workflow render configuration
@@ -129,8 +153,12 @@ declare class ril {
129
153
  row: boolean;
130
154
  body: boolean;
131
155
  submitButton: boolean;
156
+ field: boolean;
132
157
  stepper: boolean;
133
158
  workflowNavigation: boolean;
159
+ workflowNextButton: boolean;
160
+ workflowPreviousButton: boolean;
161
+ workflowSkipButton: boolean;
134
162
  };
135
163
  };
136
164
  /**
@@ -212,6 +240,7 @@ interface ComponentConfig<TProps = any> {
212
240
  readonly options?: ComponentOptions<TProps>;
213
241
  readonly validation?: ValidationConfig<TProps>;
214
242
  readonly defaultProps?: Partial<TProps>;
243
+ readonly useFieldRenderer?: boolean;
215
244
  }
216
245
  interface FormFieldConfig {
217
246
  readonly id: string;
@@ -412,6 +441,9 @@ type WorkflowNavigationRenderer = (props: WorkflowNavigationRendererProps) => Re
412
441
  interface WorkflowRenderConfig {
413
442
  readonly stepperRenderer?: WorkflowStepperRenderer;
414
443
  readonly navigationRenderer?: WorkflowNavigationRenderer;
444
+ readonly nextButtonRenderer?: WorkflowNextButtonRenderer;
445
+ readonly previousButtonRenderer?: WorkflowPreviousButtonRenderer;
446
+ readonly skipButtonRenderer?: WorkflowSkipButtonRenderer;
415
447
  }
416
448
  interface FormRowRendererProps {
417
449
  row: FormFieldRow;
@@ -436,10 +468,22 @@ interface FormSubmitButtonRendererProps {
436
468
  type FormRowRenderer = (props: FormRowRendererProps) => React.ReactElement;
437
469
  type FormBodyRenderer = (props: FormBodyRendererProps) => React.ReactElement;
438
470
  type FormSubmitButtonRenderer = (props: FormSubmitButtonRendererProps) => React.ReactElement;
471
+ interface FieldRendererProps {
472
+ children: React.ReactNode;
473
+ id: string;
474
+ error?: ValidationError[];
475
+ warnings?: ValidationWarning[];
476
+ touched?: boolean;
477
+ disabled?: boolean;
478
+ isValidating?: boolean;
479
+ [key: string]: any;
480
+ }
481
+ type FieldRenderer = (props: FieldRendererProps) => React.ReactElement;
439
482
  interface FormRenderConfig {
440
483
  readonly rowRenderer?: FormRowRenderer;
441
484
  readonly bodyRenderer?: FormBodyRenderer;
442
485
  readonly submitButtonRenderer?: FormSubmitButtonRenderer;
486
+ readonly fieldRenderer?: FieldRenderer;
443
487
  }
444
488
  interface FormConfiguration {
445
489
  readonly id: string;
@@ -449,6 +493,30 @@ interface FormConfiguration {
449
493
  readonly allFields: FormFieldConfig[];
450
494
  readonly renderConfig?: FormRenderConfig;
451
495
  }
496
+ interface WorkflowNextButtonRendererProps {
497
+ isLastStep: boolean;
498
+ canGoNext: boolean;
499
+ isSubmitting: boolean;
500
+ onNext: (event?: React.FormEvent) => void;
501
+ onSubmit: (event?: React.FormEvent) => void;
502
+ className?: string;
503
+ children?: React.ReactNode;
504
+ }
505
+ interface WorkflowPreviousButtonRendererProps {
506
+ canGoPrevious: boolean;
507
+ onPrevious: (event?: React.FormEvent) => void;
508
+ className?: string;
509
+ children?: React.ReactNode;
510
+ }
511
+ interface WorkflowSkipButtonRendererProps {
512
+ canSkip: boolean;
513
+ onSkip: (event?: React.FormEvent) => void;
514
+ className?: string;
515
+ children?: React.ReactNode;
516
+ }
517
+ type WorkflowNextButtonRenderer = (props: WorkflowNextButtonRendererProps) => React.ReactElement;
518
+ type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProps) => React.ReactElement;
519
+ type WorkflowSkipButtonRenderer = (props: WorkflowSkipButtonRendererProps) => React.ReactElement;
452
520
 
453
521
  /**
454
522
  * Create a Zod-based validator
@@ -614,4 +682,4 @@ declare const persistence: {
614
682
  */
615
683
  declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
616
684
 
617
- export { type CompletionConfig, type ComponentConfig, type ComponentOptions, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalBranch, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, 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 RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidationWarning, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNavigationRenderer, type WorkflowNavigationRendererProps, type WorkflowOptimizations, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowRenderConfig, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, type WorkflowVersion, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, ril };
685
+ export { type CompletionConfig, type ComponentConfig, type ComponentOptions, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalBranch, 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 RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidationWarning, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNavigationRenderer, type WorkflowNavigationRendererProps, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowOptimizations, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, type WorkflowVersion, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, ril };
package/dist/index.d.ts CHANGED
@@ -35,6 +35,12 @@ declare class ril {
35
35
  * @returns The ril instance for chaining
36
36
  */
37
37
  setSubmitButtonRenderer(renderer: FormSubmitButtonRenderer): this;
38
+ /**
39
+ * Set custom field renderer
40
+ * @param renderer - Custom field renderer function
41
+ * @returns The ril instance for chaining
42
+ */
43
+ setFieldRenderer(renderer: FieldRenderer): this;
38
44
  /**
39
45
  * Set complete form render configuration
40
46
  * @param config - Form render configuration
@@ -58,6 +64,24 @@ declare class ril {
58
64
  * @returns The ril instance for chaining
59
65
  */
60
66
  setWorkflowNavigationRenderer(renderer: WorkflowNavigationRenderer): this;
67
+ /**
68
+ * Set custom workflow next button renderer
69
+ * @param renderer - Custom workflow next button renderer function
70
+ * @returns The ril instance for chaining
71
+ */
72
+ setWorkflowNextButtonRenderer(renderer: WorkflowNextButtonRenderer): this;
73
+ /**
74
+ * Set custom workflow previous button renderer
75
+ * @param renderer - Custom workflow previous button renderer function
76
+ * @returns The ril instance for chaining
77
+ */
78
+ setWorkflowPreviousButtonRenderer(renderer: WorkflowPreviousButtonRenderer): this;
79
+ /**
80
+ * Set custom workflow skip button renderer
81
+ * @param renderer - Custom workflow skip button renderer function
82
+ * @returns The ril instance for chaining
83
+ */
84
+ setWorkflowSkipButtonRenderer(renderer: WorkflowSkipButtonRenderer): this;
61
85
  /**
62
86
  * Set complete workflow render configuration
63
87
  * @param config - Workflow render configuration
@@ -129,8 +153,12 @@ declare class ril {
129
153
  row: boolean;
130
154
  body: boolean;
131
155
  submitButton: boolean;
156
+ field: boolean;
132
157
  stepper: boolean;
133
158
  workflowNavigation: boolean;
159
+ workflowNextButton: boolean;
160
+ workflowPreviousButton: boolean;
161
+ workflowSkipButton: boolean;
134
162
  };
135
163
  };
136
164
  /**
@@ -212,6 +240,7 @@ interface ComponentConfig<TProps = any> {
212
240
  readonly options?: ComponentOptions<TProps>;
213
241
  readonly validation?: ValidationConfig<TProps>;
214
242
  readonly defaultProps?: Partial<TProps>;
243
+ readonly useFieldRenderer?: boolean;
215
244
  }
216
245
  interface FormFieldConfig {
217
246
  readonly id: string;
@@ -412,6 +441,9 @@ type WorkflowNavigationRenderer = (props: WorkflowNavigationRendererProps) => Re
412
441
  interface WorkflowRenderConfig {
413
442
  readonly stepperRenderer?: WorkflowStepperRenderer;
414
443
  readonly navigationRenderer?: WorkflowNavigationRenderer;
444
+ readonly nextButtonRenderer?: WorkflowNextButtonRenderer;
445
+ readonly previousButtonRenderer?: WorkflowPreviousButtonRenderer;
446
+ readonly skipButtonRenderer?: WorkflowSkipButtonRenderer;
415
447
  }
416
448
  interface FormRowRendererProps {
417
449
  row: FormFieldRow;
@@ -436,10 +468,22 @@ interface FormSubmitButtonRendererProps {
436
468
  type FormRowRenderer = (props: FormRowRendererProps) => React.ReactElement;
437
469
  type FormBodyRenderer = (props: FormBodyRendererProps) => React.ReactElement;
438
470
  type FormSubmitButtonRenderer = (props: FormSubmitButtonRendererProps) => React.ReactElement;
471
+ interface FieldRendererProps {
472
+ children: React.ReactNode;
473
+ id: string;
474
+ error?: ValidationError[];
475
+ warnings?: ValidationWarning[];
476
+ touched?: boolean;
477
+ disabled?: boolean;
478
+ isValidating?: boolean;
479
+ [key: string]: any;
480
+ }
481
+ type FieldRenderer = (props: FieldRendererProps) => React.ReactElement;
439
482
  interface FormRenderConfig {
440
483
  readonly rowRenderer?: FormRowRenderer;
441
484
  readonly bodyRenderer?: FormBodyRenderer;
442
485
  readonly submitButtonRenderer?: FormSubmitButtonRenderer;
486
+ readonly fieldRenderer?: FieldRenderer;
443
487
  }
444
488
  interface FormConfiguration {
445
489
  readonly id: string;
@@ -449,6 +493,30 @@ interface FormConfiguration {
449
493
  readonly allFields: FormFieldConfig[];
450
494
  readonly renderConfig?: FormRenderConfig;
451
495
  }
496
+ interface WorkflowNextButtonRendererProps {
497
+ isLastStep: boolean;
498
+ canGoNext: boolean;
499
+ isSubmitting: boolean;
500
+ onNext: (event?: React.FormEvent) => void;
501
+ onSubmit: (event?: React.FormEvent) => void;
502
+ className?: string;
503
+ children?: React.ReactNode;
504
+ }
505
+ interface WorkflowPreviousButtonRendererProps {
506
+ canGoPrevious: boolean;
507
+ onPrevious: (event?: React.FormEvent) => void;
508
+ className?: string;
509
+ children?: React.ReactNode;
510
+ }
511
+ interface WorkflowSkipButtonRendererProps {
512
+ canSkip: boolean;
513
+ onSkip: (event?: React.FormEvent) => void;
514
+ className?: string;
515
+ children?: React.ReactNode;
516
+ }
517
+ type WorkflowNextButtonRenderer = (props: WorkflowNextButtonRendererProps) => React.ReactElement;
518
+ type WorkflowPreviousButtonRenderer = (props: WorkflowPreviousButtonRendererProps) => React.ReactElement;
519
+ type WorkflowSkipButtonRenderer = (props: WorkflowSkipButtonRendererProps) => React.ReactElement;
452
520
 
453
521
  /**
454
522
  * Create a Zod-based validator
@@ -614,4 +682,4 @@ declare const persistence: {
614
682
  */
615
683
  declare function createResilientPersistence(primary: PersistenceAdapter, fallback?: PersistenceAdapter, options?: Partial<PersistenceConfig>): PersistenceConfig;
616
684
 
617
- export { type CompletionConfig, type ComponentConfig, type ComponentOptions, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalBranch, type ConditionalConfig, type CustomStepRenderer, type DynamicStepConfig, 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 RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidationWarning, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNavigationRenderer, type WorkflowNavigationRendererProps, type WorkflowOptimizations, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowRenderConfig, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, type WorkflowVersion, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, ril };
685
+ export { type CompletionConfig, type ComponentConfig, type ComponentOptions, type ComponentRenderProps, type ComponentRenderer, CompositeAdapter, type ConditionalBranch, 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 RetryPolicy, type RilayLicenseConfig, SessionStorageAdapter, type StepConditionalConfig, type StepConfig, type StepLifecycleHooks, type StepPermissions, type StepValidationConfig, type ValidationConfig, type ValidationContext, type ValidationError, type ValidationResult, type ValidationWarning, type ValidatorFunction, type WorkflowAnalytics, type WorkflowConfig, type WorkflowContext, type WorkflowHooks, type WorkflowNavigationRenderer, type WorkflowNavigationRendererProps, type WorkflowNextButtonRenderer, type WorkflowNextButtonRendererProps, type WorkflowOptimizations, type WorkflowPersistenceData, type WorkflowPlugin, type WorkflowPreviousButtonRenderer, type WorkflowPreviousButtonRendererProps, type WorkflowRenderConfig, type WorkflowSkipButtonRenderer, type WorkflowSkipButtonRendererProps, type WorkflowStepperRenderer, type WorkflowStepperRendererProps, type WorkflowVersion, combineValidators, commonValidators, createConditionalValidator, createCustomValidator, createResilientPersistence, createValidationError, createValidationResult, createZodValidator, persistence, 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}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}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,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNavigation:!!this.workflowRenderConfig.navigationRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(s=>s.id),n=t.filter((s,i)=>t.indexOf(s)!==i);n.length>0&&e.push(`Duplicate component IDs found: ${n.join(", ")}`);let a=r.filter(s=>!s.renderer);return a.length>0&&e.push(`Components without renderer: ${a.map(s=>s.id).join(", ")}`),e}};var m=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"}]}}},w=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"}]}}},v=(o,e="all")=>async(r,t,n)=>{let a=await Promise.all(o.map(l=>l(r,t,n)));if(e==="all"){let l=a.flatMap(f=>f.errors),c=a.flatMap(f=>f.warnings||[]);return {isValid:a.every(f=>f.isValid),errors:l,warnings:c.length>0?c:void 0}}if(a.some(l=>l.isValid)){let l=a.flatMap(c=>c.warnings||[]);return {isValid:true,errors:[],warnings:l.length>0?l:void 0}}return {isValid:false,errors:a.flatMap(l=>l.errors)}},P=(o,e)=>async(r,t,n)=>o(r,t)?e(r,t,n):{isValid:true,errors:[]},b={required:(o="This field is required")=>w(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>m(zod.z.string().email(o)),minLength:(o,e)=>m(zod.z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>m(zod.z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>m(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}`)),m(t)},url:(o="Invalid URL format")=>m(zod.z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>m(zod.z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (t,n,a)=>new Promise(s=>{let i=`${n.fieldId}-${JSON.stringify(t)}`;r.has(i)&&clearTimeout(r.get(i));let l=setTimeout(async()=>{try{let c=await o(t,n);s(c===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof c=="string"?c:"Async validation failed"}]});}catch(c){s({isValid:false,errors:[{code:"async_validation_error",message:c instanceof Error?c.message:"Async validation error"}]});}finally{r.delete(i);}},e);r.set(i,l);})}},k=(o,e=[],r)=>({isValid:o,errors:e,warnings:r}),V=(o,e,r)=>({code:o,message:e,path:r});var u=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}},g=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();}},y=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(a){console.warn(`Failed to save with ${n.name}:`,a);}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(a){t.push(a);}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 E={localStorage(o={}){return {adapter:new u,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 g,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function A(o,e,r={}){let t=e||new g;return {adapter:{name:`resilient-${o.name}`,async save(a,s){try{await o.save(a,s);}catch(i){console.warn("Primary persistence failed, using fallback:",i),await t.save(a,s);}},async load(a){try{let s=await o.load(a);if(s)return s}catch(s){console.warn("Primary persistence load failed, trying fallback:",s);}return await t.load(a)},async remove(a){let s=[];try{await o.remove(a);}catch(i){s.push(i);}try{await t.remove(a);}catch(i){s.push(i);}if(s.length===2)throw new Error(`Both adapters failed: ${s.map(i=>i.message).join(", ")}`)},async exists(a){try{if(await o.exists(a))return !0}catch(s){console.warn("Primary persistence exists check failed:",s);}try{return await t.exists(a)}catch(s){return console.warn("Fallback persistence exists check failed:",s),false}},async list(a){try{return await o.list?.(a)||[]}catch(s){console.warn("Primary persistence list failed:",s);try{return await t.list?.(a)||[]}catch(i){return console.warn("Fallback persistence list failed:",i),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}exports.CompositeAdapter=y;exports.LocalStorageAdapter=u;exports.MemoryAdapter=g;exports.SessionStorageAdapter=p;exports.combineValidators=v;exports.commonValidators=b;exports.createConditionalValidator=P;exports.createCustomValidator=w;exports.createResilientPersistence=A;exports.createValidationError=V;exports.createValidationResult=k;exports.createZodValidator=m;exports.persistence=E;exports.ril=h;
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;
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}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}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,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNavigation:!!this.workflowRenderConfig.navigationRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(s=>s.id),n=t.filter((s,i)=>t.indexOf(s)!==i);n.length>0&&e.push(`Duplicate component IDs found: ${n.join(", ")}`);let a=r.filter(s=>!s.renderer);return a.length>0&&e.push(`Components without renderer: ${a.map(s=>s.id).join(", ")}`),e}};var m=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"}]}}},w=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"}]}}},v=(o,e="all")=>async(r,t,n)=>{let a=await Promise.all(o.map(l=>l(r,t,n)));if(e==="all"){let l=a.flatMap(f=>f.errors),c=a.flatMap(f=>f.warnings||[]);return {isValid:a.every(f=>f.isValid),errors:l,warnings:c.length>0?c:void 0}}if(a.some(l=>l.isValid)){let l=a.flatMap(c=>c.warnings||[]);return {isValid:true,errors:[],warnings:l.length>0?l:void 0}}return {isValid:false,errors:a.flatMap(l=>l.errors)}},P=(o,e)=>async(r,t,n)=>o(r,t)?e(r,t,n):{isValid:true,errors:[]},b={required:(o="This field is required")=>w(e=>e==null||e===""?o:!0),email:(o="Invalid email format")=>m(z.string().email(o)),minLength:(o,e)=>m(z.string().min(o,e||`Minimum ${o} characters required`)),maxLength:(o,e)=>m(z.string().max(o,e||`Maximum ${o} characters allowed`)),pattern:(o,e="Invalid format")=>m(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}`)),m(t)},url:(o="Invalid URL format")=>m(z.string().url(o)),phoneNumber:(o="Invalid phone number format")=>m(z.string().regex(/^\+?[\d\s\-\(\)]+$/,o)),asyncValidation:(o,e=300)=>{let r=new Map;return (t,n,a)=>new Promise(s=>{let i=`${n.fieldId}-${JSON.stringify(t)}`;r.has(i)&&clearTimeout(r.get(i));let l=setTimeout(async()=>{try{let c=await o(t,n);s(c===!0?{isValid:!0,errors:[]}:{isValid:!1,errors:[{code:"async_validation_failed",message:typeof c=="string"?c:"Async validation failed"}]});}catch(c){s({isValid:false,errors:[{code:"async_validation_error",message:c instanceof Error?c.message:"Async validation error"}]});}finally{r.delete(i);}},e);r.set(i,l);})}},k=(o,e=[],r)=>({isValid:o,errors:e,warnings:r}),V=(o,e,r)=>({code:o,message:e,path:r});var u=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}},g=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();}},y=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(a){console.warn(`Failed to save with ${n.name}:`,a);}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(a){t.push(a);}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 E={localStorage(o={}){return {adapter:new u,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 g,debounceMs:0,autoSave:true,saveOnStepChange:true,...o}},custom(o,e={}){return {adapter:o,debounceMs:1e3,autoSave:true,saveOnStepChange:true,...e}}};function A(o,e,r={}){let t=e||new g;return {adapter:{name:`resilient-${o.name}`,async save(a,s){try{await o.save(a,s);}catch(i){console.warn("Primary persistence failed, using fallback:",i),await t.save(a,s);}},async load(a){try{let s=await o.load(a);if(s)return s}catch(s){console.warn("Primary persistence load failed, trying fallback:",s);}return await t.load(a)},async remove(a){let s=[];try{await o.remove(a);}catch(i){s.push(i);}try{await t.remove(a);}catch(i){s.push(i);}if(s.length===2)throw new Error(`Both adapters failed: ${s.map(i=>i.message).join(", ")}`)},async exists(a){try{if(await o.exists(a))return !0}catch(s){console.warn("Primary persistence exists check failed:",s);}try{return await t.exists(a)}catch(s){return console.warn("Fallback persistence exists check failed:",s),false}},async list(a){try{return await o.list?.(a)||[]}catch(s){console.warn("Primary persistence list failed:",s);try{return await t.list?.(a)||[]}catch(i){return console.warn("Fallback persistence list failed:",i),[]}}}},debounceMs:1e3,autoSave:true,saveOnStepChange:true,maxRetries:3,retryDelayMs:1e3,...r}}export{y as CompositeAdapter,u as LocalStorageAdapter,g as MemoryAdapter,p as SessionStorageAdapter,v as combineValidators,b as commonValidators,P as createConditionalValidator,w as createCustomValidator,A as createResilientPersistence,V as createValidationError,k as createValidationResult,m as createZodValidator,E as persistence,h as ril};
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};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/core",
3
- "version": "1.0.0",
3
+ "version": "1.2.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",