@rilaykit/workflow 13.0.0 → 13.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
@@ -8,6 +8,7 @@ interface WorkflowState {
8
8
  allData: Record<string, any>;
9
9
  stepData: Record<string, any>;
10
10
  visitedSteps: Set<string>;
11
+ passedSteps: Set<string>;
11
12
  isSubmitting: boolean;
12
13
  isTransitioning: boolean;
13
14
  isInitializing: boolean;
@@ -34,6 +35,7 @@ declare function useWorkflowState({ defaultValues, defaultStepIndex, workflowSte
34
35
  setSubmitting: (isSubmitting: boolean) => void;
35
36
  setTransitioning: (isTransitioning: boolean) => void;
36
37
  markStepVisited: (stepIndex: number, stepId: string) => void;
38
+ markStepPassed: (stepId: string) => void;
37
39
  resetWorkflow: () => void;
38
40
  loadPersistedState: () => Promise<boolean>;
39
41
  persistence: {
@@ -72,6 +74,8 @@ interface PersistedWorkflowData {
72
74
  stepData: Record<string, any>;
73
75
  /** Set of visited step IDs */
74
76
  visitedSteps: string[];
77
+ /** Set of passed/validated step IDs */
78
+ passedSteps?: string[];
75
79
  /** When this data was last saved */
76
80
  lastSaved: number;
77
81
  /** Optional metadata for custom persistence needs */
@@ -909,6 +913,7 @@ interface UseWorkflowNavigationProps {
909
913
  setCurrentStep: (stepIndex: number) => void;
910
914
  setTransitioning: (isTransitioning: boolean) => void;
911
915
  markStepVisited: (stepIndex: number, stepId: string) => void;
916
+ markStepPassed: (stepId: string) => void;
912
917
  setStepData: (data: Record<string, any>, stepId: string) => void;
913
918
  onStepChange?: (fromStep: number, toStep: number, context: WorkflowContext) => void;
914
919
  }
@@ -922,7 +927,7 @@ interface UseWorkflowNavigationReturn {
922
927
  canGoPrevious: () => boolean;
923
928
  canSkipCurrentStep: () => boolean;
924
929
  }
925
- declare function useWorkflowNavigation({ workflowConfig, workflowState, workflowContext, conditionsHelpers, setCurrentStep, setTransitioning, markStepVisited, setStepData, onStepChange, }: UseWorkflowNavigationProps): UseWorkflowNavigationReturn;
930
+ declare function useWorkflowNavigation({ workflowConfig, workflowState, workflowContext, conditionsHelpers, setCurrentStep, setTransitioning, markStepVisited, markStepPassed, setStepData, onStepChange, }: UseWorkflowNavigationProps): UseWorkflowNavigationReturn;
926
931
 
927
932
  interface UseWorkflowSubmissionProps {
928
933
  workflowConfig: WorkflowConfig;
package/dist/index.d.ts CHANGED
@@ -8,6 +8,7 @@ interface WorkflowState {
8
8
  allData: Record<string, any>;
9
9
  stepData: Record<string, any>;
10
10
  visitedSteps: Set<string>;
11
+ passedSteps: Set<string>;
11
12
  isSubmitting: boolean;
12
13
  isTransitioning: boolean;
13
14
  isInitializing: boolean;
@@ -34,6 +35,7 @@ declare function useWorkflowState({ defaultValues, defaultStepIndex, workflowSte
34
35
  setSubmitting: (isSubmitting: boolean) => void;
35
36
  setTransitioning: (isTransitioning: boolean) => void;
36
37
  markStepVisited: (stepIndex: number, stepId: string) => void;
38
+ markStepPassed: (stepId: string) => void;
37
39
  resetWorkflow: () => void;
38
40
  loadPersistedState: () => Promise<boolean>;
39
41
  persistence: {
@@ -72,6 +74,8 @@ interface PersistedWorkflowData {
72
74
  stepData: Record<string, any>;
73
75
  /** Set of visited step IDs */
74
76
  visitedSteps: string[];
77
+ /** Set of passed/validated step IDs */
78
+ passedSteps?: string[];
75
79
  /** When this data was last saved */
76
80
  lastSaved: number;
77
81
  /** Optional metadata for custom persistence needs */
@@ -909,6 +913,7 @@ interface UseWorkflowNavigationProps {
909
913
  setCurrentStep: (stepIndex: number) => void;
910
914
  setTransitioning: (isTransitioning: boolean) => void;
911
915
  markStepVisited: (stepIndex: number, stepId: string) => void;
916
+ markStepPassed: (stepId: string) => void;
912
917
  setStepData: (data: Record<string, any>, stepId: string) => void;
913
918
  onStepChange?: (fromStep: number, toStep: number, context: WorkflowContext) => void;
914
919
  }
@@ -922,7 +927,7 @@ interface UseWorkflowNavigationReturn {
922
927
  canGoPrevious: () => boolean;
923
928
  canSkipCurrentStep: () => boolean;
924
929
  }
925
- declare function useWorkflowNavigation({ workflowConfig, workflowState, workflowContext, conditionsHelpers, setCurrentStep, setTransitioning, markStepVisited, setStepData, onStepChange, }: UseWorkflowNavigationProps): UseWorkflowNavigationReturn;
930
+ declare function useWorkflowNavigation({ workflowConfig, workflowState, workflowContext, conditionsHelpers, setCurrentStep, setTransitioning, markStepVisited, markStepPassed, setStepData, onStepChange, }: UseWorkflowNavigationProps): UseWorkflowNavigationReturn;
926
931
 
927
932
  interface UseWorkflowSubmissionProps {
928
933
  workflowConfig: WorkflowConfig;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),xt=require('react'),Ne=require('@noble/ed25519'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var xt__default=/*#__PURE__*/_interopDefault(xt);var Ne__namespace=/*#__PURE__*/_interopNamespace(Ne);var $=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(o=>o.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(o=>!this.plugins.some(l=>l.name===o));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var tt=1751361139160,rt="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,o,l]=n,a=`${i}.${o}`,g=new TextEncoder().encode(a),p=l.match(/.{2}/g);if(!p)return {valid:!1,error:"INVALID"};let s=new Uint8Array(p.map(E=>Number.parseInt(E,16))),f=k.hexToBytes(rt);if(!await Ne__namespace.verify(s,g,f))return {valid:!1,error:"SIGNATURE_INVALID"};let y=k.base64ToString(o.replace(/-/g,"+").replace(/_/g,"/")),u=JSON.parse(y),h=Math.floor(Date.now()/1e3);return u.e<h?{valid:!1,error:"EXPIRED",data:k.decompressPayload(u)}:tt>u.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(u)}:u.p===void 0||!u.c||!u.i||!u.e||!u.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(u)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,o=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<o.length;){let l=r.indexOf(o.charAt(i++)),a=r.indexOf(o.charAt(i++)),g=r.indexOf(o.charAt(i++)),p=r.indexOf(o.charAt(i++)),s=l<<18|a<<12|g<<6|p;n+=String.fromCharCode(s>>16&255),g!==64&&(n+=String.fromCharCode(s>>8&255)),p!==64&&(n+=String.fromCharCode(s&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var O=k;function ne(t,e={},r={}){return xt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let o;return i&&typeof i=="object"&&"build"in i?o=i.build():o=i,core.evaluateCondition(o,e)}catch(o){return console.warn("Error evaluating condition:",o),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Le(t,e={}){return xt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let o=l=>{try{return l&&typeof l=="object"&&"build"in l?core.evaluateCondition(l.build(),e):core.evaluateCondition(l,e)}catch(a){return console.warn(`Error evaluating condition for field ${n}:`,a),false}};r[n]={visible:i.visible?o(i.visible):true,disabled:i.disabled?o(i.disabled):false,required:i.required?o(i.required):false,readonly:i.readonly?o(i.readonly):false};}return r},[t,e])}function Ve(t,e={}){return xt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let o=Number.parseInt(n,10);if(r[o]={visible:true,disabled:false,required:false,readonly:false},i){let l=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(g){return console.warn(`Error evaluating condition for step ${o}:`,g),false}};r[o]={visible:i.visible?l(i.visible):true,disabled:i.disabled?l(i.disabled):false,required:i.required?l(i.required):false,readonly:i.readonly?l(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ie(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function nt(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function se(t,e){return e?`${e}:${t}`:t}function oe(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function it(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function Z({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[o,l]=xt.useState(false),[a,g]=xt.useState(null),[p,s]=xt.useState(false),f=xt.useRef(r),m=xt.useRef(n),y=xt.useRef({hasPendingChanges:false});xt.useEffect(()=>{f.current=r,m.current=n;},[r,n]);let u=se(m.current.storageKey||t,i),h=xt.useCallback(()=>{g(null);},[]),x=xt.useCallback((S,I)=>{let V=S instanceof R?S:new R(`${I} failed: ${S.message}`,"OPERATION_FAILED",S);g(V),console.error("[WorkflowPersistence]",V);},[]),E=xt.useCallback(async S=>{h(),l(true);try{let I=ie(t,S,m.current.metadata);await f.current.save(u,I),y.current.lastSavedState={...S},y.current.hasPendingChanges=!1;}catch(I){throw x(I,"Save"),I}finally{l(false);}},[t,u,h,x]),c=xt.useRef(oe(async S=>{try{await E(S);}catch(I){console.debug("[WorkflowPersistence] Auto-save failed:",I);}},n.debounceMs||500)),b=xt.useCallback((S,I)=>I?S.currentStepIndex!==I.currentStepIndex||JSON.stringify(S.allData)!==JSON.stringify(I.allData)||JSON.stringify(S.stepData)!==JSON.stringify(I.stepData)||S.visitedSteps.size!==I.visitedSteps.size||!Array.from(S.visitedSteps).every(V=>I.visitedSteps.has(V)):true,[]),D=xt.useCallback(async()=>{h(),s(true);try{let S=await f.current.load(u);return S&&(y.current.lastSavedState={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},y.current.hasPendingChanges=!1),S}catch(S){return x(S,"Load"),null}finally{setTimeout(()=>s(false),100);}},[u,h,x]),L=xt.useCallback(async()=>{h();try{await f.current.remove(u),y.current.lastSavedState=void 0,y.current.hasPendingChanges=!1;}catch(S){throw x(S,"Clear"),S}},[u,h,x]),d=xt.useCallback(async()=>{try{return await f.current.exists(u)}catch(S){return x(S,"Exists check"),false}},[u,x]);xt.useEffect(()=>{m.current.autoPersist&&(o||p||e.isInitializing||e.isSubmitting||e.isTransitioning||b(e,y.current.lastSavedState)&&(y.current.hasPendingChanges=true,c.current(e)));},[e,o,p,b]);let v=xt.useCallback(async()=>{await E(e);},[E,e]);return {isPersisting:o,persistenceError:a,persistNow:v,loadPersistedData:D,clearPersistedData:L,hasPersistedData:d}}function st(){let{workflowConfig:t,currentStep:e}=A(),r=xt.useMemo(()=>e?.metadata,[e?.metadata]),n=xt.useMemo(()=>p=>t.steps.find(f=>f.id===p)?.metadata,[t.steps]),i=xt.useMemo(()=>p=>t.steps[p]?.metadata,[t.steps]),o=xt.useMemo(()=>p=>r?p in r:false,[r]),l=xt.useMemo(()=>(p,s)=>r&&p in r?r[p]:s,[r]),a=xt.useMemo(()=>()=>t.steps.map((p,s)=>({id:p.id,title:p.title,index:s,metadata:p.metadata})),[t.steps]),g=xt.useMemo(()=>p=>t.steps.map((s,f)=>({step:s,index:f})).filter(({step:s,index:f})=>p(s.metadata,s.id,f)).map(({step:s})=>s.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:o,getCurrentValue:l,getAllStepsMetadata:a,findStepsByMetadata:g}}function le({workflowConfig:t,workflowState:e,workflowContext:r}){let n=xt.useRef(Date.now()),i=xt.useRef(new Map),o=xt.useRef(false),l=xt.useRef(null),a=core.getGlobalMonitor();xt.useEffect(()=>{t.analytics?.onWorkflowStart&&!o.current&&(o.current=true,t.analytics.onWorkflowStart(t.id,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,a,t.steps.length]),xt.useEffect(()=>{let m=t.steps[e.currentStepIndex];if(m&&l.current!==m.id){if(l.current&&t.analytics?.onStepComplete){let y=i.current.get(l.current);if(y){let u=Date.now()-y;t.analytics.onStepComplete(l.current,u,e.stepData,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:l.current,duration:u},{timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:u,conditionEvaluationDuration:0},"low");}}l.current=m.id,i.current.set(m.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(m.id,Date.now(),r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:m.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,a,t.id]);let g=xt.useCallback((m,y)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(m,y,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:m,reason:y},void 0,"medium");},[t.analytics,r,a,t.id]),p=xt.useCallback(m=>{t.analytics?.onError&&t.analytics.onError(m,r),a&&a.trackError(m,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,a,t.id,e.currentStepIndex,t.steps]),s=xt.useCallback((m,y,u)=>{if(!a)return;let h={timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:y,navigationDuration:u,conditionEvaluationDuration:0};a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:m,toStep:y,direction:y>m?"forward":"backward"},h,u>1e3?"medium":"low");},[a,t.id,t.steps.length]),f=xt.useCallback((m,y)=>{if(!a)return;let u={timestamp:Date.now(),duration:m,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:m};a.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:y,currentStepIndex:e.currentStepIndex},u,m>100?"medium":"low");},[a,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:g,trackError:p,trackNavigation:s,trackConditionEvaluation:f}}function pe(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],o=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,pe(i,o)):r[o]=i;}return r}function ce(t,e){let r={...t,...e},n=pe(r);return {...r,...n}}function _e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function de({workflowConfig:t,workflowState:e,currentStep:r}){let n=xt.useMemo(()=>ce(e.allData,e.stepData),[e.allData,e.stepData]),i=xt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),o=ne(i,n,{visible:true,disabled:false,required:false,readonly:false}),l=xt.useMemo(()=>_e(o,r?.allowSkip),[o,r?.allowSkip]),a=xt.useMemo(()=>{let c={};return t.steps.forEach((b,D)=>{b.conditions&&(c[D]={visible:b.conditions.visible,required:b.conditions.skippable});}),c},[t.steps]),g=Ve(a,n),p=xt.useMemo(()=>{let c={};return t.steps.forEach((b,D)=>{let L=g[D];L?c[D]=_e(L,b.allowSkip):c[D]={visible:true,skippable:b.allowSkip===true};}),c},[t.steps,g]),s=xt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let c={};for(let b of r.formConfig.allFields)b.conditions&&(c[b.id]=b.conditions);return c},[r?.formConfig?.allFields]),f=Le(s,n),m=xt.useCallback(c=>c<0||c>=t.steps.length?false:p[c]?.visible??true,[p,t.steps.length]),y=xt.useCallback(c=>c<0||c>=t.steps.length?false:p[c]?.skippable??false,[p,t.steps.length]),u=xt.useCallback(c=>f[c]?.visible??true,[f]),h=xt.useCallback(c=>f[c]?.disabled??false,[f]),x=xt.useCallback(c=>f[c]?.required??false,[f]),E=xt.useCallback(c=>f[c]?.readonly??false,[f]);return {stepConditions:l,fieldConditions:f,allStepConditions:p,isStepVisible:m,isStepSkippable:y,isFieldVisible:u,isFieldDisabled:h,isFieldRequired:x,isFieldReadonly:E}}function ue({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:o,markStepVisited:l,setStepData:a,onStepChange:g}){let p=xt.useRef(g);p.current=g;let s=t.steps[e.currentStepIndex],f=xt.useCallback(()=>({setStepData:(d,v)=>{a(v,d);},setStepFields:(d,v)=>{let I={...e.allData[d]||{},...v};a(I,d);},getStepData:d=>e.allData[d]||{},setNextStepField:(d,v)=>{let S=e.currentStepIndex+1;if(S<t.steps.length){let I=t.steps[S].id,z={...e.allData[I]||{},[d]:v};a(z,I);}},setNextStepFields:d=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let S=t.steps[v].id,V={...e.allData[S]||{},...d};a(V,S);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,a]),m=xt.useCallback(async d=>{if(d<0||d>=t.steps.length||!n.isStepVisible(d))return false;o(true);try{return p.current&&p.current(e.currentStepIndex,d,r),i(d),l(d,t.steps[d].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{o(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,o,i,l]),y=xt.useCallback(d=>{for(let v=d+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),u=xt.useCallback(d=>{for(let v=d-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),h=xt.useCallback(async()=>{if(s?.onAfterValidation)try{let v=f();await s.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let d=y(e.currentStepIndex);return d===null?false:m(d)},[s,f,e.stepData,r,t.analytics,e.currentStepIndex,y,m]),x=xt.useCallback(async()=>{let d=u(e.currentStepIndex);return d===null?false:m(d)},[e.currentStepIndex,u,m]),E=xt.useCallback(async()=>!s?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(s.id,"user_skip",r),h()),[s,n,e.currentStepIndex,t.analytics,r,h]),c=xt.useCallback(d=>d<0||d>=t.steps.length?false:n.isStepVisible(d),[t.steps.length,n]),b=xt.useCallback(()=>{let d=y(e.currentStepIndex);return d!==null&&c(d)},[e.currentStepIndex,y,c]),D=xt.useCallback(()=>{let d=u(e.currentStepIndex);return d!==null&&c(d)},[e.currentStepIndex,u,c]),L=xt.useCallback(()=>s?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[s?.allowSkip,n,e.currentStepIndex]);return {goToStep:m,goNext:h,goPrevious:x,skipStep:E,canGoToStep:c,canGoNext:b,canGoPrevious:D,canSkipCurrentStep:L}}function ct(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function fe({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=xt.useMemo(()=>{let c=new Set;if(e&&e>0&&r)for(let b=0;b<e;b++)r[b]&&c.add(r[b].id);return c},[e,r]),o={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,isSubmitting:false,isTransitioning:false,isInitializing:true},[l,a]=xt.useReducer(ct,o),g=n?.adapter?Z({workflowId:n.workflowId,workflowState:l,adapter:n.adapter,options:n.options,userId:n.userId}):null,p=xt.useCallback(c=>{a({type:"SET_CURRENT_STEP",stepIndex:c});},[]),s=xt.useCallback((c,b)=>{a({type:"SET_STEP_DATA",data:c,stepId:b});},[]),f=xt.useCallback((c,b,D)=>{a({type:"SET_FIELD_VALUE",fieldId:c,value:b,stepId:D});},[]),m=xt.useCallback(c=>{a({type:"SET_SUBMITTING",isSubmitting:c});},[]),y=xt.useCallback(c=>{a({type:"SET_TRANSITIONING",isTransitioning:c});},[]),u=xt.useCallback((c,b)=>{a({type:"MARK_STEP_VISITED",stepIndex:c,stepId:b});},[]),h=xt.useCallback(()=>{a({type:"RESET_WORKFLOW"});},[]),x=xt.useCallback(()=>{a({type:"SET_INITIALIZATION_COMPLETE"});},[]),E=xt.useCallback(async()=>{if(!g)return x(),false;try{let c=await g.loadPersistedData();if(c){let b={currentStepIndex:c.currentStepIndex,allData:c.allData,stepData:c.stepData,visitedSteps:new Set(c.visitedSteps)};return a({type:"LOAD_PERSISTED_STATE",state:b}),x(),!0}}catch(c){console.error("Failed to load persisted state:",c);}return x(),false},[g,x]);return {workflowState:l,setCurrentStep:p,setStepData:s,setFieldValue:f,setSubmitting:m,setTransitioning:y,markStepVisited:u,resetWorkflow:h,loadPersistedState:E,persistence:g?{isPersisting:g.isPersisting,persistenceError:g.persistenceError,persistNow:g.persistNow,clearPersistedData:g.clearPersistedData,hasPersistedData:g.hasPersistedData}:null}}function me({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:o}){let l=xt.useRef(i);l.current=i;let a=xt.useCallback(async()=>{n(true);try{if(l.current&&await l.current(e.allData),t.analytics?.onWorkflowComplete){let p=Date.now()-o.current;t.analytics.onWorkflowComplete(t.id,p,e.allData);}}catch(p){throw console.error("Workflow submission failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),p}finally{n(false);}},[e.allData,t.analytics,t.id,r,o,n]),g=xt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:a,isSubmitting:e.isSubmitting,canSubmit:g()}}var Ge=xt.createContext(null);function be({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:o,className:l}){let a=xt.useRef(i),g=xt.useRef(o);a.current=i,g.current=o;let p=xt.useMemo(()=>{if(!n)return 0;let w=e.steps.findIndex(P=>P.id===n);return w===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):w},[n,e.steps]),{workflowState:s,setCurrentStep:f,setStepData:m,setFieldValue:y,setSubmitting:u,setTransitioning:h,markStepVisited:x,resetWorkflow:E,loadPersistedState:c,persistence:b}=fe({defaultValues:r,defaultStepIndex:p,workflowSteps:e.steps,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});xt.useEffect(()=>{e.persistence&&c&&c();},[]);let D=xt.useMemo(()=>({isPersisting:b?.isPersisting??false,persistenceError:b?.persistenceError??null,persistNow:b?.persistNow}),[b?.isPersisting,b?.persistenceError,b?.persistNow]),L=xt.useMemo(()=>({workflowId:e.id,currentStepIndex:s.currentStepIndex,totalSteps:e.steps.length,allData:s.allData,stepData:s.stepData,visitedSteps:s.visitedSteps}),[e.id,e.steps.length,s.currentStepIndex,s.allData,s.stepData,s.visitedSteps]),d=xt.useMemo(()=>e.steps[s.currentStepIndex],[e.steps,s.currentStepIndex]),v=xt.useMemo(()=>d?.formConfig,[d?.formConfig]),S=de({workflowConfig:e,workflowState:s,currentStep:d}),I=xt.useMemo(()=>{let w=-1;for(let W=0;W<e.steps.length;W++)if(S.isStepVisible(W)){w=W;break}let P=-1;for(let W=e.steps.length-1;W>=0;W--)if(S.isStepVisible(W)){P=W;break}let T=new Set;for(let W=0;W<e.steps.length;W++){let K=e.steps[W];S.isStepVisible(W)&&s.visitedSteps.has(K.id)&&T.add(K.id);}let B=new Set;for(let W=0;W<s.currentStepIndex;W++){let K=e.steps[W];s.visitedSteps.has(K.id)&&B.add(K.id);}return {...L,isFirstStep:s.currentStepIndex===w,isLastStep:s.currentStepIndex===P,visibleVisitedSteps:T,passedSteps:B}},[L,s.currentStepIndex,s.visitedSteps,S,e.steps]),{analyticsStartTime:V}=le({workflowConfig:e,workflowState:s,workflowContext:I}),{goToStep:z,goNext:J,goPrevious:xe,skipStep:Ie,canGoToStep:ke,canGoNext:Pe,canGoPrevious:We,canSkipCurrentStep:De}=ue({workflowConfig:e,workflowState:s,workflowContext:I,conditionsHelpers:S,setCurrentStep:f,setTransitioning:h,markStepVisited:x,setStepData:m,onStepChange:a.current}),Q=xt.useRef(false);xt.useEffect(()=>{if(Q.current)return;if(!S.isStepVisible(s.currentStepIndex)){for(let P=0;P<e.steps.length;P++)if(S.isStepVisible(P)){f(P),x(P,e.steps[P].id);break}}Q.current=true;},[s.currentStepIndex,e.steps,f,x]),xt.useEffect(()=>{if(!Q.current)return;if(!S.isStepVisible(s.currentStepIndex)){let P=null;for(let T=s.currentStepIndex+1;T<e.steps.length;T++)if(S.isStepVisible(T)){P=T;break}if(P===null){for(let T=s.currentStepIndex-1;T>=0;T--)if(S.isStepVisible(T)){P=T;break}}P!==null&&(f(P),x(P,e.steps[P].id));}},[S,s.currentStepIndex,e.steps,f,x]);let{submitWorkflow:X,isSubmitting:Re,canSubmit:Ee}=me({workflowConfig:e,workflowState:s,workflowContext:I,setSubmitting:u,onWorkflowComplete:g.current,analyticsStartTime:V}),ee=xt.useCallback((w,P)=>{y(w,P,d?.id||"");},[y,d?.id]),we=xt.useCallback(w=>{m(w,d?.id||"");},[m,d?.id]),Je=xt.useCallback(async w=>{d?.id&&w&&m(w,d.id),I.isLastStep?await X():await J();},[I.isLastStep,X,J,d?.id,m]),Te=xt.useMemo(()=>({goToStep:z,goNext:J,goPrevious:xe,skipStep:Ie,canGoToStep:ke,canGoNext:Pe,canGoPrevious:We,canSkipCurrentStep:De}),[z,J,xe,Ie,ke,Pe,We,De]),Ae=xt.useMemo(()=>({setValue:ee,setStepData:we,resetWorkflow:E}),[ee,we,E]),Ce=xt.useMemo(()=>({submitWorkflow:X,isSubmitting:Re,canSubmit:Ee}),[X,Re,Ee]),Xe=xt.useMemo(()=>({workflowState:s,workflowConfig:e,currentStep:d,context:I,formConfig:v,conditionsHelpers:S,currentStepMetadata:d?.metadata,...Te,...Ae,...Ce,persistNow:D.persistNow,isPersisting:D.isPersisting,persistenceError:D.persistenceError}),[s,e,d,I,v,S,Te,Ae,Ce,D]),He=xt.useMemo(()=>{if(!d?.id)return {};let w=s?.allData[d.id]||{};if(!v?.allFields)return w;let P=new Set(v.allFields.map(B=>B.id)),T={};for(let[B,W]of Object.entries(w))P.has(B)&&(T[B]=W);return T},[s?.allData,d?.id,v?.allFields]),Ze=xt.useMemo(()=>s.isInitializing.toString(),[s.isInitializing]);return jsxRuntime.jsx(Ge.Provider,{value:Xe,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:v,defaultValues:He,onFieldChange:ee,"data-workflow-id":e.id,className:l,onSubmit:Je,children:t},Ze)})}function A(){let t=xt.useContext(Ge);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function bt({children:t,workflowConfig:e,...r}){let[n,i]=xt.useState(),o=xt.useMemo(()=>e instanceof $?e.build():e,[e]);return xt.useEffect(()=>{if(typeof window<"u"&&O.shouldDisplayWatermark()){let a=O.getWatermarkMessage();i(a);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(be,{...r,workflowConfig:o,children:t}),n&&jsxRuntime.jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var It=xt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=A();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:o}=n;return i?o?o(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Et=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:o,workflowConfig:l,currentStep:a}=A(),{submit:g,formState:p}=forms.useFormContext(),s=xt.useMemo(()=>{let y=p.isSubmitting||o.isSubmitting,u=r??y,h=!o.isTransitioning&&!u;return {finalIsSubmitting:u,canGoNext:h}},[p.isSubmitting,o.isSubmitting,o.isTransitioning,r]),f=xt.useCallback(async y=>{y?.preventDefault(),s.canGoNext&&await g(y);},[s.canGoNext,g]),m=xt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:s.canGoNext,isSubmitting:s.finalIsSubmitting,onSubmit:f,className:e,currentStep:a,stepData:p.values||{},allData:i.allData,context:i}),[i.isLastStep,s.canGoNext,s.finalIsSubmitting,f,e,a,p.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:l.renderConfig?.nextButtonRenderer,props:m,...n})});var Lt=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:o,workflowState:l,workflowConfig:a,currentStep:g}=A(),{formState:p}=forms.useFormContext(),s=xt.useMemo(()=>{let y=p.isSubmitting||l.isSubmitting,u=r??y,h=i.currentStepIndex>0&&!l.isTransitioning&&!u;return {finalIsSubmitting:u,canGoPrevious:h}},[p.isSubmitting,l.isSubmitting,l.isTransitioning,i.currentStepIndex,r]),f=xt.useCallback(async y=>{y?.preventDefault(),s.canGoPrevious&&await o();},[s.canGoPrevious,o]),m=xt.useMemo(()=>({canGoPrevious:s.canGoPrevious,isSubmitting:s.finalIsSubmitting,onPrevious:f,className:e,currentStep:g,stepData:p.values||{},allData:i.allData,context:i}),[s.canGoPrevious,s.finalIsSubmitting,f,e,g,p.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:a.renderConfig?.previousButtonRenderer,props:m,...n})});var Ot=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:o,workflowState:l,workflowConfig:a,context:g,conditionsHelpers:p}=A(),{formState:s}=forms.useFormContext(),f=xt.useMemo(()=>{let u=s.isSubmitting||l.isSubmitting,h=r??u,x=(!!i?.allowSkip||p.isStepSkippable(l.currentStepIndex))&&!l.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:x}},[s.isSubmitting,l.isSubmitting,l.isTransitioning,l.currentStepIndex,i?.allowSkip,p.isStepSkippable,r]),m=xt.useCallback(async u=>{u?.preventDefault(),f.canSkip&&await o();},[f.canSkip,o]),y=xt.useMemo(()=>({canSkip:f.canSkip,isSubmitting:f.finalIsSubmitting,onSkip:m,className:e,currentStep:i,stepData:s.values||{},allData:g.allData,context:g}),[f.canSkip,f.finalIsSubmitting,m,e,i,s.values,g.allData,g]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:a.renderConfig?.skipButtonRenderer,props:y,...n})});var qt=xt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:o,context:l,goToStep:a,conditionsHelpers:g}=A(),{visibleSteps:p,visibleToOriginalIndexMap:s,originalToVisibleIndexMap:f}=xt.useMemo(()=>{let h=[],x=new Map,E=new Map;return i.steps.forEach((c,b)=>{if(g.isStepVisible(b)){let D=h.length;h.push(c),x.set(D,b),E.set(b,D);}}),{visibleSteps:h,visibleToOriginalIndexMap:x,originalToVisibleIndexMap:E}},[i.steps,g]),m=xt.useCallback(h=>{let x=s.get(h);x!==void 0&&(e?e(x):a(x));},[s,e,a]),y=xt.useMemo(()=>f.get(o.currentStepIndex)??-1,[f,o.currentStepIndex]),u=xt.useMemo(()=>({steps:p,currentStepIndex:y,visitedSteps:l.visibleVisitedSteps,onStepClick:m,className:r}),[p,y,l.visibleVisitedSteps,m,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:u,...n})});var he=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},o=JSON.stringify(i),l=this.compress?this.compressData(o):o;localStorage.setItem(n,l);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),o={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},l=JSON.stringify(o),a=this.compress?this.compressData(l):l;localStorage.setItem(i,a);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,o=JSON.parse(i);return o.expiresAt&&Date.now()>o.expiresAt?(await this.remove(e),null):{...o.data,visitedSteps:Array.isArray(o.data.visitedSteps)?o.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,o=JSON.parse(i);return o.expiresAt&&Date.now()>o.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let o=this.compress?this.decompressData(i):i,l=JSON.parse(o);l.expiresAt&&Date.now()>l.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
- exports.LocalStorageAdapter=he;exports.RilayLicenseManager=O;exports.Workflow=bt;exports.WorkflowBody=It;exports.WorkflowNextButton=Et;exports.WorkflowPersistenceError=R;exports.WorkflowPreviousButton=Lt;exports.WorkflowProvider=be;exports.WorkflowSkipButton=Ot;exports.WorkflowStepper=qt;exports.combineWorkflowDataForConditions=ce;exports.debounce=oe;exports.flattenObject=pe;exports.flow=$;exports.generateStorageKey=se;exports.mergePersistedState=it;exports.persistedToWorkflowState=Me;exports.useConditionEvaluation=ne;exports.usePersistence=Z;exports.useStepMetadata=st;exports.useWorkflowAnalytics=le;exports.useWorkflowConditions=de;exports.useWorkflowContext=A;exports.useWorkflowNavigation=ue;exports.useWorkflowState=fe;exports.useWorkflowSubmission=me;exports.validatePersistedData=nt;exports.workflowStateToPersisted=ie;
1
+ 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),xt=require('react'),Ne=require('@noble/ed25519'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var xt__default=/*#__PURE__*/_interopDefault(xt);var Ne__namespace=/*#__PURE__*/_interopNamespace(Ne);var G=class t{constructor(e,r,n,s){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=s;}static create(e,r,n,s){return new t(e,r,n,s)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let s=this.createStepFromDefinition(n);this.steps.push(s);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(s=>s.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let s={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:s},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let s=n.dependencies.filter(i=>!this.plugins.some(l=>l.name===i));s.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${s.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,s)=>n+s.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var rt=1751361139160,nt="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[s,i,l]=n,c=`${s}.${i}`,m=new TextEncoder().encode(c),a=l.match(/.{2}/g);if(!a)return {valid:!1,error:"INVALID"};let o=new Uint8Array(a.map(T=>Number.parseInt(T,16))),d=k.hexToBytes(nt);if(!await Ne__namespace.verify(o,m,d))return {valid:!1,error:"SIGNATURE_INVALID"};let S=k.base64ToString(i.replace(/-/g,"+").replace(/_/g,"/")),f=JSON.parse(S),h=Math.floor(Date.now()/1e3);return f.e<h?{valid:!1,error:"EXPIRED",data:k.decompressPayload(f)}:rt>f.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(f)}:f.p===void 0||!f.c||!f.i||!f.e||!f.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(f)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",s=0,i=e.replace(/[^A-Za-z0-9+/]/g,"");for(;s<i.length;){let l=r.indexOf(i.charAt(s++)),c=r.indexOf(i.charAt(s++)),m=r.indexOf(i.charAt(s++)),a=r.indexOf(i.charAt(s++)),o=l<<18|c<<12|m<<6|a;n+=String.fromCharCode(o>>16&255),m!==64&&(n+=String.fromCharCode(o>>8&255)),a!==64&&(n+=String.fromCharCode(o&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var B=k;function ne(t,e={},r={}){return xt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=s=>{try{let i;return s&&typeof s=="object"&&"build"in s?i=s.build():i=s,core.evaluateCondition(i,e)}catch(i){return console.warn("Error evaluating condition:",i),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Le(t,e={}){return xt.useMemo(()=>{let r={};for(let[n,s]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},s){let i=l=>{try{return l&&typeof l=="object"&&"build"in l?core.evaluateCondition(l.build(),e):core.evaluateCondition(l,e)}catch(c){return console.warn(`Error evaluating condition for field ${n}:`,c),false}};r[n]={visible:s.visible?i(s.visible):true,disabled:s.disabled?i(s.disabled):false,required:s.required?i(s.required):false,readonly:s.readonly?i(s.readonly):false};}return r},[t,e])}function Me(t,e={}){return xt.useMemo(()=>{let r={};for(let[n,s]of Object.entries(t)){let i=Number.parseInt(n,10);if(r[i]={visible:true,disabled:false,required:false,readonly:false},s){let l=c=>{try{return c&&typeof c=="object"&&"build"in c?core.evaluateCondition(c.build(),e):core.evaluateCondition(c,e)}catch(m){return console.warn(`Error evaluating condition for step ${i}:`,m),false}};r[i]={visible:s.visible?l(s.visible):true,disabled:s.disabled?l(s.disabled):false,required:s.required?l(s.required):false,readonly:s.readonly?l(s.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,s){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=s;this.name="WorkflowPersistenceError";}};function se(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ve(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function st(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function ie(t,e){return e?`${e}:${t}`:t}function oe(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function it(t,e,r="persist"){let n=Ve(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function Z({workflowId:t,workflowState:e,adapter:r,options:n={},userId:s}){let[i,l]=xt.useState(false),[c,m]=xt.useState(null),[a,o]=xt.useState(false),d=xt.useRef(r),g=xt.useRef(n),S=xt.useRef({hasPendingChanges:false});xt.useEffect(()=>{d.current=r,g.current=n;},[r,n]);let f=ie(g.current.storageKey||t,s),h=xt.useCallback(()=>{m(null);},[]),P=xt.useCallback((p,v)=>{let R=p instanceof E?p:new E(`${v} failed: ${p.message}`,"OPERATION_FAILED",p);m(R),console.error("[WorkflowPersistence]",R);},[]),T=xt.useCallback(async p=>{h(),l(true);try{let v=se(t,p,g.current.metadata);await d.current.save(f,v),S.current.lastSavedState={...p},S.current.hasPendingChanges=!1;}catch(v){throw P(v,"Save"),v}finally{l(false);}},[t,f,h,P]),b=xt.useRef(oe(async p=>{try{await T(p);}catch(v){console.debug("[WorkflowPersistence] Auto-save failed:",v);}},n.debounceMs||500)),x=xt.useCallback((p,v)=>v?p.currentStepIndex!==v.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(v.allData)||JSON.stringify(p.stepData)!==JSON.stringify(v.stepData)||p.visitedSteps.size!==v.visitedSteps.size||!Array.from(p.visitedSteps).every(R=>v.visitedSteps.has(R)):true,[]),y=xt.useCallback(async()=>{h(),o(true);try{let p=await d.current.load(f);return p&&(S.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},S.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>o(false),100);}},[f,h,P]),I=xt.useCallback(async()=>{h();try{await d.current.remove(f),S.current.lastSavedState=void 0,S.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[f,h,P]),V=xt.useCallback(async()=>{try{return await d.current.exists(f)}catch(p){return P(p,"Exists check"),false}},[f,P]);xt.useEffect(()=>{g.current.autoPersist&&(i||a||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,S.current.lastSavedState)&&(S.current.hasPendingChanges=true,b.current(e)));},[e,i,a,x]);let u=xt.useCallback(async()=>{await T(e);},[T,e]);return {isPersisting:i,persistenceError:c,persistNow:u,loadPersistedData:y,clearPersistedData:I,hasPersistedData:V}}function ot(){let{workflowConfig:t,currentStep:e}=C(),r=xt.useMemo(()=>e?.metadata,[e?.metadata]),n=xt.useMemo(()=>a=>t.steps.find(d=>d.id===a)?.metadata,[t.steps]),s=xt.useMemo(()=>a=>t.steps[a]?.metadata,[t.steps]),i=xt.useMemo(()=>a=>r?a in r:false,[r]),l=xt.useMemo(()=>(a,o)=>r&&a in r?r[a]:o,[r]),c=xt.useMemo(()=>()=>t.steps.map((a,o)=>({id:a.id,title:a.title,index:o,metadata:a.metadata})),[t.steps]),m=xt.useMemo(()=>a=>t.steps.map((o,d)=>({step:o,index:d})).filter(({step:o,index:d})=>a(o.metadata,o.id,d)).map(({step:o})=>o.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:s,hasCurrentKey:i,getCurrentValue:l,getAllStepsMetadata:c,findStepsByMetadata:m}}function le({workflowConfig:t,workflowState:e,workflowContext:r}){let n=xt.useRef(Date.now()),s=xt.useRef(new Map),i=xt.useRef(false),l=xt.useRef(null),c=core.getGlobalMonitor();xt.useEffect(()=>{t.analytics?.onWorkflowStart&&!i.current&&(i.current=true,t.analytics.onWorkflowStart(t.id,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,c,t.steps.length]),xt.useEffect(()=>{let g=t.steps[e.currentStepIndex];if(g&&l.current!==g.id){if(l.current&&t.analytics?.onStepComplete){let S=s.current.get(l.current);if(S){let f=Date.now()-S;t.analytics.onStepComplete(l.current,f,e.stepData,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:l.current,duration:f},{timestamp:Date.now(),duration:f,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:f,conditionEvaluationDuration:0},"low");}}l.current=g.id,s.current.set(g.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(g.id,Date.now(),r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:g.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,c,t.id]);let m=xt.useCallback((g,S)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(g,S,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:g,reason:S},void 0,"medium");},[t.analytics,r,c,t.id]),a=xt.useCallback(g=>{t.analytics?.onError&&t.analytics.onError(g,r),c&&c.trackError(g,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,c,t.id,e.currentStepIndex,t.steps]),o=xt.useCallback((g,S,f)=>{if(!c)return;let h={timestamp:Date.now(),duration:f,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:S,navigationDuration:f,conditionEvaluationDuration:0};c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:g,toStep:S,direction:S>g?"forward":"backward"},h,f>1e3?"medium":"low");},[c,t.id,t.steps.length]),d=xt.useCallback((g,S)=>{if(!c)return;let f={timestamp:Date.now(),duration:g,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:g};c.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:S,currentStepIndex:e.currentStepIndex},f,g>100?"medium":"low");},[c,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:m,trackError:a,trackNavigation:o,trackConditionEvaluation:d}}function pe(t,e=""){let r={};for(let n in t)if(n in t){let s=t[n],i=e?`${e}.${n}`:n;s!==null&&typeof s=="object"&&!Array.isArray(s)&&!(s instanceof Date)?Object.assign(r,pe(s,i)):r[i]=s;}return r}function ce(t,e){let r={...t,...e},n=pe(r);return {...r,...n}}function Be(t,e){return {visible:t.visible,skippable:e===true||t.required}}function de({workflowConfig:t,workflowState:e,currentStep:r}){let n=xt.useMemo(()=>ce(e.allData,e.stepData),[e.allData,e.stepData]),s=xt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),i=ne(s,n,{visible:true,disabled:false,required:false,readonly:false}),l=xt.useMemo(()=>Be(i,r?.allowSkip),[i,r?.allowSkip]),c=xt.useMemo(()=>{let b={};return t.steps.forEach((x,y)=>{x.conditions&&(b[y]={visible:x.conditions.visible,required:x.conditions.skippable});}),b},[t.steps]),m=Me(c,n),a=xt.useMemo(()=>{let b={};return t.steps.forEach((x,y)=>{let I=m[y];I?b[y]=Be(I,x.allowSkip):b[y]={visible:true,skippable:x.allowSkip===true};}),b},[t.steps,m]),o=xt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let b={};for(let x of r.formConfig.allFields)x.conditions&&(b[x.id]=x.conditions);return b},[r?.formConfig?.allFields]),d=Le(o,n),g=xt.useCallback(b=>b<0||b>=t.steps.length?false:a[b]?.visible??true,[a,t.steps.length]),S=xt.useCallback(b=>b<0||b>=t.steps.length?false:a[b]?.skippable??false,[a,t.steps.length]),f=xt.useCallback(b=>d[b]?.visible??true,[d]),h=xt.useCallback(b=>d[b]?.disabled??false,[d]),P=xt.useCallback(b=>d[b]?.required??false,[d]),T=xt.useCallback(b=>d[b]?.readonly??false,[d]);return {stepConditions:l,fieldConditions:d,allStepConditions:a,isStepVisible:g,isStepSkippable:S,isFieldVisible:f,isFieldDisabled:h,isFieldRequired:P,isFieldReadonly:T}}function ue({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:s,setTransitioning:i,markStepVisited:l,markStepPassed:c,setStepData:m,onStepChange:a}){let o=xt.useRef(a);o.current=a;let d=t.steps[e.currentStepIndex],g=xt.useCallback(()=>({setStepData:(u,p)=>{m(p,u);},setStepFields:(u,p)=>{let R={...e.allData[u]||{},...p};m(R,u);},getStepData:u=>e.allData[u]||{},setNextStepField:(u,p)=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let R=t.steps[v].id,q={...e.allData[R]||{},[u]:p};m(q,R);}},setNextStepFields:u=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let v=t.steps[p].id,$={...e.allData[v]||{},...u};m($,v);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,m]),S=xt.useCallback(async u=>{if(u<0||u>=t.steps.length||!n.isStepVisible(u))return false;i(true);try{return o.current&&o.current(e.currentStepIndex,u,r),s(u),l(u,t.steps[u].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{i(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,i,s,l]),f=xt.useCallback(u=>{for(let p=u+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),h=xt.useCallback(u=>{for(let p=u-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=xt.useCallback(async()=>{if(d?.onAfterValidation)try{let p=g();await d.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}c(d.id);let u=f(e.currentStepIndex);return u===null?false:S(u)},[d,g,e.stepData,r,t.analytics,e.currentStepIndex,f,S,c]),T=xt.useCallback(async()=>{let u=h(e.currentStepIndex);return u===null?false:S(u)},[e.currentStepIndex,h,S]),b=xt.useCallback(async()=>!d?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(d.id,"user_skip",r),P()),[d,n,e.currentStepIndex,t.analytics,r,P]),x=xt.useCallback(u=>u<0||u>=t.steps.length?false:n.isStepVisible(u),[t.steps.length,n]),y=xt.useCallback(()=>{let u=f(e.currentStepIndex);return u!==null&&x(u)},[e.currentStepIndex,f,x]),I=xt.useCallback(()=>{let u=h(e.currentStepIndex);return u!==null&&x(u)},[e.currentStepIndex,h,x]),V=xt.useCallback(()=>d?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[d?.allowSkip,n,e.currentStepIndex]);return {goToStep:S,goNext:P,goPrevious:T,skipStep:b,canGoToStep:x,canGoNext:y,canGoPrevious:I,canSkipCurrentStep:V}}function ct(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function fe({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let s=xt.useMemo(()=>{let y=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&y.add(r[I].id);return y},[e,r]),i=xt.useMemo(()=>{let y=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&y.add(r[I].id);return y},[e,r]),l={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:s,passedSteps:i,isSubmitting:false,isTransitioning:false,isInitializing:true},[c,m]=xt.useReducer(ct,l),a=n?.adapter?Z({workflowId:n.workflowId,workflowState:c,adapter:n.adapter,options:n.options,userId:n.userId}):null,o=xt.useCallback(y=>{m({type:"SET_CURRENT_STEP",stepIndex:y});},[]),d=xt.useCallback((y,I)=>{m({type:"SET_STEP_DATA",data:y,stepId:I});},[]),g=xt.useCallback((y,I,V)=>{m({type:"SET_FIELD_VALUE",fieldId:y,value:I,stepId:V});},[]),S=xt.useCallback(y=>{m({type:"SET_SUBMITTING",isSubmitting:y});},[]),f=xt.useCallback(y=>{m({type:"SET_TRANSITIONING",isTransitioning:y});},[]),h=xt.useCallback((y,I)=>{m({type:"MARK_STEP_VISITED",stepIndex:y,stepId:I});},[]),P=xt.useCallback(y=>{m({type:"MARK_STEP_PASSED",stepId:y});},[]),T=xt.useCallback(()=>{m({type:"RESET_WORKFLOW"});},[]),b=xt.useCallback(()=>{m({type:"SET_INITIALIZATION_COMPLETE"});},[]),x=xt.useCallback(async()=>{if(!a)return b(),false;try{let y=await a.loadPersistedData();if(y){let I={currentStepIndex:y.currentStepIndex,allData:y.allData,stepData:y.stepData,visitedSteps:new Set(y.visitedSteps),passedSteps:new Set(y.passedSteps||[])};return m({type:"LOAD_PERSISTED_STATE",state:I}),b(),!0}}catch(y){console.error("Failed to load persisted state:",y);}return b(),false},[a,b]);return {workflowState:c,setCurrentStep:o,setStepData:d,setFieldValue:g,setSubmitting:S,setTransitioning:f,markStepVisited:h,markStepPassed:P,resetWorkflow:T,loadPersistedState:x,persistence:a?{isPersisting:a.isPersisting,persistenceError:a.persistenceError,persistNow:a.persistNow,clearPersistedData:a.clearPersistedData,hasPersistedData:a.hasPersistedData}:null}}function me({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:s,analyticsStartTime:i}){let l=xt.useRef(s);l.current=s;let c=xt.useCallback(async()=>{n(true);try{if(l.current&&await l.current(e.allData),t.analytics?.onWorkflowComplete){let a=Date.now()-i.current;t.analytics.onWorkflowComplete(t.id,a,e.allData);}}catch(a){throw console.error("Workflow submission failed:",a),t.analytics?.onError&&t.analytics.onError(a,r),a}finally{n(false);}},[e.allData,t.analytics,t.id,r,i,n]),m=xt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:c,isSubmitting:e.isSubmitting,canSubmit:m()}}var Ke=xt.createContext(null);function be({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:s,onWorkflowComplete:i,className:l}){let c=xt.useRef(s),m=xt.useRef(i);c.current=s,m.current=i;let a=xt.useMemo(()=>{if(!n)return 0;let w=e.steps.findIndex(W=>W.id===n);return w===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):w},[n,e.steps]),{workflowState:o,setCurrentStep:d,setStepData:g,setFieldValue:S,setSubmitting:f,setTransitioning:h,markStepVisited:P,markStepPassed:T,resetWorkflow:b,loadPersistedState:x,persistence:y}=fe({defaultValues:r,defaultStepIndex:a,workflowSteps:e.steps,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});xt.useEffect(()=>{e.persistence&&x&&x();},[]);let I=xt.useMemo(()=>({isPersisting:y?.isPersisting??false,persistenceError:y?.persistenceError??null,persistNow:y?.persistNow}),[y?.isPersisting,y?.persistenceError,y?.persistNow]),V=xt.useMemo(()=>({workflowId:e.id,currentStepIndex:o.currentStepIndex,totalSteps:e.steps.length,allData:o.allData,stepData:o.stepData,visitedSteps:o.visitedSteps}),[e.id,e.steps.length,o.currentStepIndex,o.allData,o.stepData,o.visitedSteps]),u=xt.useMemo(()=>e.steps[o.currentStepIndex],[e.steps,o.currentStepIndex]),p=xt.useMemo(()=>u?.formConfig,[u?.formConfig]),v=de({workflowConfig:e,workflowState:o,currentStep:u}),R=xt.useMemo(()=>{let w=-1;for(let D=0;D<e.steps.length;D++)if(v.isStepVisible(D)){w=D;break}let W=-1;for(let D=e.steps.length-1;D>=0;D--)if(v.isStepVisible(D)){W=D;break}let A=new Set;for(let D=0;D<e.steps.length;D++){let X=e.steps[D];v.isStepVisible(D)&&o.visitedSteps.has(X.id)&&A.add(X.id);}return {...V,isFirstStep:o.currentStepIndex===w,isLastStep:o.currentStepIndex===W,visibleVisitedSteps:A,passedSteps:o.passedSteps}},[V,o.currentStepIndex,o.visitedSteps,o.passedSteps,v,e.steps]),{analyticsStartTime:$}=le({workflowConfig:e,workflowState:o,workflowContext:R}),{goToStep:q,goNext:z,goPrevious:xe,skipStep:Pe,canGoToStep:Ie,canGoNext:ke,canGoPrevious:We,canSkipCurrentStep:De}=ue({workflowConfig:e,workflowState:o,workflowContext:R,conditionsHelpers:v,setCurrentStep:d,setTransitioning:h,markStepVisited:P,markStepPassed:T,setStepData:g,onStepChange:c.current}),Q=xt.useRef(false);xt.useEffect(()=>{if(Q.current)return;if(!v.isStepVisible(o.currentStepIndex)){for(let W=0;W<e.steps.length;W++)if(v.isStepVisible(W)){d(W),P(W,e.steps[W].id);break}}Q.current=true;},[o.currentStepIndex,e.steps,d,P]),xt.useEffect(()=>{if(!Q.current)return;if(!v.isStepVisible(o.currentStepIndex)){let W=null;for(let A=o.currentStepIndex+1;A<e.steps.length;A++)if(v.isStepVisible(A)){W=A;break}if(W===null){for(let A=o.currentStepIndex-1;A>=0;A--)if(v.isStepVisible(A)){W=A;break}}W!==null&&(d(W),P(W,e.steps[W].id));}},[v,o.currentStepIndex,e.steps,d,P]);let{submitWorkflow:J,isSubmitting:Re,canSubmit:Ee}=me({workflowConfig:e,workflowState:o,workflowContext:R,setSubmitting:f,onWorkflowComplete:m.current,analyticsStartTime:$}),ee=xt.useCallback((w,W)=>{S(w,W,u?.id||"");},[S,u?.id]),we=xt.useCallback(w=>{g(w,u?.id||"");},[g,u?.id]),Xe=xt.useCallback(async w=>{u?.id&&w&&g(w,u.id),R.isLastStep?await J():await z();},[R.isLastStep,J,z,u?.id,g]),Te=xt.useMemo(()=>({goToStep:q,goNext:z,goPrevious:xe,skipStep:Pe,canGoToStep:Ie,canGoNext:ke,canGoPrevious:We,canSkipCurrentStep:De}),[q,z,xe,Pe,Ie,ke,We,De]),Ae=xt.useMemo(()=>({setValue:ee,setStepData:we,resetWorkflow:b}),[ee,we,b]),Ce=xt.useMemo(()=>({submitWorkflow:J,isSubmitting:Re,canSubmit:Ee}),[J,Re,Ee]),He=xt.useMemo(()=>({workflowState:o,workflowConfig:e,currentStep:u,context:R,formConfig:p,conditionsHelpers:v,currentStepMetadata:u?.metadata,...Te,...Ae,...Ce,persistNow:I.persistNow,isPersisting:I.isPersisting,persistenceError:I.persistenceError}),[o,e,u,R,p,v,Te,Ae,Ce,I]),Ze=xt.useMemo(()=>{if(!u?.id)return {};let w=o?.allData[u.id]||{};if(!p?.allFields)return w;let W=new Set(p.allFields.map(D=>D.id)),A={};for(let[D,X]of Object.entries(w))W.has(D)&&(A[D]=X);return A},[o?.allData,u?.id,p?.allFields]),je=xt.useMemo(()=>o.isInitializing.toString(),[o.isInitializing]);return jsxRuntime.jsx(Ke.Provider,{value:He,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:p,defaultValues:Ze,onFieldChange:ee,"data-workflow-id":e.id,className:l,onSubmit:Xe,children:t},je)})}function C(){let t=xt.useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function bt({children:t,workflowConfig:e,...r}){let[n,s]=xt.useState(),i=xt.useMemo(()=>e instanceof G?e.build():e,[e]);return xt.useEffect(()=>{if(typeof window<"u"&&B.shouldDisplayWatermark()){let c=B.getWatermarkMessage();s(c);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(be,{...r,workflowConfig:i,children:t}),n&&jsxRuntime.jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var Pt=xt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=C();if(!n||e&&n.id!==e)return null;let{formConfig:s,renderer:i}=n;return s?i?i(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Et=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:s,workflowState:i,workflowConfig:l,currentStep:c}=C(),{submit:m,formState:a}=forms.useFormContext(),o=xt.useMemo(()=>{let S=a.isSubmitting||i.isSubmitting,f=r??S,h=!i.isTransitioning&&!f;return {finalIsSubmitting:f,canGoNext:h}},[a.isSubmitting,i.isSubmitting,i.isTransitioning,r]),d=xt.useCallback(async S=>{S?.preventDefault(),o.canGoNext&&await m(S);},[o.canGoNext,m]),g=xt.useMemo(()=>({isLastStep:s.isLastStep,canGoNext:o.canGoNext,isSubmitting:o.finalIsSubmitting,onSubmit:d,className:e,currentStep:c,stepData:a.values||{},allData:s.allData,context:s}),[s.isLastStep,o.canGoNext,o.finalIsSubmitting,d,e,c,a.values,s.allData,s]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:l.renderConfig?.nextButtonRenderer,props:g,...n})});var Lt=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:s,goPrevious:i,workflowState:l,workflowConfig:c,currentStep:m}=C(),{formState:a}=forms.useFormContext(),o=xt.useMemo(()=>{let S=a.isSubmitting||l.isSubmitting,f=r??S,h=s.currentStepIndex>0&&!l.isTransitioning&&!f;return {finalIsSubmitting:f,canGoPrevious:h}},[a.isSubmitting,l.isSubmitting,l.isTransitioning,s.currentStepIndex,r]),d=xt.useCallback(async S=>{S?.preventDefault(),o.canGoPrevious&&await i();},[o.canGoPrevious,i]),g=xt.useMemo(()=>({canGoPrevious:o.canGoPrevious,isSubmitting:o.finalIsSubmitting,onPrevious:d,className:e,currentStep:m,stepData:a.values||{},allData:s.allData,context:s}),[o.canGoPrevious,o.finalIsSubmitting,d,e,m,a.values,s.allData,s]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:c.renderConfig?.previousButtonRenderer,props:g,...n})});var Ot=xt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:s,skipStep:i,workflowState:l,workflowConfig:c,context:m,conditionsHelpers:a}=C(),{formState:o}=forms.useFormContext(),d=xt.useMemo(()=>{let f=o.isSubmitting||l.isSubmitting,h=r??f,P=(!!s?.allowSkip||a.isStepSkippable(l.currentStepIndex))&&!l.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:P}},[o.isSubmitting,l.isSubmitting,l.isTransitioning,l.currentStepIndex,s?.allowSkip,a.isStepSkippable,r]),g=xt.useCallback(async f=>{f?.preventDefault(),d.canSkip&&await i();},[d.canSkip,i]),S=xt.useMemo(()=>({canSkip:d.canSkip,isSubmitting:d.finalIsSubmitting,onSkip:g,className:e,currentStep:s,stepData:o.values||{},allData:m.allData,context:m}),[d.canSkip,d.finalIsSubmitting,g,e,s,o.values,m.allData,m]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:c.renderConfig?.skipButtonRenderer,props:S,...n})});var qt=xt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:s,workflowState:i,context:l,goToStep:c,conditionsHelpers:m}=C(),{visibleSteps:a,visibleToOriginalIndexMap:o,originalToVisibleIndexMap:d}=xt.useMemo(()=>{let h=[],P=new Map,T=new Map;return s.steps.forEach((b,x)=>{if(m.isStepVisible(x)){let y=h.length;h.push(b),P.set(y,x),T.set(x,y);}}),{visibleSteps:h,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:T}},[s.steps,m]),g=xt.useCallback(h=>{let P=o.get(h);P!==void 0&&(e?e(P):c(P));},[o,e,c]),S=xt.useMemo(()=>d.get(i.currentStepIndex)??-1,[d,i.currentStepIndex]),f=xt.useMemo(()=>({steps:a,currentStepIndex:S,visitedSteps:l.visibleVisitedSteps,onStepClick:g,className:r}),[a,S,l.visibleVisitedSteps,g,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:s.renderConfig?.stepperRenderer,props:f,...n})});var he=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},i=JSON.stringify(s),l=this.compress?this.compressData(i):i;localStorage.setItem(n,l);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let s=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},l=JSON.stringify(i),c=this.compress?this.compressData(l):l;localStorage.setItem(s,c);}catch(s){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",s)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let s=this.compress?this.decompressData(n):n,i=JSON.parse(s);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),null):{...i.data,visitedSteps:Array.isArray(i.data.visitedSteps)?i.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let s=this.compress?this.decompressData(n):n,i=JSON.parse(s);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let s=n.substring(this.keyPrefix.length);await this.exists(s)&&e.push(s);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let s=localStorage.getItem(n);if(s){let i=this.compress?this.decompressData(s):s,l=JSON.parse(i);l.expiresAt&&Date.now()>l.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
+ exports.LocalStorageAdapter=he;exports.RilayLicenseManager=B;exports.Workflow=bt;exports.WorkflowBody=Pt;exports.WorkflowNextButton=Et;exports.WorkflowPersistenceError=E;exports.WorkflowPreviousButton=Lt;exports.WorkflowProvider=be;exports.WorkflowSkipButton=Ot;exports.WorkflowStepper=qt;exports.combineWorkflowDataForConditions=ce;exports.debounce=oe;exports.flattenObject=pe;exports.flow=G;exports.generateStorageKey=ie;exports.mergePersistedState=it;exports.persistedToWorkflowState=Ve;exports.useConditionEvaluation=ne;exports.usePersistence=Z;exports.useStepMetadata=ot;exports.useWorkflowAnalytics=le;exports.useWorkflowConditions=de;exports.useWorkflowContext=C;exports.useWorkflowNavigation=ue;exports.useWorkflowState=fe;exports.useWorkflowSubmission=me;exports.validatePersistedData=st;exports.workflowStateToPersisted=se;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormContext,form,FormProvider}from'@rilaykit/forms';import xt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import*as Ne from'@noble/ed25519';import {jsx,jsxs}from'react/jsx-runtime';var $=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(o=>o.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(o=>!this.plugins.some(l=>l.name===o));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var tt=1751361139160,rt="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,o,l]=n,a=`${i}.${o}`,g=new TextEncoder().encode(a),p=l.match(/.{2}/g);if(!p)return {valid:!1,error:"INVALID"};let s=new Uint8Array(p.map(E=>Number.parseInt(E,16))),f=k.hexToBytes(rt);if(!await Ne.verify(s,g,f))return {valid:!1,error:"SIGNATURE_INVALID"};let y=k.base64ToString(o.replace(/-/g,"+").replace(/_/g,"/")),u=JSON.parse(y),h=Math.floor(Date.now()/1e3);return u.e<h?{valid:!1,error:"EXPIRED",data:k.decompressPayload(u)}:tt>u.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(u)}:u.p===void 0||!u.c||!u.i||!u.e||!u.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(u)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,o=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<o.length;){let l=r.indexOf(o.charAt(i++)),a=r.indexOf(o.charAt(i++)),g=r.indexOf(o.charAt(i++)),p=r.indexOf(o.charAt(i++)),s=l<<18|a<<12|g<<6|p;n+=String.fromCharCode(s>>16&255),g!==64&&(n+=String.fromCharCode(s>>8&255)),p!==64&&(n+=String.fromCharCode(s&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var O=k;function ne(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let o;return i&&typeof i=="object"&&"build"in i?o=i.build():o=i,evaluateCondition(o,e)}catch(o){return console.warn("Error evaluating condition:",o),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Le(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let o=l=>{try{return l&&typeof l=="object"&&"build"in l?evaluateCondition(l.build(),e):evaluateCondition(l,e)}catch(a){return console.warn(`Error evaluating condition for field ${n}:`,a),false}};r[n]={visible:i.visible?o(i.visible):true,disabled:i.disabled?o(i.disabled):false,required:i.required?o(i.required):false,readonly:i.readonly?o(i.readonly):false};}return r},[t,e])}function Ve(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let o=Number.parseInt(n,10);if(r[o]={visible:true,disabled:false,required:false,readonly:false},i){let l=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(g){return console.warn(`Error evaluating condition for step ${o}:`,g),false}};r[o]={visible:i.visible?l(i.visible):true,disabled:i.disabled?l(i.disabled):false,required:i.required?l(i.required):false,readonly:i.readonly?l(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ie(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function nt(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function se(t,e){return e?`${e}:${t}`:t}function oe(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function it(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function Z({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[o,l]=useState(false),[a,g]=useState(null),[p,s]=useState(false),f=useRef(r),m=useRef(n),y=useRef({hasPendingChanges:false});useEffect(()=>{f.current=r,m.current=n;},[r,n]);let u=se(m.current.storageKey||t,i),h=useCallback(()=>{g(null);},[]),x=useCallback((S,I)=>{let V=S instanceof R?S:new R(`${I} failed: ${S.message}`,"OPERATION_FAILED",S);g(V),console.error("[WorkflowPersistence]",V);},[]),E=useCallback(async S=>{h(),l(true);try{let I=ie(t,S,m.current.metadata);await f.current.save(u,I),y.current.lastSavedState={...S},y.current.hasPendingChanges=!1;}catch(I){throw x(I,"Save"),I}finally{l(false);}},[t,u,h,x]),c=useRef(oe(async S=>{try{await E(S);}catch(I){console.debug("[WorkflowPersistence] Auto-save failed:",I);}},n.debounceMs||500)),b=useCallback((S,I)=>I?S.currentStepIndex!==I.currentStepIndex||JSON.stringify(S.allData)!==JSON.stringify(I.allData)||JSON.stringify(S.stepData)!==JSON.stringify(I.stepData)||S.visitedSteps.size!==I.visitedSteps.size||!Array.from(S.visitedSteps).every(V=>I.visitedSteps.has(V)):true,[]),D=useCallback(async()=>{h(),s(true);try{let S=await f.current.load(u);return S&&(y.current.lastSavedState={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},y.current.hasPendingChanges=!1),S}catch(S){return x(S,"Load"),null}finally{setTimeout(()=>s(false),100);}},[u,h,x]),L=useCallback(async()=>{h();try{await f.current.remove(u),y.current.lastSavedState=void 0,y.current.hasPendingChanges=!1;}catch(S){throw x(S,"Clear"),S}},[u,h,x]),d=useCallback(async()=>{try{return await f.current.exists(u)}catch(S){return x(S,"Exists check"),false}},[u,x]);useEffect(()=>{m.current.autoPersist&&(o||p||e.isInitializing||e.isSubmitting||e.isTransitioning||b(e,y.current.lastSavedState)&&(y.current.hasPendingChanges=true,c.current(e)));},[e,o,p,b]);let v=useCallback(async()=>{await E(e);},[E,e]);return {isPersisting:o,persistenceError:a,persistNow:v,loadPersistedData:D,clearPersistedData:L,hasPersistedData:d}}function st(){let{workflowConfig:t,currentStep:e}=A(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>p=>t.steps.find(f=>f.id===p)?.metadata,[t.steps]),i=useMemo(()=>p=>t.steps[p]?.metadata,[t.steps]),o=useMemo(()=>p=>r?p in r:false,[r]),l=useMemo(()=>(p,s)=>r&&p in r?r[p]:s,[r]),a=useMemo(()=>()=>t.steps.map((p,s)=>({id:p.id,title:p.title,index:s,metadata:p.metadata})),[t.steps]),g=useMemo(()=>p=>t.steps.map((s,f)=>({step:s,index:f})).filter(({step:s,index:f})=>p(s.metadata,s.id,f)).map(({step:s})=>s.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:o,getCurrentValue:l,getAllStepsMetadata:a,findStepsByMetadata:g}}function le({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),o=useRef(false),l=useRef(null),a=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!o.current&&(o.current=true,t.analytics.onWorkflowStart(t.id,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,a,t.steps.length]),useEffect(()=>{let m=t.steps[e.currentStepIndex];if(m&&l.current!==m.id){if(l.current&&t.analytics?.onStepComplete){let y=i.current.get(l.current);if(y){let u=Date.now()-y;t.analytics.onStepComplete(l.current,u,e.stepData,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:l.current,duration:u},{timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:u,conditionEvaluationDuration:0},"low");}}l.current=m.id,i.current.set(m.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(m.id,Date.now(),r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:m.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,a,t.id]);let g=useCallback((m,y)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(m,y,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:m,reason:y},void 0,"medium");},[t.analytics,r,a,t.id]),p=useCallback(m=>{t.analytics?.onError&&t.analytics.onError(m,r),a&&a.trackError(m,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,a,t.id,e.currentStepIndex,t.steps]),s=useCallback((m,y,u)=>{if(!a)return;let h={timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:y,navigationDuration:u,conditionEvaluationDuration:0};a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:m,toStep:y,direction:y>m?"forward":"backward"},h,u>1e3?"medium":"low");},[a,t.id,t.steps.length]),f=useCallback((m,y)=>{if(!a)return;let u={timestamp:Date.now(),duration:m,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:m};a.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:y,currentStepIndex:e.currentStepIndex},u,m>100?"medium":"low");},[a,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:g,trackError:p,trackNavigation:s,trackConditionEvaluation:f}}function pe(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],o=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,pe(i,o)):r[o]=i;}return r}function ce(t,e){let r={...t,...e},n=pe(r);return {...r,...n}}function _e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function de({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>ce(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),o=ne(i,n,{visible:true,disabled:false,required:false,readonly:false}),l=useMemo(()=>_e(o,r?.allowSkip),[o,r?.allowSkip]),a=useMemo(()=>{let c={};return t.steps.forEach((b,D)=>{b.conditions&&(c[D]={visible:b.conditions.visible,required:b.conditions.skippable});}),c},[t.steps]),g=Ve(a,n),p=useMemo(()=>{let c={};return t.steps.forEach((b,D)=>{let L=g[D];L?c[D]=_e(L,b.allowSkip):c[D]={visible:true,skippable:b.allowSkip===true};}),c},[t.steps,g]),s=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let c={};for(let b of r.formConfig.allFields)b.conditions&&(c[b.id]=b.conditions);return c},[r?.formConfig?.allFields]),f=Le(s,n),m=useCallback(c=>c<0||c>=t.steps.length?false:p[c]?.visible??true,[p,t.steps.length]),y=useCallback(c=>c<0||c>=t.steps.length?false:p[c]?.skippable??false,[p,t.steps.length]),u=useCallback(c=>f[c]?.visible??true,[f]),h=useCallback(c=>f[c]?.disabled??false,[f]),x=useCallback(c=>f[c]?.required??false,[f]),E=useCallback(c=>f[c]?.readonly??false,[f]);return {stepConditions:l,fieldConditions:f,allStepConditions:p,isStepVisible:m,isStepSkippable:y,isFieldVisible:u,isFieldDisabled:h,isFieldRequired:x,isFieldReadonly:E}}function ue({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:o,markStepVisited:l,setStepData:a,onStepChange:g}){let p=useRef(g);p.current=g;let s=t.steps[e.currentStepIndex],f=useCallback(()=>({setStepData:(d,v)=>{a(v,d);},setStepFields:(d,v)=>{let I={...e.allData[d]||{},...v};a(I,d);},getStepData:d=>e.allData[d]||{},setNextStepField:(d,v)=>{let S=e.currentStepIndex+1;if(S<t.steps.length){let I=t.steps[S].id,z={...e.allData[I]||{},[d]:v};a(z,I);}},setNextStepFields:d=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let S=t.steps[v].id,V={...e.allData[S]||{},...d};a(V,S);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,a]),m=useCallback(async d=>{if(d<0||d>=t.steps.length||!n.isStepVisible(d))return false;o(true);try{return p.current&&p.current(e.currentStepIndex,d,r),i(d),l(d,t.steps[d].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{o(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,o,i,l]),y=useCallback(d=>{for(let v=d+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),u=useCallback(d=>{for(let v=d-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),h=useCallback(async()=>{if(s?.onAfterValidation)try{let v=f();await s.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let d=y(e.currentStepIndex);return d===null?false:m(d)},[s,f,e.stepData,r,t.analytics,e.currentStepIndex,y,m]),x=useCallback(async()=>{let d=u(e.currentStepIndex);return d===null?false:m(d)},[e.currentStepIndex,u,m]),E=useCallback(async()=>!s?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(s.id,"user_skip",r),h()),[s,n,e.currentStepIndex,t.analytics,r,h]),c=useCallback(d=>d<0||d>=t.steps.length?false:n.isStepVisible(d),[t.steps.length,n]),b=useCallback(()=>{let d=y(e.currentStepIndex);return d!==null&&c(d)},[e.currentStepIndex,y,c]),D=useCallback(()=>{let d=u(e.currentStepIndex);return d!==null&&c(d)},[e.currentStepIndex,u,c]),L=useCallback(()=>s?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[s?.allowSkip,n,e.currentStepIndex]);return {goToStep:m,goNext:h,goPrevious:x,skipStep:E,canGoToStep:c,canGoNext:b,canGoPrevious:D,canSkipCurrentStep:L}}function ct(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function fe({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let c=new Set;if(e&&e>0&&r)for(let b=0;b<e;b++)r[b]&&c.add(r[b].id);return c},[e,r]),o={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,isSubmitting:false,isTransitioning:false,isInitializing:true},[l,a]=useReducer(ct,o),g=n?.adapter?Z({workflowId:n.workflowId,workflowState:l,adapter:n.adapter,options:n.options,userId:n.userId}):null,p=useCallback(c=>{a({type:"SET_CURRENT_STEP",stepIndex:c});},[]),s=useCallback((c,b)=>{a({type:"SET_STEP_DATA",data:c,stepId:b});},[]),f=useCallback((c,b,D)=>{a({type:"SET_FIELD_VALUE",fieldId:c,value:b,stepId:D});},[]),m=useCallback(c=>{a({type:"SET_SUBMITTING",isSubmitting:c});},[]),y=useCallback(c=>{a({type:"SET_TRANSITIONING",isTransitioning:c});},[]),u=useCallback((c,b)=>{a({type:"MARK_STEP_VISITED",stepIndex:c,stepId:b});},[]),h=useCallback(()=>{a({type:"RESET_WORKFLOW"});},[]),x=useCallback(()=>{a({type:"SET_INITIALIZATION_COMPLETE"});},[]),E=useCallback(async()=>{if(!g)return x(),false;try{let c=await g.loadPersistedData();if(c){let b={currentStepIndex:c.currentStepIndex,allData:c.allData,stepData:c.stepData,visitedSteps:new Set(c.visitedSteps)};return a({type:"LOAD_PERSISTED_STATE",state:b}),x(),!0}}catch(c){console.error("Failed to load persisted state:",c);}return x(),false},[g,x]);return {workflowState:l,setCurrentStep:p,setStepData:s,setFieldValue:f,setSubmitting:m,setTransitioning:y,markStepVisited:u,resetWorkflow:h,loadPersistedState:E,persistence:g?{isPersisting:g.isPersisting,persistenceError:g.persistenceError,persistNow:g.persistNow,clearPersistedData:g.clearPersistedData,hasPersistedData:g.hasPersistedData}:null}}function me({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:o}){let l=useRef(i);l.current=i;let a=useCallback(async()=>{n(true);try{if(l.current&&await l.current(e.allData),t.analytics?.onWorkflowComplete){let p=Date.now()-o.current;t.analytics.onWorkflowComplete(t.id,p,e.allData);}}catch(p){throw console.error("Workflow submission failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),p}finally{n(false);}},[e.allData,t.analytics,t.id,r,o,n]),g=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:a,isSubmitting:e.isSubmitting,canSubmit:g()}}var Ge=createContext(null);function be({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:o,className:l}){let a=useRef(i),g=useRef(o);a.current=i,g.current=o;let p=useMemo(()=>{if(!n)return 0;let w=e.steps.findIndex(P=>P.id===n);return w===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):w},[n,e.steps]),{workflowState:s,setCurrentStep:f,setStepData:m,setFieldValue:y,setSubmitting:u,setTransitioning:h,markStepVisited:x,resetWorkflow:E,loadPersistedState:c,persistence:b}=fe({defaultValues:r,defaultStepIndex:p,workflowSteps:e.steps,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});useEffect(()=>{e.persistence&&c&&c();},[]);let D=useMemo(()=>({isPersisting:b?.isPersisting??false,persistenceError:b?.persistenceError??null,persistNow:b?.persistNow}),[b?.isPersisting,b?.persistenceError,b?.persistNow]),L=useMemo(()=>({workflowId:e.id,currentStepIndex:s.currentStepIndex,totalSteps:e.steps.length,allData:s.allData,stepData:s.stepData,visitedSteps:s.visitedSteps}),[e.id,e.steps.length,s.currentStepIndex,s.allData,s.stepData,s.visitedSteps]),d=useMemo(()=>e.steps[s.currentStepIndex],[e.steps,s.currentStepIndex]),v=useMemo(()=>d?.formConfig,[d?.formConfig]),S=de({workflowConfig:e,workflowState:s,currentStep:d}),I=useMemo(()=>{let w=-1;for(let W=0;W<e.steps.length;W++)if(S.isStepVisible(W)){w=W;break}let P=-1;for(let W=e.steps.length-1;W>=0;W--)if(S.isStepVisible(W)){P=W;break}let T=new Set;for(let W=0;W<e.steps.length;W++){let K=e.steps[W];S.isStepVisible(W)&&s.visitedSteps.has(K.id)&&T.add(K.id);}let B=new Set;for(let W=0;W<s.currentStepIndex;W++){let K=e.steps[W];s.visitedSteps.has(K.id)&&B.add(K.id);}return {...L,isFirstStep:s.currentStepIndex===w,isLastStep:s.currentStepIndex===P,visibleVisitedSteps:T,passedSteps:B}},[L,s.currentStepIndex,s.visitedSteps,S,e.steps]),{analyticsStartTime:V}=le({workflowConfig:e,workflowState:s,workflowContext:I}),{goToStep:z,goNext:J,goPrevious:xe,skipStep:Ie,canGoToStep:ke,canGoNext:Pe,canGoPrevious:We,canSkipCurrentStep:De}=ue({workflowConfig:e,workflowState:s,workflowContext:I,conditionsHelpers:S,setCurrentStep:f,setTransitioning:h,markStepVisited:x,setStepData:m,onStepChange:a.current}),Q=useRef(false);useEffect(()=>{if(Q.current)return;if(!S.isStepVisible(s.currentStepIndex)){for(let P=0;P<e.steps.length;P++)if(S.isStepVisible(P)){f(P),x(P,e.steps[P].id);break}}Q.current=true;},[s.currentStepIndex,e.steps,f,x]),useEffect(()=>{if(!Q.current)return;if(!S.isStepVisible(s.currentStepIndex)){let P=null;for(let T=s.currentStepIndex+1;T<e.steps.length;T++)if(S.isStepVisible(T)){P=T;break}if(P===null){for(let T=s.currentStepIndex-1;T>=0;T--)if(S.isStepVisible(T)){P=T;break}}P!==null&&(f(P),x(P,e.steps[P].id));}},[S,s.currentStepIndex,e.steps,f,x]);let{submitWorkflow:X,isSubmitting:Re,canSubmit:Ee}=me({workflowConfig:e,workflowState:s,workflowContext:I,setSubmitting:u,onWorkflowComplete:g.current,analyticsStartTime:V}),ee=useCallback((w,P)=>{y(w,P,d?.id||"");},[y,d?.id]),we=useCallback(w=>{m(w,d?.id||"");},[m,d?.id]),Je=useCallback(async w=>{d?.id&&w&&m(w,d.id),I.isLastStep?await X():await J();},[I.isLastStep,X,J,d?.id,m]),Te=useMemo(()=>({goToStep:z,goNext:J,goPrevious:xe,skipStep:Ie,canGoToStep:ke,canGoNext:Pe,canGoPrevious:We,canSkipCurrentStep:De}),[z,J,xe,Ie,ke,Pe,We,De]),Ae=useMemo(()=>({setValue:ee,setStepData:we,resetWorkflow:E}),[ee,we,E]),Ce=useMemo(()=>({submitWorkflow:X,isSubmitting:Re,canSubmit:Ee}),[X,Re,Ee]),Xe=useMemo(()=>({workflowState:s,workflowConfig:e,currentStep:d,context:I,formConfig:v,conditionsHelpers:S,currentStepMetadata:d?.metadata,...Te,...Ae,...Ce,persistNow:D.persistNow,isPersisting:D.isPersisting,persistenceError:D.persistenceError}),[s,e,d,I,v,S,Te,Ae,Ce,D]),He=useMemo(()=>{if(!d?.id)return {};let w=s?.allData[d.id]||{};if(!v?.allFields)return w;let P=new Set(v.allFields.map(B=>B.id)),T={};for(let[B,W]of Object.entries(w))P.has(B)&&(T[B]=W);return T},[s?.allData,d?.id,v?.allFields]),Ze=useMemo(()=>s.isInitializing.toString(),[s.isInitializing]);return jsx(Ge.Provider,{value:Xe,children:jsx(FormProvider,{formConfig:v,defaultValues:He,onFieldChange:ee,"data-workflow-id":e.id,className:l,onSubmit:Je,children:t},Ze)})}function A(){let t=useContext(Ge);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function bt({children:t,workflowConfig:e,...r}){let[n,i]=useState(),o=useMemo(()=>e instanceof $?e.build():e,[e]);return useEffect(()=>{if(typeof window<"u"&&O.shouldDisplayWatermark()){let a=O.getWatermarkMessage();i(a);}},[]),jsxs("div",{style:{position:"relative"},children:[jsx(be,{...r,workflowConfig:o,children:t}),n&&jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var It=xt.memo(function({stepId:e,children:r}){let{currentStep:n}=A();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:o}=n;return i?o?o(n):r??jsx(FormBody,{}):null});var Et=xt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:o,workflowConfig:l,currentStep:a}=A(),{submit:g,formState:p}=useFormContext(),s=useMemo(()=>{let y=p.isSubmitting||o.isSubmitting,u=r??y,h=!o.isTransitioning&&!u;return {finalIsSubmitting:u,canGoNext:h}},[p.isSubmitting,o.isSubmitting,o.isTransitioning,r]),f=useCallback(async y=>{y?.preventDefault(),s.canGoNext&&await g(y);},[s.canGoNext,g]),m=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:s.canGoNext,isSubmitting:s.finalIsSubmitting,onSubmit:f,className:e,currentStep:a,stepData:p.values||{},allData:i.allData,context:i}),[i.isLastStep,s.canGoNext,s.finalIsSubmitting,f,e,a,p.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:l.renderConfig?.nextButtonRenderer,props:m,...n})});var Lt=xt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:o,workflowState:l,workflowConfig:a,currentStep:g}=A(),{formState:p}=useFormContext(),s=useMemo(()=>{let y=p.isSubmitting||l.isSubmitting,u=r??y,h=i.currentStepIndex>0&&!l.isTransitioning&&!u;return {finalIsSubmitting:u,canGoPrevious:h}},[p.isSubmitting,l.isSubmitting,l.isTransitioning,i.currentStepIndex,r]),f=useCallback(async y=>{y?.preventDefault(),s.canGoPrevious&&await o();},[s.canGoPrevious,o]),m=useMemo(()=>({canGoPrevious:s.canGoPrevious,isSubmitting:s.finalIsSubmitting,onPrevious:f,className:e,currentStep:g,stepData:p.values||{},allData:i.allData,context:i}),[s.canGoPrevious,s.finalIsSubmitting,f,e,g,p.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:a.renderConfig?.previousButtonRenderer,props:m,...n})});var Ot=xt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:o,workflowState:l,workflowConfig:a,context:g,conditionsHelpers:p}=A(),{formState:s}=useFormContext(),f=useMemo(()=>{let u=s.isSubmitting||l.isSubmitting,h=r??u,x=(!!i?.allowSkip||p.isStepSkippable(l.currentStepIndex))&&!l.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:x}},[s.isSubmitting,l.isSubmitting,l.isTransitioning,l.currentStepIndex,i?.allowSkip,p.isStepSkippable,r]),m=useCallback(async u=>{u?.preventDefault(),f.canSkip&&await o();},[f.canSkip,o]),y=useMemo(()=>({canSkip:f.canSkip,isSubmitting:f.finalIsSubmitting,onSkip:m,className:e,currentStep:i,stepData:s.values||{},allData:g.allData,context:g}),[f.canSkip,f.finalIsSubmitting,m,e,i,s.values,g.allData,g]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:a.renderConfig?.skipButtonRenderer,props:y,...n})});var qt=xt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:o,context:l,goToStep:a,conditionsHelpers:g}=A(),{visibleSteps:p,visibleToOriginalIndexMap:s,originalToVisibleIndexMap:f}=useMemo(()=>{let h=[],x=new Map,E=new Map;return i.steps.forEach((c,b)=>{if(g.isStepVisible(b)){let D=h.length;h.push(c),x.set(D,b),E.set(b,D);}}),{visibleSteps:h,visibleToOriginalIndexMap:x,originalToVisibleIndexMap:E}},[i.steps,g]),m=useCallback(h=>{let x=s.get(h);x!==void 0&&(e?e(x):a(x));},[s,e,a]),y=useMemo(()=>f.get(o.currentStepIndex)??-1,[f,o.currentStepIndex]),u=useMemo(()=>({steps:p,currentStepIndex:y,visitedSteps:l.visibleVisitedSteps,onStepClick:m,className:r}),[p,y,l.visibleVisitedSteps,m,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:u,...n})});var he=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},o=JSON.stringify(i),l=this.compress?this.compressData(o):o;localStorage.setItem(n,l);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),o={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},l=JSON.stringify(o),a=this.compress?this.compressData(l):l;localStorage.setItem(i,a);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,o=JSON.parse(i);return o.expiresAt&&Date.now()>o.expiresAt?(await this.remove(e),null):{...o.data,visitedSteps:Array.isArray(o.data.visitedSteps)?o.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,o=JSON.parse(i);return o.expiresAt&&Date.now()>o.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let o=this.compress?this.decompressData(i):i,l=JSON.parse(o);l.expiresAt&&Date.now()>l.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
- export{he as LocalStorageAdapter,O as RilayLicenseManager,bt as Workflow,It as WorkflowBody,Et as WorkflowNextButton,R as WorkflowPersistenceError,Lt as WorkflowPreviousButton,be as WorkflowProvider,Ot as WorkflowSkipButton,qt as WorkflowStepper,ce as combineWorkflowDataForConditions,oe as debounce,pe as flattenObject,$ as flow,se as generateStorageKey,it as mergePersistedState,Me as persistedToWorkflowState,ne as useConditionEvaluation,Z as usePersistence,st as useStepMetadata,le as useWorkflowAnalytics,de as useWorkflowConditions,A as useWorkflowContext,ue as useWorkflowNavigation,fe as useWorkflowState,me as useWorkflowSubmission,nt as validatePersistedData,ie as workflowStateToPersisted};
1
+ import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormContext,form,FormProvider}from'@rilaykit/forms';import xt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import*as Ne from'@noble/ed25519';import {jsx,jsxs}from'react/jsx-runtime';var G=class t{constructor(e,r,n,s){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=s;}static create(e,r,n,s){return new t(e,r,n,s)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let s=this.createStepFromDefinition(n);this.steps.push(s);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(s=>s.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let s={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:s},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let s=n.dependencies.filter(i=>!this.plugins.some(l=>l.name===i));s.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${s.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,s)=>n+s.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var rt=1751361139160,nt="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[s,i,l]=n,c=`${s}.${i}`,m=new TextEncoder().encode(c),a=l.match(/.{2}/g);if(!a)return {valid:!1,error:"INVALID"};let o=new Uint8Array(a.map(T=>Number.parseInt(T,16))),d=k.hexToBytes(nt);if(!await Ne.verify(o,m,d))return {valid:!1,error:"SIGNATURE_INVALID"};let S=k.base64ToString(i.replace(/-/g,"+").replace(/_/g,"/")),f=JSON.parse(S),h=Math.floor(Date.now()/1e3);return f.e<h?{valid:!1,error:"EXPIRED",data:k.decompressPayload(f)}:rt>f.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(f)}:f.p===void 0||!f.c||!f.i||!f.e||!f.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(f)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",s=0,i=e.replace(/[^A-Za-z0-9+/]/g,"");for(;s<i.length;){let l=r.indexOf(i.charAt(s++)),c=r.indexOf(i.charAt(s++)),m=r.indexOf(i.charAt(s++)),a=r.indexOf(i.charAt(s++)),o=l<<18|c<<12|m<<6|a;n+=String.fromCharCode(o>>16&255),m!==64&&(n+=String.fromCharCode(o>>8&255)),a!==64&&(n+=String.fromCharCode(o&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var B=k;function ne(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=s=>{try{let i;return s&&typeof s=="object"&&"build"in s?i=s.build():i=s,evaluateCondition(i,e)}catch(i){return console.warn("Error evaluating condition:",i),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Le(t,e={}){return useMemo(()=>{let r={};for(let[n,s]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},s){let i=l=>{try{return l&&typeof l=="object"&&"build"in l?evaluateCondition(l.build(),e):evaluateCondition(l,e)}catch(c){return console.warn(`Error evaluating condition for field ${n}:`,c),false}};r[n]={visible:s.visible?i(s.visible):true,disabled:s.disabled?i(s.disabled):false,required:s.required?i(s.required):false,readonly:s.readonly?i(s.readonly):false};}return r},[t,e])}function Me(t,e={}){return useMemo(()=>{let r={};for(let[n,s]of Object.entries(t)){let i=Number.parseInt(n,10);if(r[i]={visible:true,disabled:false,required:false,readonly:false},s){let l=c=>{try{return c&&typeof c=="object"&&"build"in c?evaluateCondition(c.build(),e):evaluateCondition(c,e)}catch(m){return console.warn(`Error evaluating condition for step ${i}:`,m),false}};r[i]={visible:s.visible?l(s.visible):true,disabled:s.disabled?l(s.disabled):false,required:s.required?l(s.required):false,readonly:s.readonly?l(s.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,s){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=s;this.name="WorkflowPersistenceError";}};function se(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ve(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function st(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function ie(t,e){return e?`${e}:${t}`:t}function oe(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function it(t,e,r="persist"){let n=Ve(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function Z({workflowId:t,workflowState:e,adapter:r,options:n={},userId:s}){let[i,l]=useState(false),[c,m]=useState(null),[a,o]=useState(false),d=useRef(r),g=useRef(n),S=useRef({hasPendingChanges:false});useEffect(()=>{d.current=r,g.current=n;},[r,n]);let f=ie(g.current.storageKey||t,s),h=useCallback(()=>{m(null);},[]),P=useCallback((p,v)=>{let R=p instanceof E?p:new E(`${v} failed: ${p.message}`,"OPERATION_FAILED",p);m(R),console.error("[WorkflowPersistence]",R);},[]),T=useCallback(async p=>{h(),l(true);try{let v=se(t,p,g.current.metadata);await d.current.save(f,v),S.current.lastSavedState={...p},S.current.hasPendingChanges=!1;}catch(v){throw P(v,"Save"),v}finally{l(false);}},[t,f,h,P]),b=useRef(oe(async p=>{try{await T(p);}catch(v){console.debug("[WorkflowPersistence] Auto-save failed:",v);}},n.debounceMs||500)),x=useCallback((p,v)=>v?p.currentStepIndex!==v.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(v.allData)||JSON.stringify(p.stepData)!==JSON.stringify(v.stepData)||p.visitedSteps.size!==v.visitedSteps.size||!Array.from(p.visitedSteps).every(R=>v.visitedSteps.has(R)):true,[]),y=useCallback(async()=>{h(),o(true);try{let p=await d.current.load(f);return p&&(S.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},S.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>o(false),100);}},[f,h,P]),I=useCallback(async()=>{h();try{await d.current.remove(f),S.current.lastSavedState=void 0,S.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[f,h,P]),V=useCallback(async()=>{try{return await d.current.exists(f)}catch(p){return P(p,"Exists check"),false}},[f,P]);useEffect(()=>{g.current.autoPersist&&(i||a||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,S.current.lastSavedState)&&(S.current.hasPendingChanges=true,b.current(e)));},[e,i,a,x]);let u=useCallback(async()=>{await T(e);},[T,e]);return {isPersisting:i,persistenceError:c,persistNow:u,loadPersistedData:y,clearPersistedData:I,hasPersistedData:V}}function ot(){let{workflowConfig:t,currentStep:e}=C(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>a=>t.steps.find(d=>d.id===a)?.metadata,[t.steps]),s=useMemo(()=>a=>t.steps[a]?.metadata,[t.steps]),i=useMemo(()=>a=>r?a in r:false,[r]),l=useMemo(()=>(a,o)=>r&&a in r?r[a]:o,[r]),c=useMemo(()=>()=>t.steps.map((a,o)=>({id:a.id,title:a.title,index:o,metadata:a.metadata})),[t.steps]),m=useMemo(()=>a=>t.steps.map((o,d)=>({step:o,index:d})).filter(({step:o,index:d})=>a(o.metadata,o.id,d)).map(({step:o})=>o.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:s,hasCurrentKey:i,getCurrentValue:l,getAllStepsMetadata:c,findStepsByMetadata:m}}function le({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),s=useRef(new Map),i=useRef(false),l=useRef(null),c=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!i.current&&(i.current=true,t.analytics.onWorkflowStart(t.id,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,c,t.steps.length]),useEffect(()=>{let g=t.steps[e.currentStepIndex];if(g&&l.current!==g.id){if(l.current&&t.analytics?.onStepComplete){let S=s.current.get(l.current);if(S){let f=Date.now()-S;t.analytics.onStepComplete(l.current,f,e.stepData,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:l.current,duration:f},{timestamp:Date.now(),duration:f,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:f,conditionEvaluationDuration:0},"low");}}l.current=g.id,s.current.set(g.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(g.id,Date.now(),r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:g.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,c,t.id]);let m=useCallback((g,S)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(g,S,r),c&&c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:g,reason:S},void 0,"medium");},[t.analytics,r,c,t.id]),a=useCallback(g=>{t.analytics?.onError&&t.analytics.onError(g,r),c&&c.trackError(g,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,c,t.id,e.currentStepIndex,t.steps]),o=useCallback((g,S,f)=>{if(!c)return;let h={timestamp:Date.now(),duration:f,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:S,navigationDuration:f,conditionEvaluationDuration:0};c.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:g,toStep:S,direction:S>g?"forward":"backward"},h,f>1e3?"medium":"low");},[c,t.id,t.steps.length]),d=useCallback((g,S)=>{if(!c)return;let f={timestamp:Date.now(),duration:g,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:g};c.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:S,currentStepIndex:e.currentStepIndex},f,g>100?"medium":"low");},[c,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:m,trackError:a,trackNavigation:o,trackConditionEvaluation:d}}function pe(t,e=""){let r={};for(let n in t)if(n in t){let s=t[n],i=e?`${e}.${n}`:n;s!==null&&typeof s=="object"&&!Array.isArray(s)&&!(s instanceof Date)?Object.assign(r,pe(s,i)):r[i]=s;}return r}function ce(t,e){let r={...t,...e},n=pe(r);return {...r,...n}}function Be(t,e){return {visible:t.visible,skippable:e===true||t.required}}function de({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>ce(e.allData,e.stepData),[e.allData,e.stepData]),s=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),i=ne(s,n,{visible:true,disabled:false,required:false,readonly:false}),l=useMemo(()=>Be(i,r?.allowSkip),[i,r?.allowSkip]),c=useMemo(()=>{let b={};return t.steps.forEach((x,y)=>{x.conditions&&(b[y]={visible:x.conditions.visible,required:x.conditions.skippable});}),b},[t.steps]),m=Me(c,n),a=useMemo(()=>{let b={};return t.steps.forEach((x,y)=>{let I=m[y];I?b[y]=Be(I,x.allowSkip):b[y]={visible:true,skippable:x.allowSkip===true};}),b},[t.steps,m]),o=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let b={};for(let x of r.formConfig.allFields)x.conditions&&(b[x.id]=x.conditions);return b},[r?.formConfig?.allFields]),d=Le(o,n),g=useCallback(b=>b<0||b>=t.steps.length?false:a[b]?.visible??true,[a,t.steps.length]),S=useCallback(b=>b<0||b>=t.steps.length?false:a[b]?.skippable??false,[a,t.steps.length]),f=useCallback(b=>d[b]?.visible??true,[d]),h=useCallback(b=>d[b]?.disabled??false,[d]),P=useCallback(b=>d[b]?.required??false,[d]),T=useCallback(b=>d[b]?.readonly??false,[d]);return {stepConditions:l,fieldConditions:d,allStepConditions:a,isStepVisible:g,isStepSkippable:S,isFieldVisible:f,isFieldDisabled:h,isFieldRequired:P,isFieldReadonly:T}}function ue({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:s,setTransitioning:i,markStepVisited:l,markStepPassed:c,setStepData:m,onStepChange:a}){let o=useRef(a);o.current=a;let d=t.steps[e.currentStepIndex],g=useCallback(()=>({setStepData:(u,p)=>{m(p,u);},setStepFields:(u,p)=>{let R={...e.allData[u]||{},...p};m(R,u);},getStepData:u=>e.allData[u]||{},setNextStepField:(u,p)=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let R=t.steps[v].id,q={...e.allData[R]||{},[u]:p};m(q,R);}},setNextStepFields:u=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let v=t.steps[p].id,$={...e.allData[v]||{},...u};m($,v);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,m]),S=useCallback(async u=>{if(u<0||u>=t.steps.length||!n.isStepVisible(u))return false;i(true);try{return o.current&&o.current(e.currentStepIndex,u,r),s(u),l(u,t.steps[u].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{i(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,i,s,l]),f=useCallback(u=>{for(let p=u+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),h=useCallback(u=>{for(let p=u-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=useCallback(async()=>{if(d?.onAfterValidation)try{let p=g();await d.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}c(d.id);let u=f(e.currentStepIndex);return u===null?false:S(u)},[d,g,e.stepData,r,t.analytics,e.currentStepIndex,f,S,c]),T=useCallback(async()=>{let u=h(e.currentStepIndex);return u===null?false:S(u)},[e.currentStepIndex,h,S]),b=useCallback(async()=>!d?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(d.id,"user_skip",r),P()),[d,n,e.currentStepIndex,t.analytics,r,P]),x=useCallback(u=>u<0||u>=t.steps.length?false:n.isStepVisible(u),[t.steps.length,n]),y=useCallback(()=>{let u=f(e.currentStepIndex);return u!==null&&x(u)},[e.currentStepIndex,f,x]),I=useCallback(()=>{let u=h(e.currentStepIndex);return u!==null&&x(u)},[e.currentStepIndex,h,x]),V=useCallback(()=>d?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[d?.allowSkip,n,e.currentStepIndex]);return {goToStep:S,goNext:P,goPrevious:T,skipStep:b,canGoToStep:x,canGoNext:y,canGoPrevious:I,canSkipCurrentStep:V}}function ct(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function fe({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let s=useMemo(()=>{let y=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&y.add(r[I].id);return y},[e,r]),i=useMemo(()=>{let y=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&y.add(r[I].id);return y},[e,r]),l={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:s,passedSteps:i,isSubmitting:false,isTransitioning:false,isInitializing:true},[c,m]=useReducer(ct,l),a=n?.adapter?Z({workflowId:n.workflowId,workflowState:c,adapter:n.adapter,options:n.options,userId:n.userId}):null,o=useCallback(y=>{m({type:"SET_CURRENT_STEP",stepIndex:y});},[]),d=useCallback((y,I)=>{m({type:"SET_STEP_DATA",data:y,stepId:I});},[]),g=useCallback((y,I,V)=>{m({type:"SET_FIELD_VALUE",fieldId:y,value:I,stepId:V});},[]),S=useCallback(y=>{m({type:"SET_SUBMITTING",isSubmitting:y});},[]),f=useCallback(y=>{m({type:"SET_TRANSITIONING",isTransitioning:y});},[]),h=useCallback((y,I)=>{m({type:"MARK_STEP_VISITED",stepIndex:y,stepId:I});},[]),P=useCallback(y=>{m({type:"MARK_STEP_PASSED",stepId:y});},[]),T=useCallback(()=>{m({type:"RESET_WORKFLOW"});},[]),b=useCallback(()=>{m({type:"SET_INITIALIZATION_COMPLETE"});},[]),x=useCallback(async()=>{if(!a)return b(),false;try{let y=await a.loadPersistedData();if(y){let I={currentStepIndex:y.currentStepIndex,allData:y.allData,stepData:y.stepData,visitedSteps:new Set(y.visitedSteps),passedSteps:new Set(y.passedSteps||[])};return m({type:"LOAD_PERSISTED_STATE",state:I}),b(),!0}}catch(y){console.error("Failed to load persisted state:",y);}return b(),false},[a,b]);return {workflowState:c,setCurrentStep:o,setStepData:d,setFieldValue:g,setSubmitting:S,setTransitioning:f,markStepVisited:h,markStepPassed:P,resetWorkflow:T,loadPersistedState:x,persistence:a?{isPersisting:a.isPersisting,persistenceError:a.persistenceError,persistNow:a.persistNow,clearPersistedData:a.clearPersistedData,hasPersistedData:a.hasPersistedData}:null}}function me({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:s,analyticsStartTime:i}){let l=useRef(s);l.current=s;let c=useCallback(async()=>{n(true);try{if(l.current&&await l.current(e.allData),t.analytics?.onWorkflowComplete){let a=Date.now()-i.current;t.analytics.onWorkflowComplete(t.id,a,e.allData);}}catch(a){throw console.error("Workflow submission failed:",a),t.analytics?.onError&&t.analytics.onError(a,r),a}finally{n(false);}},[e.allData,t.analytics,t.id,r,i,n]),m=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:c,isSubmitting:e.isSubmitting,canSubmit:m()}}var Ke=createContext(null);function be({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:s,onWorkflowComplete:i,className:l}){let c=useRef(s),m=useRef(i);c.current=s,m.current=i;let a=useMemo(()=>{if(!n)return 0;let w=e.steps.findIndex(W=>W.id===n);return w===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):w},[n,e.steps]),{workflowState:o,setCurrentStep:d,setStepData:g,setFieldValue:S,setSubmitting:f,setTransitioning:h,markStepVisited:P,markStepPassed:T,resetWorkflow:b,loadPersistedState:x,persistence:y}=fe({defaultValues:r,defaultStepIndex:a,workflowSteps:e.steps,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});useEffect(()=>{e.persistence&&x&&x();},[]);let I=useMemo(()=>({isPersisting:y?.isPersisting??false,persistenceError:y?.persistenceError??null,persistNow:y?.persistNow}),[y?.isPersisting,y?.persistenceError,y?.persistNow]),V=useMemo(()=>({workflowId:e.id,currentStepIndex:o.currentStepIndex,totalSteps:e.steps.length,allData:o.allData,stepData:o.stepData,visitedSteps:o.visitedSteps}),[e.id,e.steps.length,o.currentStepIndex,o.allData,o.stepData,o.visitedSteps]),u=useMemo(()=>e.steps[o.currentStepIndex],[e.steps,o.currentStepIndex]),p=useMemo(()=>u?.formConfig,[u?.formConfig]),v=de({workflowConfig:e,workflowState:o,currentStep:u}),R=useMemo(()=>{let w=-1;for(let D=0;D<e.steps.length;D++)if(v.isStepVisible(D)){w=D;break}let W=-1;for(let D=e.steps.length-1;D>=0;D--)if(v.isStepVisible(D)){W=D;break}let A=new Set;for(let D=0;D<e.steps.length;D++){let X=e.steps[D];v.isStepVisible(D)&&o.visitedSteps.has(X.id)&&A.add(X.id);}return {...V,isFirstStep:o.currentStepIndex===w,isLastStep:o.currentStepIndex===W,visibleVisitedSteps:A,passedSteps:o.passedSteps}},[V,o.currentStepIndex,o.visitedSteps,o.passedSteps,v,e.steps]),{analyticsStartTime:$}=le({workflowConfig:e,workflowState:o,workflowContext:R}),{goToStep:q,goNext:z,goPrevious:xe,skipStep:Pe,canGoToStep:Ie,canGoNext:ke,canGoPrevious:We,canSkipCurrentStep:De}=ue({workflowConfig:e,workflowState:o,workflowContext:R,conditionsHelpers:v,setCurrentStep:d,setTransitioning:h,markStepVisited:P,markStepPassed:T,setStepData:g,onStepChange:c.current}),Q=useRef(false);useEffect(()=>{if(Q.current)return;if(!v.isStepVisible(o.currentStepIndex)){for(let W=0;W<e.steps.length;W++)if(v.isStepVisible(W)){d(W),P(W,e.steps[W].id);break}}Q.current=true;},[o.currentStepIndex,e.steps,d,P]),useEffect(()=>{if(!Q.current)return;if(!v.isStepVisible(o.currentStepIndex)){let W=null;for(let A=o.currentStepIndex+1;A<e.steps.length;A++)if(v.isStepVisible(A)){W=A;break}if(W===null){for(let A=o.currentStepIndex-1;A>=0;A--)if(v.isStepVisible(A)){W=A;break}}W!==null&&(d(W),P(W,e.steps[W].id));}},[v,o.currentStepIndex,e.steps,d,P]);let{submitWorkflow:J,isSubmitting:Re,canSubmit:Ee}=me({workflowConfig:e,workflowState:o,workflowContext:R,setSubmitting:f,onWorkflowComplete:m.current,analyticsStartTime:$}),ee=useCallback((w,W)=>{S(w,W,u?.id||"");},[S,u?.id]),we=useCallback(w=>{g(w,u?.id||"");},[g,u?.id]),Xe=useCallback(async w=>{u?.id&&w&&g(w,u.id),R.isLastStep?await J():await z();},[R.isLastStep,J,z,u?.id,g]),Te=useMemo(()=>({goToStep:q,goNext:z,goPrevious:xe,skipStep:Pe,canGoToStep:Ie,canGoNext:ke,canGoPrevious:We,canSkipCurrentStep:De}),[q,z,xe,Pe,Ie,ke,We,De]),Ae=useMemo(()=>({setValue:ee,setStepData:we,resetWorkflow:b}),[ee,we,b]),Ce=useMemo(()=>({submitWorkflow:J,isSubmitting:Re,canSubmit:Ee}),[J,Re,Ee]),He=useMemo(()=>({workflowState:o,workflowConfig:e,currentStep:u,context:R,formConfig:p,conditionsHelpers:v,currentStepMetadata:u?.metadata,...Te,...Ae,...Ce,persistNow:I.persistNow,isPersisting:I.isPersisting,persistenceError:I.persistenceError}),[o,e,u,R,p,v,Te,Ae,Ce,I]),Ze=useMemo(()=>{if(!u?.id)return {};let w=o?.allData[u.id]||{};if(!p?.allFields)return w;let W=new Set(p.allFields.map(D=>D.id)),A={};for(let[D,X]of Object.entries(w))W.has(D)&&(A[D]=X);return A},[o?.allData,u?.id,p?.allFields]),je=useMemo(()=>o.isInitializing.toString(),[o.isInitializing]);return jsx(Ke.Provider,{value:He,children:jsx(FormProvider,{formConfig:p,defaultValues:Ze,onFieldChange:ee,"data-workflow-id":e.id,className:l,onSubmit:Xe,children:t},je)})}function C(){let t=useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function bt({children:t,workflowConfig:e,...r}){let[n,s]=useState(),i=useMemo(()=>e instanceof G?e.build():e,[e]);return useEffect(()=>{if(typeof window<"u"&&B.shouldDisplayWatermark()){let c=B.getWatermarkMessage();s(c);}},[]),jsxs("div",{style:{position:"relative"},children:[jsx(be,{...r,workflowConfig:i,children:t}),n&&jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var Pt=xt.memo(function({stepId:e,children:r}){let{currentStep:n}=C();if(!n||e&&n.id!==e)return null;let{formConfig:s,renderer:i}=n;return s?i?i(n):r??jsx(FormBody,{}):null});var Et=xt.memo(function({className:e,isSubmitting:r,...n}){let{context:s,workflowState:i,workflowConfig:l,currentStep:c}=C(),{submit:m,formState:a}=useFormContext(),o=useMemo(()=>{let S=a.isSubmitting||i.isSubmitting,f=r??S,h=!i.isTransitioning&&!f;return {finalIsSubmitting:f,canGoNext:h}},[a.isSubmitting,i.isSubmitting,i.isTransitioning,r]),d=useCallback(async S=>{S?.preventDefault(),o.canGoNext&&await m(S);},[o.canGoNext,m]),g=useMemo(()=>({isLastStep:s.isLastStep,canGoNext:o.canGoNext,isSubmitting:o.finalIsSubmitting,onSubmit:d,className:e,currentStep:c,stepData:a.values||{},allData:s.allData,context:s}),[s.isLastStep,o.canGoNext,o.finalIsSubmitting,d,e,c,a.values,s.allData,s]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:l.renderConfig?.nextButtonRenderer,props:g,...n})});var Lt=xt.memo(function({className:e,isSubmitting:r,...n}){let{context:s,goPrevious:i,workflowState:l,workflowConfig:c,currentStep:m}=C(),{formState:a}=useFormContext(),o=useMemo(()=>{let S=a.isSubmitting||l.isSubmitting,f=r??S,h=s.currentStepIndex>0&&!l.isTransitioning&&!f;return {finalIsSubmitting:f,canGoPrevious:h}},[a.isSubmitting,l.isSubmitting,l.isTransitioning,s.currentStepIndex,r]),d=useCallback(async S=>{S?.preventDefault(),o.canGoPrevious&&await i();},[o.canGoPrevious,i]),g=useMemo(()=>({canGoPrevious:o.canGoPrevious,isSubmitting:o.finalIsSubmitting,onPrevious:d,className:e,currentStep:m,stepData:a.values||{},allData:s.allData,context:s}),[o.canGoPrevious,o.finalIsSubmitting,d,e,m,a.values,s.allData,s]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:c.renderConfig?.previousButtonRenderer,props:g,...n})});var Ot=xt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:s,skipStep:i,workflowState:l,workflowConfig:c,context:m,conditionsHelpers:a}=C(),{formState:o}=useFormContext(),d=useMemo(()=>{let f=o.isSubmitting||l.isSubmitting,h=r??f,P=(!!s?.allowSkip||a.isStepSkippable(l.currentStepIndex))&&!l.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:P}},[o.isSubmitting,l.isSubmitting,l.isTransitioning,l.currentStepIndex,s?.allowSkip,a.isStepSkippable,r]),g=useCallback(async f=>{f?.preventDefault(),d.canSkip&&await i();},[d.canSkip,i]),S=useMemo(()=>({canSkip:d.canSkip,isSubmitting:d.finalIsSubmitting,onSkip:g,className:e,currentStep:s,stepData:o.values||{},allData:m.allData,context:m}),[d.canSkip,d.finalIsSubmitting,g,e,s,o.values,m.allData,m]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:c.renderConfig?.skipButtonRenderer,props:S,...n})});var qt=xt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:s,workflowState:i,context:l,goToStep:c,conditionsHelpers:m}=C(),{visibleSteps:a,visibleToOriginalIndexMap:o,originalToVisibleIndexMap:d}=useMemo(()=>{let h=[],P=new Map,T=new Map;return s.steps.forEach((b,x)=>{if(m.isStepVisible(x)){let y=h.length;h.push(b),P.set(y,x),T.set(x,y);}}),{visibleSteps:h,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:T}},[s.steps,m]),g=useCallback(h=>{let P=o.get(h);P!==void 0&&(e?e(P):c(P));},[o,e,c]),S=useMemo(()=>d.get(i.currentStepIndex)??-1,[d,i.currentStepIndex]),f=useMemo(()=>({steps:a,currentStepIndex:S,visitedSteps:l.visibleVisitedSteps,onStepClick:g,className:r}),[a,S,l.visibleVisitedSteps,g,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:s.renderConfig?.stepperRenderer,props:f,...n})});var he=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},i=JSON.stringify(s),l=this.compress?this.compressData(i):i;localStorage.setItem(n,l);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let s=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},l=JSON.stringify(i),c=this.compress?this.compressData(l):l;localStorage.setItem(s,c);}catch(s){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",s)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let s=this.compress?this.decompressData(n):n,i=JSON.parse(s);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),null):{...i.data,visitedSteps:Array.isArray(i.data.visitedSteps)?i.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let s=this.compress?this.decompressData(n):n,i=JSON.parse(s);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let s=n.substring(this.keyPrefix.length);await this.exists(s)&&e.push(s);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let s=localStorage.getItem(n);if(s){let i=this.compress?this.decompressData(s):s,l=JSON.parse(i);l.expiresAt&&Date.now()>l.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
+ export{he as LocalStorageAdapter,B as RilayLicenseManager,bt as Workflow,Pt as WorkflowBody,Et as WorkflowNextButton,E as WorkflowPersistenceError,Lt as WorkflowPreviousButton,be as WorkflowProvider,Ot as WorkflowSkipButton,qt as WorkflowStepper,ce as combineWorkflowDataForConditions,oe as debounce,pe as flattenObject,G as flow,ie as generateStorageKey,it as mergePersistedState,Ve as persistedToWorkflowState,ne as useConditionEvaluation,Z as usePersistence,ot as useStepMetadata,le as useWorkflowAnalytics,de as useWorkflowConditions,C as useWorkflowContext,ue as useWorkflowNavigation,fe as useWorkflowState,me as useWorkflowSubmission,st as validatePersistedData,se as workflowStateToPersisted};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/workflow",
3
- "version": "13.0.0",
3
+ "version": "13.1.0",
4
4
  "description": "Commercial workflow and multi-step form utilities for RilayKit - License required for all use",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@noble/ed25519": "^1.7.1",
37
- "@rilaykit/core": "12.0.0",
38
- "@rilaykit/forms": "11.2.1"
37
+ "@rilaykit/core": "12.1.0",
38
+ "@rilaykit/forms": "11.2.2"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=18.0.0",