@rilaykit/workflow 13.1.2 → 14.0.0

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