@rilaykit/core 7.0.0 → 8.1.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
@@ -401,6 +401,7 @@ interface StepConfig {
401
401
  readonly allowSkip?: boolean;
402
402
  readonly renderer?: CustomStepRenderer;
403
403
  readonly conditions?: StepConditionalBehavior;
404
+ readonly metadata?: Record<string, any>;
404
405
  readonly onAfterValidation?: (stepData: Record<string, any>, helper: StepDataHelper, context: WorkflowContext) => void | Promise<void>;
405
406
  }
406
407
  type CustomStepRenderer = (props: StepConfig) => React__default.ReactElement;
@@ -410,6 +411,11 @@ interface WorkflowConfig {
410
411
  readonly description?: string;
411
412
  readonly steps: StepConfig[];
412
413
  readonly analytics?: WorkflowAnalytics;
414
+ readonly persistence?: {
415
+ adapter: any;
416
+ options?: any;
417
+ userId?: string;
418
+ };
413
419
  readonly plugins?: WorkflowPlugin[];
414
420
  readonly renderConfig?: WorkflowRenderConfig;
415
421
  }
@@ -457,10 +463,12 @@ type WorkflowNextButtonRendererProps = WorkflowComponentRendererBaseProps & {
457
463
  };
458
464
  type WorkflowPreviousButtonRendererProps = WorkflowComponentRendererBaseProps & {
459
465
  canGoPrevious: boolean;
466
+ isSubmitting: boolean;
460
467
  onPrevious: (event?: React__default.FormEvent) => void;
461
468
  };
462
469
  type WorkflowSkipButtonRendererProps = WorkflowComponentRendererBaseProps & {
463
470
  canSkip: boolean;
471
+ isSubmitting: boolean;
464
472
  onSkip: (event?: React__default.FormEvent) => void;
465
473
  };
466
474
  type WorkflowStepperRenderer = RendererChildrenFunction<WorkflowStepperRendererProps>;
package/dist/index.d.ts CHANGED
@@ -401,6 +401,7 @@ interface StepConfig {
401
401
  readonly allowSkip?: boolean;
402
402
  readonly renderer?: CustomStepRenderer;
403
403
  readonly conditions?: StepConditionalBehavior;
404
+ readonly metadata?: Record<string, any>;
404
405
  readonly onAfterValidation?: (stepData: Record<string, any>, helper: StepDataHelper, context: WorkflowContext) => void | Promise<void>;
405
406
  }
406
407
  type CustomStepRenderer = (props: StepConfig) => React__default.ReactElement;
@@ -410,6 +411,11 @@ interface WorkflowConfig {
410
411
  readonly description?: string;
411
412
  readonly steps: StepConfig[];
412
413
  readonly analytics?: WorkflowAnalytics;
414
+ readonly persistence?: {
415
+ adapter: any;
416
+ options?: any;
417
+ userId?: string;
418
+ };
413
419
  readonly plugins?: WorkflowPlugin[];
414
420
  readonly renderConfig?: WorkflowRenderConfig;
415
421
  }
@@ -457,10 +463,12 @@ type WorkflowNextButtonRendererProps = WorkflowComponentRendererBaseProps & {
457
463
  };
458
464
  type WorkflowPreviousButtonRendererProps = WorkflowComponentRendererBaseProps & {
459
465
  canGoPrevious: boolean;
466
+ isSubmitting: boolean;
460
467
  onPrevious: (event?: React__default.FormEvent) => void;
461
468
  };
462
469
  type WorkflowSkipButtonRendererProps = WorkflowComponentRendererBaseProps & {
463
470
  canSkip: boolean;
471
+ isSubmitting: boolean;
464
472
  onSkip: (event?: React__default.FormEvent) => void;
465
473
  };
