@rilaykit/workflow 5.2.0 → 6.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.d.mts +504 -7
- package/dist/index.d.ts +504 -7
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),O=require('@noble/ed25519'),react=require('react'),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 O__namespace=/*#__PURE__*/_interopNamespace(O);var X=1751361139160,Y="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",p=class p{static async setLicenseKey(e){p.licenseKey=e||"",p.licenseKey?p.licenseResult=await p.validateLicense():p.licenseResult={valid:false,error:"MISSING"},p.isInitialized=true;}static async validateLicense(){if(!p.licenseKey)return {valid:false,error:"MISSING"};try{if(!p.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=p.licenseKey.slice(4),r=p.base64ToString(e).split(".");if(r.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[s,f,n]=r,l=`${s}.${f}`,u=new TextEncoder().encode(l),w=n.match(/.{2}/g);if(!w)return {valid:!1,error:"INVALID"};let m=new Uint8Array(w.map(E=>Number.parseInt(E,16))),g=p.hexToBytes(Y);if(!await O__namespace.verify(m,u,g))return {valid:!1,error:"SIGNATURE_INVALID"};let x=p.base64ToString(f.replace(/-/g,"+").replace(/_/g,"/")),o=JSON.parse(x),d=Math.floor(Date.now()/1e3);return o.e<d?{valid:!1,error:"EXPIRED",data:p.decompressPayload(o)}:X>o.e*1e3?{valid:!1,error:"EXPIRED",data:p.decompressPayload(o)}:o.p===void 0||!o.c||!o.i||!o.e||!o.t?{valid:!1,error:"INVALID"}:{valid:!0,data:p.decompressPayload(o)}}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 r=0;r<e.length;r+=2)t[r/2]=Number.parseInt(e.substring(r,r+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+/",r="",s=0,f=e.replace(/[^A-Za-z0-9+/]/g,"");for(;s<f.length;){let n=t.indexOf(f.charAt(s++)),l=t.indexOf(f.charAt(s++)),u=t.indexOf(f.charAt(s++)),w=t.indexOf(f.charAt(s++)),m=n<<18|l<<12|u<<6|w;r+=String.fromCharCode(m>>16&255),u!==64&&(r+=String.fromCharCode(m>>8&255)),w!==64&&(r+=String.fromCharCode(m&255));}return r}static getLicenseResult(){return p.isInitialized?p.licenseResult?p.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!p.getLicenseResult().valid}static getWatermarkMessage(){let e=p.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=p.getLicenseResult();if(e.valid)return;let r={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${r}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=p.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};p.licenseKey="",p.licenseResult=null,p.isInitialized=false;var h=p;var I=class i{constructor(e,t,r,s){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=t,this.workflowName=r,this.workflowDescription=s,h.logLicenseStatus();}static create(e,t,r,s){return new i(e,t,r,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,onAfterValidation:e.onAfterValidation}}addStep(e){let t=core.normalizeToArray(e);for(let r of t){let s=this.createStepFromDefinition(r);this.steps.push(s);}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(r=>!this.plugins.some(s=>s.name===r));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 r=this.steps.findIndex(s=>s.id===e);if(r===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[r]={...this.steps[r],...t},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 r=new i(this.config,e||`${this.workflowId}-clone`,t||this.workflowName);return r.steps=core.deepClone(this.steps),r.analytics=this.analytics?core.deepClone(this.analytics):void 0,r.plugins=[...this.plugins],r}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let t=this.steps.map(r=>r.id);try{core.ensureUnique(t,"step");}catch(r){e.push(r instanceof Error?r.message:String(r));}for(let r of this.plugins)if(r.dependencies){let s=r.dependencies.filter(f=>!this.plugins.some(n=>n.name===f));s.length>0&&e.push(`Plugin "${r.name}" requires missing dependencies: ${s.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((r,s)=>r+s.formConfig.allFields.length,0),t=this.steps.map(r=>r.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(i,e,t,r){return I.create(i,e,t,r)}core.ril.prototype.flow=function(i,e,t){return I.create(this,i,e,t)};function ae(i,e){switch(e.type){case "SET_CURRENT_STEP":return {...i,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":{let t=e.stepId;return {...i,stepData:e.data,allData:{...i.allData,[t]:e.data}}}case "SET_ALL_DATA":return {...i,allData:e.data};case "SET_FIELD_VALUE":{let t=e.stepId,r={...i.stepData,[e.fieldId]:e.value};return {...i,stepData:r,allData:{...i.allData,[t]:r}}}case "SET_SUBMITTING":return {...i,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...i,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...i,visitedSteps:new Set([...i.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false};default:return i}}var $=react.createContext(null);function N({children:i,workflowConfig:e,defaultValues:t={},onStepChange:r,onWorkflowComplete:s,className:f}){let[n,l]=react.useReducer(ae,{currentStepIndex:0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false}),u=react.useRef(Date.now()),w=react.useRef(new Map),m=react.useRef(false),g=react.useRef(null),T=react.useRef(r),x=react.useRef(s);T.current=r,x.current=s;let o=react.useMemo(()=>e,[e]),d=react.useMemo(()=>({workflowId:o.id,currentStepIndex:n.currentStepIndex,totalSteps:o.steps.length,allData:n.allData,stepData:n.stepData,isFirstStep:n.currentStepIndex===0,isLastStep:n.currentStepIndex===o.steps.length-1,visitedSteps:n.visitedSteps}),[o.id,n.currentStepIndex,o.steps.length,n.allData,n.stepData,n.visitedSteps]);react.useEffect(()=>{o.analytics?.onWorkflowStart&&!m.current&&(m.current=true,o.analytics.onWorkflowStart(o.id,d));},[o.id,o.analytics,d]),react.useEffect(()=>{let a=o.steps[n.currentStepIndex];if(a&&g.current!==a.id){if(g.current&&o.analytics?.onStepComplete){let c=w.current.get(g.current);c&&o.analytics.onStepComplete(g.current,Date.now()-c,n.stepData,d);}g.current=a.id,w.current.set(a.id,Date.now()),o.analytics?.onStepStart&&o.analytics.onStepStart(a.id,Date.now(),d);}},[n.currentStepIndex,o.steps,o.analytics,d]);let S=react.useMemo(()=>o.steps[n.currentStepIndex],[o.steps,n.currentStepIndex]),E=react.useMemo(()=>S?.formConfig,[S]),D=react.useCallback(async a=>{if(a<0||a>=o.steps.length)return false;l({type:"SET_TRANSITIONING",isTransitioning:true});try{return T.current&&T.current(n.currentStepIndex,a,d),l({type:"SET_CURRENT_STEP",stepIndex:a}),l({type:"MARK_STEP_VISITED",stepIndex:a,stepId:o.steps[a].id}),!0}catch(c){return console.error("Step transition failed:",c),o.analytics?.onError&&o.analytics.onError(c,d),false}finally{l({type:"SET_TRANSITIONING",isTransitioning:false});}},[o.steps,n.currentStepIndex,d,o.analytics]),L=react.useCallback(()=>({setStepData:(a,c)=>{l({type:"SET_STEP_DATA",data:c,stepId:a});},setStepFields:(a,c)=>{let C={...n.allData[a]||{},...c};l({type:"SET_STEP_DATA",data:C,stepId:a});},getStepData:a=>n.allData[a]||{},setNextStepField:(a,c)=>{let v=n.currentStepIndex+1;if(v<o.steps.length){let C=o.steps[v].id,J={...n.allData[C]||{},[a]:c};l({type:"SET_STEP_DATA",data:J,stepId:C});}},setNextStepFields:a=>{let c=n.currentStepIndex+1;if(c<o.steps.length){let v=o.steps[c].id,_={...n.allData[v]||{},...a};l({type:"SET_STEP_DATA",data:_,stepId:v});}},getAllData:()=>({...n.allData}),getSteps:()=>[...o.steps]}),[n.allData,n.currentStepIndex,o.steps]),A=react.useCallback((a,c)=>{l({type:"SET_FIELD_VALUE",fieldId:a,value:c,stepId:S?.id||""});},[S?.id]),F=react.useCallback(a=>{l({type:"SET_STEP_DATA",data:a,stepId:S?.id||""});},[S?.id]),W=react.useCallback(async()=>{if(S?.onAfterValidation)try{let c=L();await S.onAfterValidation(n.stepData,c,d);}catch(c){return console.error("onAfterValidation failed:",c),o.analytics?.onError&&o.analytics.onError(c,d),false}let a=n.currentStepIndex+1;return D(a)},[S,L,n.stepData,d,o.analytics,D,n.currentStepIndex]),B=react.useCallback(async()=>D(n.currentStepIndex-1),[n.currentStepIndex,D]),b=react.useCallback(async()=>{l({type:"SET_SUBMITTING",isSubmitting:true});try{if(x.current&&await x.current(n.allData),o.analytics?.onWorkflowComplete){let a=Date.now()-u.current;o.analytics.onWorkflowComplete(o.id,a,n.allData);}}catch(a){throw console.error("Workflow submission failed:",a),o.analytics?.onError&&o.analytics.onError(a,d),a}finally{l({type:"SET_SUBMITTING",isSubmitting:false});}},[n.allData,x,o.analytics,d]),V=react.useCallback(async()=>S?.allowSkip?(o.analytics?.onStepSkip&&o.analytics.onStepSkip(S.id,"user_skip",d),d.isLastStep?(await b(),true):W()):false,[S,o.analytics,d,W,b]),M=react.useCallback(()=>{l({type:"RESET_WORKFLOW"});},[]),z=react.useMemo(()=>({workflowState:n,workflowConfig:o,currentStep:S,context:d,formConfig:E,goToStep:D,goNext:W,goPrevious:B,skipStep:V,setValue:A,setStepData:F,submitWorkflow:b,resetWorkflow:M}),[n,o,S,d,E,D,W,B,V,A,F,b,M]),q=react.useCallback(async()=>{await W();},[W]);return jsxRuntime.jsx($.Provider,{value:z,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:S?.formConfig,defaultValues:n?.allData[S?.id]||{},onFieldChange:A,"data-workflow-id":o.id,className:f,onSubmit:q,children:i})})}function y(){let i=react.useContext($);if(!i)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return i}function ce({children:i,workflowConfig:e,...t}){let[r,s]=react.useState(false),f=h.shouldDisplayWatermark(),n=h.getWatermarkMessage(),l=react.useMemo(()=>e instanceof I?e.build():e,[e]);return react.useEffect(()=>{s(true);},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(N,{...t,workflowConfig:l,children:i}),r&&f&&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})]})}function Se(){let{currentStep:i}=y();if(!i)return null;let{formConfig:e,renderer:t}=i;return e?t?t(i):jsxRuntime.jsx(forms.FormBody,{}):null}function ye({className:i,...e}){let{context:t,workflowState:r,workflowConfig:s,currentStep:f}=y(),{submit:n,formState:l}=forms.useFormContext(),u=!r.isTransitioning&&!r.isSubmitting,w=async g=>{g?.preventDefault(),u&&await n(g);},m={isLastStep:t.isLastStep,canGoNext:u,isSubmitting:l.isSubmitting||r.isSubmitting,onSubmit:w,className:i,currentStep:f,stepData:l.values||{},allData:t.allData,context:t};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:s.renderConfig?.nextButtonRenderer,props:m,...e})}function xe({className:i,...e}){let{context:t,goPrevious:r,workflowState:s,workflowConfig:f,currentStep:n}=y(),{formState:l}=forms.useFormContext(),u=t.currentStepIndex>0&&!s.isTransitioning&&!s.isSubmitting,m={canGoPrevious:u,onPrevious:async g=>{g?.preventDefault(),u&&await r();},className:i,currentStep:n,stepData:l.values||{},allData:t.allData,context:t};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:f.renderConfig?.previousButtonRenderer,props:m,...e})}function Re({className:i,...e}){let{currentStep:t,skipStep:r,workflowState:s,workflowConfig:f,context:n}=y(),{formState:l}=forms.useFormContext(),u=!!t?.allowSkip&&!s.isTransitioning&&!s.isSubmitting,m={canSkip:u,onSkip:async g=>{g?.preventDefault(),u&&await r();},className:i,currentStep:t,stepData:l.values||{},allData:n.allData,context:n};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:f.renderConfig?.skipButtonRenderer,props:m,...e})}function Te({onStepClick:i,className:e,...t}){let{workflowConfig:r,workflowState:s,goToStep:f}=y(),n=u=>{i?i(u):f(u);},l={steps:r.steps,currentStepIndex:s.currentStepIndex,visitedSteps:s.visitedSteps,onStepClick:n,className:e};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:r.renderConfig?.stepperRenderer,props:l,...t})}
|
|
2
|
-
Object.defineProperty(exports,"form",{enumerable:true,get:function(){return forms.form}});exports.RilayLicenseManager=
|
|
1
|
+
'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,n){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=t,this.workflowName=o,this.workflowDescription=n;}static create(e,t,o,n){return new r(e,t,o,n)}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 n=this.createStepFromDefinition(o);this.steps.push(n);}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(n=>n.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(n=>n.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(i=>i.id===e);if(o===-1)throw new Error(`Step with ID "${e}" not found`);let n={...this.steps[o].conditions,...t};return this.steps[o]={...this.steps[o],conditions:n},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 n=o.dependencies.filter(i=>!this.plugins.some(s=>s.name===i));n.length>0&&e.push(`Plugin "${o.name}" requires missing dependencies: ${n.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((o,n)=>o+n.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,Te="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[n,i,s]=o,d=`${n}.${i}`,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(Te);if(!await oe__namespace.verify(f,S,m))return {valid:!1,error:"SIGNATURE_INVALID"};let h=b.base64ToString(i.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="",n=0,i=e.replace(/[^A-Za-z0-9+/]/g,"");for(;n<i.length;){let s=t.indexOf(i.charAt(n++)),d=t.indexOf(i.charAt(n++)),S=t.indexOf(i.charAt(n++)),p=t.indexOf(i.charAt(n++)),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 ne(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=n=>{try{let i;return n&&typeof n=="object"&&"build"in n?i=n.build():i=n,core.evaluateCondition(i,e)}catch(i){return console.warn("Error evaluating condition:",i),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 ie(r,e={}){return react.useMemo(()=>{let t={};for(let[o,n]of Object.entries(r))if(t[o]={visible:true,disabled:false,required:false,readonly:false},n){let i=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:n.visible?i(n.visible):true,disabled:n.disabled?i(n.disabled):false,required:n.required?i(n.required):false,readonly:n.readonly?i(n.readonly):false};}return t},[r,e])}function se(r,e={}){return react.useMemo(()=>{let t={};for(let[o,n]of Object.entries(r)){let i=Number.parseInt(o,10);if(t[i]={visible:true,disabled:false,required:false,readonly:false},n){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 ${i}:`,S),false}};t[i]={visible:n.visible?s(n.visible):true,disabled:n.disabled?s(n.disabled):false,required:n.required?s(n.required):false,readonly:n.readonly?s(n.readonly):false};}}return t},[r,e])}function pe({workflowConfig:r,workflowState:e,workflowContext:t}){let o=react.useRef(Date.now()),n=react.useRef(new Map),i=react.useRef(false),s=react.useRef(null);react.useEffect(()=>{r.analytics?.onWorkflowStart&&!i.current&&(i.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=n.current.get(s.current);f&&r.analytics.onStepComplete(s.current,Date.now()-f,e.stepData,t);}s.current=p.id,n.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]),n=react.useMemo(()=>{if(t?.conditions)return {visible:t.conditions.visible,required:t.conditions.skippable}},[t?.conditions]),i=ne(n,o,{visible:true,disabled:false,required:false,readonly:false}),s=react.useMemo(()=>ce(i,t?.allowSkip),[i,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=ie(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:n,setTransitioning:i,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;i(true);try{return p.current&&p.current(e.currentStepIndex,a,t),n(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{i(false);}},[r.steps,r.analytics,o,e.currentStepIndex,t,i,n,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,n){super(`[WorkflowPersistence] ${t} (Code: ${o})`);this.code=o;this.cause=n;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:n}){let[i,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,n),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&&(i||e.isSubmitting||e.isTransitioning||P(e,m.current.lastSavedState)&&(m.current.hasPendingChanges=true,x.current(e)));},[e,i,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:i,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,n]=react.useReducer(Ve,t),i=e?.adapter?H({workflowId:e.workflowId,workflowState:o,adapter:e.adapter,options:e.options,userId:e.userId}):null,s=react.useCallback(l=>{n({type:"SET_CURRENT_STEP",stepIndex:l});},[]),d=react.useCallback((l,g)=>{n({type:"SET_STEP_DATA",data:l,stepId:g});},[]),S=react.useCallback((l,g,x)=>{n({type:"SET_FIELD_VALUE",fieldId:l,value:g,stepId:x});},[]),p=react.useCallback(l=>{n({type:"SET_SUBMITTING",isSubmitting:l});},[]),f=react.useCallback(l=>{n({type:"SET_TRANSITIONING",isTransitioning:l});},[]),m=react.useCallback((l,g)=>{n({type:"MARK_STEP_VISITED",stepIndex:l,stepId:g});},[]),y=react.useCallback(()=>{n({type:"RESET_WORKFLOW"});},[]),h=react.useCallback(async()=>{if(!i)return false;try{let l=await i.loadPersistedData();if(l){let g={currentStepIndex:l.currentStepIndex,allData:l.allData,stepData:l.stepData,visitedSteps:new Set(l.visitedSteps)};return n({type:"LOAD_PERSISTED_STATE",state:g}),!0}}catch(l){console.error("Failed to load persisted state:",l);}return false},[i]);return {workflowState:o,setCurrentStep:s,setStepData:d,setFieldValue:S,setSubmitting:p,setTransitioning:f,markStepVisited:m,resetWorkflow:y,loadPersistedState:h,persistence:i?{isPersisting:i.isPersisting,persistenceError:i.persistenceError,persistNow:i.persistNow,clearPersistedData:i.clearPersistedData,hasPersistedData:i.hasPersistedData}:null}}function be({workflowConfig:r,workflowState:e,workflowContext:t,setSubmitting:o,onWorkflowComplete:n,analyticsStartTime:i}){let s=react.useRef(n);s.current=n;let d=react.useCallback(async()=>{o(true);try{if(s.current&&await s.current(e.allData),r.analytics?.onWorkflowComplete){let p=Date.now()-i.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,i,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:n,className:i}){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:n,analyticsStartTime:P}),q=react.useCallback((M,C)=>{p(M,C,g?.id||"");},[p,g?.id]),te=react.useCallback(M=>{S(M,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:i,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,n]=react.useState(),i=react.useMemo(()=>e instanceof N?e.build():e,[e]);return react.useEffect(()=>{if(typeof window<"u"&&F.shouldDisplayWatermark()){let d=F.getWatermarkMessage();n(d);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(Q,{...t,workflowConfig:i,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:n,currentStep:i}=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:i,stepData:d.values||{},allData:t.allData,context:t};return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:n.renderConfig?.nextButtonRenderer,props:f,...e})}function rt({className:r,...e}){let{context:t,goPrevious:o,workflowState:n,workflowConfig:i,currentStep:s}=I(),{formState:d}=forms.useFormContext(),S=t.currentStepIndex>0&&!n.isTransitioning&&!n.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:i.renderConfig?.previousButtonRenderer,props:f,...e})}function st({className:r,...e}){let{currentStep:t,skipStep:o,workflowState:n,workflowConfig:i,context:s,conditionsHelpers:d}=I(),{formState:S}=forms.useFormContext(),p=(!!t?.allowSkip||d.isStepSkippable(n.currentStepIndex))&&!n.isTransitioning&&!n.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:i.renderConfig?.skipButtonRenderer,props:m,...e})}function ct({onStepClick:r,className:e,...t}){let{workflowConfig:o,workflowState:n,goToStep:i,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):i(l));},m=p.get(n.currentStepIndex)??-1,y={steps:d,currentStepIndex:m,visitedSteps:n.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";if(this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,!this.isLocalStorageAvailable())throw new k("localStorage is not available in this environment","LOCALSTORAGE_UNAVAILABLE")}async save(e,t){try{let o=this.getStorageKey(e),n={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},i=JSON.stringify(n),s=this.compress?this.compressData(i):i;localStorage.setItem(o,s);}catch(o){if(o instanceof Error)if(o.name==="QuotaExceededError"||o.message.includes("quota")){await this.clearExpiredData();try{let n=this.getStorageKey(e),i={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){throw new k("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",n)}}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){try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return null;let n=this.compress?this.decompressData(o):o,i=JSON.parse(n);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),null):{...i.data,visitedSteps:Array.isArray(i.data.visitedSteps)?i.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){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){try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return !1;let n=this.compress?this.decompressData(o):o,i=JSON.parse(n);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){try{let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix)){let n=o.substring(this.keyPrefix.length);await this.exists(n)&&e.push(n);}}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(){let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix))try{let n=localStorage.getItem(o);if(n){let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);s.expiresAt&&Date.now()>s.expiresAt&&e.push(o);}}catch{e.push(o);}}for(let t of e)localStorage.removeItem(t);}};
|
|
2
|
+
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=ne;exports.useMultipleConditionEvaluation=ie;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]}})});
|
package/dist/index.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {ril,IdGenerator,normalizeToArray,deepClone,ensureUnique,ComponentRendererWrapper}from'@rilaykit/core';export*from'@rilaykit/core';import {form,FormProvider,FormBody,useFormContext}from'@rilaykit/forms';export{form}from'@rilaykit/forms';import*as O from'@noble/ed25519';import {createContext,useReducer,useRef,useMemo,useEffect,useCallback,useContext,useState}from'react';import {jsx,jsxs}from'react/jsx-runtime';var X=1751361139160,Y="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",p=class p{static async setLicenseKey(e){p.licenseKey=e||"",p.licenseKey?p.licenseResult=await p.validateLicense():p.licenseResult={valid:false,error:"MISSING"},p.isInitialized=true;}static async validateLicense(){if(!p.licenseKey)return {valid:false,error:"MISSING"};try{if(!p.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=p.licenseKey.slice(4),r=p.base64ToString(e).split(".");if(r.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[s,f,n]=r,l=`${s}.${f}`,u=new TextEncoder().encode(l),w=n.match(/.{2}/g);if(!w)return {valid:!1,error:"INVALID"};let m=new Uint8Array(w.map(E=>Number.parseInt(E,16))),g=p.hexToBytes(Y);if(!await O.verify(m,u,g))return {valid:!1,error:"SIGNATURE_INVALID"};let x=p.base64ToString(f.replace(/-/g,"+").replace(/_/g,"/")),o=JSON.parse(x),d=Math.floor(Date.now()/1e3);return o.e<d?{valid:!1,error:"EXPIRED",data:p.decompressPayload(o)}:X>o.e*1e3?{valid:!1,error:"EXPIRED",data:p.decompressPayload(o)}:o.p===void 0||!o.c||!o.i||!o.e||!o.t?{valid:!1,error:"INVALID"}:{valid:!0,data:p.decompressPayload(o)}}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 r=0;r<e.length;r+=2)t[r/2]=Number.parseInt(e.substring(r,r+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+/",r="",s=0,f=e.replace(/[^A-Za-z0-9+/]/g,"");for(;s<f.length;){let n=t.indexOf(f.charAt(s++)),l=t.indexOf(f.charAt(s++)),u=t.indexOf(f.charAt(s++)),w=t.indexOf(f.charAt(s++)),m=n<<18|l<<12|u<<6|w;r+=String.fromCharCode(m>>16&255),u!==64&&(r+=String.fromCharCode(m>>8&255)),w!==64&&(r+=String.fromCharCode(m&255));}return r}static getLicenseResult(){return p.isInitialized?p.licenseResult?p.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!p.getLicenseResult().valid}static getWatermarkMessage(){let e=p.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=p.getLicenseResult();if(e.valid)return;let r={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${r}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=p.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};p.licenseKey="",p.licenseResult=null,p.isInitialized=false;var h=p;var I=class i{constructor(e,t,r,s){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=t,this.workflowName=r,this.workflowDescription=s,h.logLicenseStatus();}static create(e,t,r,s){return new i(e,t,r,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,onAfterValidation:e.onAfterValidation}}addStep(e){let t=normalizeToArray(e);for(let r of t){let s=this.createStepFromDefinition(r);this.steps.push(s);}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(r=>!this.plugins.some(s=>s.name===r));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 r=this.steps.findIndex(s=>s.id===e);if(r===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[r]={...this.steps[r],...t},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 r=new i(this.config,e||`${this.workflowId}-clone`,t||this.workflowName);return r.steps=deepClone(this.steps),r.analytics=this.analytics?deepClone(this.analytics):void 0,r.plugins=[...this.plugins],r}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let t=this.steps.map(r=>r.id);try{ensureUnique(t,"step");}catch(r){e.push(r instanceof Error?r.message:String(r));}for(let r of this.plugins)if(r.dependencies){let s=r.dependencies.filter(f=>!this.plugins.some(n=>n.name===f));s.length>0&&e.push(`Plugin "${r.name}" requires missing dependencies: ${s.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((r,s)=>r+s.formConfig.allFields.length,0),t=this.steps.map(r=>r.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(i,e,t,r){return I.create(i,e,t,r)}ril.prototype.flow=function(i,e,t){return I.create(this,i,e,t)};function ae(i,e){switch(e.type){case "SET_CURRENT_STEP":return {...i,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":{let t=e.stepId;return {...i,stepData:e.data,allData:{...i.allData,[t]:e.data}}}case "SET_ALL_DATA":return {...i,allData:e.data};case "SET_FIELD_VALUE":{let t=e.stepId,r={...i.stepData,[e.fieldId]:e.value};return {...i,stepData:r,allData:{...i.allData,[t]:r}}}case "SET_SUBMITTING":return {...i,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...i,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...i,visitedSteps:new Set([...i.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false};default:return i}}var $=createContext(null);function N({children:i,workflowConfig:e,defaultValues:t={},onStepChange:r,onWorkflowComplete:s,className:f}){let[n,l]=useReducer(ae,{currentStepIndex:0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false}),u=useRef(Date.now()),w=useRef(new Map),m=useRef(false),g=useRef(null),T=useRef(r),x=useRef(s);T.current=r,x.current=s;let o=useMemo(()=>e,[e]),d=useMemo(()=>({workflowId:o.id,currentStepIndex:n.currentStepIndex,totalSteps:o.steps.length,allData:n.allData,stepData:n.stepData,isFirstStep:n.currentStepIndex===0,isLastStep:n.currentStepIndex===o.steps.length-1,visitedSteps:n.visitedSteps}),[o.id,n.currentStepIndex,o.steps.length,n.allData,n.stepData,n.visitedSteps]);useEffect(()=>{o.analytics?.onWorkflowStart&&!m.current&&(m.current=true,o.analytics.onWorkflowStart(o.id,d));},[o.id,o.analytics,d]),useEffect(()=>{let a=o.steps[n.currentStepIndex];if(a&&g.current!==a.id){if(g.current&&o.analytics?.onStepComplete){let c=w.current.get(g.current);c&&o.analytics.onStepComplete(g.current,Date.now()-c,n.stepData,d);}g.current=a.id,w.current.set(a.id,Date.now()),o.analytics?.onStepStart&&o.analytics.onStepStart(a.id,Date.now(),d);}},[n.currentStepIndex,o.steps,o.analytics,d]);let S=useMemo(()=>o.steps[n.currentStepIndex],[o.steps,n.currentStepIndex]),E=useMemo(()=>S?.formConfig,[S]),D=useCallback(async a=>{if(a<0||a>=o.steps.length)return false;l({type:"SET_TRANSITIONING",isTransitioning:true});try{return T.current&&T.current(n.currentStepIndex,a,d),l({type:"SET_CURRENT_STEP",stepIndex:a}),l({type:"MARK_STEP_VISITED",stepIndex:a,stepId:o.steps[a].id}),!0}catch(c){return console.error("Step transition failed:",c),o.analytics?.onError&&o.analytics.onError(c,d),false}finally{l({type:"SET_TRANSITIONING",isTransitioning:false});}},[o.steps,n.currentStepIndex,d,o.analytics]),L=useCallback(()=>({setStepData:(a,c)=>{l({type:"SET_STEP_DATA",data:c,stepId:a});},setStepFields:(a,c)=>{let C={...n.allData[a]||{},...c};l({type:"SET_STEP_DATA",data:C,stepId:a});},getStepData:a=>n.allData[a]||{},setNextStepField:(a,c)=>{let v=n.currentStepIndex+1;if(v<o.steps.length){let C=o.steps[v].id,J={...n.allData[C]||{},[a]:c};l({type:"SET_STEP_DATA",data:J,stepId:C});}},setNextStepFields:a=>{let c=n.currentStepIndex+1;if(c<o.steps.length){let v=o.steps[c].id,_={...n.allData[v]||{},...a};l({type:"SET_STEP_DATA",data:_,stepId:v});}},getAllData:()=>({...n.allData}),getSteps:()=>[...o.steps]}),[n.allData,n.currentStepIndex,o.steps]),A=useCallback((a,c)=>{l({type:"SET_FIELD_VALUE",fieldId:a,value:c,stepId:S?.id||""});},[S?.id]),F=useCallback(a=>{l({type:"SET_STEP_DATA",data:a,stepId:S?.id||""});},[S?.id]),W=useCallback(async()=>{if(S?.onAfterValidation)try{let c=L();await S.onAfterValidation(n.stepData,c,d);}catch(c){return console.error("onAfterValidation failed:",c),o.analytics?.onError&&o.analytics.onError(c,d),false}let a=n.currentStepIndex+1;return D(a)},[S,L,n.stepData,d,o.analytics,D,n.currentStepIndex]),B=useCallback(async()=>D(n.currentStepIndex-1),[n.currentStepIndex,D]),b=useCallback(async()=>{l({type:"SET_SUBMITTING",isSubmitting:true});try{if(x.current&&await x.current(n.allData),o.analytics?.onWorkflowComplete){let a=Date.now()-u.current;o.analytics.onWorkflowComplete(o.id,a,n.allData);}}catch(a){throw console.error("Workflow submission failed:",a),o.analytics?.onError&&o.analytics.onError(a,d),a}finally{l({type:"SET_SUBMITTING",isSubmitting:false});}},[n.allData,x,o.analytics,d]),V=useCallback(async()=>S?.allowSkip?(o.analytics?.onStepSkip&&o.analytics.onStepSkip(S.id,"user_skip",d),d.isLastStep?(await b(),true):W()):false,[S,o.analytics,d,W,b]),M=useCallback(()=>{l({type:"RESET_WORKFLOW"});},[]),z=useMemo(()=>({workflowState:n,workflowConfig:o,currentStep:S,context:d,formConfig:E,goToStep:D,goNext:W,goPrevious:B,skipStep:V,setValue:A,setStepData:F,submitWorkflow:b,resetWorkflow:M}),[n,o,S,d,E,D,W,B,V,A,F,b,M]),q=useCallback(async()=>{await W();},[W]);return jsx($.Provider,{value:z,children:jsx(FormProvider,{formConfig:S?.formConfig,defaultValues:n?.allData[S?.id]||{},onFieldChange:A,"data-workflow-id":o.id,className:f,onSubmit:q,children:i})})}function y(){let i=useContext($);if(!i)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return i}function ce({children:i,workflowConfig:e,...t}){let[r,s]=useState(false),f=h.shouldDisplayWatermark(),n=h.getWatermarkMessage(),l=useMemo(()=>e instanceof I?e.build():e,[e]);return useEffect(()=>{s(true);},[]),jsxs("div",{style:{position:"relative"},children:[jsx(N,{...t,workflowConfig:l,children:i}),r&&f&&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})]})}function Se(){let{currentStep:i}=y();if(!i)return null;let{formConfig:e,renderer:t}=i;return e?t?t(i):jsx(FormBody,{}):null}function ye({className:i,...e}){let{context:t,workflowState:r,workflowConfig:s,currentStep:f}=y(),{submit:n,formState:l}=useFormContext(),u=!r.isTransitioning&&!r.isSubmitting,w=async g=>{g?.preventDefault(),u&&await n(g);},m={isLastStep:t.isLastStep,canGoNext:u,isSubmitting:l.isSubmitting||r.isSubmitting,onSubmit:w,className:i,currentStep:f,stepData:l.values||{},allData:t.allData,context:t};return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:s.renderConfig?.nextButtonRenderer,props:m,...e})}function xe({className:i,...e}){let{context:t,goPrevious:r,workflowState:s,workflowConfig:f,currentStep:n}=y(),{formState:l}=useFormContext(),u=t.currentStepIndex>0&&!s.isTransitioning&&!s.isSubmitting,m={canGoPrevious:u,onPrevious:async g=>{g?.preventDefault(),u&&await r();},className:i,currentStep:n,stepData:l.values||{},allData:t.allData,context:t};return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:f.renderConfig?.previousButtonRenderer,props:m,...e})}function Re({className:i,...e}){let{currentStep:t,skipStep:r,workflowState:s,workflowConfig:f,context:n}=y(),{formState:l}=useFormContext(),u=!!t?.allowSkip&&!s.isTransitioning&&!s.isSubmitting,m={canSkip:u,onSkip:async g=>{g?.preventDefault(),u&&await r();},className:i,currentStep:t,stepData:l.values||{},allData:n.allData,context:n};return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:f.renderConfig?.skipButtonRenderer,props:m,...e})}function Te({onStepClick:i,className:e,...t}){let{workflowConfig:r,workflowState:s,goToStep:f}=y(),n=u=>{i?i(u):f(u);},l={steps:r.steps,currentStepIndex:s.currentStepIndex,visitedSteps:s.visitedSteps,onStepClick:n,className:e};return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:r.renderConfig?.stepperRenderer,props:l,...t})}
|
|
2
|
-
export{
|
|
1
|
+
import {ril,IdGenerator,normalizeToArray,deepClone,ensureUnique,ComponentRendererWrapper,evaluateCondition}from'@rilaykit/core';export*from'@rilaykit/core';import {form,FormProvider,FormBody,useFormContext}from'@rilaykit/forms';export{form}from'@rilaykit/forms';import {createContext,useMemo,useRef,useEffect,useCallback,useState,useReducer,useContext}from'react';import*as oe from'@noble/ed25519';import {jsx,jsxs}from'react/jsx-runtime';var N=class r{constructor(e,t,o,n){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=t,this.workflowName=o,this.workflowDescription=n;}static create(e,t,o,n){return new r(e,t,o,n)}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,onAfterValidation:e.onAfterValidation}}addStep(e){let t=normalizeToArray(e);for(let o of t){let n=this.createStepFromDefinition(o);this.steps.push(n);}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(n=>n.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(n=>n.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(i=>i.id===e);if(o===-1)throw new Error(`Step with ID "${e}" not found`);let n={...this.steps[o].conditions,...t};return this.steps[o]={...this.steps[o],conditions:n},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=deepClone(this.steps),o.analytics=this.analytics?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{ensureUnique(t,"step");}catch(o){e.push(o instanceof Error?o.message:String(o));}for(let o of this.plugins)if(o.dependencies){let n=o.dependencies.filter(i=>!this.plugins.some(s=>s.name===i));n.length>0&&e.push(`Plugin "${o.name}" requires missing dependencies: ${n.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((o,n)=>o+n.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)}ril.prototype.flow=function(r,e,t){return N.create(this,r,e,t)};var Ce=1751361139160,Te="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[n,i,s]=o,d=`${n}.${i}`,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(Te);if(!await oe.verify(f,S,m))return {valid:!1,error:"SIGNATURE_INVALID"};let h=b.base64ToString(i.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="",n=0,i=e.replace(/[^A-Za-z0-9+/]/g,"");for(;n<i.length;){let s=t.indexOf(i.charAt(n++)),d=t.indexOf(i.charAt(n++)),S=t.indexOf(i.charAt(n++)),p=t.indexOf(i.charAt(n++)),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 ne(r,e={},t={}){return useMemo(()=>{if(!r)return {visible:t.visible??true,disabled:t.disabled??false,required:t.required??false,readonly:t.readonly??false};let o=n=>{try{let i;return n&&typeof n=="object"&&"build"in n?i=n.build():i=n,evaluateCondition(i,e)}catch(i){return console.warn("Error evaluating condition:",i),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 ie(r,e={}){return useMemo(()=>{let t={};for(let[o,n]of Object.entries(r))if(t[o]={visible:true,disabled:false,required:false,readonly:false},n){let i=s=>{try{return s&&typeof s=="object"&&"build"in s?evaluateCondition(s.build(),e):evaluateCondition(s,e)}catch(d){return console.warn(`Error evaluating condition for field ${o}:`,d),false}};t[o]={visible:n.visible?i(n.visible):true,disabled:n.disabled?i(n.disabled):false,required:n.required?i(n.required):false,readonly:n.readonly?i(n.readonly):false};}return t},[r,e])}function se(r,e={}){return useMemo(()=>{let t={};for(let[o,n]of Object.entries(r)){let i=Number.parseInt(o,10);if(t[i]={visible:true,disabled:false,required:false,readonly:false},n){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?evaluateCondition(d.build(),e):evaluateCondition(d,e)}catch(S){return console.warn(`Error evaluating condition for step ${i}:`,S),false}};t[i]={visible:n.visible?s(n.visible):true,disabled:n.disabled?s(n.disabled):false,required:n.required?s(n.required):false,readonly:n.readonly?s(n.readonly):false};}}return t},[r,e])}function pe({workflowConfig:r,workflowState:e,workflowContext:t}){let o=useRef(Date.now()),n=useRef(new Map),i=useRef(false),s=useRef(null);useEffect(()=>{r.analytics?.onWorkflowStart&&!i.current&&(i.current=true,r.analytics.onWorkflowStart(r.id,t));},[r.id,r.analytics,t]),useEffect(()=>{let p=r.steps[e.currentStepIndex];if(p&&s.current!==p.id){if(s.current&&r.analytics?.onStepComplete){let f=n.current.get(s.current);f&&r.analytics.onStepComplete(s.current,Date.now()-f,e.stepData,t);}s.current=p.id,n.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=useCallback((p,f)=>{r.analytics?.onStepSkip&&r.analytics.onStepSkip(p,f,t);},[r.analytics,t]),S=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=useMemo(()=>({...e.allData,...e.stepData}),[e.allData,e.stepData]),n=useMemo(()=>{if(t?.conditions)return {visible:t.conditions.visible,required:t.conditions.skippable}},[t?.conditions]),i=ne(n,o,{visible:true,disabled:false,required:false,readonly:false}),s=useMemo(()=>ce(i,t?.allowSkip),[i,t?.allowSkip]),d=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=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=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=ie(f,o),y=useCallback(u=>u<0||u>=r.steps.length?false:p[u]?.visible??true,[p,r.steps.length]),h=useCallback(u=>u<0||u>=r.steps.length?false:p[u]?.skippable??false,[p,r.steps.length]),l=useCallback(u=>m[u]?.visible??true,[m]),g=useCallback(u=>m[u]?.disabled??false,[m]),x=useCallback(u=>m[u]?.required??false,[m]),P=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:n,setTransitioning:i,markStepVisited:s,setStepData:d,onStepChange:S}){let p=useRef(S);p.current=S;let f=r.steps[e.currentStepIndex],m=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=useCallback(async a=>{if(a<0||a>=r.steps.length||!o.isStepVisible(a))return false;i(true);try{return p.current&&p.current(e.currentStepIndex,a,t),n(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{i(false);}},[r.steps,r.analytics,o,e.currentStepIndex,t,i,n,s]),h=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=useCallback(a=>{for(let c=a-1;c>=0;c--)if(o.isStepVisible(c))return c;return null},[o]),g=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=useCallback(async()=>{let a=l(e.currentStepIndex);return a===null?false:y(a)},[e.currentStepIndex,l,y]),P=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=useCallback(a=>a<0||a>=r.steps.length?false:o.isStepVisible(a),[r.steps.length,o]),v=useCallback(()=>{let a=h(e.currentStepIndex);return a!==null&&u(a)},[e.currentStepIndex,h,u]),W=useCallback(()=>{let a=l(e.currentStepIndex);return a!==null&&u(a)},[e.currentStepIndex,l,u]),E=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,n){super(`[WorkflowPersistence] ${t} (Code: ${o})`);this.code=o;this.cause=n;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:n}){let[i,s]=useState(false),[d,S]=useState(null),p=useRef(t),f=useRef(o),m=useRef({hasPendingChanges:false});useEffect(()=>{p.current=t,f.current=o;},[t,o]);let y=z(f.current.storageKey||r,n),h=useCallback(()=>{S(null);},[]),l=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=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=useRef(X(async a=>{try{await g(a);}catch(c){console.debug("[WorkflowPersistence] Auto-save failed:",c);}},o.debounceMs||500)),P=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,[]);useEffect(()=>{f.current.autoPersist&&(i||e.isSubmitting||e.isTransitioning||P(e,m.current.lastSavedState)&&(m.current.hasPendingChanges=true,x.current(e)));},[e,i,P]);let u=useCallback(async()=>{await g(e);},[g,e]),v=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=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=useCallback(async()=>{try{return await p.current.exists(y)}catch(a){return l(a,"Exists check"),false}},[y,l]);return {isPersisting:i,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,n]=useReducer(Ve,t),i=e?.adapter?H({workflowId:e.workflowId,workflowState:o,adapter:e.adapter,options:e.options,userId:e.userId}):null,s=useCallback(l=>{n({type:"SET_CURRENT_STEP",stepIndex:l});},[]),d=useCallback((l,g)=>{n({type:"SET_STEP_DATA",data:l,stepId:g});},[]),S=useCallback((l,g,x)=>{n({type:"SET_FIELD_VALUE",fieldId:l,value:g,stepId:x});},[]),p=useCallback(l=>{n({type:"SET_SUBMITTING",isSubmitting:l});},[]),f=useCallback(l=>{n({type:"SET_TRANSITIONING",isTransitioning:l});},[]),m=useCallback((l,g)=>{n({type:"MARK_STEP_VISITED",stepIndex:l,stepId:g});},[]),y=useCallback(()=>{n({type:"RESET_WORKFLOW"});},[]),h=useCallback(async()=>{if(!i)return false;try{let l=await i.loadPersistedData();if(l){let g={currentStepIndex:l.currentStepIndex,allData:l.allData,stepData:l.stepData,visitedSteps:new Set(l.visitedSteps)};return n({type:"LOAD_PERSISTED_STATE",state:g}),!0}}catch(l){console.error("Failed to load persisted state:",l);}return false},[i]);return {workflowState:o,setCurrentStep:s,setStepData:d,setFieldValue:S,setSubmitting:p,setTransitioning:f,markStepVisited:m,resetWorkflow:y,loadPersistedState:h,persistence:i?{isPersisting:i.isPersisting,persistenceError:i.persistenceError,persistNow:i.persistNow,clearPersistedData:i.clearPersistedData,hasPersistedData:i.hasPersistedData}:null}}function be({workflowConfig:r,workflowState:e,workflowContext:t,setSubmitting:o,onWorkflowComplete:n,analyticsStartTime:i}){let s=useRef(n);s.current=n;let d=useCallback(async()=>{o(true);try{if(s.current&&await s.current(e.allData),r.analytics?.onWorkflowComplete){let p=Date.now()-i.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,i,o]),S=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=createContext(null);function Q({children:r,workflowConfig:e,defaultValues:t={},onStepChange:o,onWorkflowComplete:n,className:i}){let{workflowState:s,setCurrentStep:d,setStepData:S,setFieldValue:p,setSubmitting:f,setTransitioning:m,markStepVisited:y,resetWorkflow:h}=ge({defaultValues:t}),l=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=useMemo(()=>e.steps[s.currentStepIndex],[e.steps,s.currentStepIndex]),x=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});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:n,analyticsStartTime:P}),q=useCallback((M,C)=>{p(M,C,g?.id||"");},[p,g?.id]),te=useCallback(M=>{S(M,g?.id||"");},[S,g?.id]),xe=useCallback(async()=>{l.isLastStep?await L():await W();},[l.isLastStep,L,W]),Pe=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 jsx(ve.Provider,{value:Pe,children:jsx(FormProvider,{formConfig:x,defaultValues:s?.allData[g?.id]||{},onFieldChange:q,"data-workflow-id":e.id,className:i,onSubmit:xe,children:r})})}function I(){let r=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,n]=useState(),i=useMemo(()=>e instanceof N?e.build():e,[e]);return useEffect(()=>{if(typeof window<"u"&&F.shouldDisplayWatermark()){let d=F.getWatermarkMessage();n(d);}},[]),jsxs("div",{style:{position:"relative"},children:[jsx(Q,{...t,workflowConfig:i,children:r}),o&&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):jsx(FormBody,{}):null}function je({className:r,...e}){let{context:t,workflowState:o,workflowConfig:n,currentStep:i}=I(),{submit:s,formState:d}=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:i,stepData:d.values||{},allData:t.allData,context:t};return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:n.renderConfig?.nextButtonRenderer,props:f,...e})}function rt({className:r,...e}){let{context:t,goPrevious:o,workflowState:n,workflowConfig:i,currentStep:s}=I(),{formState:d}=useFormContext(),S=t.currentStepIndex>0&&!n.isTransitioning&&!n.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 jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:i.renderConfig?.previousButtonRenderer,props:f,...e})}function st({className:r,...e}){let{currentStep:t,skipStep:o,workflowState:n,workflowConfig:i,context:s,conditionsHelpers:d}=I(),{formState:S}=useFormContext(),p=(!!t?.allowSkip||d.isStepSkippable(n.currentStepIndex))&&!n.isTransitioning&&!n.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 jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:i.renderConfig?.skipButtonRenderer,props:m,...e})}function ct({onStepClick:r,className:e,...t}){let{workflowConfig:o,workflowState:n,goToStep:i,conditionsHelpers:s}=I(),{visibleSteps:d,visibleToOriginalIndexMap:S,originalToVisibleIndexMap:p}=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):i(l));},m=p.get(n.currentStepIndex)??-1,y={steps:d,currentStepIndex:m,visitedSteps:n.visitedSteps,onStepClick:f,className:e};return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:o.renderConfig?.stepperRenderer,props:y,...t})}var j=class{constructor(e={}){this.version="1.0.0";if(this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,!this.isLocalStorageAvailable())throw new k("localStorage is not available in this environment","LOCALSTORAGE_UNAVAILABLE")}async save(e,t){try{let o=this.getStorageKey(e),n={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},i=JSON.stringify(n),s=this.compress?this.compressData(i):i;localStorage.setItem(o,s);}catch(o){if(o instanceof Error)if(o.name==="QuotaExceededError"||o.message.includes("quota")){await this.clearExpiredData();try{let n=this.getStorageKey(e),i={data:{...t,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){throw new k("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",n)}}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){try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return null;let n=this.compress?this.decompressData(o):o,i=JSON.parse(n);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),null):{...i.data,visitedSteps:Array.isArray(i.data.visitedSteps)?i.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){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){try{let t=this.getStorageKey(e),o=localStorage.getItem(t);if(!o)return !1;let n=this.compress?this.decompressData(o):o,i=JSON.parse(n);return i.expiresAt&&Date.now()>i.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){try{let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix)){let n=o.substring(this.keyPrefix.length);await this.exists(n)&&e.push(n);}}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(){let e=[];for(let t=0;t<localStorage.length;t++){let o=localStorage.key(t);if(o?.startsWith(this.keyPrefix))try{let n=localStorage.getItem(o);if(n){let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);s.expiresAt&&Date.now()>s.expiresAt&&e.push(o);}}catch{e.push(o);}}for(let t of e)localStorage.removeItem(t);}};
|
|
2
|
+
export{j as LocalStorageAdapter,F as RilayLicenseManager,$e as Workflow,Xe as WorkflowBody,je as WorkflowNextButton,k as WorkflowPersistenceError,rt as WorkflowPreviousButton,Q as WorkflowProvider,st as WorkflowSkipButton,ct as WorkflowStepper,Re as createFlow,X as debounce,N as flow,z as generateStorageKey,Le as mergePersistedState,fe as persistedToWorkflowState,ne as useConditionEvaluation,ie as useMultipleConditionEvaluation,se as useMultipleStepConditionEvaluation,H as usePersistence,pe as useWorkflowAnalytics,de as useWorkflowConditions,I as useWorkflowContext,ue as useWorkflowNavigation,ge as useWorkflowState,be as useWorkflowSubmission,Ne as validatePersistedData,J as workflowStateToPersisted};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rilaykit/workflow",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "6.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
|
"types": "dist/index.d.ts",
|
|
@@ -26,8 +26,8 @@
|
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@noble/ed25519": "^1.7.1",
|
|
29
|
-
"@rilaykit/core": "
|
|
30
|
-
"@rilaykit/forms": "
|
|
29
|
+
"@rilaykit/core": "6.0.0",
|
|
30
|
+
"@rilaykit/forms": "6.0.0"
|
|
31
31
|
},
|
|
32
32
|
"peerDependencies": {
|
|
33
33
|
"react": ">=18.0.0",
|