@rilaykit/workflow 9.0.1 → 10.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 CHANGED
@@ -14,6 +14,7 @@ interface WorkflowState {
14
14
  }
15
15
  interface UseWorkflowStateProps {
16
16
  defaultValues?: Record<string, any>;
17
+ defaultStepIndex?: number;
17
18
  persistence?: {
18
19
  workflowId: string;
19
20
  adapter?: WorkflowPersistenceAdapter;
@@ -22,7 +23,7 @@ interface UseWorkflowStateProps {
22
23
  autoLoad?: boolean;
23
24
  };
24
25
  }
25
- declare function useWorkflowState({ defaultValues, persistence }: UseWorkflowStateProps): {
26
+ declare function useWorkflowState({ defaultValues, defaultStepIndex, persistence, }: UseWorkflowStateProps): {
26
27
  workflowState: WorkflowState;
27
28
  setCurrentStep: (stepIndex: number) => void;
28
29
  setStepData: (data: Record<string, any>, stepId: string) => void;
@@ -965,11 +966,12 @@ interface WorkflowProviderProps {
965
966
  children: React$1.ReactNode;
966
967
  workflowConfig: WorkflowConfig;
967
968
  defaultValues?: Record<string, any>;
969
+ defaultStep?: string;
968
970
  onStepChange?: (fromStep: number, toStep: number, context: WorkflowContext) => void;
969
971
  onWorkflowComplete?: (data: Record<string, any>) => void | Promise<void>;
970
972
  className?: string;
971
973
  }
972
- declare function WorkflowProvider({ children, workflowConfig, defaultValues, onStepChange, onWorkflowComplete, className, }: WorkflowProviderProps): react_jsx_runtime.JSX.Element;
974
+ declare function WorkflowProvider({ children, workflowConfig, defaultValues, defaultStep, onStepChange, onWorkflowComplete, className, }: WorkflowProviderProps): react_jsx_runtime.JSX.Element;
973
975
  declare function useWorkflowContext(): WorkflowContextValue;
974
976
 
975
977
  type WorkflowProps = Omit<WorkflowProviderProps, 'children' | 'workflowConfig'> & {
@@ -1212,4 +1214,39 @@ declare class RilayLicenseManager {
1212
1214
  }>;
1213
1215
  }
1214
1216
 
1215
- export { type LicensePayload, type LicensePlan, type LicenseResult, LocalStorageAdapter, type LocalStorageAdapterConfig, type PersistedWorkflowData, type PersistenceOptions, RilayLicenseManager, type StepDefinition, type UsePersistenceProps, type UsePersistenceReturn, Workflow, WorkflowBody, type WorkflowContextValue, WorkflowNextButton, type WorkflowPersistenceAdapter, WorkflowPersistenceError, WorkflowPreviousButton, WorkflowProvider, WorkflowSkipButton, WorkflowStepper, debounce, flow, generateStorageKey, mergePersistedState, persistedToWorkflowState, useConditionEvaluation, usePersistence, useStepMetadata, useWorkflowAnalytics, useWorkflowConditions, useWorkflowContext, useWorkflowNavigation, useWorkflowState, useWorkflowSubmission, validatePersistedData, workflowStateToPersisted };
1217
+ /**
1218
+ * Utility functions for handling nested data structures in workflows
1219
+ * and making them compatible with condition evaluation
1220
+ */
1221
+ /**
1222
+ * Flattens a nested object into a flat object with dot-notation keys
1223
+ *
1224
+ * @param obj - The nested object to flatten
1225
+ * @param prefix - The prefix to use for keys (used internally for recursion)
1226
+ * @returns A flattened object with dot-notation keys
1227
+ *
1228
+ * @example
1229
+ * ```typescript
1230
+ * const nested = {
1231
+ * products: { requestedProducts: ['health'] },
1232
+ * user: { profile: { name: 'John' } }
1233
+ * };
1234
+ *
1235
+ * const flat = flattenObject(nested);
1236
+ * // Result: {
1237
+ * // 'products.requestedProducts': ['health'],
1238
+ * // 'user.profile.name': 'John'
1239
+ * // }
1240
+ * ```
1241
+ */
1242
+ declare function flattenObject(obj: Record<string, any>, prefix?: string): Record<string, any>;
1243
+ /**
1244
+ * Combines workflow data from different sources and flattens them for condition evaluation
1245
+ *
1246
+ * @param allData - Global workflow data (usually from defaultValues)
1247
+ * @param stepData - Step-specific data
1248
+ * @returns Combined and flattened data ready for condition evaluation
1249
+ */
1250
+ declare function combineWorkflowDataForConditions(allData: Record<string, any>, stepData: Record<string, any>): Record<string, any>;
1251
+
1252
+ export { type LicensePayload, type LicensePlan, type LicenseResult, LocalStorageAdapter, type LocalStorageAdapterConfig, type PersistedWorkflowData, type PersistenceOptions, RilayLicenseManager, type StepDefinition, type UsePersistenceProps, type UsePersistenceReturn, Workflow, WorkflowBody, type WorkflowContextValue, WorkflowNextButton, type WorkflowPersistenceAdapter, WorkflowPersistenceError, WorkflowPreviousButton, WorkflowProvider, WorkflowSkipButton, WorkflowStepper, combineWorkflowDataForConditions, debounce, flattenObject, flow, generateStorageKey, mergePersistedState, persistedToWorkflowState, useConditionEvaluation, usePersistence, useStepMetadata, useWorkflowAnalytics, useWorkflowConditions, useWorkflowContext, useWorkflowNavigation, useWorkflowState, useWorkflowSubmission, validatePersistedData, workflowStateToPersisted };
package/dist/index.d.ts CHANGED
@@ -14,6 +14,7 @@ interface WorkflowState {
14
14
  }
15
15
  interface UseWorkflowStateProps {
16
16
  defaultValues?: Record<string, any>;
17
+ defaultStepIndex?: number;
17
18
  persistence?: {
18
19
  workflowId: string;
19
20
  adapter?: WorkflowPersistenceAdapter;
@@ -22,7 +23,7 @@ interface UseWorkflowStateProps {
22
23
  autoLoad?: boolean;
23
24
  };
24
25
  }
25
- declare function useWorkflowState({ defaultValues, persistence }: UseWorkflowStateProps): {
26
+ declare function useWorkflowState({ defaultValues, defaultStepIndex, persistence, }: UseWorkflowStateProps): {
26
27
  workflowState: WorkflowState;
27
28
  setCurrentStep: (stepIndex: number) => void;
28
29
  setStepData: (data: Record<string, any>, stepId: string) => void;
@@ -965,11 +966,12 @@ interface WorkflowProviderProps {
965
966
  children: React$1.ReactNode;
966
967
  workflowConfig: WorkflowConfig;
967
968
  defaultValues?: Record<string, any>;
969
+ defaultStep?: string;
968
970
  onStepChange?: (fromStep: number, toStep: number, context: WorkflowContext) => void;
969
971
  onWorkflowComplete?: (data: Record<string, any>) => void | Promise<void>;
970
972
  className?: string;
971
973
  }
972
- declare function WorkflowProvider({ children, workflowConfig, defaultValues, onStepChange, onWorkflowComplete, className, }: WorkflowProviderProps): react_jsx_runtime.JSX.Element;
974
+ declare function WorkflowProvider({ children, workflowConfig, defaultValues, defaultStep, onStepChange, onWorkflowComplete, className, }: WorkflowProviderProps): react_jsx_runtime.JSX.Element;
973
975
  declare function useWorkflowContext(): WorkflowContextValue;
974
976
 
975
977
  type WorkflowProps = Omit<WorkflowProviderProps, 'children' | 'workflowConfig'> & {
@@ -1212,4 +1214,39 @@ declare class RilayLicenseManager {
1212
1214
  }>;
1213
1215
  }
1214
1216
 
1215
- export { type LicensePayload, type LicensePlan, type LicenseResult, LocalStorageAdapter, type LocalStorageAdapterConfig, type PersistedWorkflowData, type PersistenceOptions, RilayLicenseManager, type StepDefinition, type UsePersistenceProps, type UsePersistenceReturn, Workflow, WorkflowBody, type WorkflowContextValue, WorkflowNextButton, type WorkflowPersistenceAdapter, WorkflowPersistenceError, WorkflowPreviousButton, WorkflowProvider, WorkflowSkipButton, WorkflowStepper, debounce, flow, generateStorageKey, mergePersistedState, persistedToWorkflowState, useConditionEvaluation, usePersistence, useStepMetadata, useWorkflowAnalytics, useWorkflowConditions, useWorkflowContext, useWorkflowNavigation, useWorkflowState, useWorkflowSubmission, validatePersistedData, workflowStateToPersisted };
1217
+ /**
1218
+ * Utility functions for handling nested data structures in workflows
1219
+ * and making them compatible with condition evaluation
1220
+ */
1221
+ /**
1222
+ * Flattens a nested object into a flat object with dot-notation keys
1223
+ *
1224
+ * @param obj - The nested object to flatten
1225
+ * @param prefix - The prefix to use for keys (used internally for recursion)
1226
+ * @returns A flattened object with dot-notation keys
1227
+ *
1228
+ * @example
1229
+ * ```typescript
1230
+ * const nested = {
1231
+ * products: { requestedProducts: ['health'] },
1232
+ * user: { profile: { name: 'John' } }
1233
+ * };
1234
+ *
1235
+ * const flat = flattenObject(nested);
1236
+ * // Result: {
1237
+ * // 'products.requestedProducts': ['health'],
1238
+ * // 'user.profile.name': 'John'
1239
+ * // }
1240
+ * ```
1241
+ */
1242
+ declare function flattenObject(obj: Record<string, any>, prefix?: string): Record<string, any>;
1243
+ /**
1244
+ * Combines workflow data from different sources and flattens them for condition evaluation
1245
+ *
1246
+ * @param allData - Global workflow data (usually from defaultValues)
1247
+ * @param stepData - Step-specific data
1248
+ * @returns Combined and flattened data ready for condition evaluation
1249
+ */
1250
+ declare function combineWorkflowDataForConditions(allData: Record<string, any>, stepData: Record<string, any>): Record<string, any>;
1251
+
1252
+ export { type LicensePayload, type LicensePlan, type LicenseResult, LocalStorageAdapter, type LocalStorageAdapterConfig, type PersistedWorkflowData, type PersistenceOptions, RilayLicenseManager, type StepDefinition, type UsePersistenceProps, type UsePersistenceReturn, Workflow, WorkflowBody, type WorkflowContextValue, WorkflowNextButton, type WorkflowPersistenceAdapter, WorkflowPersistenceError, WorkflowPreviousButton, WorkflowProvider, WorkflowSkipButton, WorkflowStepper, combineWorkflowDataForConditions, debounce, flattenObject, flow, generateStorageKey, mergePersistedState, persistedToWorkflowState, useConditionEvaluation, usePersistence, useStepMetadata, useWorkflowAnalytics, useWorkflowConditions, useWorkflowContext, useWorkflowNavigation, useWorkflowState, useWorkflowSubmission, validatePersistedData, workflowStateToPersisted };
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),mt=require('react'),Pe=require('@noble/ed25519'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var mt__default=/*#__PURE__*/_interopDefault(mt);var Pe__namespace=/*#__PURE__*/_interopNamespace(Pe);var U=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(o=>o.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var He=1751361139160,Ze="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,s,o]=n,a=`${i}.${s}`,c=new TextEncoder().encode(a),l=o.match(/.{2}/g);if(!l)return {valid:!1,error:"INVALID"};let p=new Uint8Array(l.map(W=>Number.parseInt(W,16))),m=k.hexToBytes(Ze);if(!await Pe__namespace.verify(p,c,m))return {valid:!1,error:"SIGNATURE_INVALID"};let S=k.base64ToString(s.replace(/-/g,"+").replace(/_/g,"/")),d=JSON.parse(S),u=Math.floor(Date.now()/1e3);return d.e<u?{valid:!1,error:"EXPIRED",data:k.decompressPayload(d)}:He>d.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(d)}:d.p===void 0||!d.c||!d.i||!d.e||!d.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(d)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,s=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<s.length;){let o=r.indexOf(s.charAt(i++)),a=r.indexOf(s.charAt(i++)),c=r.indexOf(s.charAt(i++)),l=r.indexOf(s.charAt(i++)),p=o<<18|a<<12|c<<6|l;n+=String.fromCharCode(p>>16&255),c!==64&&(n+=String.fromCharCode(p>>8&255)),l!==64&&(n+=String.fromCharCode(p&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var _=k;function j(t,e={},r={}){return mt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function We(t,e={}){return mt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(a){return console.warn(`Error evaluating condition for field ${n}:`,a),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function De(t,e={}){return mt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let o=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(c){return console.warn(`Error evaluating condition for step ${s}:`,c),false}};r[s]={visible:i.visible?o(i.visible):true,disabled:i.disabled?o(i.disabled):false,required:i.required?o(i.required):false,readonly:i.readonly?o(i.readonly):false};}}return r},[t,e])}var D=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ee(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Ee(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function Ye(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function te(t,e){return e?`${e}:${t}`:t}function re(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function Qe(t,e,r="persist"){let n=Ee(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function J({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,o]=mt.useState(false),[a,c]=mt.useState(null),[l,p]=mt.useState(false),m=mt.useRef(r),g=mt.useRef(n),S=mt.useRef({hasPendingChanges:false});mt.useEffect(()=>{m.current=r,g.current=n;},[r,n]);let d=te(g.current.storageKey||t,i),u=mt.useCallback(()=>{c(null);},[]),h=mt.useCallback((b,P)=>{let C=b instanceof D?b:new D(`${P} failed: ${b.message}`,"OPERATION_FAILED",b);c(C),console.error("[WorkflowPersistence]",C);},[]),W=mt.useCallback(async b=>{u(),o(true);try{let P=ee(t,b,g.current.metadata);await m.current.save(d,P),S.current.lastSavedState={...b},S.current.hasPendingChanges=!1;}catch(P){throw h(P,"Save"),P}finally{o(false);}},[t,d,u,h]),y=mt.useRef(re(async b=>{try{await W(b);}catch(P){console.debug("[WorkflowPersistence] Auto-save failed:",P);}},n.debounceMs||500)),x=mt.useCallback((b,P)=>P?b.currentStepIndex!==P.currentStepIndex||JSON.stringify(b.allData)!==JSON.stringify(P.allData)||JSON.stringify(b.stepData)!==JSON.stringify(P.stepData)||b.visitedSteps.size!==P.visitedSteps.size||!Array.from(b.visitedSteps).every(C=>P.visitedSteps.has(C)):true,[]),I=mt.useCallback(async()=>{u(),p(true);try{let b=await m.current.load(d);return b&&(S.current.lastSavedState={currentStepIndex:b.currentStepIndex,allData:b.allData,stepData:b.stepData,visitedSteps:new Set(b.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},S.current.hasPendingChanges=!1),b}catch(b){return h(b,"Load"),null}finally{setTimeout(()=>p(false),100);}},[d,u,h]),E=mt.useCallback(async()=>{u();try{await m.current.remove(d),S.current.lastSavedState=void 0,S.current.hasPendingChanges=!1;}catch(b){throw h(b,"Clear"),b}},[d,u,h]),f=mt.useCallback(async()=>{try{return await m.current.exists(d)}catch(b){return h(b,"Exists check"),false}},[d,h]);mt.useEffect(()=>{g.current.autoPersist&&(s||l||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,S.current.lastSavedState)&&(S.current.hasPendingChanges=true,y.current(e)));},[e,s,l,x]);let v=mt.useCallback(async()=>{await W(e);},[W,e]);return {isPersisting:s,persistenceError:a,persistNow:v,loadPersistedData:I,clearPersistedData:E,hasPersistedData:f}}function je(){let{workflowConfig:t,currentStep:e}=T(),r=mt.useMemo(()=>e?.metadata,[e?.metadata]),n=mt.useMemo(()=>l=>t.steps.find(m=>m.id===l)?.metadata,[t.steps]),i=mt.useMemo(()=>l=>t.steps[l]?.metadata,[t.steps]),s=mt.useMemo(()=>l=>r?l in r:false,[r]),o=mt.useMemo(()=>(l,p)=>r&&l in r?r[l]:p,[r]),a=mt.useMemo(()=>()=>t.steps.map((l,p)=>({id:l.id,title:l.title,index:p,metadata:l.metadata})),[t.steps]),c=mt.useMemo(()=>l=>t.steps.map((p,m)=>({step:p,index:m})).filter(({step:p,index:m})=>l(p.metadata,p.id,m)).map(({step:p})=>p.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:o,getAllStepsMetadata:a,findStepsByMetadata:c}}function ie({workflowConfig:t,workflowState:e,workflowContext:r}){let n=mt.useRef(Date.now()),i=mt.useRef(new Map),s=mt.useRef(false),o=mt.useRef(null),a=core.getGlobalMonitor();mt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,a,t.steps.length]),mt.useEffect(()=>{let g=t.steps[e.currentStepIndex];if(g&&o.current!==g.id){if(o.current&&t.analytics?.onStepComplete){let S=i.current.get(o.current);if(S){let d=Date.now()-S;t.analytics.onStepComplete(o.current,d,e.stepData,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:o.current,duration:d},{timestamp:Date.now(),duration:d,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:d,conditionEvaluationDuration:0},"low");}}o.current=g.id,i.current.set(g.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(g.id,Date.now(),r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:g.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,a,t.id]);let c=mt.useCallback((g,S)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(g,S,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:g,reason:S},void 0,"medium");},[t.analytics,r,a,t.id]),l=mt.useCallback(g=>{t.analytics?.onError&&t.analytics.onError(g,r),a&&a.trackError(g,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,a,t.id,e.currentStepIndex,t.steps]),p=mt.useCallback((g,S,d)=>{if(!a)return;let u={timestamp:Date.now(),duration:d,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:S,navigationDuration:d,conditionEvaluationDuration:0};a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:g,toStep:S,direction:S>g?"forward":"backward"},u,d>1e3?"medium":"low");},[a,t.id,t.steps.length]),m=mt.useCallback((g,S)=>{if(!a)return;let d={timestamp:Date.now(),duration:g,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:g};a.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:S,currentStepIndex:e.currentStepIndex},d,g>100?"medium":"low");},[a,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:c,trackError:l,trackNavigation:p,trackConditionEvaluation:m}}function Te(t,e){return {visible:t.visible,skippable:e===true||t.required}}function se({workflowConfig:t,workflowState:e,currentStep:r}){let n=mt.useMemo(()=>({...e.allData,...e.stepData}),[e.allData,e.stepData]),i=mt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=j(i,n,{visible:true,disabled:false,required:false,readonly:false}),o=mt.useMemo(()=>Te(s,r?.allowSkip),[s,r?.allowSkip]),a=mt.useMemo(()=>{let y={};return t.steps.forEach((x,I)=>{x.conditions&&(y[I]={visible:x.conditions.visible,required:x.conditions.skippable});}),y},[t.steps]),c=De(a,n),l=mt.useMemo(()=>{let y={};return t.steps.forEach((x,I)=>{let E=c[I];E?y[I]=Te(E,x.allowSkip):y[I]={visible:true,skippable:x.allowSkip===true};}),y},[t.steps,c]),p=mt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let y={};for(let x of r.formConfig.allFields)x.conditions&&(y[x.id]=x.conditions);return y},[r?.formConfig?.allFields]),m=We(p,n),g=mt.useCallback(y=>y<0||y>=t.steps.length?false:l[y]?.visible??true,[l,t.steps.length]),S=mt.useCallback(y=>y<0||y>=t.steps.length?false:l[y]?.skippable??false,[l,t.steps.length]),d=mt.useCallback(y=>m[y]?.visible??true,[m]),u=mt.useCallback(y=>m[y]?.disabled??false,[m]),h=mt.useCallback(y=>m[y]?.required??false,[m]),W=mt.useCallback(y=>m[y]?.readonly??false,[m]);return {stepConditions:o,fieldConditions:m,allStepConditions:l,isStepVisible:g,isStepSkippable:S,isFieldVisible:d,isFieldDisabled:u,isFieldRequired:h,isFieldReadonly:W}}function oe({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:o,setStepData:a,onStepChange:c}){let l=mt.useRef(c);l.current=c;let p=t.steps[e.currentStepIndex],m=mt.useCallback(()=>({setStepData:(f,v)=>{a(v,f);},setStepFields:(f,v)=>{let P={...e.allData[f]||{},...v};a(P,f);},getStepData:f=>e.allData[f]||{},setNextStepField:(f,v)=>{let b=e.currentStepIndex+1;if(b<t.steps.length){let P=t.steps[b].id,K={...e.allData[P]||{},[f]:v};a(K,P);}},setNextStepFields:f=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let b=t.steps[v].id,C={...e.allData[b]||{},...f};a(C,b);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,a]),g=mt.useCallback(async f=>{if(f<0||f>=t.steps.length||!n.isStepVisible(f))return false;s(true);try{return l.current&&l.current(e.currentStepIndex,f,r),i(f),o(f,t.steps[f].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,o]),S=mt.useCallback(f=>{for(let v=f+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),d=mt.useCallback(f=>{for(let v=f-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),u=mt.useCallback(async()=>{if(p?.onAfterValidation)try{let v=m();await p.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let f=S(e.currentStepIndex);return f===null?false:g(f)},[p,m,e.stepData,r,t.analytics,e.currentStepIndex,S,g]),h=mt.useCallback(async()=>{let f=d(e.currentStepIndex);return f===null?false:g(f)},[e.currentStepIndex,d,g]),W=mt.useCallback(async()=>!p?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(p.id,"user_skip",r),u()),[p,n,e.currentStepIndex,t.analytics,r,u]),y=mt.useCallback(f=>f<0||f>=t.steps.length?false:n.isStepVisible(f),[t.steps.length,n]),x=mt.useCallback(()=>{let f=S(e.currentStepIndex);return f!==null&&y(f)},[e.currentStepIndex,S,y]),I=mt.useCallback(()=>{let f=d(e.currentStepIndex);return f!==null&&y(f)},[e.currentStepIndex,d,y]),E=mt.useCallback(()=>p?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[p?.allowSkip,n,e.currentStepIndex]);return {goToStep:g,goNext:u,goPrevious:h,skipStep:W,canGoToStep:y,canGoNext:x,canGoPrevious:I,canSkipCurrentStep:E}}function nt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ae({defaultValues:t={},persistence:e}){let r={currentStepIndex:0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:true},[n,i]=mt.useReducer(nt,r),s=e?.adapter?J({workflowId:e.workflowId,workflowState:n,adapter:e.adapter,options:e.options,userId:e.userId}):null,o=mt.useCallback(u=>{i({type:"SET_CURRENT_STEP",stepIndex:u});},[]),a=mt.useCallback((u,h)=>{i({type:"SET_STEP_DATA",data:u,stepId:h});},[]),c=mt.useCallback((u,h,W)=>{i({type:"SET_FIELD_VALUE",fieldId:u,value:h,stepId:W});},[]),l=mt.useCallback(u=>{i({type:"SET_SUBMITTING",isSubmitting:u});},[]),p=mt.useCallback(u=>{i({type:"SET_TRANSITIONING",isTransitioning:u});},[]),m=mt.useCallback((u,h)=>{i({type:"MARK_STEP_VISITED",stepIndex:u,stepId:h});},[]),g=mt.useCallback(()=>{i({type:"RESET_WORKFLOW"});},[]),S=mt.useCallback(()=>{i({type:"SET_INITIALIZATION_COMPLETE"});},[]),d=mt.useCallback(async()=>{if(!s)return S(),false;try{let u=await s.loadPersistedData();if(u){let h={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps)};return i({type:"LOAD_PERSISTED_STATE",state:h}),S(),!0}}catch(u){console.error("Failed to load persisted state:",u);}return S(),false},[s,S]);return {workflowState:n,setCurrentStep:o,setStepData:a,setFieldValue:c,setSubmitting:l,setTransitioning:p,markStepVisited:m,resetWorkflow:g,loadPersistedState:d,persistence:s?{isPersisting:s.isPersisting,persistenceError:s.persistenceError,persistNow:s.persistNow,clearPersistedData:s.clearPersistedData,hasPersistedData:s.hasPersistedData}:null}}function le({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let o=mt.useRef(i);o.current=i;let a=mt.useCallback(async()=>{n(true);try{if(o.current&&await o.current(e.allData),t.analytics?.onWorkflowComplete){let l=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,l,e.allData);}}catch(l){throw console.error("Workflow submission failed:",l),t.analytics?.onError&&t.analytics.onError(l,r),l}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),c=mt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:a,isSubmitting:e.isSubmitting,canSubmit:c()}}var Me=mt.createContext(null);function ce({children:t,workflowConfig:e,defaultValues:r={},onStepChange:n,onWorkflowComplete:i,className:s}){let o=mt.useRef(n),a=mt.useRef(i);o.current=n,a.current=i;let{workflowState:c,setCurrentStep:l,setStepData:p,setFieldValue:m,setSubmitting:g,setTransitioning:S,markStepVisited:d,resetWorkflow:u,loadPersistedState:h,persistence:W}=ae({defaultValues:r,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});mt.useEffect(()=>{e.persistence&&h&&h();},[]);let y=mt.useMemo(()=>({isPersisting:W?.isPersisting??false,persistenceError:W?.persistenceError??null,persistNow:W?.persistNow}),[W?.isPersisting,W?.persistenceError,W?.persistNow]),x=mt.useMemo(()=>({workflowId:e.id,currentStepIndex:c.currentStepIndex,totalSteps:e.steps.length,allData:c.allData,stepData:c.stepData,visitedSteps:c.visitedSteps}),[e.id,e.steps.length,c.currentStepIndex,c.allData,c.stepData,c.visitedSteps]),I=mt.useMemo(()=>e.steps[c.currentStepIndex],[e.steps,c.currentStepIndex]),E=mt.useMemo(()=>I?.formConfig,[I?.formConfig]),f=se({workflowConfig:e,workflowState:c,currentStep:I}),v=mt.useMemo(()=>{let w=-1;for(let A=0;A<e.steps.length;A++)if(f.isStepVisible(A)){w=A;break}let R=-1;for(let A=e.steps.length-1;A>=0;A--)if(f.isStepVisible(A)){R=A;break}return {...x,isFirstStep:c.currentStepIndex===w,isLastStep:c.currentStepIndex===R}},[x,c.currentStepIndex,f,e.steps.length]),{analyticsStartTime:b}=ie({workflowConfig:e,workflowState:c,workflowContext:v}),{goToStep:P,goNext:C,goPrevious:K,skipStep:fe,canGoToStep:me,canGoNext:Se,canGoPrevious:ge,canSkipCurrentStep:ye}=oe({workflowConfig:e,workflowState:c,workflowContext:v,conditionsHelpers:f,setCurrentStep:l,setTransitioning:S,markStepVisited:d,setStepData:p,onStepChange:o.current});mt.useEffect(()=>{if(!f.isStepVisible(c.currentStepIndex)){for(let R=0;R<e.steps.length;R++)if(f.isStepVisible(R)){l(R),d(R,e.steps[R].id);break}}},[f,c.currentStepIndex,e.steps,l,d]);let{submitWorkflow:$,isSubmitting:be,canSubmit:ve}=le({workflowConfig:e,workflowState:c,workflowContext:v,setSubmitting:g,onWorkflowComplete:a.current,analyticsStartTime:b}),Z=mt.useCallback((w,R)=>{m(w,R,I?.id||"");},[m,I?.id]),he=mt.useCallback(w=>{p(w,I?.id||"");},[p,I?.id]),Oe=mt.useCallback(async w=>{I?.id&&w&&p(w,I.id),v.isLastStep?await $():await C();},[v.isLastStep,$,C,I?.id,p]),xe=mt.useMemo(()=>({goToStep:P,goNext:C,goPrevious:K,skipStep:fe,canGoToStep:me,canGoNext:Se,canGoPrevious:ge,canSkipCurrentStep:ye}),[P,C,K,fe,me,Se,ge,ye]),ke=mt.useMemo(()=>({setValue:Z,setStepData:he,resetWorkflow:u}),[Z,he,u]),Ie=mt.useMemo(()=>({submitWorkflow:$,isSubmitting:be,canSubmit:ve}),[$,be,ve]),Ue=mt.useMemo(()=>({workflowState:c,workflowConfig:e,currentStep:I,context:v,formConfig:E,conditionsHelpers:f,currentStepMetadata:I?.metadata,...xe,...ke,...Ie,persistNow:y.persistNow,isPersisting:y.isPersisting,persistenceError:y.persistenceError}),[c,e,I,v,E,f,xe,ke,Ie,y]),Ge=mt.useMemo(()=>{if(!I?.id)return {};let w=c?.allData[I.id]||{};if(!E?.allFields)return w;let R=new Set(E.allFields.map(q=>q.id)),A={};for(let[q,$e]of Object.entries(w))R.has(q)&&(A[q]=$e);return A},[c?.allData,I?.id,E?.allFields]),Ke=mt.useMemo(()=>c.isInitializing.toString(),[c.isInitializing]);return jsxRuntime.jsx(Me.Provider,{value:Ue,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:E,defaultValues:Ge,onFieldChange:Z,"data-workflow-id":e.id,className:s,onSubmit:Oe,children:t},Ke)})}function T(){let t=mt.useContext(Me);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function dt({children:t,workflowConfig:e,...r}){let[n,i]=mt.useState(),s=mt.useMemo(()=>e instanceof U?e.build():e,[e]);return mt.useEffect(()=>{if(typeof window<"u"&&_.shouldDisplayWatermark()){let a=_.getWatermarkMessage();i(a);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(ce,{...r,workflowConfig:s,children:t}),n&&jsxRuntime.jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var St=mt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=T();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var xt=mt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:o,currentStep:a}=T(),{submit:c,formState:l}=forms.useFormContext(),p=mt.useMemo(()=>{let S=l.isSubmitting||s.isSubmitting,d=r??S,u=!s.isTransitioning&&!d;return {finalIsSubmitting:d,canGoNext:u}},[l.isSubmitting,s.isSubmitting,s.isTransitioning,r]),m=mt.useCallback(async S=>{S?.preventDefault(),p.canGoNext&&await c(S);},[p.canGoNext,c]),g=mt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:p.canGoNext,isSubmitting:p.finalIsSubmitting,onSubmit:m,className:e,currentStep:a,stepData:l.values||{},allData:i.allData,context:i}),[i.isLastStep,p.canGoNext,p.finalIsSubmitting,m,e,a,l.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:o.renderConfig?.nextButtonRenderer,props:g,...n})});var Et=mt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:o,workflowConfig:a,currentStep:c}=T(),{formState:l}=forms.useFormContext(),p=mt.useMemo(()=>{let S=l.isSubmitting||o.isSubmitting,d=r??S,u=i.currentStepIndex>0&&!o.isTransitioning&&!d;return {finalIsSubmitting:d,canGoPrevious:u}},[l.isSubmitting,o.isSubmitting,o.isTransitioning,i.currentStepIndex,r]),m=mt.useCallback(async S=>{S?.preventDefault(),p.canGoPrevious&&await s();},[p.canGoPrevious,s]),g=mt.useMemo(()=>({canGoPrevious:p.canGoPrevious,isSubmitting:p.finalIsSubmitting,onPrevious:m,className:e,currentStep:c,stepData:l.values||{},allData:i.allData,context:i}),[p.canGoPrevious,p.finalIsSubmitting,m,e,c,l.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:a.renderConfig?.previousButtonRenderer,props:g,...n})});var Nt=mt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:o,workflowConfig:a,context:c,conditionsHelpers:l}=T(),{formState:p}=forms.useFormContext(),m=mt.useMemo(()=>{let d=p.isSubmitting||o.isSubmitting,u=r??d,h=(!!i?.allowSkip||l.isStepSkippable(o.currentStepIndex))&&!o.isTransitioning&&!u;return {finalIsSubmitting:u,canSkip:h}},[p.isSubmitting,o.isSubmitting,o.isTransitioning,o.currentStepIndex,i?.allowSkip,l.isStepSkippable,r]),g=mt.useCallback(async d=>{d?.preventDefault(),m.canSkip&&await s();},[m.canSkip,s]),S=mt.useMemo(()=>({canSkip:m.canSkip,isSubmitting:m.finalIsSubmitting,onSkip:g,className:e,currentStep:i,stepData:p.values||{},allData:c.allData,context:c}),[m.canSkip,m.finalIsSubmitting,g,e,i,p.values,c.allData,c]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:a.renderConfig?.skipButtonRenderer,props:S,...n})});var _t=mt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,goToStep:o,conditionsHelpers:a}=T(),{visibleSteps:c,visibleToOriginalIndexMap:l,originalToVisibleIndexMap:p}=mt.useMemo(()=>{let d=[],u=new Map,h=new Map;return i.steps.forEach((W,y)=>{if(a.isStepVisible(y)){let x=d.length;d.push(W),u.set(x,y),h.set(y,x);}}),{visibleSteps:d,visibleToOriginalIndexMap:u,originalToVisibleIndexMap:h}},[i.steps,a]),m=mt.useCallback(d=>{let u=l.get(d);u!==void 0&&(e?e(u):o(u));},[l,e,o]),g=mt.useMemo(()=>p.get(s.currentStepIndex)??-1,[p,s.currentStepIndex]),S=mt.useMemo(()=>({steps:c,currentStepIndex:g,visitedSteps:s.visitedSteps,onStepClick:m,className:r}),[c,g,s.visitedSteps,m,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:S,...n})});var ue=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),o=this.compress?this.compressData(s):s;localStorage.setItem(n,o);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},o=JSON.stringify(s),a=this.compress?this.compressData(o):o;localStorage.setItem(i,a);}catch(i){throw new D("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new D(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new D("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new D(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new D("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new D(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new D("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new D(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new D("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new D(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new D("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,o=JSON.parse(s);o.expiresAt&&Date.now()>o.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
- exports.LocalStorageAdapter=ue;exports.RilayLicenseManager=_;exports.Workflow=dt;exports.WorkflowBody=St;exports.WorkflowNextButton=xt;exports.WorkflowPersistenceError=D;exports.WorkflowPreviousButton=Et;exports.WorkflowProvider=ce;exports.WorkflowSkipButton=Nt;exports.WorkflowStepper=_t;exports.debounce=re;exports.flow=U;exports.generateStorageKey=te;exports.mergePersistedState=Qe;exports.persistedToWorkflowState=Ee;exports.useConditionEvaluation=j;exports.usePersistence=J;exports.useStepMetadata=je;exports.useWorkflowAnalytics=ie;exports.useWorkflowConditions=se;exports.useWorkflowContext=T;exports.useWorkflowNavigation=oe;exports.useWorkflowState=ae;exports.useWorkflowSubmission=le;exports.validatePersistedData=Ye;exports.workflowStateToPersisted=ee;
1
+ 'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),bt=require('react'),Ee=require('@noble/ed25519'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}function _interopNamespace(e){if(e&&e.__esModule)return e;var n=Object.create(null);if(e){Object.keys(e).forEach(function(k){if(k!=='default'){var d=Object.getOwnPropertyDescriptor(e,k);Object.defineProperty(n,k,d.get?d:{enumerable:true,get:function(){return e[k]}});}})}n.default=e;return Object.freeze(n)}var bt__default=/*#__PURE__*/_interopDefault(bt);var Ee__namespace=/*#__PURE__*/_interopNamespace(Ee);var U=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(a=>a.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var Qe=1751361139160,et="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",I=class I{static async setLicenseKey(e){I.licenseKey=e||"",I.licenseKey?I.licenseResult=await I.validateLicense():I.licenseResult={valid:false,error:"MISSING"},I.isInitialized=true;}static async validateLicense(){if(!I.licenseKey)return {valid:false,error:"MISSING"};try{if(!I.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=I.licenseKey.slice(4),n=I.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,s,a]=n,l=`${i}.${s}`,b=new TextEncoder().encode(l),p=a.match(/.{2}/g);if(!p)return {valid:!1,error:"INVALID"};let o=new Uint8Array(p.map(P=>Number.parseInt(P,16))),f=I.hexToBytes(et);if(!await Ee__namespace.verify(o,b,f))return {valid:!1,error:"SIGNATURE_INVALID"};let m=I.base64ToString(s.replace(/-/g,"+").replace(/_/g,"/")),c=JSON.parse(m),h=Math.floor(Date.now()/1e3);return c.e<h?{valid:!1,error:"EXPIRED",data:I.decompressPayload(c)}:Qe>c.e*1e3?{valid:!1,error:"EXPIRED",data:I.decompressPayload(c)}:c.p===void 0||!c.c||!c.i||!c.e||!c.t?{valid:!1,error:"INVALID"}:{valid:!0,data:I.decompressPayload(c)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,s=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<s.length;){let a=r.indexOf(s.charAt(i++)),l=r.indexOf(s.charAt(i++)),b=r.indexOf(s.charAt(i++)),p=r.indexOf(s.charAt(i++)),o=a<<18|l<<12|b<<6|p;n+=String.fromCharCode(o>>16&255),b!==64&&(n+=String.fromCharCode(o>>8&255)),p!==64&&(n+=String.fromCharCode(o&255));}return n}static getLicenseResult(){return I.isInitialized?I.licenseResult?I.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!I.getLicenseResult().valid}static getWatermarkMessage(){let e=I.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=I.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=I.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};I.licenseKey="",I.licenseResult=null,I.isInitialized=false;var _=I;function ee(t,e={},r={}){return bt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function we(t,e={}){return bt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?core.evaluateCondition(a.build(),e):core.evaluateCondition(a,e)}catch(l){return console.warn(`Error evaluating condition for field ${n}:`,l),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Te(t,e={}){return bt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let a=l=>{try{return l&&typeof l=="object"&&"build"in l?core.evaluateCondition(l.build(),e):core.evaluateCondition(l,e)}catch(b){return console.warn(`Error evaluating condition for step ${s}:`,b),false}};r[s]={visible:i.visible?a(i.visible):true,disabled:i.disabled?a(i.disabled):false,required:i.required?a(i.required):false,readonly:i.readonly?a(i.readonly):false};}}return r},[t,e])}var W=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function te(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Ce(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function tt(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function re(t,e){return e?`${e}:${t}`:t}function ne(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function rt(t,e,r="persist"){let n=Ce(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function X({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,a]=bt.useState(false),[l,b]=bt.useState(null),[p,o]=bt.useState(false),f=bt.useRef(r),u=bt.useRef(n),m=bt.useRef({hasPendingChanges:false});bt.useEffect(()=>{f.current=r,u.current=n;},[r,n]);let c=re(u.current.storageKey||t,i),h=bt.useCallback(()=>{b(null);},[]),g=bt.useCallback((S,k)=>{let L=S instanceof W?S:new W(`${k} failed: ${S.message}`,"OPERATION_FAILED",S);b(L),console.error("[WorkflowPersistence]",L);},[]),P=bt.useCallback(async S=>{h(),a(true);try{let k=te(t,S,u.current.metadata);await f.current.save(c,k),m.current.lastSavedState={...S},m.current.hasPendingChanges=!1;}catch(k){throw g(k,"Save"),k}finally{a(false);}},[t,c,h,g]),y=bt.useRef(ne(async S=>{try{await P(S);}catch(k){console.debug("[WorkflowPersistence] Auto-save failed:",k);}},n.debounceMs||500)),x=bt.useCallback((S,k)=>k?S.currentStepIndex!==k.currentStepIndex||JSON.stringify(S.allData)!==JSON.stringify(k.allData)||JSON.stringify(S.stepData)!==JSON.stringify(k.stepData)||S.visitedSteps.size!==k.visitedSteps.size||!Array.from(S.visitedSteps).every(L=>k.visitedSteps.has(L)):true,[]),E=bt.useCallback(async()=>{h(),o(true);try{let S=await f.current.load(c);return S&&(m.current.lastSavedState={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},m.current.hasPendingChanges=!1),S}catch(S){return g(S,"Load"),null}finally{setTimeout(()=>o(false),100);}},[c,h,g]),N=bt.useCallback(async()=>{h();try{await f.current.remove(c),m.current.lastSavedState=void 0,m.current.hasPendingChanges=!1;}catch(S){throw g(S,"Clear"),S}},[c,h,g]),d=bt.useCallback(async()=>{try{return await f.current.exists(c)}catch(S){return g(S,"Exists check"),false}},[c,g]);bt.useEffect(()=>{u.current.autoPersist&&(s||p||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,m.current.lastSavedState)&&(m.current.hasPendingChanges=true,y.current(e)));},[e,s,p,x]);let v=bt.useCallback(async()=>{await P(e);},[P,e]);return {isPersisting:s,persistenceError:l,persistNow:v,loadPersistedData:E,clearPersistedData:N,hasPersistedData:d}}function nt(){let{workflowConfig:t,currentStep:e}=w(),r=bt.useMemo(()=>e?.metadata,[e?.metadata]),n=bt.useMemo(()=>p=>t.steps.find(f=>f.id===p)?.metadata,[t.steps]),i=bt.useMemo(()=>p=>t.steps[p]?.metadata,[t.steps]),s=bt.useMemo(()=>p=>r?p in r:false,[r]),a=bt.useMemo(()=>(p,o)=>r&&p in r?r[p]:o,[r]),l=bt.useMemo(()=>()=>t.steps.map((p,o)=>({id:p.id,title:p.title,index:o,metadata:p.metadata})),[t.steps]),b=bt.useMemo(()=>p=>t.steps.map((o,f)=>({step:o,index:f})).filter(({step:o,index:f})=>p(o.metadata,o.id,f)).map(({step:o})=>o.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:a,getAllStepsMetadata:l,findStepsByMetadata:b}}function se({workflowConfig:t,workflowState:e,workflowContext:r}){let n=bt.useRef(Date.now()),i=bt.useRef(new Map),s=bt.useRef(false),a=bt.useRef(null),l=core.getGlobalMonitor();bt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,l,t.steps.length]),bt.useEffect(()=>{let u=t.steps[e.currentStepIndex];if(u&&a.current!==u.id){if(a.current&&t.analytics?.onStepComplete){let m=i.current.get(a.current);if(m){let c=Date.now()-m;t.analytics.onStepComplete(a.current,c,e.stepData,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:a.current,duration:c},{timestamp:Date.now(),duration:c,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:c,conditionEvaluationDuration:0},"low");}}a.current=u.id,i.current.set(u.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(u.id,Date.now(),r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:u.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,l,t.id]);let b=bt.useCallback((u,m)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(u,m,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:u,reason:m},void 0,"medium");},[t.analytics,r,l,t.id]),p=bt.useCallback(u=>{t.analytics?.onError&&t.analytics.onError(u,r),l&&l.trackError(u,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,l,t.id,e.currentStepIndex,t.steps]),o=bt.useCallback((u,m,c)=>{if(!l)return;let h={timestamp:Date.now(),duration:c,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:m,navigationDuration:c,conditionEvaluationDuration:0};l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:u,toStep:m,direction:m>u?"forward":"backward"},h,c>1e3?"medium":"low");},[l,t.id,t.steps.length]),f=bt.useCallback((u,m)=>{if(!l)return;let c={timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:u};l.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:m,currentStepIndex:e.currentStepIndex},c,u>100?"medium":"low");},[l,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:b,trackError:p,trackNavigation:o,trackConditionEvaluation:f}}function oe(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,oe(i,s)):r[s]=i;}return r}function ae(t,e){let r={...t,...e},n=oe(r);return {...r,...n}}function Le(t,e){return {visible:t.visible,skippable:e===true||t.required}}function le({workflowConfig:t,workflowState:e,currentStep:r}){let n=bt.useMemo(()=>ae(e.allData,e.stepData),[e.allData,e.stepData]),i=bt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ee(i,n,{visible:true,disabled:false,required:false,readonly:false}),a=bt.useMemo(()=>Le(s,r?.allowSkip),[s,r?.allowSkip]),l=bt.useMemo(()=>{let y={};return t.steps.forEach((x,E)=>{x.conditions&&(y[E]={visible:x.conditions.visible,required:x.conditions.skippable});}),y},[t.steps]),b=Te(l,n),p=bt.useMemo(()=>{let y={};return t.steps.forEach((x,E)=>{let N=b[E];N?y[E]=Le(N,x.allowSkip):y[E]={visible:true,skippable:x.allowSkip===true};}),y},[t.steps,b]),o=bt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let y={};for(let x of r.formConfig.allFields)x.conditions&&(y[x.id]=x.conditions);return y},[r?.formConfig?.allFields]),f=we(o,n),u=bt.useCallback(y=>y<0||y>=t.steps.length?false:p[y]?.visible??true,[p,t.steps.length]),m=bt.useCallback(y=>y<0||y>=t.steps.length?false:p[y]?.skippable??false,[p,t.steps.length]),c=bt.useCallback(y=>f[y]?.visible??true,[f]),h=bt.useCallback(y=>f[y]?.disabled??false,[f]),g=bt.useCallback(y=>f[y]?.required??false,[f]),P=bt.useCallback(y=>f[y]?.readonly??false,[f]);return {stepConditions:a,fieldConditions:f,allStepConditions:p,isStepVisible:u,isStepSkippable:m,isFieldVisible:c,isFieldDisabled:h,isFieldRequired:g,isFieldReadonly:P}}function pe({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:a,setStepData:l,onStepChange:b}){let p=bt.useRef(b);p.current=b;let o=t.steps[e.currentStepIndex],f=bt.useCallback(()=>({setStepData:(d,v)=>{l(v,d);},setStepFields:(d,v)=>{let k={...e.allData[d]||{},...v};l(k,d);},getStepData:d=>e.allData[d]||{},setNextStepField:(d,v)=>{let S=e.currentStepIndex+1;if(S<t.steps.length){let k=t.steps[S].id,K={...e.allData[k]||{},[d]:v};l(K,k);}},setNextStepFields:d=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let S=t.steps[v].id,L={...e.allData[S]||{},...d};l(L,S);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,l]),u=bt.useCallback(async d=>{if(d<0||d>=t.steps.length||!n.isStepVisible(d))return false;s(true);try{return p.current&&p.current(e.currentStepIndex,d,r),i(d),a(d,t.steps[d].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,a]),m=bt.useCallback(d=>{for(let v=d+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),c=bt.useCallback(d=>{for(let v=d-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),h=bt.useCallback(async()=>{if(o?.onAfterValidation)try{let v=f();await o.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let d=m(e.currentStepIndex);return d===null?false:u(d)},[o,f,e.stepData,r,t.analytics,e.currentStepIndex,m,u]),g=bt.useCallback(async()=>{let d=c(e.currentStepIndex);return d===null?false:u(d)},[e.currentStepIndex,c,u]),P=bt.useCallback(async()=>!o?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(o.id,"user_skip",r),h()),[o,n,e.currentStepIndex,t.analytics,r,h]),y=bt.useCallback(d=>d<0||d>=t.steps.length?false:n.isStepVisible(d),[t.steps.length,n]),x=bt.useCallback(()=>{let d=m(e.currentStepIndex);return d!==null&&y(d)},[e.currentStepIndex,m,y]),E=bt.useCallback(()=>{let d=c(e.currentStepIndex);return d!==null&&y(d)},[e.currentStepIndex,c,y]),N=bt.useCallback(()=>o?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[o?.allowSkip,n,e.currentStepIndex]);return {goToStep:u,goNext:h,goPrevious:g,skipStep:P,canGoToStep:y,canGoNext:x,canGoPrevious:E,canSkipCurrentStep:N}}function at(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ce({defaultValues:t={},defaultStepIndex:e,persistence:r}){let n={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:true},[i,s]=bt.useReducer(at,n),a=r?.adapter?X({workflowId:r.workflowId,workflowState:i,adapter:r.adapter,options:r.options,userId:r.userId}):null,l=bt.useCallback(g=>{s({type:"SET_CURRENT_STEP",stepIndex:g});},[]),b=bt.useCallback((g,P)=>{s({type:"SET_STEP_DATA",data:g,stepId:P});},[]),p=bt.useCallback((g,P,y)=>{s({type:"SET_FIELD_VALUE",fieldId:g,value:P,stepId:y});},[]),o=bt.useCallback(g=>{s({type:"SET_SUBMITTING",isSubmitting:g});},[]),f=bt.useCallback(g=>{s({type:"SET_TRANSITIONING",isTransitioning:g});},[]),u=bt.useCallback((g,P)=>{s({type:"MARK_STEP_VISITED",stepIndex:g,stepId:P});},[]),m=bt.useCallback(()=>{s({type:"RESET_WORKFLOW"});},[]),c=bt.useCallback(()=>{s({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=bt.useCallback(async()=>{if(!a)return c(),false;try{let g=await a.loadPersistedData();if(g){let P={currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps)};return s({type:"LOAD_PERSISTED_STATE",state:P}),c(),!0}}catch(g){console.error("Failed to load persisted state:",g);}return c(),false},[a,c]);return {workflowState:i,setCurrentStep:l,setStepData:b,setFieldValue:p,setSubmitting:o,setTransitioning:f,markStepVisited:u,resetWorkflow:m,loadPersistedState:h,persistence:a?{isPersisting:a.isPersisting,persistenceError:a.persistenceError,persistNow:a.persistNow,clearPersistedData:a.clearPersistedData,hasPersistedData:a.hasPersistedData}:null}}function de({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let a=bt.useRef(i);a.current=i;let l=bt.useCallback(async()=>{n(true);try{if(a.current&&await a.current(e.allData),t.analytics?.onWorkflowComplete){let p=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,p,e.allData);}}catch(p){throw console.error("Workflow submission failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),p}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),b=bt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:l,isSubmitting:e.isSubmitting,canSubmit:b()}}var Oe=bt.createContext(null);function fe({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:a}){let l=bt.useRef(i),b=bt.useRef(s);l.current=i,b.current=s;let p=bt.useMemo(()=>{if(!n)return 0;let D=e.steps.findIndex(R=>R.id===n);return D===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):D},[n,e.steps]),{workflowState:o,setCurrentStep:f,setStepData:u,setFieldValue:m,setSubmitting:c,setTransitioning:h,markStepVisited:g,resetWorkflow:P,loadPersistedState:y,persistence:x}=ce({defaultValues:r,defaultStepIndex:p,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});bt.useEffect(()=>{e.persistence&&y&&y();},[]);let E=bt.useMemo(()=>({isPersisting:x?.isPersisting??false,persistenceError:x?.persistenceError??null,persistNow:x?.persistNow}),[x?.isPersisting,x?.persistenceError,x?.persistNow]),N=bt.useMemo(()=>({workflowId:e.id,currentStepIndex:o.currentStepIndex,totalSteps:e.steps.length,allData:o.allData,stepData:o.stepData,visitedSteps:o.visitedSteps}),[e.id,e.steps.length,o.currentStepIndex,o.allData,o.stepData,o.visitedSteps]),d=bt.useMemo(()=>e.steps[o.currentStepIndex],[e.steps,o.currentStepIndex]),v=bt.useMemo(()=>d?.formConfig,[d?.formConfig]),S=le({workflowConfig:e,workflowState:o,currentStep:d}),k=bt.useMemo(()=>{let D=-1;for(let T=0;T<e.steps.length;T++)if(S.isStepVisible(T)){D=T;break}let R=-1;for(let T=e.steps.length-1;T>=0;T--)if(S.isStepVisible(T)){R=T;break}return {...N,isFirstStep:o.currentStepIndex===D,isLastStep:o.currentStepIndex===R}},[N,o.currentStepIndex,S,e.steps.length]),{analyticsStartTime:L}=se({workflowConfig:e,workflowState:o,workflowContext:k}),{goToStep:K,goNext:$,goPrevious:ge,skipStep:ye,canGoToStep:be,canGoNext:ve,canGoPrevious:he,canSkipCurrentStep:xe}=pe({workflowConfig:e,workflowState:o,workflowContext:k,conditionsHelpers:S,setCurrentStep:f,setTransitioning:h,markStepVisited:g,setStepData:u,onStepChange:l.current});bt.useEffect(()=>{if(!S.isStepVisible(o.currentStepIndex)){for(let R=0;R<e.steps.length;R++)if(S.isStepVisible(R)){f(R),g(R,e.steps[R].id);break}}},[S,o.currentStepIndex,e.steps,f,g]);let{submitWorkflow:q,isSubmitting:ke,canSubmit:Ie}=de({workflowConfig:e,workflowState:o,workflowContext:k,setSubmitting:c,onWorkflowComplete:b.current,analyticsStartTime:L}),j=bt.useCallback((D,R)=>{m(D,R,d?.id||"");},[m,d?.id]),Pe=bt.useCallback(D=>{u(D,d?.id||"");},[u,d?.id]),$e=bt.useCallback(async D=>{d?.id&&D&&u(D,d.id),k.isLastStep?await q():await $();},[k.isLastStep,q,$,d?.id,u]),We=bt.useMemo(()=>({goToStep:K,goNext:$,goPrevious:ge,skipStep:ye,canGoToStep:be,canGoNext:ve,canGoPrevious:he,canSkipCurrentStep:xe}),[K,$,ge,ye,be,ve,he,xe]),De=bt.useMemo(()=>({setValue:j,setStepData:Pe,resetWorkflow:P}),[j,Pe,P]),Re=bt.useMemo(()=>({submitWorkflow:q,isSubmitting:ke,canSubmit:Ie}),[q,ke,Ie]),qe=bt.useMemo(()=>({workflowState:o,workflowConfig:e,currentStep:d,context:k,formConfig:v,conditionsHelpers:S,currentStepMetadata:d?.metadata,...We,...De,...Re,persistNow:E.persistNow,isPersisting:E.isPersisting,persistenceError:E.persistenceError}),[o,e,d,k,v,S,We,De,Re,E]),ze=bt.useMemo(()=>{if(!d?.id)return {};let D=o?.allData[d.id]||{};if(!v?.allFields)return D;let R=new Set(v.allFields.map(z=>z.id)),T={};for(let[z,Xe]of Object.entries(D))R.has(z)&&(T[z]=Xe);return T},[o?.allData,d?.id,v?.allFields]),Je=bt.useMemo(()=>o.isInitializing.toString(),[o.isInitializing]);return jsxRuntime.jsx(Oe.Provider,{value:qe,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:v,defaultValues:ze,onFieldChange:j,"data-workflow-id":e.id,className:a,onSubmit:$e,children:t},Je)})}function w(){let t=bt.useContext(Oe);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function St({children:t,workflowConfig:e,...r}){let[n,i]=bt.useState(),s=bt.useMemo(()=>e instanceof U?e.build():e,[e]);return bt.useEffect(()=>{if(typeof window<"u"&&_.shouldDisplayWatermark()){let l=_.getWatermarkMessage();i(l);}},[]),jsxRuntime.jsxs("div",{style:{position:"relative"},children:[jsxRuntime.jsx(fe,{...r,workflowConfig:s,children:t}),n&&jsxRuntime.jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var vt=bt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=w();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Wt=bt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:a,currentStep:l}=w(),{submit:b,formState:p}=forms.useFormContext(),o=bt.useMemo(()=>{let m=p.isSubmitting||s.isSubmitting,c=r??m,h=!s.isTransitioning&&!c;return {finalIsSubmitting:c,canGoNext:h}},[p.isSubmitting,s.isSubmitting,s.isTransitioning,r]),f=bt.useCallback(async m=>{m?.preventDefault(),o.canGoNext&&await b(m);},[o.canGoNext,b]),u=bt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:o.canGoNext,isSubmitting:o.finalIsSubmitting,onSubmit:f,className:e,currentStep:l,stepData:p.values||{},allData:i.allData,context:i}),[i.isLastStep,o.canGoNext,o.finalIsSubmitting,f,e,l,p.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:a.renderConfig?.nextButtonRenderer,props:u,...n})});var Ct=bt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:a,workflowConfig:l,currentStep:b}=w(),{formState:p}=forms.useFormContext(),o=bt.useMemo(()=>{let m=p.isSubmitting||a.isSubmitting,c=r??m,h=i.currentStepIndex>0&&!a.isTransitioning&&!c;return {finalIsSubmitting:c,canGoPrevious:h}},[p.isSubmitting,a.isSubmitting,a.isTransitioning,i.currentStepIndex,r]),f=bt.useCallback(async m=>{m?.preventDefault(),o.canGoPrevious&&await s();},[o.canGoPrevious,s]),u=bt.useMemo(()=>({canGoPrevious:o.canGoPrevious,isSubmitting:o.finalIsSubmitting,onPrevious:f,className:e,currentStep:b,stepData:p.values||{},allData:i.allData,context:i}),[o.canGoPrevious,o.finalIsSubmitting,f,e,b,p.values,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:l.renderConfig?.previousButtonRenderer,props:u,...n})});var Bt=bt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:a,workflowConfig:l,context:b,conditionsHelpers:p}=w(),{formState:o}=forms.useFormContext(),f=bt.useMemo(()=>{let c=o.isSubmitting||a.isSubmitting,h=r??c,g=(!!i?.allowSkip||p.isStepSkippable(a.currentStepIndex))&&!a.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:g}},[o.isSubmitting,a.isSubmitting,a.isTransitioning,a.currentStepIndex,i?.allowSkip,p.isStepSkippable,r]),u=bt.useCallback(async c=>{c?.preventDefault(),f.canSkip&&await s();},[f.canSkip,s]),m=bt.useMemo(()=>({canSkip:f.canSkip,isSubmitting:f.finalIsSubmitting,onSkip:u,className:e,currentStep:i,stepData:o.values||{},allData:b.allData,context:b}),[f.canSkip,f.finalIsSubmitting,u,e,i,o.values,b.allData,b]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:l.renderConfig?.skipButtonRenderer,props:m,...n})});var Gt=bt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,goToStep:a,conditionsHelpers:l}=w(),{visibleSteps:b,visibleToOriginalIndexMap:p,originalToVisibleIndexMap:o}=bt.useMemo(()=>{let c=[],h=new Map,g=new Map;return i.steps.forEach((P,y)=>{if(l.isStepVisible(y)){let x=c.length;c.push(P),h.set(x,y),g.set(y,x);}}),{visibleSteps:c,visibleToOriginalIndexMap:h,originalToVisibleIndexMap:g}},[i.steps,l]),f=bt.useCallback(c=>{let h=p.get(c);h!==void 0&&(e?e(h):a(h));},[p,e,a]),u=bt.useMemo(()=>o.get(s.currentStepIndex)??-1,[o,s.currentStepIndex]),m=bt.useMemo(()=>({steps:b,currentStepIndex:u,visitedSteps:s.visitedSteps,onStepClick:f,className:r}),[b,u,s.visitedSteps,f,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:m,...n})});var Se=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),a=this.compress?this.compressData(s):s;localStorage.setItem(n,a);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},a=JSON.stringify(s),l=this.compress?this.compressData(a):a;localStorage.setItem(i,l);}catch(i){throw new W("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new W(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new W("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new W(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new W("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new W(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new W("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new W(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new W("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new W(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new W("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,a=JSON.parse(s);a.expiresAt&&Date.now()>a.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
+ exports.LocalStorageAdapter=Se;exports.RilayLicenseManager=_;exports.Workflow=St;exports.WorkflowBody=vt;exports.WorkflowNextButton=Wt;exports.WorkflowPersistenceError=W;exports.WorkflowPreviousButton=Ct;exports.WorkflowProvider=fe;exports.WorkflowSkipButton=Bt;exports.WorkflowStepper=Gt;exports.combineWorkflowDataForConditions=ae;exports.debounce=ne;exports.flattenObject=oe;exports.flow=U;exports.generateStorageKey=re;exports.mergePersistedState=rt;exports.persistedToWorkflowState=Ce;exports.useConditionEvaluation=ee;exports.usePersistence=X;exports.useStepMetadata=nt;exports.useWorkflowAnalytics=se;exports.useWorkflowConditions=le;exports.useWorkflowContext=w;exports.useWorkflowNavigation=pe;exports.useWorkflowState=ce;exports.useWorkflowSubmission=de;exports.validatePersistedData=tt;exports.workflowStateToPersisted=te;
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormContext,form,FormProvider}from'@rilaykit/forms';import mt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import*as Pe from'@noble/ed25519';import {jsx,jsxs}from'react/jsx-runtime';var U=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(o=>o.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var He=1751361139160,Ze="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",k=class k{static async setLicenseKey(e){k.licenseKey=e||"",k.licenseKey?k.licenseResult=await k.validateLicense():k.licenseResult={valid:false,error:"MISSING"},k.isInitialized=true;}static async validateLicense(){if(!k.licenseKey)return {valid:false,error:"MISSING"};try{if(!k.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=k.licenseKey.slice(4),n=k.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,s,o]=n,a=`${i}.${s}`,c=new TextEncoder().encode(a),l=o.match(/.{2}/g);if(!l)return {valid:!1,error:"INVALID"};let p=new Uint8Array(l.map(W=>Number.parseInt(W,16))),m=k.hexToBytes(Ze);if(!await Pe.verify(p,c,m))return {valid:!1,error:"SIGNATURE_INVALID"};let S=k.base64ToString(s.replace(/-/g,"+").replace(/_/g,"/")),d=JSON.parse(S),u=Math.floor(Date.now()/1e3);return d.e<u?{valid:!1,error:"EXPIRED",data:k.decompressPayload(d)}:He>d.e*1e3?{valid:!1,error:"EXPIRED",data:k.decompressPayload(d)}:d.p===void 0||!d.c||!d.i||!d.e||!d.t?{valid:!1,error:"INVALID"}:{valid:!0,data:k.decompressPayload(d)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,s=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<s.length;){let o=r.indexOf(s.charAt(i++)),a=r.indexOf(s.charAt(i++)),c=r.indexOf(s.charAt(i++)),l=r.indexOf(s.charAt(i++)),p=o<<18|a<<12|c<<6|l;n+=String.fromCharCode(p>>16&255),c!==64&&(n+=String.fromCharCode(p>>8&255)),l!==64&&(n+=String.fromCharCode(p&255));}return n}static getLicenseResult(){return k.isInitialized?k.licenseResult?k.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!k.getLicenseResult().valid}static getWatermarkMessage(){let e=k.getLicenseResult();return {MISSING:"Rilay Workflow - For Trial Use Only",EXPIRED:"Rilay Workflow - License Expired",INVALID:"Rilay Workflow - Invalid License",FORMAT_INVALID:"Rilay Workflow - Invalid License Format",SIGNATURE_INVALID:"Rilay Workflow - Invalid License Signature"}[e.error||"MISSING"]||""}static logLicenseStatus(){let e=k.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=k.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};k.licenseKey="",k.licenseResult=null,k.isInitialized=false;var _=k;function j(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function We(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(a){return console.warn(`Error evaluating condition for field ${n}:`,a),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function De(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let o=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(c){return console.warn(`Error evaluating condition for step ${s}:`,c),false}};r[s]={visible:i.visible?o(i.visible):true,disabled:i.disabled?o(i.disabled):false,required:i.required?o(i.required):false,readonly:i.readonly?o(i.readonly):false};}}return r},[t,e])}var D=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ee(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Ee(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function Ye(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function te(t,e){return e?`${e}:${t}`:t}function re(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function Qe(t,e,r="persist"){let n=Ee(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function J({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,o]=useState(false),[a,c]=useState(null),[l,p]=useState(false),m=useRef(r),g=useRef(n),S=useRef({hasPendingChanges:false});useEffect(()=>{m.current=r,g.current=n;},[r,n]);let d=te(g.current.storageKey||t,i),u=useCallback(()=>{c(null);},[]),h=useCallback((b,P)=>{let C=b instanceof D?b:new D(`${P} failed: ${b.message}`,"OPERATION_FAILED",b);c(C),console.error("[WorkflowPersistence]",C);},[]),W=useCallback(async b=>{u(),o(true);try{let P=ee(t,b,g.current.metadata);await m.current.save(d,P),S.current.lastSavedState={...b},S.current.hasPendingChanges=!1;}catch(P){throw h(P,"Save"),P}finally{o(false);}},[t,d,u,h]),y=useRef(re(async b=>{try{await W(b);}catch(P){console.debug("[WorkflowPersistence] Auto-save failed:",P);}},n.debounceMs||500)),x=useCallback((b,P)=>P?b.currentStepIndex!==P.currentStepIndex||JSON.stringify(b.allData)!==JSON.stringify(P.allData)||JSON.stringify(b.stepData)!==JSON.stringify(P.stepData)||b.visitedSteps.size!==P.visitedSteps.size||!Array.from(b.visitedSteps).every(C=>P.visitedSteps.has(C)):true,[]),I=useCallback(async()=>{u(),p(true);try{let b=await m.current.load(d);return b&&(S.current.lastSavedState={currentStepIndex:b.currentStepIndex,allData:b.allData,stepData:b.stepData,visitedSteps:new Set(b.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},S.current.hasPendingChanges=!1),b}catch(b){return h(b,"Load"),null}finally{setTimeout(()=>p(false),100);}},[d,u,h]),E=useCallback(async()=>{u();try{await m.current.remove(d),S.current.lastSavedState=void 0,S.current.hasPendingChanges=!1;}catch(b){throw h(b,"Clear"),b}},[d,u,h]),f=useCallback(async()=>{try{return await m.current.exists(d)}catch(b){return h(b,"Exists check"),false}},[d,h]);useEffect(()=>{g.current.autoPersist&&(s||l||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,S.current.lastSavedState)&&(S.current.hasPendingChanges=true,y.current(e)));},[e,s,l,x]);let v=useCallback(async()=>{await W(e);},[W,e]);return {isPersisting:s,persistenceError:a,persistNow:v,loadPersistedData:I,clearPersistedData:E,hasPersistedData:f}}function je(){let{workflowConfig:t,currentStep:e}=T(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>l=>t.steps.find(m=>m.id===l)?.metadata,[t.steps]),i=useMemo(()=>l=>t.steps[l]?.metadata,[t.steps]),s=useMemo(()=>l=>r?l in r:false,[r]),o=useMemo(()=>(l,p)=>r&&l in r?r[l]:p,[r]),a=useMemo(()=>()=>t.steps.map((l,p)=>({id:l.id,title:l.title,index:p,metadata:l.metadata})),[t.steps]),c=useMemo(()=>l=>t.steps.map((p,m)=>({step:p,index:m})).filter(({step:p,index:m})=>l(p.metadata,p.id,m)).map(({step:p})=>p.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:o,getAllStepsMetadata:a,findStepsByMetadata:c}}function ie({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),o=useRef(null),a=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,a,t.steps.length]),useEffect(()=>{let g=t.steps[e.currentStepIndex];if(g&&o.current!==g.id){if(o.current&&t.analytics?.onStepComplete){let S=i.current.get(o.current);if(S){let d=Date.now()-S;t.analytics.onStepComplete(o.current,d,e.stepData,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:o.current,duration:d},{timestamp:Date.now(),duration:d,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:d,conditionEvaluationDuration:0},"low");}}o.current=g.id,i.current.set(g.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(g.id,Date.now(),r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:g.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,a,t.id]);let c=useCallback((g,S)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(g,S,r),a&&a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:g,reason:S},void 0,"medium");},[t.analytics,r,a,t.id]),l=useCallback(g=>{t.analytics?.onError&&t.analytics.onError(g,r),a&&a.trackError(g,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,a,t.id,e.currentStepIndex,t.steps]),p=useCallback((g,S,d)=>{if(!a)return;let u={timestamp:Date.now(),duration:d,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:S,navigationDuration:d,conditionEvaluationDuration:0};a.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:g,toStep:S,direction:S>g?"forward":"backward"},u,d>1e3?"medium":"low");},[a,t.id,t.steps.length]),m=useCallback((g,S)=>{if(!a)return;let d={timestamp:Date.now(),duration:g,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:g};a.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:S,currentStepIndex:e.currentStepIndex},d,g>100?"medium":"low");},[a,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:c,trackError:l,trackNavigation:p,trackConditionEvaluation:m}}function Te(t,e){return {visible:t.visible,skippable:e===true||t.required}}function se({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>({...e.allData,...e.stepData}),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=j(i,n,{visible:true,disabled:false,required:false,readonly:false}),o=useMemo(()=>Te(s,r?.allowSkip),[s,r?.allowSkip]),a=useMemo(()=>{let y={};return t.steps.forEach((x,I)=>{x.conditions&&(y[I]={visible:x.conditions.visible,required:x.conditions.skippable});}),y},[t.steps]),c=De(a,n),l=useMemo(()=>{let y={};return t.steps.forEach((x,I)=>{let E=c[I];E?y[I]=Te(E,x.allowSkip):y[I]={visible:true,skippable:x.allowSkip===true};}),y},[t.steps,c]),p=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let y={};for(let x of r.formConfig.allFields)x.conditions&&(y[x.id]=x.conditions);return y},[r?.formConfig?.allFields]),m=We(p,n),g=useCallback(y=>y<0||y>=t.steps.length?false:l[y]?.visible??true,[l,t.steps.length]),S=useCallback(y=>y<0||y>=t.steps.length?false:l[y]?.skippable??false,[l,t.steps.length]),d=useCallback(y=>m[y]?.visible??true,[m]),u=useCallback(y=>m[y]?.disabled??false,[m]),h=useCallback(y=>m[y]?.required??false,[m]),W=useCallback(y=>m[y]?.readonly??false,[m]);return {stepConditions:o,fieldConditions:m,allStepConditions:l,isStepVisible:g,isStepSkippable:S,isFieldVisible:d,isFieldDisabled:u,isFieldRequired:h,isFieldReadonly:W}}function oe({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:o,setStepData:a,onStepChange:c}){let l=useRef(c);l.current=c;let p=t.steps[e.currentStepIndex],m=useCallback(()=>({setStepData:(f,v)=>{a(v,f);},setStepFields:(f,v)=>{let P={...e.allData[f]||{},...v};a(P,f);},getStepData:f=>e.allData[f]||{},setNextStepField:(f,v)=>{let b=e.currentStepIndex+1;if(b<t.steps.length){let P=t.steps[b].id,K={...e.allData[P]||{},[f]:v};a(K,P);}},setNextStepFields:f=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let b=t.steps[v].id,C={...e.allData[b]||{},...f};a(C,b);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,a]),g=useCallback(async f=>{if(f<0||f>=t.steps.length||!n.isStepVisible(f))return false;s(true);try{return l.current&&l.current(e.currentStepIndex,f,r),i(f),o(f,t.steps[f].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,o]),S=useCallback(f=>{for(let v=f+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),d=useCallback(f=>{for(let v=f-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),u=useCallback(async()=>{if(p?.onAfterValidation)try{let v=m();await p.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let f=S(e.currentStepIndex);return f===null?false:g(f)},[p,m,e.stepData,r,t.analytics,e.currentStepIndex,S,g]),h=useCallback(async()=>{let f=d(e.currentStepIndex);return f===null?false:g(f)},[e.currentStepIndex,d,g]),W=useCallback(async()=>!p?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(p.id,"user_skip",r),u()),[p,n,e.currentStepIndex,t.analytics,r,u]),y=useCallback(f=>f<0||f>=t.steps.length?false:n.isStepVisible(f),[t.steps.length,n]),x=useCallback(()=>{let f=S(e.currentStepIndex);return f!==null&&y(f)},[e.currentStepIndex,S,y]),I=useCallback(()=>{let f=d(e.currentStepIndex);return f!==null&&y(f)},[e.currentStepIndex,d,y]),E=useCallback(()=>p?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[p?.allowSkip,n,e.currentStepIndex]);return {goToStep:g,goNext:u,goPrevious:h,skipStep:W,canGoToStep:y,canGoNext:x,canGoPrevious:I,canSkipCurrentStep:E}}function nt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ae({defaultValues:t={},persistence:e}){let r={currentStepIndex:0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:true},[n,i]=useReducer(nt,r),s=e?.adapter?J({workflowId:e.workflowId,workflowState:n,adapter:e.adapter,options:e.options,userId:e.userId}):null,o=useCallback(u=>{i({type:"SET_CURRENT_STEP",stepIndex:u});},[]),a=useCallback((u,h)=>{i({type:"SET_STEP_DATA",data:u,stepId:h});},[]),c=useCallback((u,h,W)=>{i({type:"SET_FIELD_VALUE",fieldId:u,value:h,stepId:W});},[]),l=useCallback(u=>{i({type:"SET_SUBMITTING",isSubmitting:u});},[]),p=useCallback(u=>{i({type:"SET_TRANSITIONING",isTransitioning:u});},[]),m=useCallback((u,h)=>{i({type:"MARK_STEP_VISITED",stepIndex:u,stepId:h});},[]),g=useCallback(()=>{i({type:"RESET_WORKFLOW"});},[]),S=useCallback(()=>{i({type:"SET_INITIALIZATION_COMPLETE"});},[]),d=useCallback(async()=>{if(!s)return S(),false;try{let u=await s.loadPersistedData();if(u){let h={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps)};return i({type:"LOAD_PERSISTED_STATE",state:h}),S(),!0}}catch(u){console.error("Failed to load persisted state:",u);}return S(),false},[s,S]);return {workflowState:n,setCurrentStep:o,setStepData:a,setFieldValue:c,setSubmitting:l,setTransitioning:p,markStepVisited:m,resetWorkflow:g,loadPersistedState:d,persistence:s?{isPersisting:s.isPersisting,persistenceError:s.persistenceError,persistNow:s.persistNow,clearPersistedData:s.clearPersistedData,hasPersistedData:s.hasPersistedData}:null}}function le({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let o=useRef(i);o.current=i;let a=useCallback(async()=>{n(true);try{if(o.current&&await o.current(e.allData),t.analytics?.onWorkflowComplete){let l=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,l,e.allData);}}catch(l){throw console.error("Workflow submission failed:",l),t.analytics?.onError&&t.analytics.onError(l,r),l}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),c=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:a,isSubmitting:e.isSubmitting,canSubmit:c()}}var Me=createContext(null);function ce({children:t,workflowConfig:e,defaultValues:r={},onStepChange:n,onWorkflowComplete:i,className:s}){let o=useRef(n),a=useRef(i);o.current=n,a.current=i;let{workflowState:c,setCurrentStep:l,setStepData:p,setFieldValue:m,setSubmitting:g,setTransitioning:S,markStepVisited:d,resetWorkflow:u,loadPersistedState:h,persistence:W}=ae({defaultValues:r,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});useEffect(()=>{e.persistence&&h&&h();},[]);let y=useMemo(()=>({isPersisting:W?.isPersisting??false,persistenceError:W?.persistenceError??null,persistNow:W?.persistNow}),[W?.isPersisting,W?.persistenceError,W?.persistNow]),x=useMemo(()=>({workflowId:e.id,currentStepIndex:c.currentStepIndex,totalSteps:e.steps.length,allData:c.allData,stepData:c.stepData,visitedSteps:c.visitedSteps}),[e.id,e.steps.length,c.currentStepIndex,c.allData,c.stepData,c.visitedSteps]),I=useMemo(()=>e.steps[c.currentStepIndex],[e.steps,c.currentStepIndex]),E=useMemo(()=>I?.formConfig,[I?.formConfig]),f=se({workflowConfig:e,workflowState:c,currentStep:I}),v=useMemo(()=>{let w=-1;for(let A=0;A<e.steps.length;A++)if(f.isStepVisible(A)){w=A;break}let R=-1;for(let A=e.steps.length-1;A>=0;A--)if(f.isStepVisible(A)){R=A;break}return {...x,isFirstStep:c.currentStepIndex===w,isLastStep:c.currentStepIndex===R}},[x,c.currentStepIndex,f,e.steps.length]),{analyticsStartTime:b}=ie({workflowConfig:e,workflowState:c,workflowContext:v}),{goToStep:P,goNext:C,goPrevious:K,skipStep:fe,canGoToStep:me,canGoNext:Se,canGoPrevious:ge,canSkipCurrentStep:ye}=oe({workflowConfig:e,workflowState:c,workflowContext:v,conditionsHelpers:f,setCurrentStep:l,setTransitioning:S,markStepVisited:d,setStepData:p,onStepChange:o.current});useEffect(()=>{if(!f.isStepVisible(c.currentStepIndex)){for(let R=0;R<e.steps.length;R++)if(f.isStepVisible(R)){l(R),d(R,e.steps[R].id);break}}},[f,c.currentStepIndex,e.steps,l,d]);let{submitWorkflow:$,isSubmitting:be,canSubmit:ve}=le({workflowConfig:e,workflowState:c,workflowContext:v,setSubmitting:g,onWorkflowComplete:a.current,analyticsStartTime:b}),Z=useCallback((w,R)=>{m(w,R,I?.id||"");},[m,I?.id]),he=useCallback(w=>{p(w,I?.id||"");},[p,I?.id]),Oe=useCallback(async w=>{I?.id&&w&&p(w,I.id),v.isLastStep?await $():await C();},[v.isLastStep,$,C,I?.id,p]),xe=useMemo(()=>({goToStep:P,goNext:C,goPrevious:K,skipStep:fe,canGoToStep:me,canGoNext:Se,canGoPrevious:ge,canSkipCurrentStep:ye}),[P,C,K,fe,me,Se,ge,ye]),ke=useMemo(()=>({setValue:Z,setStepData:he,resetWorkflow:u}),[Z,he,u]),Ie=useMemo(()=>({submitWorkflow:$,isSubmitting:be,canSubmit:ve}),[$,be,ve]),Ue=useMemo(()=>({workflowState:c,workflowConfig:e,currentStep:I,context:v,formConfig:E,conditionsHelpers:f,currentStepMetadata:I?.metadata,...xe,...ke,...Ie,persistNow:y.persistNow,isPersisting:y.isPersisting,persistenceError:y.persistenceError}),[c,e,I,v,E,f,xe,ke,Ie,y]),Ge=useMemo(()=>{if(!I?.id)return {};let w=c?.allData[I.id]||{};if(!E?.allFields)return w;let R=new Set(E.allFields.map(q=>q.id)),A={};for(let[q,$e]of Object.entries(w))R.has(q)&&(A[q]=$e);return A},[c?.allData,I?.id,E?.allFields]),Ke=useMemo(()=>c.isInitializing.toString(),[c.isInitializing]);return jsx(Me.Provider,{value:Ue,children:jsx(FormProvider,{formConfig:E,defaultValues:Ge,onFieldChange:Z,"data-workflow-id":e.id,className:s,onSubmit:Oe,children:t},Ke)})}function T(){let t=useContext(Me);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function dt({children:t,workflowConfig:e,...r}){let[n,i]=useState(),s=useMemo(()=>e instanceof U?e.build():e,[e]);return useEffect(()=>{if(typeof window<"u"&&_.shouldDisplayWatermark()){let a=_.getWatermarkMessage();i(a);}},[]),jsxs("div",{style:{position:"relative"},children:[jsx(ce,{...r,workflowConfig:s,children:t}),n&&jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var St=mt.memo(function({stepId:e,children:r}){let{currentStep:n}=T();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var xt=mt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:o,currentStep:a}=T(),{submit:c,formState:l}=useFormContext(),p=useMemo(()=>{let S=l.isSubmitting||s.isSubmitting,d=r??S,u=!s.isTransitioning&&!d;return {finalIsSubmitting:d,canGoNext:u}},[l.isSubmitting,s.isSubmitting,s.isTransitioning,r]),m=useCallback(async S=>{S?.preventDefault(),p.canGoNext&&await c(S);},[p.canGoNext,c]),g=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:p.canGoNext,isSubmitting:p.finalIsSubmitting,onSubmit:m,className:e,currentStep:a,stepData:l.values||{},allData:i.allData,context:i}),[i.isLastStep,p.canGoNext,p.finalIsSubmitting,m,e,a,l.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:o.renderConfig?.nextButtonRenderer,props:g,...n})});var Et=mt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:o,workflowConfig:a,currentStep:c}=T(),{formState:l}=useFormContext(),p=useMemo(()=>{let S=l.isSubmitting||o.isSubmitting,d=r??S,u=i.currentStepIndex>0&&!o.isTransitioning&&!d;return {finalIsSubmitting:d,canGoPrevious:u}},[l.isSubmitting,o.isSubmitting,o.isTransitioning,i.currentStepIndex,r]),m=useCallback(async S=>{S?.preventDefault(),p.canGoPrevious&&await s();},[p.canGoPrevious,s]),g=useMemo(()=>({canGoPrevious:p.canGoPrevious,isSubmitting:p.finalIsSubmitting,onPrevious:m,className:e,currentStep:c,stepData:l.values||{},allData:i.allData,context:i}),[p.canGoPrevious,p.finalIsSubmitting,m,e,c,l.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:a.renderConfig?.previousButtonRenderer,props:g,...n})});var Nt=mt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:o,workflowConfig:a,context:c,conditionsHelpers:l}=T(),{formState:p}=useFormContext(),m=useMemo(()=>{let d=p.isSubmitting||o.isSubmitting,u=r??d,h=(!!i?.allowSkip||l.isStepSkippable(o.currentStepIndex))&&!o.isTransitioning&&!u;return {finalIsSubmitting:u,canSkip:h}},[p.isSubmitting,o.isSubmitting,o.isTransitioning,o.currentStepIndex,i?.allowSkip,l.isStepSkippable,r]),g=useCallback(async d=>{d?.preventDefault(),m.canSkip&&await s();},[m.canSkip,s]),S=useMemo(()=>({canSkip:m.canSkip,isSubmitting:m.finalIsSubmitting,onSkip:g,className:e,currentStep:i,stepData:p.values||{},allData:c.allData,context:c}),[m.canSkip,m.finalIsSubmitting,g,e,i,p.values,c.allData,c]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:a.renderConfig?.skipButtonRenderer,props:S,...n})});var _t=mt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,goToStep:o,conditionsHelpers:a}=T(),{visibleSteps:c,visibleToOriginalIndexMap:l,originalToVisibleIndexMap:p}=useMemo(()=>{let d=[],u=new Map,h=new Map;return i.steps.forEach((W,y)=>{if(a.isStepVisible(y)){let x=d.length;d.push(W),u.set(x,y),h.set(y,x);}}),{visibleSteps:d,visibleToOriginalIndexMap:u,originalToVisibleIndexMap:h}},[i.steps,a]),m=useCallback(d=>{let u=l.get(d);u!==void 0&&(e?e(u):o(u));},[l,e,o]),g=useMemo(()=>p.get(s.currentStepIndex)??-1,[p,s.currentStepIndex]),S=useMemo(()=>({steps:c,currentStepIndex:g,visitedSteps:s.visitedSteps,onStepClick:m,className:r}),[c,g,s.visitedSteps,m,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:S,...n})});var ue=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),o=this.compress?this.compressData(s):s;localStorage.setItem(n,o);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},o=JSON.stringify(s),a=this.compress?this.compressData(o):o;localStorage.setItem(i,a);}catch(i){throw new D("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new D(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new D("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new D(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new D("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new D(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new D("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new D(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new D("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new D(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new D("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,o=JSON.parse(s);o.expiresAt&&Date.now()>o.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
- export{ue as LocalStorageAdapter,_ as RilayLicenseManager,dt as Workflow,St as WorkflowBody,xt as WorkflowNextButton,D as WorkflowPersistenceError,Et as WorkflowPreviousButton,ce as WorkflowProvider,Nt as WorkflowSkipButton,_t as WorkflowStepper,re as debounce,U as flow,te as generateStorageKey,Qe as mergePersistedState,Ee as persistedToWorkflowState,j as useConditionEvaluation,J as usePersistence,je as useStepMetadata,ie as useWorkflowAnalytics,se as useWorkflowConditions,T as useWorkflowContext,oe as useWorkflowNavigation,ae as useWorkflowState,le as useWorkflowSubmission,Ye as validatePersistedData,ee as workflowStateToPersisted};
1
+ import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormContext,form,FormProvider}from'@rilaykit/forms';import bt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import*as Ee from'@noble/ed25519';import {jsx,jsxs}from'react/jsx-runtime';var U=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(a=>a.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};var Qe=1751361139160,et="8fdb6a454550326d331c3b3d1d1f8c707a371bdb6c7ea72a0a1e4ea6f1822620",I=class I{static async setLicenseKey(e){I.licenseKey=e||"",I.licenseKey?I.licenseResult=await I.validateLicense():I.licenseResult={valid:false,error:"MISSING"},I.isInitialized=true;}static async validateLicense(){if(!I.licenseKey)return {valid:false,error:"MISSING"};try{if(!I.licenseKey.startsWith("ril_"))return {valid:!1,error:"FORMAT_INVALID"};let e=I.licenseKey.slice(4),n=I.base64ToString(e).split(".");if(n.length!==3)return {valid:!1,error:"FORMAT_INVALID"};let[i,s,a]=n,l=`${i}.${s}`,b=new TextEncoder().encode(l),p=a.match(/.{2}/g);if(!p)return {valid:!1,error:"INVALID"};let o=new Uint8Array(p.map(P=>Number.parseInt(P,16))),f=I.hexToBytes(et);if(!await Ee.verify(o,b,f))return {valid:!1,error:"SIGNATURE_INVALID"};let m=I.base64ToString(s.replace(/-/g,"+").replace(/_/g,"/")),c=JSON.parse(m),h=Math.floor(Date.now()/1e3);return c.e<h?{valid:!1,error:"EXPIRED",data:I.decompressPayload(c)}:Qe>c.e*1e3?{valid:!1,error:"EXPIRED",data:I.decompressPayload(c)}:c.p===void 0||!c.c||!c.i||!c.e||!c.t?{valid:!1,error:"INVALID"}:{valid:!0,data:I.decompressPayload(c)}}catch{return {valid:false,error:"INVALID"}}}static decompressPayload(e){return {plan:{0:"ARCHITECT",1:"FOUNDRY"}[e.p]||"ARCHITECT",company:e.c,customerId:e.i.toString(),expiry:e.e*1e3,iat:e.t*1e3}}static hexToBytes(e){let r=new Uint8Array(e.length/2);for(let n=0;n<e.length;n+=2)r[n/2]=Number.parseInt(e.substring(n,n+2),16);return r}static base64ToString(e){if(typeof atob<"u")return atob(e);if(typeof Buffer<"u")return Buffer.from(e,"base64").toString();let r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",n="",i=0,s=e.replace(/[^A-Za-z0-9+/]/g,"");for(;i<s.length;){let a=r.indexOf(s.charAt(i++)),l=r.indexOf(s.charAt(i++)),b=r.indexOf(s.charAt(i++)),p=r.indexOf(s.charAt(i++)),o=a<<18|l<<12|b<<6|p;n+=String.fromCharCode(o>>16&255),b!==64&&(n+=String.fromCharCode(o>>8&255)),p!==64&&(n+=String.fromCharCode(o&255));}return n}static getLicenseResult(){return I.isInitialized?I.licenseResult?I.licenseResult:{valid:false,error:"MISSING"}:{valid:false,error:"MISSING"}}static shouldDisplayWatermark(){return typeof window>"u"?false:!I.getLicenseResult().valid}static getWatermarkMessage(){let e=I.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=I.getLicenseResult();if(e.valid)return;let n={MISSING:"\u{1F527} Rilay Workflow - Trial Mode. Purchase a license at https://rilay.io/pricing",EXPIRED:"\u26A0\uFE0F Rilay Workflow - License Expired. Please renew your license.",INVALID:"\u274C Rilay Workflow - Invalid License. Please check your license key.",FORMAT_INVALID:"\u274C Rilay Workflow - Invalid License Format. Please check your license key.",SIGNATURE_INVALID:"\u274C Rilay Workflow - Invalid License Signature. Please check your license key."}[e.error||"MISSING"];console.warn(`%c${n}`,"color: #f59e0b; font-weight: bold;");}static async getLicenseInfo(){let e=I.getLicenseResult();return !e.valid||!e.data?{}:{plan:e.data.plan,company:e.data.company,expiryDate:new Date(e.data.expiry).toLocaleDateString()}}};I.licenseKey="",I.licenseResult=null,I.isInitialized=false;var _=I;function ee(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function we(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=a=>{try{return a&&typeof a=="object"&&"build"in a?evaluateCondition(a.build(),e):evaluateCondition(a,e)}catch(l){return console.warn(`Error evaluating condition for field ${n}:`,l),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Te(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let a=l=>{try{return l&&typeof l=="object"&&"build"in l?evaluateCondition(l.build(),e):evaluateCondition(l,e)}catch(b){return console.warn(`Error evaluating condition for step ${s}:`,b),false}};r[s]={visible:i.visible?a(i.visible):true,disabled:i.disabled?a(i.disabled):false,required:i.required?a(i.required):false,readonly:i.readonly?a(i.readonly):false};}}return r},[t,e])}var W=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function te(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),lastSaved:Date.now(),metadata:r}}function Ce(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),isSubmitting:false,isTransitioning:false}}function tt(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function re(t,e){return e?`${e}:${t}`:t}function ne(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function rt(t,e,r="persist"){let n=Ce(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function X({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,a]=useState(false),[l,b]=useState(null),[p,o]=useState(false),f=useRef(r),u=useRef(n),m=useRef({hasPendingChanges:false});useEffect(()=>{f.current=r,u.current=n;},[r,n]);let c=re(u.current.storageKey||t,i),h=useCallback(()=>{b(null);},[]),g=useCallback((S,k)=>{let L=S instanceof W?S:new W(`${k} failed: ${S.message}`,"OPERATION_FAILED",S);b(L),console.error("[WorkflowPersistence]",L);},[]),P=useCallback(async S=>{h(),a(true);try{let k=te(t,S,u.current.metadata);await f.current.save(c,k),m.current.lastSavedState={...S},m.current.hasPendingChanges=!1;}catch(k){throw g(k,"Save"),k}finally{a(false);}},[t,c,h,g]),y=useRef(ne(async S=>{try{await P(S);}catch(k){console.debug("[WorkflowPersistence] Auto-save failed:",k);}},n.debounceMs||500)),x=useCallback((S,k)=>k?S.currentStepIndex!==k.currentStepIndex||JSON.stringify(S.allData)!==JSON.stringify(k.allData)||JSON.stringify(S.stepData)!==JSON.stringify(k.stepData)||S.visitedSteps.size!==k.visitedSteps.size||!Array.from(S.visitedSteps).every(L=>k.visitedSteps.has(L)):true,[]),E=useCallback(async()=>{h(),o(true);try{let S=await f.current.load(c);return S&&(m.current.lastSavedState={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},m.current.hasPendingChanges=!1),S}catch(S){return g(S,"Load"),null}finally{setTimeout(()=>o(false),100);}},[c,h,g]),N=useCallback(async()=>{h();try{await f.current.remove(c),m.current.lastSavedState=void 0,m.current.hasPendingChanges=!1;}catch(S){throw g(S,"Clear"),S}},[c,h,g]),d=useCallback(async()=>{try{return await f.current.exists(c)}catch(S){return g(S,"Exists check"),false}},[c,g]);useEffect(()=>{u.current.autoPersist&&(s||p||e.isInitializing||e.isSubmitting||e.isTransitioning||x(e,m.current.lastSavedState)&&(m.current.hasPendingChanges=true,y.current(e)));},[e,s,p,x]);let v=useCallback(async()=>{await P(e);},[P,e]);return {isPersisting:s,persistenceError:l,persistNow:v,loadPersistedData:E,clearPersistedData:N,hasPersistedData:d}}function nt(){let{workflowConfig:t,currentStep:e}=w(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>p=>t.steps.find(f=>f.id===p)?.metadata,[t.steps]),i=useMemo(()=>p=>t.steps[p]?.metadata,[t.steps]),s=useMemo(()=>p=>r?p in r:false,[r]),a=useMemo(()=>(p,o)=>r&&p in r?r[p]:o,[r]),l=useMemo(()=>()=>t.steps.map((p,o)=>({id:p.id,title:p.title,index:o,metadata:p.metadata})),[t.steps]),b=useMemo(()=>p=>t.steps.map((o,f)=>({step:o,index:f})).filter(({step:o,index:f})=>p(o.metadata,o.id,f)).map(({step:o})=>o.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:a,getAllStepsMetadata:l,findStepsByMetadata:b}}function se({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),a=useRef(null),l=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,l,t.steps.length]),useEffect(()=>{let u=t.steps[e.currentStepIndex];if(u&&a.current!==u.id){if(a.current&&t.analytics?.onStepComplete){let m=i.current.get(a.current);if(m){let c=Date.now()-m;t.analytics.onStepComplete(a.current,c,e.stepData,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:a.current,duration:c},{timestamp:Date.now(),duration:c,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:c,conditionEvaluationDuration:0},"low");}}a.current=u.id,i.current.set(u.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(u.id,Date.now(),r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:u.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,l,t.id]);let b=useCallback((u,m)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(u,m,r),l&&l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:u,reason:m},void 0,"medium");},[t.analytics,r,l,t.id]),p=useCallback(u=>{t.analytics?.onError&&t.analytics.onError(u,r),l&&l.trackError(u,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,l,t.id,e.currentStepIndex,t.steps]),o=useCallback((u,m,c)=>{if(!l)return;let h={timestamp:Date.now(),duration:c,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:m,navigationDuration:c,conditionEvaluationDuration:0};l.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:u,toStep:m,direction:m>u?"forward":"backward"},h,c>1e3?"medium":"low");},[l,t.id,t.steps.length]),f=useCallback((u,m)=>{if(!l)return;let c={timestamp:Date.now(),duration:u,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:u};l.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:m,currentStepIndex:e.currentStepIndex},c,u>100?"medium":"low");},[l,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:b,trackError:p,trackNavigation:o,trackConditionEvaluation:f}}function oe(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,oe(i,s)):r[s]=i;}return r}function ae(t,e){let r={...t,...e},n=oe(r);return {...r,...n}}function Le(t,e){return {visible:t.visible,skippable:e===true||t.required}}function le({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>ae(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ee(i,n,{visible:true,disabled:false,required:false,readonly:false}),a=useMemo(()=>Le(s,r?.allowSkip),[s,r?.allowSkip]),l=useMemo(()=>{let y={};return t.steps.forEach((x,E)=>{x.conditions&&(y[E]={visible:x.conditions.visible,required:x.conditions.skippable});}),y},[t.steps]),b=Te(l,n),p=useMemo(()=>{let y={};return t.steps.forEach((x,E)=>{let N=b[E];N?y[E]=Le(N,x.allowSkip):y[E]={visible:true,skippable:x.allowSkip===true};}),y},[t.steps,b]),o=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let y={};for(let x of r.formConfig.allFields)x.conditions&&(y[x.id]=x.conditions);return y},[r?.formConfig?.allFields]),f=we(o,n),u=useCallback(y=>y<0||y>=t.steps.length?false:p[y]?.visible??true,[p,t.steps.length]),m=useCallback(y=>y<0||y>=t.steps.length?false:p[y]?.skippable??false,[p,t.steps.length]),c=useCallback(y=>f[y]?.visible??true,[f]),h=useCallback(y=>f[y]?.disabled??false,[f]),g=useCallback(y=>f[y]?.required??false,[f]),P=useCallback(y=>f[y]?.readonly??false,[f]);return {stepConditions:a,fieldConditions:f,allStepConditions:p,isStepVisible:u,isStepSkippable:m,isFieldVisible:c,isFieldDisabled:h,isFieldRequired:g,isFieldReadonly:P}}function pe({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:a,setStepData:l,onStepChange:b}){let p=useRef(b);p.current=b;let o=t.steps[e.currentStepIndex],f=useCallback(()=>({setStepData:(d,v)=>{l(v,d);},setStepFields:(d,v)=>{let k={...e.allData[d]||{},...v};l(k,d);},getStepData:d=>e.allData[d]||{},setNextStepField:(d,v)=>{let S=e.currentStepIndex+1;if(S<t.steps.length){let k=t.steps[S].id,K={...e.allData[k]||{},[d]:v};l(K,k);}},setNextStepFields:d=>{let v=e.currentStepIndex+1;if(v<t.steps.length){let S=t.steps[v].id,L={...e.allData[S]||{},...d};l(L,S);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,l]),u=useCallback(async d=>{if(d<0||d>=t.steps.length||!n.isStepVisible(d))return false;s(true);try{return p.current&&p.current(e.currentStepIndex,d,r),i(d),a(d,t.steps[d].id),!0}catch(v){return console.error("Step transition failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,a]),m=useCallback(d=>{for(let v=d+1;v<t.steps.length;v++)if(n.isStepVisible(v))return v;return null},[t.steps.length,n]),c=useCallback(d=>{for(let v=d-1;v>=0;v--)if(n.isStepVisible(v))return v;return null},[n]),h=useCallback(async()=>{if(o?.onAfterValidation)try{let v=f();await o.onAfterValidation(e.stepData,v,r);}catch(v){return console.error("onAfterValidation failed:",v),t.analytics?.onError&&t.analytics.onError(v,r),false}let d=m(e.currentStepIndex);return d===null?false:u(d)},[o,f,e.stepData,r,t.analytics,e.currentStepIndex,m,u]),g=useCallback(async()=>{let d=c(e.currentStepIndex);return d===null?false:u(d)},[e.currentStepIndex,c,u]),P=useCallback(async()=>!o?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(o.id,"user_skip",r),h()),[o,n,e.currentStepIndex,t.analytics,r,h]),y=useCallback(d=>d<0||d>=t.steps.length?false:n.isStepVisible(d),[t.steps.length,n]),x=useCallback(()=>{let d=m(e.currentStepIndex);return d!==null&&y(d)},[e.currentStepIndex,m,y]),E=useCallback(()=>{let d=c(e.currentStepIndex);return d!==null&&y(d)},[e.currentStepIndex,c,y]),N=useCallback(()=>o?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[o?.allowSkip,n,e.currentStepIndex]);return {goToStep:u,goNext:h,goPrevious:g,skipStep:P,canGoToStep:y,canGoNext:x,canGoPrevious:E,canSkipCurrentStep:N}}function at(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ce({defaultValues:t={},defaultStepIndex:e,persistence:r}){let n={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:true},[i,s]=useReducer(at,n),a=r?.adapter?X({workflowId:r.workflowId,workflowState:i,adapter:r.adapter,options:r.options,userId:r.userId}):null,l=useCallback(g=>{s({type:"SET_CURRENT_STEP",stepIndex:g});},[]),b=useCallback((g,P)=>{s({type:"SET_STEP_DATA",data:g,stepId:P});},[]),p=useCallback((g,P,y)=>{s({type:"SET_FIELD_VALUE",fieldId:g,value:P,stepId:y});},[]),o=useCallback(g=>{s({type:"SET_SUBMITTING",isSubmitting:g});},[]),f=useCallback(g=>{s({type:"SET_TRANSITIONING",isTransitioning:g});},[]),u=useCallback((g,P)=>{s({type:"MARK_STEP_VISITED",stepIndex:g,stepId:P});},[]),m=useCallback(()=>{s({type:"RESET_WORKFLOW"});},[]),c=useCallback(()=>{s({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=useCallback(async()=>{if(!a)return c(),false;try{let g=await a.loadPersistedData();if(g){let P={currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps)};return s({type:"LOAD_PERSISTED_STATE",state:P}),c(),!0}}catch(g){console.error("Failed to load persisted state:",g);}return c(),false},[a,c]);return {workflowState:i,setCurrentStep:l,setStepData:b,setFieldValue:p,setSubmitting:o,setTransitioning:f,markStepVisited:u,resetWorkflow:m,loadPersistedState:h,persistence:a?{isPersisting:a.isPersisting,persistenceError:a.persistenceError,persistNow:a.persistNow,clearPersistedData:a.clearPersistedData,hasPersistedData:a.hasPersistedData}:null}}function de({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let a=useRef(i);a.current=i;let l=useCallback(async()=>{n(true);try{if(a.current&&await a.current(e.allData),t.analytics?.onWorkflowComplete){let p=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,p,e.allData);}}catch(p){throw console.error("Workflow submission failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),p}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),b=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:l,isSubmitting:e.isSubmitting,canSubmit:b()}}var Oe=createContext(null);function fe({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:a}){let l=useRef(i),b=useRef(s);l.current=i,b.current=s;let p=useMemo(()=>{if(!n)return 0;let D=e.steps.findIndex(R=>R.id===n);return D===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):D},[n,e.steps]),{workflowState:o,setCurrentStep:f,setStepData:u,setFieldValue:m,setSubmitting:c,setTransitioning:h,markStepVisited:g,resetWorkflow:P,loadPersistedState:y,persistence:x}=ce({defaultValues:r,defaultStepIndex:p,persistence:e.persistence?{workflowId:e.id,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}:void 0});useEffect(()=>{e.persistence&&y&&y();},[]);let E=useMemo(()=>({isPersisting:x?.isPersisting??false,persistenceError:x?.persistenceError??null,persistNow:x?.persistNow}),[x?.isPersisting,x?.persistenceError,x?.persistNow]),N=useMemo(()=>({workflowId:e.id,currentStepIndex:o.currentStepIndex,totalSteps:e.steps.length,allData:o.allData,stepData:o.stepData,visitedSteps:o.visitedSteps}),[e.id,e.steps.length,o.currentStepIndex,o.allData,o.stepData,o.visitedSteps]),d=useMemo(()=>e.steps[o.currentStepIndex],[e.steps,o.currentStepIndex]),v=useMemo(()=>d?.formConfig,[d?.formConfig]),S=le({workflowConfig:e,workflowState:o,currentStep:d}),k=useMemo(()=>{let D=-1;for(let T=0;T<e.steps.length;T++)if(S.isStepVisible(T)){D=T;break}let R=-1;for(let T=e.steps.length-1;T>=0;T--)if(S.isStepVisible(T)){R=T;break}return {...N,isFirstStep:o.currentStepIndex===D,isLastStep:o.currentStepIndex===R}},[N,o.currentStepIndex,S,e.steps.length]),{analyticsStartTime:L}=se({workflowConfig:e,workflowState:o,workflowContext:k}),{goToStep:K,goNext:$,goPrevious:ge,skipStep:ye,canGoToStep:be,canGoNext:ve,canGoPrevious:he,canSkipCurrentStep:xe}=pe({workflowConfig:e,workflowState:o,workflowContext:k,conditionsHelpers:S,setCurrentStep:f,setTransitioning:h,markStepVisited:g,setStepData:u,onStepChange:l.current});useEffect(()=>{if(!S.isStepVisible(o.currentStepIndex)){for(let R=0;R<e.steps.length;R++)if(S.isStepVisible(R)){f(R),g(R,e.steps[R].id);break}}},[S,o.currentStepIndex,e.steps,f,g]);let{submitWorkflow:q,isSubmitting:ke,canSubmit:Ie}=de({workflowConfig:e,workflowState:o,workflowContext:k,setSubmitting:c,onWorkflowComplete:b.current,analyticsStartTime:L}),j=useCallback((D,R)=>{m(D,R,d?.id||"");},[m,d?.id]),Pe=useCallback(D=>{u(D,d?.id||"");},[u,d?.id]),$e=useCallback(async D=>{d?.id&&D&&u(D,d.id),k.isLastStep?await q():await $();},[k.isLastStep,q,$,d?.id,u]),We=useMemo(()=>({goToStep:K,goNext:$,goPrevious:ge,skipStep:ye,canGoToStep:be,canGoNext:ve,canGoPrevious:he,canSkipCurrentStep:xe}),[K,$,ge,ye,be,ve,he,xe]),De=useMemo(()=>({setValue:j,setStepData:Pe,resetWorkflow:P}),[j,Pe,P]),Re=useMemo(()=>({submitWorkflow:q,isSubmitting:ke,canSubmit:Ie}),[q,ke,Ie]),qe=useMemo(()=>({workflowState:o,workflowConfig:e,currentStep:d,context:k,formConfig:v,conditionsHelpers:S,currentStepMetadata:d?.metadata,...We,...De,...Re,persistNow:E.persistNow,isPersisting:E.isPersisting,persistenceError:E.persistenceError}),[o,e,d,k,v,S,We,De,Re,E]),ze=useMemo(()=>{if(!d?.id)return {};let D=o?.allData[d.id]||{};if(!v?.allFields)return D;let R=new Set(v.allFields.map(z=>z.id)),T={};for(let[z,Xe]of Object.entries(D))R.has(z)&&(T[z]=Xe);return T},[o?.allData,d?.id,v?.allFields]),Je=useMemo(()=>o.isInitializing.toString(),[o.isInitializing]);return jsx(Oe.Provider,{value:qe,children:jsx(FormProvider,{formConfig:v,defaultValues:ze,onFieldChange:j,"data-workflow-id":e.id,className:a,onSubmit:$e,children:t},Je)})}function w(){let t=useContext(Oe);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function St({children:t,workflowConfig:e,...r}){let[n,i]=useState(),s=useMemo(()=>e instanceof U?e.build():e,[e]);return useEffect(()=>{if(typeof window<"u"&&_.shouldDisplayWatermark()){let l=_.getWatermarkMessage();i(l);}},[]),jsxs("div",{style:{position:"relative"},children:[jsx(fe,{...r,workflowConfig:s,children:t}),n&&jsx("div",{style:{position:"absolute",top:"10px",right:"10px",background:"rgba(0, 0, 0, 0.8)",color:"white",padding:"4px 8px",borderRadius:"4px",fontSize:"12px",fontFamily:"monospace",zIndex:1e3,pointerEvents:"none",opacity:.7},children:n})]})}var vt=bt.memo(function({stepId:e,children:r}){let{currentStep:n}=w();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Wt=bt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:a,currentStep:l}=w(),{submit:b,formState:p}=useFormContext(),o=useMemo(()=>{let m=p.isSubmitting||s.isSubmitting,c=r??m,h=!s.isTransitioning&&!c;return {finalIsSubmitting:c,canGoNext:h}},[p.isSubmitting,s.isSubmitting,s.isTransitioning,r]),f=useCallback(async m=>{m?.preventDefault(),o.canGoNext&&await b(m);},[o.canGoNext,b]),u=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:o.canGoNext,isSubmitting:o.finalIsSubmitting,onSubmit:f,className:e,currentStep:l,stepData:p.values||{},allData:i.allData,context:i}),[i.isLastStep,o.canGoNext,o.finalIsSubmitting,f,e,l,p.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:a.renderConfig?.nextButtonRenderer,props:u,...n})});var Ct=bt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:a,workflowConfig:l,currentStep:b}=w(),{formState:p}=useFormContext(),o=useMemo(()=>{let m=p.isSubmitting||a.isSubmitting,c=r??m,h=i.currentStepIndex>0&&!a.isTransitioning&&!c;return {finalIsSubmitting:c,canGoPrevious:h}},[p.isSubmitting,a.isSubmitting,a.isTransitioning,i.currentStepIndex,r]),f=useCallback(async m=>{m?.preventDefault(),o.canGoPrevious&&await s();},[o.canGoPrevious,s]),u=useMemo(()=>({canGoPrevious:o.canGoPrevious,isSubmitting:o.finalIsSubmitting,onPrevious:f,className:e,currentStep:b,stepData:p.values||{},allData:i.allData,context:i}),[o.canGoPrevious,o.finalIsSubmitting,f,e,b,p.values,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:l.renderConfig?.previousButtonRenderer,props:u,...n})});var Bt=bt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:a,workflowConfig:l,context:b,conditionsHelpers:p}=w(),{formState:o}=useFormContext(),f=useMemo(()=>{let c=o.isSubmitting||a.isSubmitting,h=r??c,g=(!!i?.allowSkip||p.isStepSkippable(a.currentStepIndex))&&!a.isTransitioning&&!h;return {finalIsSubmitting:h,canSkip:g}},[o.isSubmitting,a.isSubmitting,a.isTransitioning,a.currentStepIndex,i?.allowSkip,p.isStepSkippable,r]),u=useCallback(async c=>{c?.preventDefault(),f.canSkip&&await s();},[f.canSkip,s]),m=useMemo(()=>({canSkip:f.canSkip,isSubmitting:f.finalIsSubmitting,onSkip:u,className:e,currentStep:i,stepData:o.values||{},allData:b.allData,context:b}),[f.canSkip,f.finalIsSubmitting,u,e,i,o.values,b.allData,b]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:l.renderConfig?.skipButtonRenderer,props:m,...n})});var Gt=bt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,goToStep:a,conditionsHelpers:l}=w(),{visibleSteps:b,visibleToOriginalIndexMap:p,originalToVisibleIndexMap:o}=useMemo(()=>{let c=[],h=new Map,g=new Map;return i.steps.forEach((P,y)=>{if(l.isStepVisible(y)){let x=c.length;c.push(P),h.set(x,y),g.set(y,x);}}),{visibleSteps:c,visibleToOriginalIndexMap:h,originalToVisibleIndexMap:g}},[i.steps,l]),f=useCallback(c=>{let h=p.get(c);h!==void 0&&(e?e(h):a(h));},[p,e,a]),u=useMemo(()=>o.get(s.currentStepIndex)??-1,[o,s.currentStepIndex]),m=useMemo(()=>({steps:b,currentStepIndex:u,visitedSteps:s.visitedSteps,onStepClick:f,className:r}),[b,u,s.visitedSteps,f,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:m,...n})});var Se=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),a=this.compress?this.compressData(s):s;localStorage.setItem(n,a);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},a=JSON.stringify(s),l=this.compress?this.compressData(a):a;localStorage.setItem(i,l);}catch(i){throw new W("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new W(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new W("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new W(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new W("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new W(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new W("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new W(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new W("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new W(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new W("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,a=JSON.parse(s);a.expiresAt&&Date.now()>a.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};
2
+ export{Se as LocalStorageAdapter,_ as RilayLicenseManager,St as Workflow,vt as WorkflowBody,Wt as WorkflowNextButton,W as WorkflowPersistenceError,Ct as WorkflowPreviousButton,fe as WorkflowProvider,Bt as WorkflowSkipButton,Gt as WorkflowStepper,ae as combineWorkflowDataForConditions,ne as debounce,oe as flattenObject,U as flow,re as generateStorageKey,rt as mergePersistedState,Ce as persistedToWorkflowState,ee as useConditionEvaluation,X as usePersistence,nt as useStepMetadata,se as useWorkflowAnalytics,le as useWorkflowConditions,w as useWorkflowContext,pe as useWorkflowNavigation,ce as useWorkflowState,de as useWorkflowSubmission,tt as validatePersistedData,te as workflowStateToPersisted};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rilaykit/workflow",
3
- "version": "9.0.1",
3
+ "version": "10.0.0",
4
4
  "description": "Commercial workflow and multi-step form utilities for RilayKit - License required for all use",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -34,8 +34,8 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@noble/ed25519": "^1.7.1",
37
- "@rilaykit/core": "9.0.1",
38
- "@rilaykit/forms": "9.0.1"
37
+ "@rilaykit/forms": "10.0.0",
38
+ "@rilaykit/core": "10.0.0"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=18.0.0",