466
474
  type WorkflowStepperRenderer = RendererChildrenFunction<WorkflowStepperRendererProps>;
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- 'use strict';function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function R(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function k(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return R(t)}async function A(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return R(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var y=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new y(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"&&r.includes(n.value);case "notContains":return typeof r=="string"&&typeof n.value=="string"&&!r.includes(n.value);case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}exports.ComponentRendererWrapper=z;exports.IdGenerator=b;exports.async=S;exports.combineValidationResults=R;exports.configureObject=Y;exports.createValidationContext=B;exports.createValidationResult=m;exports.custom=D;exports.deepClone=x;exports.email=N;exports.ensureUnique=V;exports.evaluateCondition=v;exports.matchField=M;exports.max=L;exports.maxLength=I;exports.mergeInto=j;exports.min=q;exports.minLength=F;exports.normalizeToArray=X;exports.number=$;exports.pattern=O;exports.required=E;exports.resolveRendererChildren=T;exports.ril=h;exports.runValidators=k;exports.runValidatorsAsync=A;exports.url=P;exports.validateRequired=H;exports.validateWhen=W;exports.when=se;
1
+ 'use strict';function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function y(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function A(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return y(t)}async function k(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return y(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var R=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new R(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?r.includes(n.value):false;case "notContains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?!r.includes(n.value):false;case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}exports.ComponentRendererWrapper=z;exports.IdGenerator=b;exports.async=S;exports.combineValidationResults=y;exports.configureObject=Y;exports.createValidationContext=B;exports.createValidationResult=m;exports.custom=D;exports.deepClone=x;exports.email=N;exports.ensureUnique=V;exports.evaluateCondition=v;exports.matchField=M;exports.max=L;exports.maxLength=I;exports.mergeInto=j;exports.min=q;exports.minLength=F;exports.normalizeToArray=X;exports.number=$;exports.pattern=O;exports.required=E;exports.resolveRendererChildren=T;exports.ril=h;exports.runValidators=A;exports.runValidatorsAsync=k;exports.url=P;exports.validateRequired=H;exports.validateWhen=W;exports.when=se;
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function R(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function k(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return R(t)}async function A(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return R(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var y=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new y(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"&&r.includes(n.value);case "notContains":return typeof r=="string"&&typeof n.value=="string"&&!r.includes(n.value);case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}export{z as ComponentRendererWrapper,b as IdGenerator,S as async,R as combineValidationResults,Y as configureObject,B as createValidationContext,m as createValidationResult,D as custom,x as deepClone,N as email,V as ensureUnique,v as evaluateCondition,M as matchField,L as max,I as maxLength,j as mergeInto,q as min,F as minLength,X as normalizeToArray,$ as number,O as pattern,E as required,T as resolveRendererChildren,h as ril,k as runValidators,A as runValidatorsAsync,P as url,H as validateRequired,W as validateWhen,se as when};
1
+ function T(n,e){return typeof n=="function"?n(e):n}function z({children:n,renderAs:e,renderer:r,name:t,props:o}){if(e==="children"||e===true){if(typeof n!="function")throw new Error(`When renderAs="children" is used, children must be a function that returns React elements for ${t}`);return n(o)}if(!r)throw new Error(`No renderer provided for ${t}`);if(typeof r!="function")throw new Error(`Renderer must be a function for ${t}`);let d={...o,children:T(n,o)};return r(d)}function j(n,e){return {...n,...e}}function V(n,e){let r=n.filter((t,o)=>n.indexOf(t)!==o);if(r.length>0)throw new Error(`Duplicate ${e} IDs: ${r.join(", ")}`)}function H(n,e,r){if(n.filter(o=>e.some(i=>!o[i])).length>0)throw new Error(`Missing required fields in ${r}: ${e.join(", ")}`)}var b=class{constructor(){this.counters=new Map;}next(e){let r=this.counters.get(e)||0;return this.counters.set(e,r+1),`${e}-${r+1}`}reset(e){e?this.counters.delete(e):this.counters.clear();}};function X(n){return Array.isArray(n)?n:[n]}function x(n){if(n===null||typeof n!="object")return n;if(n instanceof Date)return new Date(n.getTime());if(Array.isArray(n))return n.map(r=>x(r));let e={};for(let r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=x(n[r]));return e}function Y(n,e,r){let t={...n};for(let o in e)r&&!r.includes(o)||e[o]!==void 0&&(t[o]=e[o]);return t}var C=class extends Error{constructor(r,t,o){super(r);this.code=t;this.meta=o;this.name="RilayError";}},g=class extends C{constructor(e,r){super(e,"VALIDATION_ERROR",r),this.name="ValidationError";}};function p(n,e){let r={...n};for(let t in e){let o=e[t],i=r[t];o&&typeof o=="object"&&!Array.isArray(o)&&i&&typeof i=="object"&&!Array.isArray(i)?r[t]=p(i,o):r[t]=o;}return r}var h=class n{constructor(){this.components=new Map;this.formRenderConfig={};this.workflowRenderConfig={};}static create(){return new n}addComponent(e,r){let t={id:e,type:e,...r},o=new n;return o.components=new Map(this.components),o.formRenderConfig={...this.formRenderConfig},o.workflowRenderConfig={...this.workflowRenderConfig},o.components.set(e,t),o}configure(e){let r=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],t=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],o={},i={};for(let[f,c]of Object.entries(e))r.includes(f)?o[f]=c:t.includes(f)&&(i[f]=c);let d=new n;return d.components=new Map(this.components),d.formRenderConfig=p(this.formRenderConfig,o),d.workflowRenderConfig=p(this.workflowRenderConfig,i),d}getFormRenderConfig(){return {...this.formRenderConfig}}getWorkflowRenderConfig(){return {...this.workflowRenderConfig}}getComponent(e){return this.components.get(e)}getAllComponents(){return Array.from(this.components.values())}hasComponent(e){return this.components.has(e)}removeComponent(e){let r=new n;return r.components=new Map(this.components),r.formRenderConfig={...this.formRenderConfig},r.workflowRenderConfig={...this.workflowRenderConfig},r.components.delete(e),r}clear(){let e=new n;return e.formRenderConfig={...this.formRenderConfig},e.workflowRenderConfig={...this.workflowRenderConfig},e}clone(){let e=new n;return e.components=new Map(this.components),e.formRenderConfig=p({},this.formRenderConfig),e.workflowRenderConfig=p({},this.workflowRenderConfig),e}getStats(){let e=Array.from(this.components.values());return {total:e.length,byType:e.reduce((r,t)=>(r[t.type]=(r[t.type]||0)+1,r),{}),hasCustomRenderers:{row:!!this.formRenderConfig.rowRenderer,body:!!this.formRenderConfig.bodyRenderer,submitButton:!!this.formRenderConfig.submitButtonRenderer,field:!!this.formRenderConfig.fieldRenderer,stepper:!!this.workflowRenderConfig.stepperRenderer,workflowNextButton:!!this.workflowRenderConfig.nextButtonRenderer,workflowPreviousButton:!!this.workflowRenderConfig.previousButtonRenderer,workflowSkipButton:!!this.workflowRenderConfig.skipButtonRenderer}}}validate(){let e=[],r=Array.from(this.components.values()),t=r.map(u=>u.id);try{V(t,"component");}catch(u){e.push(u instanceof Error?u.message:String(u));}let o=r.filter(u=>!u.renderer);o.length>0&&e.push(`Components without renderer: ${o.map(u=>u.id).join(", ")}`);let i=Object.keys(this.formRenderConfig),d=Object.keys(this.workflowRenderConfig),f=["rowRenderer","bodyRenderer","submitButtonRenderer","fieldRenderer"],c=["stepperRenderer","nextButtonRenderer","previousButtonRenderer","skipButtonRenderer"],l=i.filter(u=>!f.includes(u)),w=d.filter(u=>!c.includes(u));return l.length>0&&e.push(`Invalid form renderer keys: ${l.join(", ")}`),w.length>0&&e.push(`Invalid workflow renderer keys: ${w.join(", ")}`),e}async validateAsync(){let e=[],r=[],t=Array.from(this.components.values());try{let o=this.validate();e.push(...o);let i=t.map(async l=>l.renderer&&typeof l.renderer!="function"&&typeof l.renderer!="object"?`Component "${l.id}" has invalid renderer type: ${typeof l.renderer}`:((l.id.includes(" ")||l.id.includes("-"))&&r.push(`Component "${l.id}" uses non-standard naming (contains spaces or dashes)`),null)),f=(await Promise.all(i)).filter(l=>l!==null);e.push(...f),t.length>50&&r.push("Large number of components detected. Consider splitting configuration.");let c={isValid:e.length===0,errors:e,warnings:r.length>0?r:void 0};if(!c.isValid)throw new g("Ril configuration validation failed",{errors:e,warnings:r,componentCount:t.length});return c}catch(o){throw o instanceof g?o:new g("Unexpected error during async validation",{originalError:o instanceof Error?o.message:String(o)})}}};function m(n,e=[]){return {isValid:n,errors:[...e]}}function s(){return m(true,[])}function a(n,e,r){return m(false,[{message:n,code:e,path:r}])}function y(n){let e=[],r=true;for(let t of n)t.isValid||(r=false),e.push(...t.errors);return m(r,e)}function A(n,e,r){let t=n.map(o=>{let i=o(e,r);if(i instanceof Promise)throw new Error("Use runValidatorsAsync for async validators");return i});return y(t)}async function k(n,e,r){let t=await Promise.all(n.map(o=>o(e,r)));return y(t)}function B(n={}){return {fieldId:n.fieldId,formId:n.formId,stepId:n.stepId,workflowId:n.workflowId,allFormData:n.allFormData||{},stepData:n.stepData||{},workflowData:n.workflowData||{}}}function E(n="This field is required"){return e=>e==null||e===""||Array.isArray(e)&&e.length===0?a(n,"REQUIRED"):s()}function F(n,e){return r=>!r||r.length<n?a(e||`Must be at least ${n} characters long`,"MIN_LENGTH",`length.${n}`):s()}function I(n,e){return r=>r&&r.length>n?a(e||`Must be no more than ${n} characters long`,"MAX_LENGTH",`length.${n}`):s()}function O(n,e){return r=>r&&!n.test(r)?a(e||"Invalid format","PATTERN_MISMATCH",`pattern.${n.source}`):s()}function N(n="Please enter a valid email address"){let e=/^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;return r=>r&&!e.test(r)?a(n,"INVALID_EMAIL"):s()}function P(n="Please enter a valid URL"){let e=/^https?:\/\/(?:[-\w.])+(?:\:[0-9]+)?(?:\/(?:[\w/_.])*(?:\?(?:[\w&=%.])*)?(?:\#(?:[\w.])*)?)?$/;return r=>r&&!e.test(r)?a(n,"INVALID_URL"):s()}function $(n="Must be a valid number"){return e=>{let r=typeof e=="string"?Number.parseFloat(e):e;return Number.isNaN(r)||!Number.isFinite(r)?a(n,"INVALID_NUMBER"):s()}}function q(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t<n?a(e||`Must be at least ${n}`,"MIN_VALUE",`min.${n}`):s()}}function L(n,e){return r=>{let t=typeof r=="string"?Number.parseFloat(r):r;return !Number.isNaN(t)&&t>n?a(e||`Must be no more than ${n}`,"MAX_VALUE",`max.${n}`):s()}}function D(n,e,r){return (t,o)=>n(t,o)?s():a(e,r||"CUSTOM_VALIDATION_FAILED")}function M(n,e){return (r,t)=>{let o=t.allFormData?.[n];return r!==o?a(e||"Fields must match","FIELD_MISMATCH",`match.${n}`):s()}}function W(n,e){return (r,t)=>n(r,t)?e(r,t):s()}function S(n,e,r){return async(t,o)=>{try{return await n(t,o)?s():a(e,r||"ASYNC_VALIDATION_FAILED")}catch(i){return a(i instanceof Error?i.message:"Async validation error","ASYNC_ERROR")}}}var R=class{constructor(e){this.field=e,this.operator="exists",this.conditions=[];}equals(e){return this.operator="equals",this.value=e,this}notEquals(e){return this.operator="notEquals",this.value=e,this}greaterThan(e){return this.operator="greaterThan",this.value=e,this}lessThan(e){return this.operator="lessThan",this.value=e,this}greaterThanOrEqual(e){return this.operator="greaterThanOrEqual",this.value=e,this}lessThanOrEqual(e){return this.operator="lessThanOrEqual",this.value=e,this}contains(e){return this.operator="contains",this.value=e,this}notContains(e){return this.operator="notContains",this.value=e,this}in(e){return this.operator="in",this.value=e,this}notIn(e){return this.operator="notIn",this.value=e,this}matches(e){return this.operator="matches",this.value=e instanceof RegExp?e.source:e,this}exists(){return this.operator="exists",this.value=void 0,this}notExists(){return this.operator="notExists",this.value=void 0,this}and(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="and",this}or(e){let r="build"in e?e.build():e,t={field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator};return this.field="",this.operator="exists",this.value=void 0,this.conditions=[t,r],this.logicalOperator="or",this}build(){return {field:this.field,operator:this.operator,value:this.value,conditions:this.conditions,logicalOperator:this.logicalOperator}}evaluate(e){return v(this,e)}};function se(n){return new R(n)}function v(n,e){if(n.conditions&&n.conditions.length>0){let t=n.conditions.map(o=>v(o,e));return n.logicalOperator==="or"?t.some(o=>o):t.every(o=>o)}let r=U(e,n.field);switch(n.operator){case "equals":return r===n.value;case "notEquals":return r!==n.value;case "greaterThan":return typeof r=="number"&&typeof n.value=="number"&&r>n.value;case "lessThan":return typeof r=="number"&&typeof n.value=="number"&&r<n.value;case "greaterThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r>=n.value;case "lessThanOrEqual":return typeof r=="number"&&typeof n.value=="number"&&r<=n.value;case "contains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?r.includes(n.value):false;case "notContains":return typeof r=="string"&&typeof n.value=="string"||Array.isArray(r)?!r.includes(n.value):false;case "in":return Array.isArray(n.value)&&n.value.includes(r);case "notIn":return Array.isArray(n.value)&&!n.value.includes(r);case "matches":return typeof r!="string"||typeof n.value!="string"?false:new RegExp(n.value).test(r);case "exists":return r!=null;case "notExists":return r==null;default:return false}}function U(n,e){let r=e.split("."),t=n;for(let o of r)if(t&&typeof t=="object"&&o in t)t=t[o];else return;return t}export{z as ComponentRendererWrapper,b as IdGenerator,S as async,y as combineValidationResults,Y as configureObject,B as createValidationContext,m as createValidationResult,D as custom,x as deepClone,N as email,V as ensureUnique,v as evaluateCondition,M as matchField,L as max,I as maxLength,j as mergeInto,q as min,F as minLength,X as normalizeToArray,$ as number,O as pattern,E as required,T as resolveRendererChildren,h as ril,A as runValidators,k as runValidatorsAsync,P as url,H as validateRequired,W as validateWhen,se as when};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/core",
3
- "version": "7.0.0",
3
+ "version": "8.1.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",