@rilaykit/workflow
Advanced tools
+1
-1
@@ -1,1 +0,1 @@ | ||
| 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Ct=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Ct__default=/*#__PURE__*/_interopDefault(Ct);function pe(t,e,r,n){return {data:t,next:{prefill:i=>{e.setNextStepFields(i);},skip:()=>{console.warn("step.next.skip() not yet implemented");}},workflow:{get:i=>e.getStepData(i),all:()=>e.getAllData(),goto:i=>{console.warn("step.workflow.goto() not yet implemented");}},meta:n||{},isFirst:r.isFirstStep,isLast:r.isLastStep}}var j=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r||`workflow-${Math.random().toString(36).substring(2,15)}`,this.workflowName=n||"Workflow",this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){let r=e.after?(n,i,s)=>{let p=pe(n,i,s,e.metadata);return e.after(p)}:e.onAfterValidation;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:r}}_addStepsInternal(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}addStep(e){return this._addStepsInternal(e)}step(e){return this._addStepsInternal(e)}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(s=>s.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(s=>!this.plugins.some(p=>p.name===s));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}};function ce(t,e={},r={}){return Ct.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 s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),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 Ct.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?core.evaluateCondition(p.build(),e):core.evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Ue(t,e={}){return Ct.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(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 fe(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 ze(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 lt(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 me(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function pt(t,e,r="persist"){let n=ze(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 Q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=Ct.useState(false),[o,f]=Ct.useState(null),[u,b]=Ct.useState(false),c=Ct.useRef(r),l=Ct.useRef(n),a=Ct.useRef({hasPendingChanges:false});Ct.useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=Se(l.current.storageKey||t,i),k=Ct.useCallback(()=>{f(null);},[]),P=Ct.useCallback((d,W)=>{let V=d instanceof R?d:new R(`${W} failed: ${d.message}`,"OPERATION_FAILED",d);f(V),console.error("[WorkflowPersistence]",V);},[]),D=Ct.useCallback(async d=>{k(),p(true);try{let W=fe(t,d,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...d},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{p(false);}},[t,y,k,P]),v=Ct.useRef(me(async d=>{try{await D(d);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),I=Ct.useCallback((d,W)=>W?d.currentStepIndex!==W.currentStepIndex||JSON.stringify(d.allData)!==JSON.stringify(W.allData)||JSON.stringify(d.stepData)!==JSON.stringify(W.stepData)||d.visitedSteps.size!==W.visitedSteps.size||!Array.from(d.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=Ct.useCallback(async()=>{k(),b(true);try{let d=await c.current.load(y);return d&&(a.current.lastSavedState={currentStepIndex:d.currentStepIndex,allData:d.allData,stepData:d.stepData,visitedSteps:new Set(d.visitedSteps),passedSteps:new Set(d.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),d}catch(d){return P(d,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),h=Ct.useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(d){throw P(d,"Clear"),d}},[y,k,P]),L=Ct.useCallback(async()=>{try{return await c.current.exists(y)}catch(d){return P(d,"Exists check"),false}},[y,P]);Ct.useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||I(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,v.current(e)));},[e,s,u,I]);let m=Ct.useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:h,hasPersistedData:L}}function dt(){let{workflowConfig:t,currentStep:e}=N(),r=Ct.useMemo(()=>e?.metadata,[e?.metadata]),n=Ct.useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=Ct.useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=Ct.useMemo(()=>u=>r?u in r:false,[r]),p=Ct.useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=Ct.useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=Ct.useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function be({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Ct.useRef(Date.now()),i=Ct.useRef(new Map),s=Ct.useRef(false),p=Ct.useRef(null),o=core.getGlobalMonitor();Ct.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.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,o,t.steps.length]),Ct.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.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,o,t.id]);let f=Ct.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=Ct.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Ct.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=Ct.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function ye(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function Ke(t,e){return {visible:t.visible,skippable:e===true||t.required}}function xe({workflowConfig:t,workflowState:e,currentStep:r}){let n=Ct.useMemo(()=>ye(e.allData,e.stepData),[e.allData,e.stepData]),i=Ct.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ce(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=Ct.useMemo(()=>Ke(s,r?.allowSkip),[s,r?.allowSkip]),o=Ct.useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{I.conditions&&(v[S]={visible:I.conditions.visible,required:I.conditions.skippable});}),v},[t.steps]),f=Ue(o,n),u=Ct.useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{let h=f[S];h?v[S]=Ke(h,I.allowSkip):v[S]={visible:true,skippable:I.allowSkip===true};}),v},[t.steps,f]),b=Ct.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let v={};for(let I of r.formConfig.allFields)I.conditions&&(v[I.id]=I.conditions);return v},[r?.formConfig?.allFields]),c=Le(b,n),l=Ct.useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.visible??true,[u,t.steps.length]),a=Ct.useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.skippable??false,[u,t.steps.length]),y=Ct.useCallback(v=>c[v]?.visible??true,[c]),k=Ct.useCallback(v=>c[v]?.disabled??false,[c]),P=Ct.useCallback(v=>c[v]?.required??false,[c]),D=Ct.useCallback(v=>c[v]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:u}){let b=Ct.useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=Ct.useCallback(()=>({setStepData:(m,d)=>{f(d,m);},setStepFields:(m,d)=>{let V={...e.allData[m]||{},...d};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,d)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:d};f(X,V);}},setNextStepFields:m=>{let d=e.currentStepIndex+1;if(d<t.steps.length){let W=t.steps[d].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=Ct.useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),p(m,t.steps[m].id),!0}catch(d){return console.error("Step transition failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=Ct.useCallback(m=>{for(let d=m+1;d<t.steps.length;d++)if(n.isStepVisible(d))return d;return null},[t.steps.length,n]),k=Ct.useCallback(m=>{for(let d=m-1;d>=0;d--)if(n.isStepVisible(d))return d;return null},[n]),P=Ct.useCallback(async()=>{if(c?.onAfterValidation)try{let d=l();await c.onAfterValidation(e.stepData,d,r);}catch(d){return console.error("onAfterValidation failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=Ct.useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),v=Ct.useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),I=Ct.useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=Ct.useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,y,I]),h=Ct.useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,k,I]),L=Ct.useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:v,canGoToStep:I,canGoNext:S,canGoPrevious:h,canSkipCurrentStep:L}}function St(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 mt({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Ct.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let h=0;h<e;h++)r[h]&&S.add(r[h].id);return S},[e,r]),s=Ct.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let h=0;h<e;h++)r[h]&&S.add(r[h].id);return S},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=Ct.useReducer(St,p),u=n?.adapter?Q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Ct.useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=Ct.useCallback((S,h)=>{f({type:"SET_STEP_DATA",data:S,stepId:h});},[]),l=Ct.useCallback((S,h,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:h,stepId:L});},[]),a=Ct.useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=Ct.useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=Ct.useCallback((S,h)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:h});},[]),P=Ct.useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=Ct.useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),v=Ct.useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),I=Ct.useCallback(async()=>{if(!u)return v(),false;try{let S=await u.loadPersistedData();if(S){let h={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:h}),v(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return v(),false},[u,v]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:I,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=Ct.useRef(i);p.current=i;let o=Ct.useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=Ct.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function He(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var Pe=Ct.createContext(null);function A(){let t=Ct.useContext(Pe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function Qr(){let t=A();return zustand.useStore(t,e=>e.currentStepIndex)}function Xr(){let t=A();return zustand.useStore(t,e=>e.isTransitioning)}function Yr(){let t=A();return zustand.useStore(t,e=>e.isInitializing)}function en(){let t=A();return zustand.useStore(t,e=>e.isSubmitting)}function tn(){let t=A();return zustand.useStore(t,e=>e.allData)}function rn(){let t=A();return zustand.useStore(t,e=>e.stepData)}function nn(t){let e=A();return zustand.useStore(e,r=>r.allData[t])}function sn(){let t=A();return zustand.useStore(t,e=>e.visitedSteps)}function on(){let t=A();return zustand.useStore(t,e=>e.passedSteps)}function an(t){let e=A();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function ln(t){let e=A();return zustand.useStore(e,r=>r.passedSteps.has(t))}function pn(){let t=A(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function dn(){let t=A(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function un(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function cn(){return A()}var Wt={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=Ct.createContext(null);function Dt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=Ct.useRef(i),f=Ct.useRef(s);o.current=i,f.current=s;let u=Ct.useMemo(()=>{if(!n)return 0;let x=e.steps.findIndex(g=>g.id===n);return x===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):x},[n,e.steps]),b=Ct.useMemo(()=>Dt(u,e.steps),[u,e.steps]),c=Ct.useRef(null);c.current||(c.current=He({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=Ct.useState(()=>{let x=l.getState();return {currentStepIndex:x.currentStepIndex,allData:x.allData,stepData:x.stepData,visitedSteps:x.visitedSteps,passedSteps:x.passedSteps,isSubmitting:x.isSubmitting,isTransitioning:x.isTransitioning,isInitializing:x.isInitializing}});Ct.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Ct.useCallback(x=>l.getState()._setCurrentStep(x),[l]),P=Ct.useCallback((x,g)=>l.getState()._setStepData(x,g),[l]),D=Ct.useCallback((x,g,E)=>l.getState()._setFieldValue(x,g,E),[l]),v=Ct.useCallback(x=>l.getState()._setSubmitting(x),[l]),I=Ct.useCallback(x=>l.getState()._setTransitioning(x),[l]),S=Ct.useCallback((x,g)=>l.getState()._markStepVisited(g),[l]),h=Ct.useCallback(x=>l.getState()._markStepPassed(x),[l]),L=Ct.useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,d=Q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??Wt,options:e.persistence?.options,userId:e.persistence?.userId}),W=Ct.useRef(d);W.current=d;let V=Ct.useRef(false);Ct.useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=Ct.useMemo(()=>({isPersisting:m?d.isPersisting:false,persistenceError:m?d.persistenceError:null,persistNow:m?d.persistNow:void 0}),[m,d.isPersisting,d.persistenceError,d.persistNow]),X=Ct.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=Ct.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=Ct.useMemo(()=>C?.formConfig,[C?.formConfig]),_=xe({workflowConfig:e,workflowState:a,currentStep:C}),G=Ct.useMemo(()=>{let x=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){x=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===x,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Ye}=be({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}=ke({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:I,markStepVisited:S,markStepPassed:h,setStepData:P,onStepChange:o.current}),ae=Ct.useRef(false);Ct.useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),Ct.useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}=ve({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:v,onWorkflowComplete:f.current,analyticsStartTime:Ye}),le=Ct.useCallback((x,g)=>{D(x,g,C?.id||"");},[D,C?.id]),Fe=Ct.useCallback(x=>{P(x,C?.id||"");},[P,C?.id]),et=Ct.useCallback(async x=>{C?.id&&x&&P(x,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Me=Ct.useMemo(()=>({goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}),[we,Y,Re,Ee,Te,Ce,Ae,_e]),Be=Ct.useMemo(()=>({setValue:le,setStepData:Fe,resetWorkflow:L}),[le,Fe,L]),Oe=Ct.useMemo(()=>({submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}),[ee,Ve,Ne]),tt=Ct.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Me,...Be,...Oe,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Me,Be,Oe,z]),rt=Ct.useMemo(()=>{if(!C?.id)return {};let x=a?.allData[C.id]||{};if(!K?.allFields)return x;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(x))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),nt=Ct.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(Pe.Provider,{value:l,children:jsxRuntime.jsx(je.Provider,{value:tt,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:K,defaultValues:rt,onFieldChange:le,"data-workflow-id":e.id,className:p,onSubmit:et,children:t},nt)})})}function N(){let t=Ct.useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Rt({children:t,workflowConfig:e,...r}){let n=Ct.useMemo(()=>e instanceof j?e.build():e,[e]);return jsxRuntime.jsx(he,{...r,workflowConfig:n,children:t})}var At=Ct__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Lt=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=N(),{submit:f}=forms.useFormConfigContext(),u=forms.useFormSubmitting(),b=forms.useFormValues(),c=Ct.useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=Ct.useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=Ct.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var Jt=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Ct.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=u()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,p.isSubmitting,p.isTransitioning,u,r]),a=Ct.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Ct.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var er=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Ct.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=Ct.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Ct.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var sr=Ct__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=Ct.useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((v,I)=>{if(f.isStepVisible(I)){let S=k.length;k.push(v),P.set(S,I),D.set(I,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=Ct.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Ct.useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=Ct.useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,p.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var De=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},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.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 s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=De;exports.Workflow=Rt;exports.WorkflowBody=At;exports.WorkflowNextButton=Lt;exports.WorkflowPersistenceError=R;exports.WorkflowPreviousButton=Jt;exports.WorkflowProvider=he;exports.WorkflowSkipButton=er;exports.WorkflowStepper=sr;exports.WorkflowStoreContext=Pe;exports.combineWorkflowDataForConditions=ye;exports.createStepContext=pe;exports.createWorkflowStore=He;exports.debounce=me;exports.flattenObject=se;exports.flow=j;exports.generateStorageKey=Se;exports.mergePersistedState=pt;exports.persistedToWorkflowState=ze;exports.useConditionEvaluation=ce;exports.useCurrentStepIndex=Qr;exports.useIsStepPassed=ln;exports.useIsStepVisited=an;exports.usePassedSteps=on;exports.usePersistence=Q;exports.useStepDataById=nn;exports.useStepMetadata=dt;exports.useVisitedSteps=sn;exports.useWorkflowActions=un;exports.useWorkflowAllData=tn;exports.useWorkflowAnalytics=be;exports.useWorkflowConditions=xe;exports.useWorkflowContext=N;exports.useWorkflowInitializing=Yr;exports.useWorkflowNavigation=ke;exports.useWorkflowNavigationState=pn;exports.useWorkflowState=mt;exports.useWorkflowStepData=rn;exports.useWorkflowStore=A;exports.useWorkflowStoreApi=cn;exports.useWorkflowSubmission=ve;exports.useWorkflowSubmitState=dn;exports.useWorkflowSubmitting=en;exports.useWorkflowTransitioning=Xr;exports.validatePersistedData=lt;exports.workflowStateToPersisted=fe; | ||
| 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Ct=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Ct__default=/*#__PURE__*/_interopDefault(Ct);function pe(t,e,r,n){return {data:t,next:{prefill:i=>{e.setNextStepFields(i);},skip:()=>{console.warn("step.next.skip() not yet implemented");}},workflow:{get:i=>e.getStepData(i),all:()=>e.getAllData(),goto:i=>{console.warn("step.workflow.goto() not yet implemented");}},meta:n||{},isFirst:r.isFirstStep,isLast:r.isLastStep}}var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r||`workflow-${Math.random().toString(36).substring(2,15)}`,this.workflowName=n||"Workflow",this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){let r=e.after?(n,i,s)=>{let p=pe(n,i,s,e.metadata);return e.after(p)}:e.onAfterValidation;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:r}}_addStepsInternal(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}addStep(e){return this._addStepsInternal(e)}step(e){return this._addStepsInternal(e)}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(s=>s.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(s=>!this.plugins.some(p=>p.name===s));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}};function ce(t,e={},r={}){return Ct.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 s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),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 Ct.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?core.evaluateCondition(p.build(),e):core.evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Ue(t,e={}){return Ct.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(c){return console.warn(`Error evaluating condition for step ${s}:`,c),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(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 fe(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 ze(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 lt(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 me(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function pt(t,e,r="persist"){let n=ze(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 Q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=Ct.useState(false),[o,c]=Ct.useState(null),[u,b]=Ct.useState(false),f=Ct.useRef(r),l=Ct.useRef(n),a=Ct.useRef({hasPendingChanges:false});Ct.useEffect(()=>{f.current=r,l.current=n;},[r,n]);let y=Se(l.current.storageKey||t,i),k=Ct.useCallback(()=>{c(null);},[]),P=Ct.useCallback((d,h)=>{let V=d instanceof R?d:new R(`${h} failed: ${d.message}`,"OPERATION_FAILED",d);c(V),console.error("[WorkflowPersistence]",V);},[]),D=Ct.useCallback(async d=>{k(),p(true);try{let h=fe(t,d,l.current.metadata);await f.current.save(y,h),a.current.lastSavedState={...d},a.current.hasPendingChanges=!1;}catch(h){throw P(h,"Save"),h}finally{p(false);}},[t,y,k,P]),v=Ct.useRef(me(async d=>{try{await D(d);}catch(h){console.debug("[WorkflowPersistence] Auto-save failed:",h);}},n.debounceMs||500)),I=Ct.useCallback((d,h)=>h?d.currentStepIndex!==h.currentStepIndex||JSON.stringify(d.allData)!==JSON.stringify(h.allData)||JSON.stringify(d.stepData)!==JSON.stringify(h.stepData)||d.visitedSteps.size!==h.visitedSteps.size||!Array.from(d.visitedSteps).every(V=>h.visitedSteps.has(V)):true,[]),S=Ct.useCallback(async()=>{k(),b(true);try{let d=await f.current.load(y);return d&&(a.current.lastSavedState={currentStepIndex:d.currentStepIndex,allData:d.allData,stepData:d.stepData,visitedSteps:new Set(d.visitedSteps),passedSteps:new Set(d.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),d}catch(d){return P(d,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=Ct.useCallback(async()=>{k();try{await f.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(d){throw P(d,"Clear"),d}},[y,k,P]),L=Ct.useCallback(async()=>{try{return await f.current.exists(y)}catch(d){return P(d,"Exists check"),false}},[y,P]);Ct.useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||I(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,v.current(e)));},[e,s,u,I]);let m=Ct.useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:W,hasPersistedData:L}}function dt(){let{workflowConfig:t,currentStep:e}=N(),r=Ct.useMemo(()=>e?.metadata,[e?.metadata]),n=Ct.useMemo(()=>u=>t.steps.find(f=>f.id===u)?.metadata,[t.steps]),i=Ct.useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=Ct.useMemo(()=>u=>r?u in r:false,[r]),p=Ct.useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=Ct.useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),c=Ct.useMemo(()=>u=>t.steps.map((b,f)=>({step:b,index:f})).filter(({step:b,index:f})=>u(b.metadata,b.id,f)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:c}}function be({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Ct.useRef(Date.now()),i=Ct.useRef(new Map),s=Ct.useRef(false),p=Ct.useRef(null),o=core.getGlobalMonitor();Ct.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.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,o,t.steps.length]),Ct.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.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,o,t.id]);let c=Ct.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=Ct.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Ct.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),f=Ct.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:c,trackError:u,trackNavigation:b,trackConditionEvaluation:f}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function ye(t,e){let r={};for(let s in t){let p=t[s];p&&typeof p=="object"&&!Array.isArray(p)&&!(p instanceof Date)&&Object.assign(r,p);}let n=se(t),i=se(e);return {...r,...t,...e,...n,...i}}function Ke(t,e){return {visible:t.visible,skippable:e===true||t.required}}function xe({workflowConfig:t,workflowState:e,currentStep:r}){let n=Ct.useMemo(()=>ye(e.allData,e.stepData),[e.allData,e.stepData]),i=Ct.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ce(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=Ct.useMemo(()=>Ke(s,r?.allowSkip),[s,r?.allowSkip]),o=Ct.useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{I.conditions&&(v[S]={visible:I.conditions.visible,required:I.conditions.skippable});}),v},[t.steps]),c=Ue(o,n),u=Ct.useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{let W=c[S];W?v[S]=Ke(W,I.allowSkip):v[S]={visible:true,skippable:I.allowSkip===true};}),v},[t.steps,c]),b=Ct.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let v={};for(let I of r.formConfig.allFields)I.conditions&&(v[I.id]=I.conditions);return v},[r?.formConfig?.allFields]),f=Le(b,n),l=Ct.useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.visible??true,[u,t.steps.length]),a=Ct.useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.skippable??false,[u,t.steps.length]),y=Ct.useCallback(v=>f[v]?.visible??true,[f]),k=Ct.useCallback(v=>f[v]?.disabled??false,[f]),P=Ct.useCallback(v=>f[v]?.required??false,[f]),D=Ct.useCallback(v=>f[v]?.readonly??false,[f]);return {stepConditions:p,fieldConditions:f,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:c,onStepChange:u}){let b=Ct.useRef(u);b.current=u;let f=t.steps[e.currentStepIndex],l=Ct.useCallback(()=>({setStepData:(m,d)=>{c(d,m);},setStepFields:(m,d)=>{let V={...e.allData[m]||{},...d};c(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,d)=>{let h=e.currentStepIndex+1;if(h<t.steps.length){let V=t.steps[h].id,X={...e.allData[V]||{},[m]:d};c(X,V);}},setNextStepFields:m=>{let d=e.currentStepIndex+1;if(d<t.steps.length){let h=t.steps[d].id,z={...e.allData[h]||{},...m};c(z,h);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,c]),a=Ct.useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{b.current&&b.current(e.currentStepIndex,m,r);let d=t.steps[m].id;i(m),p(m,d);let h=e.allData[d]||{};return c(h,d),!0}catch(d){return console.error("Step transition failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,e.allData,r,s,i,p,c]),y=Ct.useCallback(m=>{for(let d=m+1;d<t.steps.length;d++)if(n.isStepVisible(d))return d;return null},[t.steps.length,n]),k=Ct.useCallback(m=>{for(let d=m-1;d>=0;d--)if(n.isStepVisible(d))return d;return null},[n]),P=Ct.useCallback(async()=>{if(f?.onAfterValidation)try{let d=l();await f.onAfterValidation(e.stepData,d,r);}catch(d){return console.error("onAfterValidation failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}o(f.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[f,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=Ct.useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),v=Ct.useCallback(async()=>!f?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(f.id,"user_skip",r),P()),[f,n,e.currentStepIndex,t.analytics,r,P]),I=Ct.useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=Ct.useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,y,I]),W=Ct.useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,k,I]),L=Ct.useCallback(()=>f?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[f?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:v,canGoToStep:I,canGoNext:S,canGoPrevious:W,canSkipCurrentStep:L}}function St(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 mt({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Ct.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&S.add(r[W].id);return S},[e,r]),s=Ct.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&S.add(r[W].id);return S},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,c]=Ct.useReducer(St,p),u=n?.adapter?Q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Ct.useCallback(S=>{c({type:"SET_CURRENT_STEP",stepIndex:S});},[]),f=Ct.useCallback((S,W)=>{c({type:"SET_STEP_DATA",data:S,stepId:W});},[]),l=Ct.useCallback((S,W,L)=>{c({type:"SET_FIELD_VALUE",fieldId:S,value:W,stepId:L});},[]),a=Ct.useCallback(S=>{c({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=Ct.useCallback(S=>{c({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=Ct.useCallback((S,W)=>{c({type:"MARK_STEP_VISITED",stepIndex:S,stepId:W});},[]),P=Ct.useCallback(S=>{c({type:"MARK_STEP_PASSED",stepId:S});},[]),D=Ct.useCallback(()=>{c({type:"RESET_WORKFLOW"});},[]),v=Ct.useCallback(()=>{c({type:"SET_INITIALIZATION_COMPLETE"});},[]),I=Ct.useCallback(async()=>{if(!u)return v(),false;try{let S=await u.loadPersistedData();if(S){let W={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return c({type:"LOAD_PERSISTED_STATE",state:W}),v(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return v(),false},[u,v]);return {workflowState:o,setCurrentStep:b,setStepData:f,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:I,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=Ct.useRef(i);p.current=i;let o=Ct.useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),c=Ct.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:c()}}function je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,c)=>{s(u=>({stepData:o,allData:{...u.allData,[c]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,c,u)=>{s(b=>{let f={...b.stepData,[o]:c};return {stepData:f,allData:{...b.allData,[u]:f}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(c=>({visitedSteps:new Set([...c.visitedSteps,o])}));},_markStepPassed:o=>{s(c=>({passedSteps:new Set([...c.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(c=>({...c,...o,isInitializing:false}));}})))}var Pe=Ct.createContext(null);function A(){let t=Ct.useContext(Pe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function Qr(){let t=A();return zustand.useStore(t,e=>e.currentStepIndex)}function Xr(){let t=A();return zustand.useStore(t,e=>e.isTransitioning)}function Yr(){let t=A();return zustand.useStore(t,e=>e.isInitializing)}function en(){let t=A();return zustand.useStore(t,e=>e.isSubmitting)}function tn(){let t=A();return zustand.useStore(t,e=>e.allData)}function rn(){let t=A();return zustand.useStore(t,e=>e.stepData)}function nn(t){let e=A();return zustand.useStore(e,r=>r.allData[t])}function sn(){let t=A();return zustand.useStore(t,e=>e.visitedSteps)}function on(){let t=A();return zustand.useStore(t,e=>e.passedSteps)}function an(t){let e=A();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function ln(t){let e=A();return zustand.useStore(e,r=>r.passedSteps.has(t))}function pn(){let t=A(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function dn(){let t=A(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function un(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function cn(){return A()}var Wt={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},He=Ct.createContext(null);function Dt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=Ct.useRef(i),c=Ct.useRef(s);o.current=i,c.current=s;let u=Ct.useMemo(()=>{if(!n)return 0;let x=e.steps.findIndex(g=>g.id===n);return x===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):x},[n,e.steps]),b=Ct.useMemo(()=>Dt(u,e.steps),[u,e.steps]),f=Ct.useRef(null);f.current||(f.current=je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=f.current,[a,y]=Ct.useState(()=>{let x=l.getState();return {currentStepIndex:x.currentStepIndex,allData:x.allData,stepData:x.stepData,visitedSteps:x.visitedSteps,passedSteps:x.passedSteps,isSubmitting:x.isSubmitting,isTransitioning:x.isTransitioning,isInitializing:x.isInitializing}});Ct.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Ct.useCallback(x=>l.getState()._setCurrentStep(x),[l]),P=Ct.useCallback((x,g)=>l.getState()._setStepData(x,g),[l]),D=Ct.useCallback((x,g,E)=>l.getState()._setFieldValue(x,g,E),[l]),v=Ct.useCallback(x=>l.getState()._setSubmitting(x),[l]),I=Ct.useCallback(x=>l.getState()._setTransitioning(x),[l]),S=Ct.useCallback((x,g)=>l.getState()._markStepVisited(g),[l]),W=Ct.useCallback(x=>l.getState()._markStepPassed(x),[l]),L=Ct.useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,d=Q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??Wt,options:e.persistence?.options,userId:e.persistence?.userId}),h=Ct.useRef(d);h.current=d;let V=Ct.useRef(false);Ct.useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await h.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=Ct.useMemo(()=>({isPersisting:m?d.isPersisting:false,persistenceError:m?d.persistenceError:null,persistNow:m?d.persistNow:void 0}),[m,d.isPersisting,d.persistenceError,d.persistNow]),X=Ct.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=Ct.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=Ct.useMemo(()=>C?.formConfig,[C?.formConfig]),_=xe({workflowConfig:e,workflowState:a,currentStep:C}),G=Ct.useMemo(()=>{let x=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){x=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===x,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Ye}=be({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}=ke({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:I,markStepVisited:S,markStepPassed:W,setStepData:P,onStepChange:o.current}),ae=Ct.useRef(false);Ct.useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),Ct.useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}=ve({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:v,onWorkflowComplete:c.current,analyticsStartTime:Ye}),le=Ct.useCallback((x,g)=>{D(x,g,C?.id||"");},[D,C?.id]),Fe=Ct.useCallback(x=>{P(x,C?.id||"");},[P,C?.id]),et=Ct.useCallback(async x=>{C?.id&&x&&P(x,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Me=Ct.useMemo(()=>({goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}),[we,Y,Re,Ee,Te,Ce,Ae,_e]),Be=Ct.useMemo(()=>({setValue:le,setStepData:Fe,resetWorkflow:L}),[le,Fe,L]),Oe=Ct.useMemo(()=>({submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}),[ee,Ve,Ne]),tt=Ct.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Me,...Be,...Oe,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Me,Be,Oe,z]),rt=Ct.useMemo(()=>{if(!C?.id)return {};let x=a?.allData[C.id]||{};if(!K?.allFields)return x;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(x))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),nt=Ct.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(Pe.Provider,{value:l,children:jsxRuntime.jsx(He.Provider,{value:tt,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:K,defaultValues:rt,onFieldChange:le,"data-workflow-id":e.id,className:p,onSubmit:et,children:t},nt)})})}function N(){let t=Ct.useContext(He);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Rt({children:t,workflowConfig:e,...r}){let n=Ct.useMemo(()=>e instanceof H?e.build():e,[e]);return jsxRuntime.jsx(he,{...r,workflowConfig:n,children:t})}var At=Ct__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Lt=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=N(),{submit:c}=forms.useFormConfigContext(),u=forms.useFormSubmitting(),b=forms.useFormValues(),f=Ct.useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=Ct.useCallback(async y=>{y?.preventDefault(),f.canGoNext&&await c(y);},[f.canGoNext,c]),a=Ct.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:f.canGoNext,isSubmitting:f.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,f.canGoNext,f.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var Jt=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:c,canGoPrevious:u}=N(),b=forms.useFormSubmitting(),f=forms.useFormValues(),l=Ct.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=u()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,p.isSubmitting,p.isTransitioning,u,r]),a=Ct.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Ct.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:c,stepData:f,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,c,f,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var er=Ct__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:c,conditionsHelpers:u}=N(),b=forms.useFormSubmitting(),f=forms.useFormValues(),l=Ct.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=Ct.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Ct.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:f,allData:c.allData,context:c}),[l.canSkip,l.finalIsSubmitting,a,e,i,f,c.allData,c]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var sr=Ct__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:c}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:f}=Ct.useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((v,I)=>{if(c.isStepVisible(I)){let S=k.length;k.push(v),P.set(S,I),D.set(I,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,c]),l=Ct.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Ct.useMemo(()=>f.get(s.currentStepIndex)??-1,[f,s.currentStepIndex]),y=Ct.useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,p.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var De=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},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.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 s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=De;exports.Workflow=Rt;exports.WorkflowBody=At;exports.WorkflowNextButton=Lt;exports.WorkflowPersistenceError=R;exports.WorkflowPreviousButton=Jt;exports.WorkflowProvider=he;exports.WorkflowSkipButton=er;exports.WorkflowStepper=sr;exports.WorkflowStoreContext=Pe;exports.combineWorkflowDataForConditions=ye;exports.createStepContext=pe;exports.createWorkflowStore=je;exports.debounce=me;exports.flattenObject=se;exports.flow=H;exports.generateStorageKey=Se;exports.mergePersistedState=pt;exports.persistedToWorkflowState=ze;exports.useConditionEvaluation=ce;exports.useCurrentStepIndex=Qr;exports.useIsStepPassed=ln;exports.useIsStepVisited=an;exports.usePassedSteps=on;exports.usePersistence=Q;exports.useStepDataById=nn;exports.useStepMetadata=dt;exports.useVisitedSteps=sn;exports.useWorkflowActions=un;exports.useWorkflowAllData=tn;exports.useWorkflowAnalytics=be;exports.useWorkflowConditions=xe;exports.useWorkflowContext=N;exports.useWorkflowInitializing=Yr;exports.useWorkflowNavigation=ke;exports.useWorkflowNavigationState=pn;exports.useWorkflowState=mt;exports.useWorkflowStepData=rn;exports.useWorkflowStore=A;exports.useWorkflowStoreApi=cn;exports.useWorkflowSubmission=ve;exports.useWorkflowSubmitState=dn;exports.useWorkflowSubmitting=en;exports.useWorkflowTransitioning=Xr;exports.validatePersistedData=lt;exports.workflowStateToPersisted=fe; |
+1
-1
@@ -1,1 +0,1 @@ | ||
| import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Ct,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';function pe(t,e,r,n){return {data:t,next:{prefill:i=>{e.setNextStepFields(i);},skip:()=>{console.warn("step.next.skip() not yet implemented");}},workflow:{get:i=>e.getStepData(i),all:()=>e.getAllData(),goto:i=>{console.warn("step.workflow.goto() not yet implemented");}},meta:n||{},isFirst:r.isFirstStep,isLast:r.isLastStep}}var j=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r||`workflow-${Math.random().toString(36).substring(2,15)}`,this.workflowName=n||"Workflow",this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){let r=e.after?(n,i,s)=>{let p=pe(n,i,s,e.metadata);return e.after(p)}:e.onAfterValidation;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:r}}_addStepsInternal(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}addStep(e){return this._addStepsInternal(e)}step(e){return this._addStepsInternal(e)}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(s=>s.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(s=>!this.plugins.some(p=>p.name===s));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}};function ce(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 s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),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 s=p=>{try{return p&&typeof p=="object"&&"build"in p?evaluateCondition(p.build(),e):evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Ue(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(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 fe(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 ze(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 lt(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 me(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function pt(t,e,r="persist"){let n=ze(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 Q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=useState(false),[o,f]=useState(null),[u,b]=useState(false),c=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=Se(l.current.storageKey||t,i),k=useCallback(()=>{f(null);},[]),P=useCallback((d,W)=>{let V=d instanceof R?d:new R(`${W} failed: ${d.message}`,"OPERATION_FAILED",d);f(V),console.error("[WorkflowPersistence]",V);},[]),D=useCallback(async d=>{k(),p(true);try{let W=fe(t,d,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...d},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{p(false);}},[t,y,k,P]),v=useRef(me(async d=>{try{await D(d);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),I=useCallback((d,W)=>W?d.currentStepIndex!==W.currentStepIndex||JSON.stringify(d.allData)!==JSON.stringify(W.allData)||JSON.stringify(d.stepData)!==JSON.stringify(W.stepData)||d.visitedSteps.size!==W.visitedSteps.size||!Array.from(d.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=useCallback(async()=>{k(),b(true);try{let d=await c.current.load(y);return d&&(a.current.lastSavedState={currentStepIndex:d.currentStepIndex,allData:d.allData,stepData:d.stepData,visitedSteps:new Set(d.visitedSteps),passedSteps:new Set(d.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),d}catch(d){return P(d,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),h=useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(d){throw P(d,"Clear"),d}},[y,k,P]),L=useCallback(async()=>{try{return await c.current.exists(y)}catch(d){return P(d,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||I(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,v.current(e)));},[e,s,u,I]);let m=useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:h,hasPersistedData:L}}function dt(){let{workflowConfig:t,currentStep:e}=N(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=useMemo(()=>u=>r?u in r:false,[r]),p=useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function be({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),p=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.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,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.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,o,t.id]);let f=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function ye(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function Ke(t,e){return {visible:t.visible,skippable:e===true||t.required}}function xe({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>ye(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ce(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=useMemo(()=>Ke(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{I.conditions&&(v[S]={visible:I.conditions.visible,required:I.conditions.skippable});}),v},[t.steps]),f=Ue(o,n),u=useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{let h=f[S];h?v[S]=Ke(h,I.allowSkip):v[S]={visible:true,skippable:I.allowSkip===true};}),v},[t.steps,f]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let v={};for(let I of r.formConfig.allFields)I.conditions&&(v[I.id]=I.conditions);return v},[r?.formConfig?.allFields]),c=Le(b,n),l=useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.visible??true,[u,t.steps.length]),a=useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.skippable??false,[u,t.steps.length]),y=useCallback(v=>c[v]?.visible??true,[c]),k=useCallback(v=>c[v]?.disabled??false,[c]),P=useCallback(v=>c[v]?.required??false,[c]),D=useCallback(v=>c[v]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:u}){let b=useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(m,d)=>{f(d,m);},setStepFields:(m,d)=>{let V={...e.allData[m]||{},...d};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,d)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:d};f(X,V);}},setNextStepFields:m=>{let d=e.currentStepIndex+1;if(d<t.steps.length){let W=t.steps[d].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),p(m,t.steps[m].id),!0}catch(d){return console.error("Step transition failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=useCallback(m=>{for(let d=m+1;d<t.steps.length;d++)if(n.isStepVisible(d))return d;return null},[t.steps.length,n]),k=useCallback(m=>{for(let d=m-1;d>=0;d--)if(n.isStepVisible(d))return d;return null},[n]),P=useCallback(async()=>{if(c?.onAfterValidation)try{let d=l();await c.onAfterValidation(e.stepData,d,r);}catch(d){return console.error("onAfterValidation failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),v=useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),I=useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,y,I]),h=useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,k,I]),L=useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:v,canGoToStep:I,canGoNext:S,canGoPrevious:h,canSkipCurrentStep:L}}function St(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 mt({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let h=0;h<e;h++)r[h]&&S.add(r[h].id);return S},[e,r]),s=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let h=0;h<e;h++)r[h]&&S.add(r[h].id);return S},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=useReducer(St,p),u=n?.adapter?Q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=useCallback((S,h)=>{f({type:"SET_STEP_DATA",data:S,stepId:h});},[]),l=useCallback((S,h,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:h,stepId:L});},[]),a=useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=useCallback((S,h)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:h});},[]),P=useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),v=useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),I=useCallback(async()=>{if(!u)return v(),false;try{let S=await u.loadPersistedData();if(S){let h={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:h}),v(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return v(),false},[u,v]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:I,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=useRef(i);p.current=i;let o=useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function He(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var Pe=createContext(null);function A(){let t=useContext(Pe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function Qr(){let t=A();return useStore(t,e=>e.currentStepIndex)}function Xr(){let t=A();return useStore(t,e=>e.isTransitioning)}function Yr(){let t=A();return useStore(t,e=>e.isInitializing)}function en(){let t=A();return useStore(t,e=>e.isSubmitting)}function tn(){let t=A();return useStore(t,e=>e.allData)}function rn(){let t=A();return useStore(t,e=>e.stepData)}function nn(t){let e=A();return useStore(e,r=>r.allData[t])}function sn(){let t=A();return useStore(t,e=>e.visitedSteps)}function on(){let t=A();return useStore(t,e=>e.passedSteps)}function an(t){let e=A();return useStore(e,r=>r.visitedSteps.has(t))}function ln(t){let e=A();return useStore(e,r=>r.passedSteps.has(t))}function pn(){let t=A(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function dn(){let t=A(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function un(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function cn(){return A()}var Wt={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=createContext(null);function Dt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=useRef(i),f=useRef(s);o.current=i,f.current=s;let u=useMemo(()=>{if(!n)return 0;let x=e.steps.findIndex(g=>g.id===n);return x===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):x},[n,e.steps]),b=useMemo(()=>Dt(u,e.steps),[u,e.steps]),c=useRef(null);c.current||(c.current=He({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=useState(()=>{let x=l.getState();return {currentStepIndex:x.currentStepIndex,allData:x.allData,stepData:x.stepData,visitedSteps:x.visitedSteps,passedSteps:x.passedSteps,isSubmitting:x.isSubmitting,isTransitioning:x.isTransitioning,isInitializing:x.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(x=>l.getState()._setCurrentStep(x),[l]),P=useCallback((x,g)=>l.getState()._setStepData(x,g),[l]),D=useCallback((x,g,E)=>l.getState()._setFieldValue(x,g,E),[l]),v=useCallback(x=>l.getState()._setSubmitting(x),[l]),I=useCallback(x=>l.getState()._setTransitioning(x),[l]),S=useCallback((x,g)=>l.getState()._markStepVisited(g),[l]),h=useCallback(x=>l.getState()._markStepPassed(x),[l]),L=useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,d=Q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??Wt,options:e.persistence?.options,userId:e.persistence?.userId}),W=useRef(d);W.current=d;let V=useRef(false);useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=useMemo(()=>({isPersisting:m?d.isPersisting:false,persistenceError:m?d.persistenceError:null,persistNow:m?d.persistNow:void 0}),[m,d.isPersisting,d.persistenceError,d.persistNow]),X=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=useMemo(()=>C?.formConfig,[C?.formConfig]),_=xe({workflowConfig:e,workflowState:a,currentStep:C}),G=useMemo(()=>{let x=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){x=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===x,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Ye}=be({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}=ke({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:I,markStepVisited:S,markStepPassed:h,setStepData:P,onStepChange:o.current}),ae=useRef(false);useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}=ve({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:v,onWorkflowComplete:f.current,analyticsStartTime:Ye}),le=useCallback((x,g)=>{D(x,g,C?.id||"");},[D,C?.id]),Fe=useCallback(x=>{P(x,C?.id||"");},[P,C?.id]),et=useCallback(async x=>{C?.id&&x&&P(x,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Me=useMemo(()=>({goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}),[we,Y,Re,Ee,Te,Ce,Ae,_e]),Be=useMemo(()=>({setValue:le,setStepData:Fe,resetWorkflow:L}),[le,Fe,L]),Oe=useMemo(()=>({submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}),[ee,Ve,Ne]),tt=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Me,...Be,...Oe,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Me,Be,Oe,z]),rt=useMemo(()=>{if(!C?.id)return {};let x=a?.allData[C.id]||{};if(!K?.allFields)return x;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(x))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),nt=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(Pe.Provider,{value:l,children:jsx(je.Provider,{value:tt,children:jsx(FormProvider,{formConfig:K,defaultValues:rt,onFieldChange:le,"data-workflow-id":e.id,className:p,onSubmit:et,children:t},nt)})})}function N(){let t=useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Rt({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof j?e.build():e,[e]);return jsx(he,{...r,workflowConfig:n,children:t})}var At=Ct.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Lt=Ct.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=N(),{submit:f}=useFormConfigContext(),u=useFormSubmitting(),b=useFormValues(),c=useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var Jt=Ct.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=u()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,p.isSubmitting,p.isTransitioning,u,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var er=Ct.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var sr=Ct.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((v,I)=>{if(f.isStepVisible(I)){let S=k.length;k.push(v),P.set(S,I),D.set(I,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,p.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var De=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},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.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 s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{De as LocalStorageAdapter,Rt as Workflow,At as WorkflowBody,Lt as WorkflowNextButton,R as WorkflowPersistenceError,Jt as WorkflowPreviousButton,he as WorkflowProvider,er as WorkflowSkipButton,sr as WorkflowStepper,Pe as WorkflowStoreContext,ye as combineWorkflowDataForConditions,pe as createStepContext,He as createWorkflowStore,me as debounce,se as flattenObject,j as flow,Se as generateStorageKey,pt as mergePersistedState,ze as persistedToWorkflowState,ce as useConditionEvaluation,Qr as useCurrentStepIndex,ln as useIsStepPassed,an as useIsStepVisited,on as usePassedSteps,Q as usePersistence,nn as useStepDataById,dt as useStepMetadata,sn as useVisitedSteps,un as useWorkflowActions,tn as useWorkflowAllData,be as useWorkflowAnalytics,xe as useWorkflowConditions,N as useWorkflowContext,Yr as useWorkflowInitializing,ke as useWorkflowNavigation,pn as useWorkflowNavigationState,mt as useWorkflowState,rn as useWorkflowStepData,A as useWorkflowStore,cn as useWorkflowStoreApi,ve as useWorkflowSubmission,dn as useWorkflowSubmitState,en as useWorkflowSubmitting,Xr as useWorkflowTransitioning,lt as validatePersistedData,fe as workflowStateToPersisted}; | ||
| import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Ct,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';function pe(t,e,r,n){return {data:t,next:{prefill:i=>{e.setNextStepFields(i);},skip:()=>{console.warn("step.next.skip() not yet implemented");}},workflow:{get:i=>e.getStepData(i),all:()=>e.getAllData(),goto:i=>{console.warn("step.workflow.goto() not yet implemented");}},meta:n||{},isFirst:r.isFirstStep,isLast:r.isLastStep}}var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r||`workflow-${Math.random().toString(36).substring(2,15)}`,this.workflowName=n||"Workflow",this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){let r=e.after?(n,i,s)=>{let p=pe(n,i,s,e.metadata);return e.after(p)}:e.onAfterValidation;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:r}}_addStepsInternal(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}addStep(e){return this._addStepsInternal(e)}step(e){return this._addStepsInternal(e)}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(s=>s.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(s=>!this.plugins.some(p=>p.name===s));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}};function ce(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 s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),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 s=p=>{try{return p&&typeof p=="object"&&"build"in p?evaluateCondition(p.build(),e):evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Ue(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(c){return console.warn(`Error evaluating condition for step ${s}:`,c),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(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 fe(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 ze(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 lt(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 me(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function pt(t,e,r="persist"){let n=ze(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 Q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=useState(false),[o,c]=useState(null),[u,b]=useState(false),f=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{f.current=r,l.current=n;},[r,n]);let y=Se(l.current.storageKey||t,i),k=useCallback(()=>{c(null);},[]),P=useCallback((d,h)=>{let V=d instanceof R?d:new R(`${h} failed: ${d.message}`,"OPERATION_FAILED",d);c(V),console.error("[WorkflowPersistence]",V);},[]),D=useCallback(async d=>{k(),p(true);try{let h=fe(t,d,l.current.metadata);await f.current.save(y,h),a.current.lastSavedState={...d},a.current.hasPendingChanges=!1;}catch(h){throw P(h,"Save"),h}finally{p(false);}},[t,y,k,P]),v=useRef(me(async d=>{try{await D(d);}catch(h){console.debug("[WorkflowPersistence] Auto-save failed:",h);}},n.debounceMs||500)),I=useCallback((d,h)=>h?d.currentStepIndex!==h.currentStepIndex||JSON.stringify(d.allData)!==JSON.stringify(h.allData)||JSON.stringify(d.stepData)!==JSON.stringify(h.stepData)||d.visitedSteps.size!==h.visitedSteps.size||!Array.from(d.visitedSteps).every(V=>h.visitedSteps.has(V)):true,[]),S=useCallback(async()=>{k(),b(true);try{let d=await f.current.load(y);return d&&(a.current.lastSavedState={currentStepIndex:d.currentStepIndex,allData:d.allData,stepData:d.stepData,visitedSteps:new Set(d.visitedSteps),passedSteps:new Set(d.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),d}catch(d){return P(d,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=useCallback(async()=>{k();try{await f.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(d){throw P(d,"Clear"),d}},[y,k,P]),L=useCallback(async()=>{try{return await f.current.exists(y)}catch(d){return P(d,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||I(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,v.current(e)));},[e,s,u,I]);let m=useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:W,hasPersistedData:L}}function dt(){let{workflowConfig:t,currentStep:e}=N(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>u=>t.steps.find(f=>f.id===u)?.metadata,[t.steps]),i=useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=useMemo(()=>u=>r?u in r:false,[r]),p=useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),c=useMemo(()=>u=>t.steps.map((b,f)=>({step:b,index:f})).filter(({step:b,index:f})=>u(b.metadata,b.id,f)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:c}}function be({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),p=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.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,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.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,o,t.id]);let c=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),f=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:c,trackError:u,trackNavigation:b,trackConditionEvaluation:f}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function ye(t,e){let r={};for(let s in t){let p=t[s];p&&typeof p=="object"&&!Array.isArray(p)&&!(p instanceof Date)&&Object.assign(r,p);}let n=se(t),i=se(e);return {...r,...t,...e,...n,...i}}function Ke(t,e){return {visible:t.visible,skippable:e===true||t.required}}function xe({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>ye(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ce(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=useMemo(()=>Ke(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{I.conditions&&(v[S]={visible:I.conditions.visible,required:I.conditions.skippable});}),v},[t.steps]),c=Ue(o,n),u=useMemo(()=>{let v={};return t.steps.forEach((I,S)=>{let W=c[S];W?v[S]=Ke(W,I.allowSkip):v[S]={visible:true,skippable:I.allowSkip===true};}),v},[t.steps,c]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let v={};for(let I of r.formConfig.allFields)I.conditions&&(v[I.id]=I.conditions);return v},[r?.formConfig?.allFields]),f=Le(b,n),l=useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.visible??true,[u,t.steps.length]),a=useCallback(v=>v<0||v>=t.steps.length?false:u[v]?.skippable??false,[u,t.steps.length]),y=useCallback(v=>f[v]?.visible??true,[f]),k=useCallback(v=>f[v]?.disabled??false,[f]),P=useCallback(v=>f[v]?.required??false,[f]),D=useCallback(v=>f[v]?.readonly??false,[f]);return {stepConditions:p,fieldConditions:f,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:c,onStepChange:u}){let b=useRef(u);b.current=u;let f=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(m,d)=>{c(d,m);},setStepFields:(m,d)=>{let V={...e.allData[m]||{},...d};c(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,d)=>{let h=e.currentStepIndex+1;if(h<t.steps.length){let V=t.steps[h].id,X={...e.allData[V]||{},[m]:d};c(X,V);}},setNextStepFields:m=>{let d=e.currentStepIndex+1;if(d<t.steps.length){let h=t.steps[d].id,z={...e.allData[h]||{},...m};c(z,h);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,c]),a=useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{b.current&&b.current(e.currentStepIndex,m,r);let d=t.steps[m].id;i(m),p(m,d);let h=e.allData[d]||{};return c(h,d),!0}catch(d){return console.error("Step transition failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,e.allData,r,s,i,p,c]),y=useCallback(m=>{for(let d=m+1;d<t.steps.length;d++)if(n.isStepVisible(d))return d;return null},[t.steps.length,n]),k=useCallback(m=>{for(let d=m-1;d>=0;d--)if(n.isStepVisible(d))return d;return null},[n]),P=useCallback(async()=>{if(f?.onAfterValidation)try{let d=l();await f.onAfterValidation(e.stepData,d,r);}catch(d){return console.error("onAfterValidation failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),false}o(f.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[f,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),v=useCallback(async()=>!f?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(f.id,"user_skip",r),P()),[f,n,e.currentStepIndex,t.analytics,r,P]),I=useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,y,I]),W=useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&I(m)},[e.currentStepIndex,k,I]),L=useCallback(()=>f?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[f?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:v,canGoToStep:I,canGoNext:S,canGoPrevious:W,canSkipCurrentStep:L}}function St(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 mt({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&S.add(r[W].id);return S},[e,r]),s=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&S.add(r[W].id);return S},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,c]=useReducer(St,p),u=n?.adapter?Q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(S=>{c({type:"SET_CURRENT_STEP",stepIndex:S});},[]),f=useCallback((S,W)=>{c({type:"SET_STEP_DATA",data:S,stepId:W});},[]),l=useCallback((S,W,L)=>{c({type:"SET_FIELD_VALUE",fieldId:S,value:W,stepId:L});},[]),a=useCallback(S=>{c({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=useCallback(S=>{c({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=useCallback((S,W)=>{c({type:"MARK_STEP_VISITED",stepIndex:S,stepId:W});},[]),P=useCallback(S=>{c({type:"MARK_STEP_PASSED",stepId:S});},[]),D=useCallback(()=>{c({type:"RESET_WORKFLOW"});},[]),v=useCallback(()=>{c({type:"SET_INITIALIZATION_COMPLETE"});},[]),I=useCallback(async()=>{if(!u)return v(),false;try{let S=await u.loadPersistedData();if(S){let W={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return c({type:"LOAD_PERSISTED_STATE",state:W}),v(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return v(),false},[u,v]);return {workflowState:o,setCurrentStep:b,setStepData:f,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:I,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=useRef(i);p.current=i;let o=useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),c=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:c()}}function je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,c)=>{s(u=>({stepData:o,allData:{...u.allData,[c]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,c,u)=>{s(b=>{let f={...b.stepData,[o]:c};return {stepData:f,allData:{...b.allData,[u]:f}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(c=>({visitedSteps:new Set([...c.visitedSteps,o])}));},_markStepPassed:o=>{s(c=>({passedSteps:new Set([...c.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(c=>({...c,...o,isInitializing:false}));}})))}var Pe=createContext(null);function A(){let t=useContext(Pe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function Qr(){let t=A();return useStore(t,e=>e.currentStepIndex)}function Xr(){let t=A();return useStore(t,e=>e.isTransitioning)}function Yr(){let t=A();return useStore(t,e=>e.isInitializing)}function en(){let t=A();return useStore(t,e=>e.isSubmitting)}function tn(){let t=A();return useStore(t,e=>e.allData)}function rn(){let t=A();return useStore(t,e=>e.stepData)}function nn(t){let e=A();return useStore(e,r=>r.allData[t])}function sn(){let t=A();return useStore(t,e=>e.visitedSteps)}function on(){let t=A();return useStore(t,e=>e.passedSteps)}function an(t){let e=A();return useStore(e,r=>r.visitedSteps.has(t))}function ln(t){let e=A();return useStore(e,r=>r.passedSteps.has(t))}function pn(){let t=A(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function dn(){let t=A(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function un(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function cn(){return A()}var Wt={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},He=createContext(null);function Dt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=useRef(i),c=useRef(s);o.current=i,c.current=s;let u=useMemo(()=>{if(!n)return 0;let x=e.steps.findIndex(g=>g.id===n);return x===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):x},[n,e.steps]),b=useMemo(()=>Dt(u,e.steps),[u,e.steps]),f=useRef(null);f.current||(f.current=je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=f.current,[a,y]=useState(()=>{let x=l.getState();return {currentStepIndex:x.currentStepIndex,allData:x.allData,stepData:x.stepData,visitedSteps:x.visitedSteps,passedSteps:x.passedSteps,isSubmitting:x.isSubmitting,isTransitioning:x.isTransitioning,isInitializing:x.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(x=>l.getState()._setCurrentStep(x),[l]),P=useCallback((x,g)=>l.getState()._setStepData(x,g),[l]),D=useCallback((x,g,E)=>l.getState()._setFieldValue(x,g,E),[l]),v=useCallback(x=>l.getState()._setSubmitting(x),[l]),I=useCallback(x=>l.getState()._setTransitioning(x),[l]),S=useCallback((x,g)=>l.getState()._markStepVisited(g),[l]),W=useCallback(x=>l.getState()._markStepPassed(x),[l]),L=useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,d=Q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??Wt,options:e.persistence?.options,userId:e.persistence?.userId}),h=useRef(d);h.current=d;let V=useRef(false);useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await h.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=useMemo(()=>({isPersisting:m?d.isPersisting:false,persistenceError:m?d.persistenceError:null,persistNow:m?d.persistNow:void 0}),[m,d.isPersisting,d.persistenceError,d.persistNow]),X=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=useMemo(()=>C?.formConfig,[C?.formConfig]),_=xe({workflowConfig:e,workflowState:a,currentStep:C}),G=useMemo(()=>{let x=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){x=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===x,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Ye}=be({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}=ke({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:I,markStepVisited:S,markStepPassed:W,setStepData:P,onStepChange:o.current}),ae=useRef(false);useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}=ve({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:v,onWorkflowComplete:c.current,analyticsStartTime:Ye}),le=useCallback((x,g)=>{D(x,g,C?.id||"");},[D,C?.id]),Fe=useCallback(x=>{P(x,C?.id||"");},[P,C?.id]),et=useCallback(async x=>{C?.id&&x&&P(x,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Me=useMemo(()=>({goToStep:we,goNext:Y,goPrevious:Re,skipStep:Ee,canGoToStep:Te,canGoNext:Ce,canGoPrevious:Ae,canSkipCurrentStep:_e}),[we,Y,Re,Ee,Te,Ce,Ae,_e]),Be=useMemo(()=>({setValue:le,setStepData:Fe,resetWorkflow:L}),[le,Fe,L]),Oe=useMemo(()=>({submitWorkflow:ee,isSubmitting:Ve,canSubmit:Ne}),[ee,Ve,Ne]),tt=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Me,...Be,...Oe,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Me,Be,Oe,z]),rt=useMemo(()=>{if(!C?.id)return {};let x=a?.allData[C.id]||{};if(!K?.allFields)return x;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(x))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),nt=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(Pe.Provider,{value:l,children:jsx(He.Provider,{value:tt,children:jsx(FormProvider,{formConfig:K,defaultValues:rt,onFieldChange:le,"data-workflow-id":e.id,className:p,onSubmit:et,children:t},nt)})})}function N(){let t=useContext(He);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function Rt({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof H?e.build():e,[e]);return jsx(he,{...r,workflowConfig:n,children:t})}var At=Ct.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Lt=Ct.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=N(),{submit:c}=useFormConfigContext(),u=useFormSubmitting(),b=useFormValues(),f=useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),f.canGoNext&&await c(y);},[f.canGoNext,c]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:f.canGoNext,isSubmitting:f.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,f.canGoNext,f.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var Jt=Ct.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:c,canGoPrevious:u}=N(),b=useFormSubmitting(),f=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=u()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,p.isSubmitting,p.isTransitioning,u,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:c,stepData:f,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,c,f,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var er=Ct.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:c,conditionsHelpers:u}=N(),b=useFormSubmitting(),f=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:f,allData:c.allData,context:c}),[l.canSkip,l.finalIsSubmitting,a,e,i,f,c.allData,c]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var sr=Ct.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:c}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:f}=useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((v,I)=>{if(c.isStepVisible(I)){let S=k.length;k.push(v),P.set(S,I),D.set(I,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,c]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>f.get(s.currentStepIndex)??-1,[f,s.currentStepIndex]),y=useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,p.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var De=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},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.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,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.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 s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{De as LocalStorageAdapter,Rt as Workflow,At as WorkflowBody,Lt as WorkflowNextButton,R as WorkflowPersistenceError,Jt as WorkflowPreviousButton,he as WorkflowProvider,er as WorkflowSkipButton,sr as WorkflowStepper,Pe as WorkflowStoreContext,ye as combineWorkflowDataForConditions,pe as createStepContext,je as createWorkflowStore,me as debounce,se as flattenObject,H as flow,Se as generateStorageKey,pt as mergePersistedState,ze as persistedToWorkflowState,ce as useConditionEvaluation,Qr as useCurrentStepIndex,ln as useIsStepPassed,an as useIsStepVisited,on as usePassedSteps,Q as usePersistence,nn as useStepDataById,dt as useStepMetadata,sn as useVisitedSteps,un as useWorkflowActions,tn as useWorkflowAllData,be as useWorkflowAnalytics,xe as useWorkflowConditions,N as useWorkflowContext,Yr as useWorkflowInitializing,ke as useWorkflowNavigation,pn as useWorkflowNavigationState,mt as useWorkflowState,rn as useWorkflowStepData,A as useWorkflowStore,cn as useWorkflowStoreApi,ve as useWorkflowSubmission,dn as useWorkflowSubmitState,en as useWorkflowSubmitting,Xr as useWorkflowTransitioning,lt as validatePersistedData,fe as workflowStateToPersisted}; |
+3
-3
| { | ||
| "name": "@rilaykit/workflow", | ||
| "version": "0.1.5", | ||
| "version": "0.1.6", | ||
| "private": false, | ||
@@ -42,4 +42,4 @@ "description": "Workflow and multi-step form utilities for RilayKit", | ||
| "zustand": "^5.0.9", | ||
| "@rilaykit/core": "0.1.5", | ||
| "@rilaykit/forms": "0.1.5" | ||
| "@rilaykit/core": "0.1.6", | ||
| "@rilaykit/forms": "0.1.6" | ||
| }, | ||
@@ -46,0 +46,0 @@ "peerDependencies": { |
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
Long strings
Supply chain riskContains long string literals, which may be a sign of obfuscated or packed code.
Found 1 instance in 1 package
195068
0.17%+ Added
+ Added
- Removed
- Removed
Updated
Updated