@rilaykit/workflow
Version:
Commercial workflow and multi-step form utilities for RilayKit - License required for all use
2 lines • 31.2 kB
JavaScript
'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),react=require('react'),oe=require('@noble/ed25519'),jsxRuntime=require('react/jsx-runtime');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 oe__namespace=/*#__PURE__*/_interopNamespace(oe);var N=class r{constructor(e,t,o,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=t,this.workflowName=o,this.workflowDescription=i;}static create(e,t,o,i){return new r(e,t,o,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,onAfterValidation:e.onAfterValidation}}addStep(e){let t=core.normalizeToArray(e);for(let o of t){let i=this.createStepFromDefinition(o);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(t){throw new Error(`Failed to install plugin "${e.name}": ${t instanceof Error?t.message:String(t)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let t=e.dependencies.filter(o=>!this.plugins.some(i=>i.name===o));if(t.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${t.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(t=>t.name!==e),this}updateStep(e,t){let o=this.steps.findIndex(i=>i.id===e);if(o===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[o]={...this.steps[o],...t},this}addStepConditions(e,t){let o=this.steps.findIndex(n=>n.id===e);if(o===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[o].conditions,...t};return this.steps[o]={...this.steps[o],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(t=>t.id!==e),this}getStep(e){return this.steps.find(t=>t.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,t){let o=new r(this.config,e||`${this.workflowId}-clone`,t||this.workflowName);return o.steps=core.deepClone(this.steps),o.analytics=this.analytics?core.deepClone(this.analytics):void 0,o.plugins=[...this.plugins],o}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let t=this.steps.map(o=>o.id);try{core.ensureUnique(t,"step");}catch(o){e.push(o instanceof Error?o.message:String(o));}for(let o of this.plugins)if(o.dependencies){let i=o.dependencies.filter(n=>!this.plugins.some(s=>s.name===n));i.length>0&&e.push(`Plugin "${o.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((o,i)=>o+i.formConfig.allFields.length,0),t=this.steps.map(o=>o.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:t.length>0?Math.max(...t):0,minFieldsInStep:t.length>0?Math.min(...t):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,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,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.plugins=e.plugins||[],this}};function Re(r,e,t,o){return N.create(r,e,t,o)}core.ril.prototype.flow=function(r,e,t){return N.create(this,r,e,t)};var Ce=1751361139160,Ae="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",b=class b{static async setLicenseKey(e){b.licenseKey=e||"",b.licenseKey?b.licenseResult=await b.validateLicense():b.licenseResult={valid:false,error:"MISSING"},b.isInitialized=true;}static async validateLicense(){if(!b.licenseKey)return {valid:false,error:"MISSING"};try{if(!b.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=b.licenseKey.slice(4),o=b.base64ToString(e).split(".");if(o.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,n,s]=o,d=`${i}.${n}`,S=new TextEncoder().encode(d),p=s.match(/.{2}/g);if(!p)return {valid:!1,error:"INVALID"};let f=new Uint8Array(p.map(P=>Number.parseInt(P,16))),m=b.hexToBytes(Ae);if(!await oe__namespace.verify(f,S,m))return {valid:!1,error:"SIGNATURE_INVALID"};let h=b.base64ToString(n.replace(/-/g,"+").replace(/_/g,"/")),l=JSON.parse(h),g=Math.floor(Date.now()/1e3);return l.e<g?{valid:!1,error:"EXPIRED",data:b.decompressPayload(l)}:Ce>l.e*1e3?{valid:!1,error:"EXPIRED",data:b.decompressPayload(l)}:l.p===void 0||!l.c||!l.i||!l.e||!l.t?{valid:!1,error:"INVALID"}:{valid:!0,data:b.decompressPayload(l)}}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 t=new Uint8Array(e.length/2);for(let o=0;o<e.length;o+=2)t[o/2]=Number.parseInt(e.substring(o,o+2),16);return t}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",o="",i=0,n=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<n.length;){let s=t.indexOf(n.charAt(i++)),d=t.indexOf(n.charAt(i++)),S=t.indexOf(n.charAt(i++)),p=t.indexOf(n.charAt(i++)),f=s<<18|d<<12|S<<6|p;o+=String.fromCharCode(f>>16&255),S!==64&&(o+=String.fromCharCode(f>>8&255)),p!==64&&(o+=String.fromCharCode(f&255));}return o}static getLicenseResult(){return b.isInitialized?b.licenseResult?b.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!b.getLicenseResult().valid}static getWatermarkMessage(){let e=b.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=b.getLicenseResult();if(e.valid)return;let o={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${o}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=b.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};b.licenseKey="",b.licenseResult=null,b.isInitialized=false;var F=b;function ie(r,e={},t={}){return react.useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let o=i=>{try{let n;return i&&typeof i=="object"&&"build"in i?n=i.build():n=i,core.evaluateCondition(n,e)}catch(n){return console.warn("Error evaluating condition:",n),false}};return {visible:r.visible?o(r.visible):true,disabled:r.disabled?o(r.disabled):false,required:r.required?o(r.required):false,readonly:r.readonly?o(r.readonly):false}},[r,e,t])}function ne(r,e={}){return react.useMemo(()=>{let t={};for(let[o,i]of Object.entries(r))if(t[o]={visible:true,disabled:false,required:false,readonly:false},i){let n=s=>{try{return s&&typeof s=="object"&&"build"in s?core.evaluateCondition(s.build(),e):core.evaluateCondition(s,e)}catch(d){return console.warn(`Error evaluating condition for field ${o}:`,d),false}};t[o]={visible:i.visible?n(i.visible):true,disabled:i.disabled?n(i.disabled):false,required:i.required?n(i.required):false,readonly:i.readonly?n(i.readonly):false};}return t},[r,e])}function se(r,e={}){return react.useMemo(()=>{let t={};for(let[o,i]of Object.entries(r)){let n=Number.parseInt(o,10);if(t[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?core.evaluateCondition(d.build(),e):core.evaluateCondition(d,e)}catch(S){return console.warn(`Error evaluating condition for step ${n}:`,S),false}};t[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}}return t},[r,e])}function pe({workflowConfig:r,workflowState:e,workflowContext:t}){let o=react.useRef(Date.now()),i=react.useRef(new Map),n=react.useRef(false),s=react.useRef(null);react.useEffect(()=>{r.analytics?.onWorkflowStart&&!n.current&&(n.current=true,r.analytics.onWorkflowStart(r.id,t));},[r.id,r.analytics,t]),react.useEffect(()=>{let p=r.steps[e.currentStepIndex];if(p&&s.current!==p.id){if(s.current&&r.analytics?.onStepComplete){let f=i.current.get(s.current);f&&r.analytics.onStepComplete(s.current,Date.now()-f,e.stepData,t);}s.current=p.id,i.current.set(p.id,Date.now()),r.analytics?.onStepStart&&r.analytics.onStepStart(p.id,Date.now(),t);}},[e.currentStepIndex,r.steps,r.analytics,t,e.stepData]);let d=react.useCallback((p,f)=>{r.analytics?.onStepSkip&&r.analytics.onStepSkip(p,f,t);},[r.analytics,t]),S=react.useCallback(p=>{r.analytics?.onError&&r.analytics.onError(p,t);},[r.analytics,t]);return {analyticsStartTime:o,trackStepSkip:d,trackError:S}}function ce(r,e){return {visible:r.visible,skippable:e===true||r.required}}function de({workflowConfig:r,workflowState:e,currentStep:t}){let o=react.useMemo(()=>({...e.allData,...e.stepData}),[e.allData,e.stepData]),i=react.useMemo(()=>{if(t?.conditions)return {visible:t.conditions.visible,required:t.conditions.skippable}},[t?.conditions]),n=ie(i,o,{visible:true,disabled:false,required:false,readonly:false}),s=react.useMemo(()=>ce(n,t?.allowSkip),[n,t?.allowSkip]),d=react.useMemo(()=>{let u={};return r.steps.forEach((v,W)=>{v.conditions&&(u[W]={visible:v.conditions.visible,required:v.conditions.skippable});}),u},[r.steps]),S=se(d,o),p=react.useMemo(()=>{let u={};return r.steps.forEach((v,W)=>{let E=S[W];E?u[W]=ce(E,v.allowSkip):u[W]={visible:true,skippable:v.allowSkip===true};}),u},[r.steps,S]),f=react.useMemo(()=>{if(!t?.formConfig?.allFields)return {};let u={};for(let v of t.formConfig.allFields)v.conditions&&(u[v.id]=v.conditions);return u},[t?.formConfig?.allFields]),m=ne(f,o),y=react.useCallback(u=>u<0||u>=r.steps.length?false:p[u]?.visible??true,[p,r.steps.length]),h=react.useCallback(u=>u<0||u>=r.steps.length?false:p[u]?.skippable??false,[p,r.steps.length]),l=react.useCallback(u=>m[u]?.visible??true,[m]),g=react.useCallback(u=>m[u]?.disabled??false,[m]),x=react.useCallback(u=>m[u]?.required??false,[m]),P=react.useCallback(u=>m[u]?.readonly??false,[m]);return {stepConditions:s,fieldConditions:m,allStepConditions:p,isStepVisible:y,isStepSkippable:h,isFieldVisible:l,isFieldDisabled:g,isFieldRequired:x,isFieldReadonly:P}}function ue({workflowConfig:r,workflowState:e,workflowContext:t,conditionsHelpers:o,setCurrentStep:i,setTransitioning:n,markStepVisited:s,setStepData:d,onStepChange:S}){let p=react.useRef(S);p.current=S;let f=r.steps[e.currentStepIndex],m=react.useCallback(()=>({setStepData:(a,c)=>{d(c,a);},setStepFields:(a,c)=>{let R={...e.allData[a]||{},...c};d(R,a);},getStepData:a=>e.allData[a]||{},setNextStepField:(a,c)=>{let w=e.currentStepIndex+1;if(w<r.steps.length){let R=r.steps[w].id,L={...e.allData[R]||{},[a]:c};d(L,R);}},setNextStepFields:a=>{let c=e.currentStepIndex+1;if(c<r.steps.length){let w=r.steps[c].id,O={...e.allData[w]||{},...a};d(O,w);}},getAllData:()=>({...e.allData}),getSteps:()=>[...r.steps]}),[e.allData,e.currentStepIndex,r.steps,d]),y=react.useCallback(async a=>{if(a<0||a>=r.steps.length||!o.isStepVisible(a))return false;n(true);try{return p.current&&p.current(e.currentStepIndex,a,t),i(a),s(a,r.steps[a].id),!0}catch(c){return console.error("Step transition failed:",c),r.analytics?.onError&&r.analytics.onError(c,t),false}finally{n(false);}},[r.steps,r.analytics,o,e.currentStepIndex,t,n,i,s]),h=react.useCallback(a=>{for(let c=a+1;c<r.steps.length;c++)if(o.isStepVisible(c))return c;return null},[r.steps.length,o]),l=react.useCallback(a=>{for(let c=a-1;c>=0;c--)if(o.isStepVisible(c))return c;return null},[o]),g=react.useCallback(async()=>{if(f?.onAfterValidation)try{let c=m();await f.onAfterValidation(e.stepData,c,t);}catch(c){return console.error("onAfterValidation failed:",c),r.analytics?.onError&&r.analytics.onError(c,t),false}let a=h(e.currentStepIndex);return a===null?false:y(a)},[f,m,e.stepData,t,r.analytics,e.currentStepIndex,h,y]),x=react.useCallback(async()=>{let a=l(e.currentStepIndex);return a===null?false:y(a)},[e.currentStepIndex,l,y]),P=react.useCallback(async()=>!f?.allowSkip&&!o.isStepSkippable(e.currentStepIndex)?false:(r.analytics?.onStepSkip&&r.analytics.onStepSkip(f.id,"user_skip",t),g()),[f,o,e.currentStepIndex,r.analytics,t,g]),u=react.useCallback(a=>a<0||a>=r.steps.length?false:o.isStepVisible(a),[r.steps.length,o]),v=react.useCallback(()=>{let a=h(e.currentStepIndex);return a!==null&&u(a)},[e.currentStepIndex,h,u]),W=react.useCallback(()=>{let a=l(e.currentStepIndex);return a!==null&&u(a)},[e.currentStepIndex,l,u]),E=react.useCallback(()=>f?.allowSkip===true&&o.isStepSkippable(e.currentStepIndex),[f?.allowSkip,o,e.currentStepIndex]);return {goToStep:y,goNext:g,goPrevious:x,skipStep:P,canGoToStep:u,canGoNext:v,canGoPrevious:W,canSkipCurrentStep:E}}var k=class extends Error{constructor(t,o,i){super(`[WorkflowPersistence] ${t} (Code: ${o})`);this.code=o;this.cause=i;this.name="WorkflowPersistenceError";}};function J(r,e,t){return {workflowId:r,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:t}}function fe(r){return {currentStepIndex:r.currentStepIndex,allData:{...r.allData},stepData:{...r.stepData},visitedSteps:new Set(r.visitedSteps),isSubmitting:false,isTransitioning:false}}function Ne(r){if(!r||typeof r!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let t of e)if(!(t in r))return false;return !(typeof r.workflowId!="string"||typeof r.currentStepIndex!="number"||typeof r.allData!="object"||typeof r.stepData!="object"||!Array.isArray(r.visitedSteps)||typeof r.lastSaved!="number")}function z(r,e){return e?`${e}:${r}`:r}function X(r,e){let t=null;return (...o)=>{t&&clearTimeout(t),t=setTimeout(()=>{r(...o);},e);}}function Le(r,e,t="persist"){let o=fe(e);switch(t){case "persist":return {...o,isSubmitting:r.isSubmitting,isTransitioning:r.isTransitioning};case "current":return {...r,visitedSteps:new Set([...r.visitedSteps,...o.visitedSteps])};case "merge":return {currentStepIndex:r.currentStepIndex,allData:{...o.allData,...r.allData},stepData:{...o.stepData,...r.stepData},visitedSteps:new Set([...o.visitedSteps,...r.visitedSteps]),isSubmitting:r.isSubmitting,isTransitioning:r.isTransitioning};default:return o}}function H({workflowId:r,workflowState:e,adapter:t,options:o={},userId:i}){let[n,s]=react.useState(false),[d,S]=react.useState(null),p=react.useRef(t),f=react.useRef(o),m=react.useRef({hasPendingChanges:false});react.useEffect(()=>{p.current=t,f.current=o;},[t,o]);let y=z(f.current.storageKey||r,i),h=react.useCallback(()=>{S(null);},[]),l=react.useCallback((a,c)=>{let w=a instanceof k?a:new k(`${c} failed: ${a.message}`,"OPERATION_FAILED",a);S(w),console.error("[WorkflowPersistence]",w);},[]),g=react.useCallback(async a=>{h(),s(true);try{let c=J(r,a,f.current.metadata);await p.current.save(y,c),m.current.lastSavedState={...a},m.current.hasPendingChanges=!1;}catch(c){throw l(c,"Save"),c}finally{s(false);}},[r,y,h,l]),x=react.useRef(X(async a=>{try{await g(a);}catch(c){console.debug("[WorkflowPersistence] Auto-save failed:",c);}},o.debounceMs||500)),P=react.useCallback((a,c)=>c?a.currentStepIndex!==c.currentStepIndex||JSON.stringify(a.allData)!==JSON.stringify(c.allData)||JSON.stringify(a.stepData)!==JSON.stringify(c.stepData)||a.visitedSteps.size!==c.visitedSteps.size||!Array.from(a.visitedSteps).every(w=>c.visitedSteps.has(w)):true,[]);react.useEffect(()=>{f.current.autoPersist&&(n||e.isSubmitting||e.isTransitioning||P(e,m.current.lastSavedState)&&(m.current.hasPendingChanges=true,x.current(e)));},[e,n,P]);let u=react.useCallback(async()=>{await g(e);},[g,e]),v=react.useCallback(async()=>{h();try{let a=await p.current.load(y);return a&&(m.current.lastSavedState={currentStepIndex:a.currentStepIndex,allData:a.allData,stepData:a.stepData,visitedSteps:new Set(a.visitedSteps),isSubmitting:!1,isTransitioning:!1},m.current.hasPendingChanges=!1),a}catch(a){return l(a,"Load"),null}},[y,h,l]),W=react.useCallback(async()=>{h();try{await p.current.remove(y),m.current.lastSavedState=void 0,m.current.hasPendingChanges=!1;}catch(a){throw l(a,"Clear"),a}},[y,h,l]),E=react.useCallback(async()=>{try{return await p.current.exists(y)}catch(a){return l(a,"Exists check"),false}},[y,l]);return {isPersisting:n,persistenceError:d,persistNow:u,loadPersistedData:v,clearPersistedData:W,hasPersistedData:E}}function Ve(r,e){switch(e.type){case "SET_CURRENT_STEP":return {...r,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...r,stepData:e.data,allData:{...r.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...r,allData:e.data};case "SET_FIELD_VALUE":{let t={...r.stepData,[e.fieldId]:e.value};return {...r,stepData:t,allData:{...r.allData,[e.stepId]:t}}}case "SET_SUBMITTING":return {...r,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...r,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...r,visitedSteps:new Set([...r.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false};case "LOAD_PERSISTED_STATE":return {...r,...e.state};default:return r}}function ge({defaultValues:r={},persistence:e}){let t={currentStepIndex:0,allData:r,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false},[o,i]=react.useReducer(Ve,t),n=e?.adapter?H({workflowId:e.workflowId,workflowState:o,adapter:e.adapter,options:e.options,userId:e.userId}):null,s=react.useCallback(l=>{i({type:"SET_CURRENT_STEP",stepIndex:l});},[]),d=react.useCallback((l,g)=>{i({type:"SET_STEP_DATA",data:l,stepId:g});},[]),S=react.useCallback((l,g,x)=>{i({type:"SET_FIELD_VALUE",fieldId:l,value:g,stepId:x});},[]),p=react.useCallback(l=>{i({type:"SET_SUBMITTING",isSubmitting:l});},[]),f=react.useCallback(l=>{i({type:"SET_TRANSITIONING",isTransitioning:l});},[]),m=react.useCallback((l,g)=>{i({type:"MARK_STEP_VISITED",stepIndex:l,stepId:g});},[]),y=react.useCallback(()=>{i({type:"RESET_WORKFLOW"});},[]),h=react.useCallback(async()=>{if(!n)return false;try{let l=await n.loadPersistedData();if(l){let g={currentStepIndex:l.currentStepIndex,allData:l.allData,stepData:l.stepData,visitedSteps:new Set(l.visitedSteps)};return i({type:"LOAD_PERSISTED_STATE",state:g}),!0}}catch(l){console.error("Failed to load persisted state:",l);}return false},[n]);return {workflowState:o,setCurrentStep:s,setStepData:d,setFieldValue:S,setSubmitting:p,setTransitioning:f,markStepVisited:m,resetWorkflow:y,loadPersistedState:h,persistence:n?{isPersisting:n.isPersisting,persistenceError:n.persistenceError,persistNow:n.persistNow,clearPersistedData:n.clearPersistedData,hasPersistedData:n.hasPersistedData}:null}}function be({workflowConfig:r,workflowState:e,workflowContext:t,setSubmitting:o,onWorkflowComplete:i,analyticsStartTime:n}){let s=react.useRef(i);s.current=i;let d=react.useCallback(async()=>{o(true);try{if(s.current&&await s.current(e.allData),r.analytics?.onWorkflowComplete){let p=Date.now()-n.current;r.analytics.onWorkflowComplete(r.id,p,e.allData);}}catch(p){throw console.error("Workflow submission failed:",p),r.analytics?.onError&&r.analytics.onError(p,t),p}finally{o(false);}},[e.allData,r.analytics,r.id,t,n,o]),S=react.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===r.steps.length-1,[e.isSubmitting,e.currentStepIndex,r.steps.length]);return {submitWorkflow:d,isSubmitting:e.isSubmitting,canSubmit:S()}}var ve=react.createContext(null);function Q({children:r,workflowConfig:e,defaultValues:t={},onStepChange:o,onWorkflowComplete:i,className:n}){let{workflowState:s,setCurrentStep:d,setStepData:S,setFieldValue:p,setSubmitting:f,setTransitioning:m,markStepVisited:y,resetWorkflow:h}=ge({defaultValues:t}),l=react.useMemo(()=>({workflowId:e.id,currentStepIndex:s.currentStepIndex,totalSteps:e.steps.length,allData:s.allData,stepData:s.stepData,isFirstStep:s.currentStepIndex===0,isLastStep:s.currentStepIndex===e.steps.length-1,visitedSteps:s.visitedSteps}),[e.id,e.steps.length,s.currentStepIndex,s.allData,s.stepData,s.visitedSteps]),g=react.useMemo(()=>e.steps[s.currentStepIndex],[e.steps,s.currentStepIndex]),x=react.useMemo(()=>g?.formConfig,[g]),{analyticsStartTime:P}=pe({workflowConfig:e,workflowState:s,workflowContext:l}),u=de({workflowConfig:e,workflowState:s,currentStep:g}),{goToStep:v,goNext:W,goPrevious:E,skipStep:a,canGoToStep:c,canGoNext:w,canGoPrevious:R,canSkipCurrentStep:O}=ue({workflowConfig:e,workflowState:s,workflowContext:l,conditionsHelpers:u,setCurrentStep:d,setTransitioning:m,markStepVisited:y,setStepData:S,onStepChange:o});react.useEffect(()=>{if(!u.isStepVisible(s.currentStepIndex)){for(let C=0;C<e.steps.length;C++)if(u.isStepVisible(C)){d(C),y(C,e.steps[C].id);break}}},[u,s.currentStepIndex,e.steps,d,y]);let{submitWorkflow:L,isSubmitting:Z,canSubmit:ee}=be({workflowConfig:e,workflowState:s,workflowContext:l,setSubmitting:f,onWorkflowComplete:i,analyticsStartTime:P}),q=react.useCallback((_,C)=>{p(_,C,g?.id||"");},[p,g?.id]),te=react.useCallback(_=>{S(_,g?.id||"");},[S,g?.id]),xe=react.useCallback(async()=>{l.isLastStep?await L():await W();},[l.isLastStep,L,W]),Pe=react.useMemo(()=>({workflowState:s,workflowConfig:e,currentStep:g,context:l,formConfig:x,conditionsHelpers:u,goToStep:v,goNext:W,goPrevious:E,skipStep:a,canGoToStep:c,canGoNext:w,canGoPrevious:R,canSkipCurrentStep:O,setValue:q,setStepData:te,resetWorkflow:h,submitWorkflow:L,isSubmitting:Z,canSubmit:ee}),[s,e,g,l,x,u,v,W,E,a,c,w,R,O,q,te,h,L,Z,ee]);return jsxRuntime.jsx(ve.Provider,{value:Pe,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:x,defaultValues:s?.allData[g?.id]||{},onFieldChange:q,"data-workflow-id":e.id,className:n,onSubmit:xe,children:r})})}function I(){let r=react.useContext(ve);if(!r)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return r}function $e({children:r,workflowConfig:e,...t}){let[o,i]=react.useState(),n=react.useMemo(()=>e instanceof N?e.build():e,[e]);return react.useEffect(()=>{if(typeof window<"u"&&F.shouldDisplayWatermark()){let d=F.getWatermarkMessage();i(d);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(Q,{...t,workflowConfig:n,children:r}),o&&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:o})]})}function Xe(){let{currentStep:r}=I();if(!r)return null;let{formConfig:e,renderer:t}=r;return e?t?t(r):jsxRuntime.jsx(forms.FormBody,{}):null}function je({className:r,...e}){let{context:t,workflowState:o,workflowConfig:i,currentStep:n}=I(),{submit:s,formState:d}=forms.useFormContext(),S=!o.isTransitioning&&!o.isSubmitting,p=async m=>{m?.preventDefault(),S&&await s(m);},f={isLastStep:t.isLastStep,canGoNext:S,isSubmitting:d.isSubmitting||o.isSubmitting,onSubmit:p,className:r,currentStep:n,stepData:d.values||{},allData:t.allData,context:t};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:i.renderConfig?.nextButtonRenderer,props:f,...e})}function rt({className:r,...e}){let{context:t,goPrevious:o,workflowState:i,workflowConfig:n,currentStep:s}=I(),{formState:d}=forms.useFormContext(),S=t.currentStepIndex>0&&!i.isTransitioning&&!i.isSubmitting,f={canGoPrevious:S,onPrevious:async m=>{m?.preventDefault(),S&&await o();},className:r,currentStep:s,stepData:d.values||{},allData:t.allData,context:t};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:n.renderConfig?.previousButtonRenderer,props:f,...e})}function st({className:r,...e}){let{currentStep:t,skipStep:o,workflowState:i,workflowConfig:n,context:s,conditionsHelpers:d}=I(),{formState:S}=forms.useFormContext(),p=(!!t?.allowSkip||d.isStepSkippable(i.currentStepIndex))&&!i.isTransitioning&&!i.isSubmitting,m={canSkip:p,onSkip:async y=>{y?.preventDefault(),p&&await o();},className:r,currentStep:t,stepData:S.values||{},allData:s.allData,context:s};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:n.renderConfig?.skipButtonRenderer,props:m,...e})}function ct({onStepClick:r,className:e,...t}){let{workflowConfig:o,workflowState:i,goToStep:n,conditionsHelpers:s}=I(),{visibleSteps:d,visibleToOriginalIndexMap:S,originalToVisibleIndexMap:p}=react.useMemo(()=>{let h=[],l=new Map,g=new Map;return o.steps.forEach((x,P)=>{if(s.isStepVisible(P)){let u=h.length;h.push(x),l.set(u,P),g.set(P,u);}}),{visibleSteps:h,visibleToOriginalIndexMap:l,originalToVisibleIndexMap:g}},[o.steps,s]),f=h=>{let l=S.get(h);l!==void 0&&(r?r(l):n(l));},m=p.get(i.currentStepIndex)??-1,y={steps:d,currentStepIndex:m,visitedSteps:i.visitedSteps,onStepClick:f,className:e};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:o.renderConfig?.stepperRenderer,props:y,...t})}var j=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,t){if(this._isAvailable)try{let o=this.getStorageKey(e),i={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},n=JSON.stringify(i),s=this.compress?this.compressData(n):n;localStorage.setItem(o,s);}catch(o){if(o instanceof Error)if(o.name==="QuotaExceededError"||o.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),n={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(n),d=this.compress?this.compressData(s):s;localStorage.setItem(i,d);}catch(i){throw new k("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new k(`Failed to save to localStorage: ${o.message}`,"SAVE_FAILED",o);else throw new k("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return null;let i=this.compress?this.decompressData(o):o,n=JSON.parse(i);return n.expiresAt&&Date.now()>n.expiresAt?(await this.remove(e),null):{...n.data,visitedSteps:Array.isArray(n.data.visitedSteps)?n.data.visitedSteps:[]}}catch(t){throw t instanceof Error?new k(`Failed to load from localStorage: ${t.message}`,"LOAD_FAILED",t):new k("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let t=this.getStorageKey(e);localStorage.removeItem(t);}catch(t){throw t instanceof Error?new k(`Failed to remove from localStorage: ${t.message}`,"REMOVE_FAILED",t):new k("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return !1;let i=this.compress?this.decompressData(o):o,n=JSON.parse(i);return n.expiresAt&&Date.now()>n.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix)){let i=o.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new k(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new k("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);o?.startsWith(this.keyPrefix)&&e.push(o);}for(let t of e)localStorage.removeItem(t);}catch(e){throw e instanceof Error?new k(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new k("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 t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(o);if(i){let n=this.compress?this.decompressData(i):i,s=JSON.parse(n);s.expiresAt&&Date.now()>s.expiresAt&&e.push(o);}}catch{e.push(o);}}for(let t of e)localStorage.removeItem(t);}};
Object.defineProperty(exports,"form",{enumerable:true,get:function(){return forms.form}});exports.LocalStorageAdapter=j;exports.RilayLicenseManager=F;exports.Workflow=$e;exports.WorkflowBody=Xe;exports.WorkflowNextButton=je;exports.WorkflowPersistenceError=k;exports.WorkflowPreviousButton=rt;exports.WorkflowProvider=Q;exports.WorkflowSkipButton=st;exports.WorkflowStepper=ct;exports.createFlow=Re;exports.debounce=X;exports.flow=N;exports.generateStorageKey=z;exports.mergePersistedState=Le;exports.persistedToWorkflowState=fe;exports.useConditionEvaluation=ie;exports.useMultipleConditionEvaluation=ne;exports.useMultipleStepConditionEvaluation=se;exports.usePersistence=H;exports.useWorkflowAnalytics=pe;exports.useWorkflowConditions=de;exports.useWorkflowContext=I;exports.useWorkflowNavigation=ue;exports.useWorkflowState=ge;exports.useWorkflowSubmission=be;exports.validatePersistedData=Ne;exports.workflowStateToPersisted=J;Object.keys(core).forEach(function(k){if(k!=='default'&&!Object.prototype.hasOwnProperty.call(exports,k))Object.defineProperty(exports,k,{enumerable:true,get:function(){return core[k]}})});