wizzard-stepper-react 1.5.2 → 1.7.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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../src/components/WizardStepRenderer.tsx","../src/hooks/useWizard.ts","../src/factory.tsx","../src/adapters/persistence/LocalStorageAdapter.ts","../src/adapters/validation/ZodAdapter.ts","../src/adapters/validation/YupAdapter.ts"],"sourcesContent":["export * from './types';\nexport * from './context/WizardContext';\n\n// Components\nexport { WizardStepRenderer } from \"./components/WizardStepRenderer\";\n\n// Utils\nexport { createWizardFactory } from \"./factory\";\nexport * from './hooks/useWizard';\n\nexport * from './adapters/persistence/MemoryAdapter';\nexport * from './adapters/persistence/LocalStorageAdapter';\n\nexport * from './adapters/validation/ZodAdapter';\nexport * from './adapters/validation/YupAdapter';\nexport * from './utils/data';\n","import React, {\n createContext,\n useContext,\n useEffect,\n useMemo,\n useState,\n useCallback,\n useSyncExternalStore,\n useRef,\n useTransition,\n} from \"react\";\nimport type {\n IWizardConfig,\n PersistenceMode,\n IPersistenceAdapter,\n IStepConfig,\n IWizardContext,\n} from \"../types\";\nimport { MemoryAdapter } from \"../adapters/persistence/MemoryAdapter\";\nimport { getByPath, setByPath } from \"../utils/data\";\n\nexport interface IWizardState<T = unknown> {\n currentStep: IStepConfig<unknown, T> | null;\n currentStepIndex: number;\n isFirstStep: boolean;\n isLastStep: boolean;\n isLoading: boolean;\n isPending: boolean;\n activeSteps: IStepConfig<unknown, T>[];\n visitedSteps: Set<string>;\n completedSteps: Set<string>;\n errorSteps: Set<string>;\n store: WizardStore<T>;\n}\n\nexport interface IWizardActions {\n goToNextStep: () => Promise<void>;\n goToPrevStep: () => void;\n goToStep: (stepId: string) => Promise<boolean>;\n setStepData: (stepId: string, data: unknown) => void;\n handleStepChange: (field: string, value: unknown) => void;\n validateStep: (sid: string) => Promise<boolean>;\n validateAll: () => Promise<{\n isValid: boolean;\n errors: Record<string, Record<string, string>>;\n }>;\n save: () => void;\n clearStorage: () => void;\n setData: (\n path: string,\n value: unknown,\n options?: { debounceValidation?: number }\n ) => void;\n updateData: (data: Partial<any>, options?: { replace?: boolean }) => void;\n getData: (path: string, defaultValue?: unknown) => unknown;\n}\n\nconst WizardStateContext = createContext<IWizardState<any> | undefined>(\n undefined\n);\nconst WizardActionsContext = createContext<IWizardActions | undefined>(\n undefined\n);\n\n// Advanced: Store for granular subscriptions\nexport class WizardStore<T> {\n private state: { data: T; errors: Record<string, Record<string, string>> };\n private listeners: Set<() => void> = new Set();\n\n constructor(initialData: T) {\n this.state = { data: initialData, errors: {} };\n }\n\n getSnapshot = () => this.state;\n\n update(newData: T) {\n this.state = { ...this.state, data: newData };\n this.notify();\n }\n\n updateErrors(newErrors: Record<string, Record<string, string>>) {\n this.state = { ...this.state, errors: newErrors };\n this.notify();\n }\n\n private notify() {\n this.listeners.forEach((l) => l());\n }\n\n subscribe = (listener: () => void) => {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n };\n}\n\ninterface WizardProviderProps<T> {\n config: IWizardConfig<T>;\n initialData?: T;\n initialStepId?: string; // New: Start from any step\n children: React.ReactNode;\n}\n\nexport function WizardProvider<T extends Record<string, any>>({\n config,\n initialData,\n initialStepId,\n children,\n}: WizardProviderProps<T>) {\n const [currentStepId, setCurrentStepId] = useState<string>(\"\");\n const [visitedSteps, setVisitedSteps] = useState<Set<string>>(new Set());\n const [completedSteps, setCompletedSteps] = useState<Set<string>>(new Set());\n const [errorSteps, setErrorSteps] = useState<Set<string>>(new Set());\n const [, setAllErrorsState] = useState<\n Record<string, Record<string, string>>\n >({});\n const [isLoading, setIsLoading] = useState<boolean>(true);\n const [isPending, startTransition] = useTransition();\n\n // Store for granular data and errors\n const storeRef = useRef(new WizardStore<T>((initialData || {}) as T));\n\n // local state for dependencies\n const [wizardData, setWizardData] = useState<T>((initialData || {}) as T);\n\n // Persistence Setup\n const persistenceAdapter = useMemo<IPersistenceAdapter>(() => {\n return config.persistence?.adapter || new MemoryAdapter();\n }, [config.persistence?.adapter]);\n\n const persistenceMode = config.persistence?.mode || \"onStepChange\";\n\n // Calculate Active Steps (Conditional Logic) - Stabilized to prevent global re-renders\n const [activeSteps, setActiveSteps] = useState(() =>\n config.steps.filter((s) => !s.condition || s.condition(wizardData))\n );\n\n useEffect(() => {\n const nextActiveSteps = config.steps.filter((step) => {\n if (step.condition) {\n return step.condition(wizardData);\n }\n return true;\n });\n\n // Simple ID check for stability\n const currentIds = activeSteps.map((s) => s.id).join(\",\");\n const nextIds = nextActiveSteps.map((s) => s.id).join(\",\");\n\n if (currentIds !== nextIds) {\n setActiveSteps(nextActiveSteps);\n }\n }, [config.steps, wizardData, activeSteps]);\n\n // Set initial step if not set (with optional initialStepId)\n useEffect(() => {\n if (!currentStepId && activeSteps.length > 0) {\n if (initialStepId) {\n // Validation: verify initialStepId exists in active steps\n const target = activeSteps.find((s) => s.id === initialStepId);\n if (target) {\n setCurrentStepId(target.id);\n } else {\n // Fallback if initial is invalid/hidden\n setCurrentStepId(activeSteps[0].id);\n }\n } else {\n setCurrentStepId(activeSteps[0].id);\n }\n setIsLoading(false);\n }\n }, [activeSteps, currentStepId, initialStepId]);\n\n // Derived state\n const currentStep = useMemo(\n () => activeSteps.find((s) => s.id === currentStepId) || null,\n [activeSteps, currentStepId]\n );\n const currentStepIndex = useMemo(\n () => activeSteps.findIndex((s) => s.id === currentStepId),\n [activeSteps, currentStepId]\n );\n const isFirstStep = currentStepIndex === 0;\n const isLastStep = currentStepIndex === activeSteps.length - 1;\n\n // Constants\n const META_KEY = \"__wizzard_meta__\";\n\n // Hydration Helper\n const hydrate = useCallback(() => {\n setIsLoading(true);\n\n const metaFn = persistenceAdapter.getStep<{\n currentStepId: string;\n visited: string[];\n completed: string[];\n }>(META_KEY);\n\n if (metaFn) {\n if (metaFn.currentStepId) setCurrentStepId(metaFn.currentStepId);\n if (metaFn.visited) setVisitedSteps(new Set(metaFn.visited));\n if (metaFn.completed) setCompletedSteps(new Set(metaFn.completed));\n }\n\n const loadedData: Partial<T> = {};\n config.steps.forEach((step) => {\n const stepData = persistenceAdapter.getStep(step.id);\n if (stepData) {\n Object.assign(loadedData, stepData);\n }\n });\n\n if (Object.keys(loadedData).length > 0) {\n setWizardData((prev) => {\n const newData = { ...prev, ...loadedData };\n storeRef.current.update(newData);\n return newData;\n });\n }\n setIsLoading(false);\n }, [config.steps, persistenceAdapter]);\n\n useEffect(() => {\n hydrate();\n }, [hydrate]);\n\n // Save logic stabilized\n const saveData = useCallback(\n (mode: PersistenceMode, stepId: string, data: any) => {\n // Granular Check: Does the current step have a custom adapter?\n const stepConfig = config.steps.find((s) => s.id === stepId);\n const stepAdapter = stepConfig?.persistenceAdapter;\n\n // Determine which adapter to use (Granular > Global > Default)\n const adapterToUse = stepAdapter || persistenceAdapter;\n\n if (mode === persistenceMode || mode === \"manual\") {\n adapterToUse.saveStep(stepId, data);\n }\n },\n [persistenceAdapter, persistenceMode, config.steps]\n );\n\n // Debounce timeout for validation\n const validationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\n null\n );\n\n const validateStep = useCallback(\n async (stepId: string, data: T): Promise<boolean> => {\n const step = config.steps.find((s) => s.id === stepId);\n if (!step || !step.validationAdapter) return true;\n\n const result = await step.validationAdapter.validate(data);\n\n if (!result.isValid) {\n const newAllErrors = {\n ...storeRef.current.getSnapshot().errors,\n [stepId]: result.errors || {},\n };\n storeRef.current.updateErrors(newAllErrors);\n setAllErrorsState(newAllErrors);\n setErrorSteps((prev) => {\n const next = new Set(prev);\n next.add(stepId);\n return next;\n });\n return false;\n } else {\n const newAllErrors = { ...storeRef.current.getSnapshot().errors };\n delete newAllErrors[stepId];\n storeRef.current.updateErrors(newAllErrors);\n setAllErrorsState(newAllErrors);\n setErrorSteps((prev) => {\n const next = new Set(prev);\n next.delete(stepId);\n return next;\n });\n return true;\n }\n },\n [config.steps]\n );\n\n // Actions stabilized with useCallback\n const setStepData = useCallback(\n (stepId: string, data: any) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = { ...prevData, ...data };\n\n storeRef.current.update(newData);\n startTransition(() => {\n setWizardData(newData);\n });\n\n if (persistenceMode === \"onChange\") {\n saveData(\"onChange\", stepId, newData);\n }\n },\n [persistenceMode, saveData]\n );\n\n const setData = useCallback(\n (path: string, value: any, options?: { debounceValidation?: number }) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = setByPath(prevData, path, value);\n\n // 1. Immediate store update (for useWizardValue)\n storeRef.current.update(newData);\n\n // 2. Transition update (for useWizardState/Summary)\n startTransition(() => {\n setWizardData(newData);\n });\n\n // 3. Debounced validation logic\n if (options?.debounceValidation) {\n if (validationTimeoutRef.current)\n clearTimeout(validationTimeoutRef.current);\n validationTimeoutRef.current = setTimeout(() => {\n try {\n validateStep(currentStepId, newData).catch((err) => {\n console.error(\"[Wizard] Debounced validation failed:\", err);\n });\n } catch (e) {\n console.error(\"[Wizard] Error starting validation:\", e);\n }\n }, options.debounceValidation);\n } else {\n validateStep(currentStepId, newData);\n }\n\n if (persistenceMode === \"onChange\") {\n saveData(\"onChange\", currentStepId, newData);\n }\n },\n [persistenceMode, saveData, currentStepId, validateStep]\n );\n\n const updateData = useCallback(\n (data: Partial<T>, options?: { replace?: boolean }) => {\n const prevData = storeRef.current.getSnapshot().data;\n const newData = options?.replace ? (data as T) : { ...prevData, ...data };\n\n // 1. Update Store\n storeRef.current.update(newData);\n\n // 2. Update React State\n startTransition(() => {\n setWizardData(newData);\n });\n\n // 3. Persist\n // Auto-fill should implicitly update storage regardless of mode\n config.steps.forEach((step) => {\n saveData(\"manual\", step.id, newData);\n });\n },\n [saveData, config.steps]\n );\n\n const getData = useCallback((path: string, defaultValue?: any) => {\n return getByPath(storeRef.current.getSnapshot().data, path, defaultValue);\n }, []);\n\n // Action: Handle specific field change (helper)\n const handleStepChange = useCallback(\n (field: string, value: any) => {\n if (!currentStepId) return;\n setData(field, value);\n },\n [setData, currentStepId]\n );\n\n const validateAll = useCallback(async (): Promise<{\n isValid: boolean;\n errors: Record<string, Record<string, string>>;\n }> => {\n let isValid = true;\n const currentData = storeRef.current.getSnapshot().data;\n for (const step of activeSteps) {\n const stepValid = await validateStep(step.id, currentData);\n if (!stepValid) isValid = false;\n }\n const finalErrors = storeRef.current.getSnapshot().errors;\n return { isValid, errors: finalErrors };\n }, [activeSteps, validateStep]);\n\n const goToStep = useCallback(\n async (stepId: string): Promise<boolean> => {\n const targetIndex = activeSteps.findIndex((s) => s.id === stepId);\n if (targetIndex === -1) return false;\n\n const currentData = storeRef.current.getSnapshot().data;\n\n if (targetIndex > currentStepIndex) {\n const shouldValidate =\n currentStep?.autoValidate ?? config.autoValidate ?? true;\n if (shouldValidate) {\n const isValid = await validateStep(currentStepId, currentData);\n if (!isValid) return false;\n }\n }\n\n if (persistenceMode === \"onStepChange\" && currentStep) {\n saveData(\"onStepChange\", currentStepId, currentData);\n }\n\n const nextVisited = new Set(visitedSteps).add(currentStepId);\n setVisitedSteps(nextVisited);\n setCurrentStepId(stepId);\n\n if (persistenceMode !== \"manual\") {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: stepId,\n visited: Array.from(nextVisited),\n completed: Array.from(completedSteps),\n });\n }\n\n // Lifecycle Callback\n if (config.onStepChange) {\n config.onStepChange(currentStepId, stepId, currentData); // Call hook\n }\n\n window.scrollTo(0, 0);\n return true;\n },\n [\n activeSteps,\n currentStepId,\n currentStep,\n currentStepIndex,\n config.autoValidate,\n persistenceMode,\n saveData,\n validateStep,\n visitedSteps,\n completedSteps,\n persistenceAdapter,\n ]\n );\n\n const goToNextStep = useCallback(async () => {\n if (isLastStep) return;\n const nextStep = activeSteps[currentStepIndex + 1];\n if (nextStep) {\n const success = await goToStep(nextStep.id);\n if (success) {\n const nextCompleted = new Set(completedSteps).add(currentStepId);\n setCompletedSteps(nextCompleted);\n\n if (persistenceMode !== \"manual\") {\n persistenceAdapter.saveStep(META_KEY, {\n currentStepId: nextStep.id,\n visited: Array.from(new Set(visitedSteps).add(currentStepId)),\n completed: Array.from(nextCompleted),\n });\n }\n }\n }\n }, [\n activeSteps,\n currentStepIndex,\n isLastStep,\n currentStepId,\n goToStep,\n visitedSteps,\n completedSteps,\n persistenceMode,\n persistenceAdapter,\n ]);\n\n const goToPrevStep = useCallback(() => {\n if (isFirstStep) return;\n const prevStep = activeSteps[currentStepIndex - 1];\n if (prevStep) {\n goToStep(prevStep.id);\n }\n }, [activeSteps, currentStepIndex, isFirstStep, goToStep]);\n\n const clearStorage = useCallback(\n () => persistenceAdapter.clear(),\n [persistenceAdapter]\n );\n\n const save = useCallback(\n () =>\n saveData(\"manual\", currentStepId, storeRef.current.getSnapshot().data),\n [saveData, currentStepId]\n );\n\n // Split values\n const stateValue = useMemo<IWizardState<T>>(\n () => ({\n currentStep,\n currentStepIndex,\n isFirstStep,\n isLastStep,\n isLoading,\n isPending,\n activeSteps,\n visitedSteps,\n completedSteps,\n errorSteps,\n store: storeRef.current,\n }),\n [\n currentStep,\n currentStepIndex,\n isFirstStep,\n isLastStep,\n isLoading,\n isPending,\n activeSteps,\n visitedSteps,\n completedSteps,\n errorSteps,\n ]\n );\n\n const actionsValue = useMemo<IWizardActions>(\n () => ({\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep: (sid: string) =>\n validateStep(sid, storeRef.current.getSnapshot().data),\n validateAll,\n save,\n clearStorage,\n setData,\n updateData,\n getData,\n }),\n [\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep,\n validateAll,\n save,\n clearStorage,\n setData,\n updateData,\n getData,\n ]\n );\n\n return (\n <WizardStateContext.Provider value={stateValue}>\n <WizardActionsContext.Provider value={actionsValue}>\n {children}\n </WizardActionsContext.Provider>\n </WizardStateContext.Provider>\n );\n}\n\nexport function useWizardState<T = unknown>(): IWizardState<T> {\n const context = useContext(WizardStateContext);\n if (!context) {\n throw new Error(\"useWizardState must be used within a WizardProvider\");\n }\n return context as IWizardState<T>;\n}\n\nexport function useWizardValue<TValue = any>(path: string): TValue {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastValueRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n const data = fullState.data;\n if (data === lastStateRef.current) {\n return lastValueRef.current;\n }\n const value = getByPath(data, path);\n lastStateRef.current = data;\n lastValueRef.current = value;\n return value;\n }, [store, path]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardError(path: string): string | undefined {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastValueRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n const errors = fullState.errors;\n if (errors === lastStateRef.current) {\n return lastValueRef.current;\n }\n\n // Flatten errors from all steps or use a specific step?\n // Usually validation results are nested like { children: { \"0.name\": \"error\" } }\n // but the adapter flattened them to \"children.0.name\"\n let foundError: string | undefined;\n Object.values(errors).forEach((stepErrors) => {\n const typedStepErrors = stepErrors as Record<string, string>;\n if (typedStepErrors[path]) foundError = typedStepErrors[path];\n });\n\n lastStateRef.current = errors;\n lastValueRef.current = foundError;\n return foundError;\n }, [store, path]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardSelector<TSelected = any>(\n selector: (state: any) => TSelected\n): TSelected {\n const { store } = useWizardState();\n const lastStateRef = useRef<any>(null);\n const lastResultRef = useRef<any>(null);\n\n const getSnapshot = useCallback(() => {\n const fullState = store.getSnapshot();\n if (fullState === lastStateRef.current) {\n return lastResultRef.current;\n }\n // We pass only data to the selector for convenience, or the whole store state?\n // Let's pass the whole thing in case they need errors\n const result = selector(fullState.data);\n lastStateRef.current = fullState;\n lastResultRef.current = result;\n return result;\n }, [store, selector]);\n\n return useSyncExternalStore(store.subscribe, getSnapshot);\n}\n\nexport function useWizardActions(): IWizardActions {\n const context = useContext(WizardActionsContext);\n if (!context) {\n throw new Error(\"useWizardActions must be used within a WizardProvider\");\n }\n return context;\n}\n\nexport function useWizardContext<T = any>(): IWizardContext<T> & {\n store: WizardStore<T>;\n} {\n const state = useWizardState<T>();\n const actions = useWizardActions();\n\n // Backward compatibility: subscribe to everything\n const wizardData = useWizardSelector<T>((s) => s as T);\n const fullState = state.store.getSnapshot();\n\n return useMemo(\n () => ({\n ...state,\n ...actions,\n wizardData,\n allErrors: fullState.errors,\n }),\n [state, actions, wizardData, fullState.errors]\n );\n}\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class MemoryAdapter implements IPersistenceAdapter {\n private storage: Record<string, any> = {};\n\n saveStep<T>(stepId: string, data: T): void {\n this.storage[stepId] = data;\n }\n\n getStep<T>(stepId: string): T | undefined {\n return this.storage[stepId] as T;\n }\n\n clear(): void {\n this.storage = {};\n }\n}\n","/**\n * Retrieves a value from an object by path (dot notation or brackets)\n */\nexport function getByPath(obj: any, path: string, defaultValue?: unknown): unknown {\n if (!path) return obj;\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n let result = obj;\n for (const key of keys) {\n if (result === undefined || result === null) return defaultValue;\n result = result[key];\n }\n return result !== undefined ? result : defaultValue;\n}\n\n/**\n * Immutably sets a value in an object by path\n */\nexport function setByPath<T extends object>(obj: T, path: string, value: unknown): T {\n if (!path) return value as unknown as T;\n if (!path.includes('.') && !path.includes('[') && !path.includes(']')) {\n return { ...obj, [path]: value };\n }\n const keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\n\n const update = (current: any, index: number): any => {\n if (index === keys.length) return value;\n\n const key = keys[index];\n const isKeyNumeric = !isNaN(Number(key)) && key.trim() !== '';\n\n let nextLevel = current;\n if (!nextLevel || typeof nextLevel !== 'object') {\n nextLevel = isKeyNumeric ? [] : {};\n } else {\n nextLevel = Array.isArray(nextLevel) ? [...nextLevel] : { ...nextLevel };\n }\n\n const nextKey = isKeyNumeric ? Number(key) : key;\n nextLevel[nextKey] = update(nextLevel[nextKey], index + 1);\n return nextLevel;\n };\n\n return update(obj, 0);\n}\n","import React, { useMemo } from \"react\";\nimport { useWizardContext } from \"../context/WizardContext\";\n\ninterface WizardStepRendererProps {\n /**\n * Optional wrapper component for each step.\n * Useful for adding animations (e.g., Framer Motion).\n */\n wrapper?: React.ComponentType<{ children: React.ReactNode; key: string }>;\n}\n\n/**\n * A declarative component that renders the current step based on the configuration.\n * It looks for the `component` property in your `steps` config.\n */\nexport const WizardStepRenderer: React.FC<WizardStepRendererProps> = ({\n wrapper: Wrapper,\n}) => {\n const { currentStep } = useWizardContext();\n\n const StepComponent = useMemo(() => {\n if (!currentStep?.component) return null;\n return currentStep.component;\n }, [currentStep]);\n\n if (!currentStep || !StepComponent) {\n return null;\n }\n\n const content = <StepComponent />;\n\n if (Wrapper) {\n return <Wrapper key={currentStep.id}>{content}</Wrapper>;\n }\n\n return content;\n};\n","import { useWizardContext } from '../context/WizardContext';\nimport type { IWizardContext } from '../types';\n\nexport const useWizard = <T = any>(): IWizardContext<T> => {\n return useWizardContext<T>();\n};\n","import React from \"react\";\nimport {\n WizardProvider as BaseWizardProvider,\n useWizardContext as useBaseWizardContext,\n useWizardValue as useBaseWizardValue,\n useWizardSelector as useBaseWizardSelector,\n useWizardError as useBaseWizardError,\n useWizardActions as useBaseWizardActions,\n useWizardState as useBaseWizardState,\n} from \"./context/WizardContext\";\nimport { useWizard as useBaseWizard } from \"./hooks/useWizard\";\nimport type { IWizardConfig, IWizardContext, IStepConfig } from \"./types\";\nimport type { Path, PathValue } from \"./utils/types\";\n\n/**\n * createWizardFactory\n *\n * Creates a strongly-typed set of Wizard components and hooks for a specific data schema.\n * This ensures full type safety across your entire wizard implementation without manual casting.\n *\n * @template TSchema The shape of your wizard's global data state\n */\nexport function createWizardFactory<TSchema extends Record<string, any>>() {\n /**\n * Typed Provider\n */\n const WizardProvider = ({\n config,\n initialData,\n children,\n }: {\n config: IWizardConfig<TSchema>;\n initialData?: Partial<TSchema>;\n children: React.ReactNode;\n }) => {\n return (\n <BaseWizardProvider<TSchema>\n config={config}\n initialData={initialData as TSchema}\n >\n {children}\n </BaseWizardProvider>\n );\n };\n\n /**\n * Typed useWizard\n * Returns the full context with TSchema typed data and methods\n */\n const useWizard = (): IWizardContext<TSchema> => {\n return useBaseWizard<TSchema>();\n };\n\n /**\n * Typed useWizardContext\n * similar to useWizard but explicit about strict context usage\n */\n const useWizardContext = () => {\n return useBaseWizardContext<TSchema>();\n };\n\n /**\n * Typed useWizardValue\n * @param path Dot-notation path to the value\n */\n const useWizardValue = <P extends Path<TSchema>>(\n path: P\n ): PathValue<TSchema, P> => {\n return useBaseWizardValue<PathValue<TSchema, P>>(path);\n };\n\n /**\n * Typed useWizardSelector\n * @param selector Function to select a slice of state\n */\n const useWizardSelector = <TSelected,>(\n selector: (state: TSchema) => TSelected\n ): TSelected => {\n return useBaseWizardSelector<TSelected>(selector);\n };\n\n /**\n * Typed useWizardError\n * @param path Dot-notation path to check for errors\n */\n const useWizardError = <P extends Path<TSchema>>(\n path: P\n ): string | undefined => {\n return useBaseWizardError(path);\n };\n\n /**\n * Typed useWizardActions\n * No generic needed for actions usually, but we wrap it for consistency\n */\n const useWizardActions = () => {\n return useBaseWizardActions();\n };\n\n /**\n * Typed useWizardState\n * Access to raw internal state if needed (advanced)\n */\n const useWizardState = () => {\n return useBaseWizardState();\n };\n\n /**\n * Helper to create a typed step configuration.\n * By using this helper, TypeScript can infer TStepData from the validationAdapter or other properties.\n */\n const createStep = <TStepData = unknown,>(\n config: IStepConfig<TStepData, TSchema>\n ) => config;\n\n return {\n WizardProvider,\n useWizard,\n useWizardContext,\n useWizardValue,\n useWizardSelector,\n useWizardError,\n useWizardActions,\n useWizardState,\n createStep,\n };\n}\n","import type { IPersistenceAdapter } from '../../types';\n\nexport class LocalStorageAdapter implements IPersistenceAdapter {\n private prefix: string;\n\n constructor(prefix: string = 'wizard_') {\n this.prefix = prefix;\n }\n\n private getKey(stepId: string): string {\n return `${this.prefix}${stepId}`;\n }\n\n saveStep<T>(stepId: string, data: T): void {\n if (typeof window === 'undefined') return;\n try {\n localStorage.setItem(this.getKey(stepId), JSON.stringify(data));\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to save step', error);\n }\n }\n\n getStep<T>(stepId: string): T | undefined {\n if (typeof window === 'undefined') return undefined;\n try {\n const item = localStorage.getItem(this.getKey(stepId));\n return item ? JSON.parse(item) : undefined;\n } catch (error) {\n console.warn('LocalStorageAdapter: Failed to get step', error);\n return undefined;\n }\n }\n\n clear(): void {\n if (typeof window === 'undefined') return;\n Object.keys(localStorage).forEach((key) => {\n if (key.startsWith(this.prefix)) {\n localStorage.removeItem(key);\n }\n });\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport type { ZodLikeSchema } from './internal-types';\n\nexport class ZodAdapter<T> implements IValidatorAdapter<T> {\n private schema: ZodLikeSchema<T>;\n\n constructor(schema: ZodLikeSchema<T>) {\n this.schema = schema;\n }\n\n async validate(data: unknown): Promise<ValidationResult> {\n const result = await this.schema.safeParseAsync(data as T);\n if (result.success) {\n return { isValid: true };\n }\n\n // Explicitly handle error case\n const errors: Record<string, string> = {};\n if (result.error) {\n result.error.issues.forEach((err) => {\n const path = err.path.join('.'); // nested.field\n errors[path] = err.message;\n });\n }\n return { isValid: false, errors };\n }\n}\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\nimport type { YupLikeSchema, YupLikeError } from './internal-types';\n\nexport class YupAdapter<T> implements IValidatorAdapter<T> {\n private schema: YupLikeSchema<T>;\n\n constructor(schema: YupLikeSchema<T>) {\n this.schema = schema;\n }\n\n async validate(data: unknown): Promise<ValidationResult> {\n try {\n await this.schema.validate(data as T, { abortEarly: false });\n return { isValid: true };\n } catch (err) {\n if (err && typeof err === 'object' && 'inner' in err) {\n const yupError = err as YupLikeError;\n const errors: Record<string, string> = {};\n yupError.inner.forEach((error) => {\n if (error.path) {\n errors[error.path] = error.message;\n }\n });\n return { isValid: false, errors };\n }\n throw err;\n }\n }\n}\n"],"mappings":"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","names":["import_react","import_jsx_runtime","import_jsx_runtime","WizardProvider","useWizard","useWizardContext","useWizardValue","useWizardSelector","useWizardError","useWizardActions","useWizardState"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../src/components/WizardStepRenderer.tsx","../src/hooks/useWizard.ts","../src/factory.tsx","../src/adapters/persistence/LocalStorageAdapter.ts","../src/adapters/validation/ZodAdapter.ts","../src/adapters/validation/YupAdapter.ts"],"sourcesContent":["export * from './types';\r\nexport * from './context/WizardContext';\r\n\r\n// Components\r\nexport { WizardStepRenderer } from \"./components/WizardStepRenderer\";\r\n\r\n// Utils\r\nexport { createWizardFactory } from \"./factory\";\r\nexport * from './hooks/useWizard';\r\n\r\nexport * from './adapters/persistence/MemoryAdapter';\r\nexport * from './adapters/persistence/LocalStorageAdapter';\r\n\r\nexport * from './adapters/validation/ZodAdapter';\r\nexport * from './adapters/validation/YupAdapter';\r\nexport * from './utils/data';\r\n","import React, {\r\n createContext,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n useCallback,\r\n useSyncExternalStore,\r\n useRef,\r\n useTransition,\r\n} from \"react\";\r\nimport type {\r\n IWizardConfig,\r\n PersistenceMode,\r\n IPersistenceAdapter,\r\n IStepConfig,\r\n IWizardContext,\r\n} from \"../types\";\r\nimport { MemoryAdapter } from \"../adapters/persistence/MemoryAdapter\";\r\nimport { getByPath, setByPath } from \"../utils/data\";\r\n\r\nexport interface IWizardState<T = unknown, StepId extends string = string> {\r\n currentStep: IStepConfig<unknown, T, StepId> | null;\r\n currentStepIndex: number;\r\n isFirstStep: boolean;\r\n isLastStep: boolean;\r\n isLoading: boolean;\r\n isPending: boolean;\r\n activeSteps: IStepConfig<unknown, T, StepId>[];\r\n visitedSteps: Set<StepId>;\r\n completedSteps: Set<StepId>;\r\n errorSteps: Set<StepId>;\r\n store: WizardStore<T>;\r\n}\r\n\r\nexport interface IWizardActions<StepId extends string = string> {\r\n goToNextStep: () => Promise<void>;\r\n goToPrevStep: () => void;\r\n goToStep: (stepId: StepId) => Promise<boolean>;\r\n setStepData: (stepId: StepId, data: unknown) => void;\r\n handleStepChange: (field: string, value: unknown) => void;\r\n validateStep: (sid: StepId) => Promise<boolean>;\r\n validateAll: () => Promise<{\r\n isValid: boolean;\r\n errors: Record<string, Record<string, string>>;\r\n }>;\r\n save: (stepIds?: StepId | StepId[] | boolean) => void;\r\n clearStorage: () => void;\r\n setData: (\r\n path: string,\r\n value: unknown,\r\n options?: { debounceValidation?: number }\r\n ) => void;\r\n updateData: (data: Partial<any>, options?: { replace?: boolean; persist?: boolean }) => void;\r\n getData: (path: string, defaultValue?: unknown) => unknown;\r\n}\r\n\r\nconst WizardStateContext = createContext<IWizardState<any, any> | undefined>(\r\n undefined\r\n);\r\nconst WizardActionsContext = createContext<IWizardActions<any> | undefined>(\r\n undefined\r\n);\r\n\r\n// Advanced: Store for granular subscriptions\r\nexport class WizardStore<T> {\r\n private state: { data: T; errors: Record<string, Record<string, string>> };\r\n private listeners = new Set<() => void>();\r\n errorsMap = new Map<string, Map<string, string>>();\r\n\r\n constructor(initialData: T) {\r\n this.state = {\r\n data: initialData,\r\n errors: {},\r\n };\r\n }\r\n\r\n getSnapshot() {\r\n return this.state;\r\n }\r\n\r\n update(newData: T) {\r\n this.state = { ...this.state, data: newData };\r\n this.notify();\r\n }\r\n\r\n // Sync internal Map to external Object (for backward compat)\r\n private syncErrors() {\r\n const newErrorsObj: Record<string, Record<string, string>> = {};\r\n for (const [stepId, fieldErrors] of this.errorsMap.entries()) {\r\n if (fieldErrors.size > 0) {\r\n newErrorsObj[stepId] = Object.fromEntries(fieldErrors);\r\n }\r\n }\r\n this.state = { ...this.state, errors: newErrorsObj };\r\n this.notify();\r\n }\r\n\r\n // Update from Object (Legacy/State setter)\r\n updateErrors(newErrors: Record<string, Record<string, string>>) {\r\n // Re-build Map to stay in sync\r\n this.errorsMap.clear();\r\n for (const [stepId, fieldErrors] of Object.entries(newErrors)) {\r\n const stepMap = new Map<string, string>();\r\n for (const [field, msg] of Object.entries(fieldErrors)) {\r\n stepMap.set(field, msg);\r\n }\r\n if (stepMap.size > 0) this.errorsMap.set(stepId, stepMap);\r\n }\r\n this.state = { ...this.state, errors: newErrors };\r\n this.notify();\r\n }\r\n\r\n // Optimize: Update Step Errors directly (O(1) Map updated, then Sync)\r\n setStepErrors(stepId: string, errors: Record<string, string> | undefined | null) {\r\n if (!errors || Object.keys(errors).length === 0) {\r\n if (this.errorsMap.has(stepId)) {\r\n this.errorsMap.delete(stepId);\r\n this.syncErrors();\r\n return true; // changed\r\n }\r\n return false;\r\n }\r\n\r\n // Update Map\r\n const stepMap = new Map<string, string>();\r\n for (const [field, msg] of Object.entries(errors)) {\r\n stepMap.set(field, msg);\r\n }\r\n this.errorsMap.set(stepId, stepMap);\r\n \r\n this.syncErrors();\r\n return true;\r\n }\r\n\r\n // Fast Delete (O(1))\r\n deleteError(stepId: string, path: string): boolean {\r\n const stepErrors = this.errorsMap.get(stepId);\r\n if (!stepErrors) return false;\r\n \r\n if (stepErrors.has(path)) {\r\n stepErrors.delete(path);\r\n if (stepErrors.size === 0) {\r\n this.errorsMap.delete(stepId);\r\n }\r\n // Sync to object for public state\r\n this.syncErrors();\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n private notify() {\r\n this.listeners.forEach((l) => l());\r\n }\r\n\r\n subscribe = (listener: () => void) => {\r\n this.listeners.add(listener);\r\n return () => this.listeners.delete(listener);\r\n };\r\n}\r\n\r\ninterface WizardProviderProps<T, StepId extends string> {\r\n config: IWizardConfig<T, StepId>;\r\n initialData?: T;\r\n initialStepId?: StepId; // New: Start from any step\r\n children: React.ReactNode;\r\n}\r\n\r\nexport function WizardProvider<T extends Record<string, any>, StepId extends string = string>({\r\n config,\r\n initialData,\r\n initialStepId,\r\n children,\r\n}: WizardProviderProps<T, StepId>) {\r\n const [currentStepId, setCurrentStepId] = useState<StepId | \"\">(\"\");\r\n // Optimize: Keep ref to currentStepId to avoid recreating setData on every step change\r\n const currentStepIdRef = useRef<StepId | \"\">(currentStepId);\r\n useEffect(() => {\r\n currentStepIdRef.current = currentStepId;\r\n }, [currentStepId]);\r\n\r\n const [visitedSteps, setVisitedSteps] = useState<Set<StepId>>(new Set());\r\n const [completedSteps, setCompletedSteps] = useState<Set<StepId>>(new Set());\r\n const [errorSteps, setErrorSteps] = useState<Set<StepId>>(new Set());\r\n const [, setAllErrorsState] = useState<\r\n Record<string, Record<string, string>>\r\n >({});\r\n const [isLoading, setIsLoading] = useState<boolean>(true);\r\n const [isPending, startTransition] = useTransition();\r\n\r\n // Store for granular data and errors\r\n const storeRef = useRef(new WizardStore<T>((initialData || {}) as T));\r\n\r\n // Persistence Setup\r\n const persistenceAdapter = useMemo<IPersistenceAdapter>(() => {\r\n return config.persistence?.adapter || new MemoryAdapter();\r\n }, [config.persistence?.adapter]);\r\n\r\n const persistenceMode = config.persistence?.mode || \"onStepChange\";\r\n\r\n // --- Optimization: Static Step Map ---\r\n const stepsMap = useMemo(() => {\r\n const map = new Map<StepId, IStepConfig<any, T, StepId>>();\r\n config.steps.forEach((step: IStepConfig<any, T, StepId>) => map.set(step.id, step));\r\n return map;\r\n }, [config.steps]);\r\n\r\n // We use a ref to track the last calculated steps to ensure referential strictness\r\n const lastActiveStepsRef = useRef<IStepConfig<any, T, StepId>[]>([]);\r\n \r\n // Optimized: Calculate Active Steps reactively from the store\r\n const activeSteps = useSyncExternalStore(\r\n storeRef.current.subscribe,\r\n useCallback(() => {\r\n const currentData = storeRef.current.getSnapshot().data;\r\n const nextActiveSteps = config.steps.filter((step: IStepConfig<any, T, StepId>) => {\r\n if (step.condition) {\r\n return step.condition(currentData);\r\n }\r\n return true;\r\n });\r\n\r\n // Check if structure changed (ids match) - shallow check optimized for step stability\r\n const prevIds = lastActiveStepsRef.current.map(s => s.id).join('.');\r\n const nextIds = nextActiveSteps.map(s => s.id).join('.');\r\n\r\n if (prevIds === nextIds && lastActiveStepsRef.current.length > 0) {\r\n return lastActiveStepsRef.current;\r\n }\r\n\r\n lastActiveStepsRef.current = nextActiveSteps;\r\n return nextActiveSteps;\r\n }, [config.steps])\r\n );\r\n\r\n const activeStepsIndexMap = useMemo(() => {\r\n const map = new Map<StepId, number>();\r\n activeSteps.forEach((s: IStepConfig<any, T, StepId>, i: number) => map.set(s.id, i));\r\n return map;\r\n }, [activeSteps]);\r\n\r\n // Set initial step if not set (with optional initialStepId)\r\n useEffect(() => {\r\n if (!currentStepId && activeSteps.length > 0) {\r\n if (initialStepId) {\r\n // Validation: verify initialStepId exists in active steps\r\n const target = activeSteps.find((s: IStepConfig<any, T, StepId>) => s.id === initialStepId);\r\n if (target) {\r\n setCurrentStepId(target.id);\r\n } else {\r\n // Fallback if initial is invalid/hidden\r\n setCurrentStepId(activeSteps[0].id);\r\n }\r\n } else {\r\n setCurrentStepId(activeSteps[0].id);\r\n }\r\n setIsLoading(false);\r\n }\r\n }, [activeSteps, currentStepId, initialStepId]);\r\n \r\n // --- Optimization: Stable State Reference ---\r\n // We hold all \"changing\" values in a ref so actions can remain stable\r\n const stateRef = useRef({\r\n config,\r\n stepsMap,\r\n activeSteps,\r\n activeStepsIndexMap,\r\n visitedSteps,\r\n completedSteps,\r\n persistenceMode,\r\n persistenceAdapter,\r\n currentStepId\r\n });\r\n\r\n // Update ref on every render - this is fast\r\n stateRef.current = {\r\n config,\r\n stepsMap,\r\n activeSteps,\r\n activeStepsIndexMap,\r\n visitedSteps,\r\n completedSteps,\r\n persistenceMode,\r\n persistenceAdapter,\r\n currentStepId\r\n };\r\n\r\n // Derived state\r\n const currentStep = useMemo(\r\n () => stepsMap.get(currentStepId as StepId) || null,\r\n [stepsMap, currentStepId]\r\n );\r\n const currentStepIndex = useMemo(\r\n () => activeStepsIndexMap.get(currentStepId as StepId) ?? -1,\r\n [activeStepsIndexMap, currentStepId]\r\n );\r\n const isFirstStep = currentStepIndex === 0;\r\n const isLastStep = currentStepIndex === activeSteps.length - 1;\r\n\r\n // Constants\r\n const META_KEY = \"__wizzard_meta__\";\r\n\r\n // Hydration Helper\r\n // Hydration Helper\r\n const hydrate = useCallback(() => {\r\n setIsLoading(true);\r\n const { persistenceAdapter, config } = stateRef.current;\r\n\r\n const metaFn = persistenceAdapter.getStep<{\r\n currentStepId: string;\r\n visited: string[];\r\n completed: string[];\r\n }>(META_KEY);\r\n\r\n if (metaFn) {\r\n if (metaFn.currentStepId) setCurrentStepId(metaFn.currentStepId as StepId);\r\n if (metaFn.visited) setVisitedSteps(new Set(metaFn.visited as StepId[]));\r\n if (metaFn.completed) setCompletedSteps(new Set(metaFn.completed as StepId[]));\r\n }\r\n\r\n const loadedData: Partial<T> = {};\r\n config.steps.forEach((step) => {\r\n const stepData = persistenceAdapter.getStep(step.id);\r\n if (stepData) {\r\n Object.assign(loadedData, stepData);\r\n }\r\n });\r\n\r\n if (Object.keys(loadedData).length > 0) {\r\n const currentData = storeRef.current.getSnapshot().data;\r\n const newData = { ...currentData, ...loadedData };\r\n storeRef.current.update(newData);\r\n }\r\n setIsLoading(false);\r\n }, []); // Empty dependency array!\r\n\r\n useEffect(() => {\r\n hydrate();\r\n }, [hydrate]);\r\n\r\n\r\n // Save logic stabilized\r\n const saveData = useCallback(\r\n (mode: PersistenceMode, stepId: StepId, data: any) => {\r\n const { stepsMap, persistenceAdapter, persistenceMode: globalMode } = stateRef.current;\r\n const stepConfig = stepsMap.get(stepId);\r\n const stepAdapter = stepConfig?.persistenceAdapter;\r\n const stepMode = stepConfig?.persistenceMode;\r\n const adapterToUse = stepAdapter || persistenceAdapter;\r\n const modeToUse = stepMode || globalMode;\r\n\r\n if (mode === modeToUse || mode === \"manual\") {\r\n adapterToUse.saveStep(stepId, data);\r\n }\r\n },\r\n [] \r\n );\r\n\r\n // Debounce timeout for validation\r\n const validationTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(\r\n null\r\n );\r\n\r\n const validateStep = useCallback(\r\n async (stepId: StepId, data: T): Promise<boolean> => {\r\n const { stepsMap } = stateRef.current;\r\n const step = stepsMap.get(stepId);\r\n if (!step || !step.validationAdapter) {\r\n return true;\r\n }\r\n\r\n const result = await step.validationAdapter.validate(data);\r\n\r\n if (result.isValid) {\r\n // Clear errors for this step\r\n // Optimized: Use Store Method\r\n const changed = storeRef.current.setStepErrors(stepId, null);\r\n \r\n if (changed) {\r\n setAllErrorsState(storeRef.current.getSnapshot().errors);\r\n setErrorSteps((prev) => {\r\n const next = new Set(prev);\r\n next.delete(stepId);\r\n return next;\r\n });\r\n }\r\n return true;\r\n } else {\r\n // Set errors for this step\r\n // Optimized: Use Store Method\r\n storeRef.current.setStepErrors(stepId, result.errors || null);\r\n setAllErrorsState(storeRef.current.getSnapshot().errors);\r\n \r\n setErrorSteps((prev) => {\r\n const next = new Set(prev);\r\n next.add(stepId);\r\n return next;\r\n });\r\n return false;\r\n }\r\n },\r\n []\r\n );\r\n\r\n // Actions stabilized with useCallback\r\n const setStepData = useCallback(\r\n (stepId: StepId, data: any) => {\r\n const { persistenceMode } = stateRef.current;\r\n const prevData = storeRef.current.getSnapshot().data;\r\n const newData = { ...prevData, ...data };\r\n\r\n storeRef.current.update(newData);\r\n\r\n const stepConfig = stateRef.current.stepsMap.get(stepId as StepId);\r\n const effectiveMode = stepConfig?.persistenceMode || persistenceMode;\r\n\r\n if (effectiveMode === \"onChange\") {\r\n saveData(\"onChange\", stepId, newData);\r\n }\r\n },\r\n [saveData]\r\n );\r\n\r\n const setData = useCallback(\r\n (path: string, value: any, options?: { debounceValidation?: number }) => {\r\n const { persistenceMode, stepsMap } = stateRef.current;\r\n const prevData = storeRef.current.getSnapshot().data;\r\n \r\n const currentValue = getByPath(prevData, path);\r\n if (currentValue === value) return;\r\n\r\n const newData = setByPath(prevData, path, value);\r\n\r\n // --- Batching Strategy: Update Store First ---\r\n storeRef.current.update(newData);\r\n \r\n const activeStepId = stateRef.current.currentStepId;\r\n const stepConfig = stepsMap.get(activeStepId as StepId);\r\n\r\n // 4. Clear Error on Input (UX Improvement + Optimization)\r\n if (activeStepId) {\r\n const wasDeleted = storeRef.current.deleteError(activeStepId, path);\r\n if (wasDeleted) {\r\n // Check if step is now clean to update errorSteps\r\n if (!storeRef.current.errorsMap.has(activeStepId)) {\r\n setErrorSteps(prev => {\r\n const next = new Set(prev);\r\n next.delete(activeStepId);\r\n return next;\r\n });\r\n }\r\n }\r\n }\r\n\r\n // Sync React state last - only for errors to update errorSteps\r\n if (activeStepId && storeRef.current.getSnapshot().errors[activeStepId]) {\r\n startTransition(() => {\r\n setAllErrorsState(storeRef.current.getSnapshot().errors);\r\n });\r\n }\r\n\r\n // Determine Validation Mode\r\n const { config } = stateRef.current;\r\n const mode = stepConfig?.validationMode ?? config.validationMode ?? 'onStepChange';\r\n\r\n // 3. Conditional Validation Logic\r\n if (mode === 'onChange') {\r\n if (options?.debounceValidation) {\r\n if (validationTimeoutRef.current)\r\n clearTimeout(validationTimeoutRef.current);\r\n validationTimeoutRef.current = setTimeout(() => {\r\n try {\r\n if (activeStepId) {\r\n validateStep(activeStepId as StepId, newData).catch((err) => {\r\n console.error(\"[Wizard] Debounced validation failed:\", err);\r\n });\r\n }\r\n } catch (e) {\r\n console.error(\"[Wizard] Error starting validation:\", e);\r\n }\r\n }, options.debounceValidation);\r\n } else {\r\n if (activeStepId) validateStep(activeStepId as StepId, newData);\r\n }\r\n } \r\n\r\n const effectivePersistenceMode = stepConfig?.persistenceMode ?? persistenceMode;\r\n if (effectivePersistenceMode === \"onChange\" && activeStepId) {\r\n saveData(\"onChange\", activeStepId as StepId, newData);\r\n }\r\n },\r\n [saveData, validateStep]\r\n );\r\n\r\n const updateData = useCallback(\r\n (data: Partial<T>, options?: { replace?: boolean; persist?: boolean }) => {\r\n const { config } = stateRef.current;\r\n const prevData = storeRef.current.getSnapshot().data;\r\n const newData = options?.replace ? (data as T) : { ...prevData, ...data };\r\n\r\n storeRef.current.update(newData);\r\n\r\n if (options?.persist) {\r\n config.steps.forEach((step) => {\r\n saveData(\"manual\", step.id, newData);\r\n });\r\n }\r\n },\r\n [saveData]\r\n );\r\n\r\n const getData = useCallback((path: string, defaultValue?: any) => {\r\n return getByPath(storeRef.current.getSnapshot().data, path, defaultValue);\r\n }, []);\r\n\r\n // Action: Handle specific field change (helper)\r\n const handleStepChange = useCallback(\r\n (field: string, value: any) => {\r\n const { currentStepId } = stateRef.current;\r\n if (!currentStepId) return;\r\n setData(field, value);\r\n },\r\n [setData]\r\n );\r\n\r\n const validateAll = useCallback(async (): Promise<{\r\n isValid: boolean;\r\n errors: Record<string, Record<string, string>>;\r\n }> => {\r\n const { activeSteps } = stateRef.current;\r\n \r\n // Optimization: Parallel validation\r\n const currentData = storeRef.current.getSnapshot().data;\r\n const validationResults = await Promise.all(\r\n activeSteps.map((step: IStepConfig<any, T, StepId>) => validateStep(step.id, currentData))\r\n );\r\n \r\n const isValid = validationResults.every(Boolean);\r\n const finalErrors = storeRef.current.getSnapshot().errors;\r\n return { isValid, errors: finalErrors };\r\n }, [validateStep]);\r\n\r\n const goToStep = useCallback(\r\n async (stepId: StepId): Promise<boolean> => {\r\n const { \r\n activeStepsIndexMap,\r\n currentStepId, \r\n config, \r\n persistenceMode, \r\n visitedSteps, \r\n completedSteps, \r\n persistenceAdapter,\r\n stepsMap\r\n } = stateRef.current;\r\n\r\n const targetIndex = activeStepsIndexMap.get(stepId) ?? -1;\r\n if (targetIndex === -1) return false;\r\n\r\n const currentData = storeRef.current.getSnapshot().data;\r\n const currentStepIndex = activeStepsIndexMap.get(currentStepId as StepId) ?? -1;\r\n const currentStep = stepsMap.get(currentStepId as StepId);\r\n\r\n if (targetIndex > currentStepIndex) {\r\n const shouldValidate =\r\n currentStep?.autoValidate ?? config.autoValidate ?? false;\r\n if (shouldValidate && currentStepId) {\r\n const isValid = await validateStep(currentStepId as StepId, currentData);\r\n if (!isValid) return false;\r\n }\r\n }\r\n\r\n if (currentStep && currentStepId) {\r\n const effectivePersistenceMode = currentStep.persistenceMode ?? persistenceMode;\r\n if (effectivePersistenceMode === \"onStepChange\") {\r\n saveData(\"onStepChange\", currentStepId as StepId, currentData);\r\n }\r\n }\r\n\r\n const nextVisited = new Set(visitedSteps);\r\n if (currentStepId) nextVisited.add(currentStepId as StepId);\r\n \r\n setVisitedSteps(nextVisited);\r\n setCurrentStepId(stepId);\r\n\r\n if (persistenceMode !== \"manual\") {\r\n persistenceAdapter.saveStep(META_KEY, {\r\n currentStepId: stepId,\r\n visited: Array.from(nextVisited),\r\n completed: Array.from(completedSteps),\r\n });\r\n }\r\n\r\n // Lifecycle Callback\r\n if (config.onStepChange) {\r\n config.onStepChange(currentStepId || null, stepId, currentData); // Call hook\r\n }\r\n\r\n window.scrollTo(0, 0);\r\n return true;\r\n },\r\n [saveData, validateStep]\r\n );\r\n \r\n const goToNextStep = useCallback(async () => {\r\n const { activeSteps, activeStepsIndexMap, currentStepId, completedSteps, persistenceMode } = stateRef.current;\r\n const currentStepIndex = activeStepsIndexMap.get(currentStepId as StepId) ?? -1;\r\n \r\n if (currentStepIndex === -1 || currentStepIndex === activeSteps.length - 1) return;\r\n \r\n const nextStep = activeSteps[currentStepIndex + 1];\r\n if (nextStep) {\r\n const success = await goToStep(nextStep.id);\r\n if (success) {\r\n const nextCompleted = new Set(completedSteps).add(currentStepId as StepId);\r\n setCompletedSteps(nextCompleted);\r\n\r\n if (persistenceMode !== \"manual\") {\r\n persistenceAdapter.saveStep(META_KEY, {\r\n currentStepId: nextStep.id,\r\n visited: Array.from(new Set(visitedSteps).add(currentStepId as StepId)),\r\n completed: Array.from(nextCompleted),\r\n });\r\n }\r\n }\r\n }\r\n }, [goToStep]); // Only depends on goToStep (which is stable)\r\n\r\n const goToPrevStep = useCallback(() => {\r\n const { activeSteps, activeStepsIndexMap, currentStepId } = stateRef.current;\r\n const currentStepIndex = activeStepsIndexMap.get(currentStepId as StepId) ?? -1;\r\n if (currentStepIndex <= 0) return;\r\n const prevStep = activeSteps[currentStepIndex - 1];\r\n if (prevStep) {\r\n goToStep(prevStep.id);\r\n }\r\n }, [goToStep]);\r\n\r\n const clearStorage = useCallback(() => {\r\n stateRef.current.persistenceAdapter.clear();\r\n }, []);\r\n\r\n const save = useCallback(\r\n (stepIds?: StepId | StepId[] | boolean) => {\r\n const { config, currentStepId } = stateRef.current;\r\n const data = storeRef.current.getSnapshot().data;\r\n\r\n if (stepIds === true) {\r\n config.steps.forEach((step) => {\r\n saveData(\"manual\", step.id, data);\r\n });\r\n return;\r\n }\r\n\r\n if (!stepIds) {\r\n if (currentStepId) {\r\n saveData(\"manual\", currentStepId as StepId, data);\r\n }\r\n return;\r\n }\r\n\r\n const ids = Array.isArray(stepIds) ? stepIds : [stepIds];\r\n ids.forEach((id) => {\r\n saveData(\"manual\", id, data);\r\n });\r\n },\r\n [saveData]\r\n );\r\n\r\n // Split values\r\n const stateValue = useMemo<IWizardState<T, StepId>>(\r\n () => ({\r\n currentStep,\r\n currentStepIndex,\r\n isFirstStep,\r\n isLastStep,\r\n isLoading,\r\n isPending,\r\n activeSteps,\r\n visitedSteps,\r\n completedSteps,\r\n errorSteps,\r\n store: storeRef.current,\r\n }),\r\n [\r\n currentStep,\r\n currentStepIndex,\r\n isFirstStep,\r\n isLastStep,\r\n isLoading,\r\n isPending,\r\n activeSteps,\r\n visitedSteps,\r\n completedSteps,\r\n errorSteps,\r\n ]\r\n );\r\n\r\n const actionsValue = useMemo<IWizardActions<StepId>>(\r\n () => ({\r\n goToNextStep,\r\n goToPrevStep,\r\n goToStep,\r\n setStepData: setStepData as (stepId: StepId, data: unknown) => void,\r\n handleStepChange,\r\n validateStep: (sid: StepId) =>\r\n validateStep(sid, storeRef.current.getSnapshot().data),\r\n validateAll,\r\n save,\r\n clearStorage,\r\n setData,\r\n updateData,\r\n getData,\r\n }),\r\n [\r\n goToNextStep,\r\n goToPrevStep,\r\n goToStep,\r\n setStepData,\r\n handleStepChange,\r\n validateStep,\r\n validateAll,\r\n save,\r\n clearStorage,\r\n setData,\r\n updateData,\r\n getData,\r\n ]\r\n );\r\n\r\n return (\r\n <WizardStateContext.Provider value={stateValue}>\r\n <WizardActionsContext.Provider value={actionsValue}>\r\n {children}\r\n </WizardActionsContext.Provider>\r\n </WizardStateContext.Provider>\r\n );\r\n}\r\n\r\nexport function useWizardState<T = unknown, StepId extends string = string>(): IWizardState<T, StepId> {\r\n const context = useContext(WizardStateContext);\r\n if (!context) {\r\n throw new Error(\"useWizardState must be used within a WizardProvider\");\r\n }\r\n return context as IWizardState<T, StepId>;\r\n}\r\n\r\nexport function useWizardValue<TValue = any>(\r\n path: string,\r\n options?: { isEqual?: (a: TValue, b: TValue) => boolean }\r\n): TValue {\r\n const { store } = useWizardState();\r\n const lastStateRef = useRef<any>(null);\r\n const lastValueRef = useRef<any>(null);\r\n const isEqual = options?.isEqual || Object.is;\r\n\r\n const getSnapshot = useCallback(() => {\r\n const fullState = store.getSnapshot();\r\n const data = fullState.data;\r\n if (data === lastStateRef.current) {\r\n return lastValueRef.current;\r\n }\r\n const value = getByPath(data, path) as TValue;\r\n \r\n // Memoization with custom equality\r\n if (lastValueRef.current !== undefined && isEqual(lastValueRef.current, value)) {\r\n lastStateRef.current = data;\r\n return lastValueRef.current;\r\n }\r\n\r\n lastStateRef.current = data;\r\n lastValueRef.current = value;\r\n return value;\r\n }, [store, path, isEqual]);\r\n\r\n return useSyncExternalStore(store.subscribe, getSnapshot);\r\n}\r\n\r\nexport function useWizardError(path: string): string | undefined {\r\n const { store } = useWizardState();\r\n const lastStateRef = useRef<any>(null);\r\n const lastValueRef = useRef<any>(null);\r\n\r\n const getSnapshot = useCallback(() => {\r\n const fullState = store.getSnapshot();\r\n const errors = fullState.errors;\r\n if (errors === lastStateRef.current) {\r\n return lastValueRef.current;\r\n }\r\n\r\n // Flatten errors from all steps or use a specific step?\r\n // Usually validation results are nested like { children: { \"0.name\": \"error\" } }\r\n // but the adapter flattened them to \"children.0.name\"\r\n let foundError: string | undefined;\r\n Object.values(errors).forEach((stepErrors) => {\r\n const typedStepErrors = stepErrors as Record<string, string>;\r\n if (typedStepErrors[path]) foundError = typedStepErrors[path];\r\n });\r\n\r\n lastStateRef.current = errors;\r\n lastValueRef.current = foundError;\r\n return foundError;\r\n }, [store, path]);\r\n\r\n return useSyncExternalStore(store.subscribe, getSnapshot);\r\n}\r\n\r\nexport function useWizardSelector<TSelected = any>(\r\n selector: (state: any) => TSelected,\r\n options?: { isEqual?: (a: TSelected, b: TSelected) => boolean }\r\n): TSelected {\r\n const { store } = useWizardState();\r\n const lastStateRef = useRef<any>(null);\r\n const lastResultRef = useRef<any>(null);\r\n const isEqual = options?.isEqual || Object.is;\r\n\r\n const getSnapshot = useCallback(() => {\r\n const fullState = store.getSnapshot();\r\n if (fullState === lastStateRef.current) {\r\n return lastResultRef.current;\r\n }\r\n \r\n const result = selector(fullState.data);\r\n \r\n // Memoization with custom equality\r\n if (lastResultRef.current !== null && isEqual(lastResultRef.current, result)) {\r\n lastStateRef.current = fullState;\r\n return lastResultRef.current;\r\n }\r\n\r\n lastStateRef.current = fullState;\r\n lastResultRef.current = result;\r\n return result;\r\n }, [store, selector, isEqual]);\r\n\r\n return useSyncExternalStore(store.subscribe, getSnapshot);\r\n}\r\n\r\nexport function useWizardActions<StepId extends string = string>(): IWizardActions<StepId> {\r\n const context = useContext(WizardActionsContext);\r\n if (!context) {\r\n throw new Error(\"useWizardActions must be used within a WizardProvider\");\r\n }\r\n return context as IWizardActions<StepId>;\r\n}\r\n\r\nexport function useWizardContext<T = any, StepId extends string = string>(): IWizardContext<T, StepId> & {\r\n store: WizardStore<T>;\r\n} {\r\n const state = useWizardState<T, StepId>();\r\n const actions = useWizardActions<StepId>();\r\n\r\n // Backward compatibility: subscribe to everything\r\n const wizardData = useWizardSelector<T>((s) => s as T);\r\n const allErrors = useSyncExternalStore(state.store.subscribe, () => state.store.getSnapshot().errors);\r\n\r\n return useMemo(\r\n () => ({\r\n ...state,\r\n ...actions,\r\n wizardData,\r\n allErrors,\r\n }),\r\n [state, actions, wizardData, allErrors]\r\n );\r\n}\r\n","import type { IPersistenceAdapter } from '../../types';\r\n\r\nexport class MemoryAdapter implements IPersistenceAdapter {\r\n private storage: Record<string, any> = {};\r\n\r\n saveStep<T>(stepId: string, data: T): void {\r\n this.storage[stepId] = data;\r\n }\r\n\r\n getStep<T>(stepId: string): T | undefined {\r\n return this.storage[stepId] as T;\r\n }\r\n\r\n clear(): void {\r\n this.storage = {};\r\n }\r\n}\r\n","/**\r\n * Cache for parsed path strings to avoid repetitive regex/split operations.\r\n * Key: path string (e.g., \"users[0].name\")\r\n * Value: array of keys (e.g., [\"users\", \"0\", \"name\"])\r\n */\r\nconst pathCache = new Map<string, string[]>();\r\n\r\n/**\r\n * Parses a string path into an array of keys using a cache.\r\n * Handles dot notation \"a.b\" and bracket notation \"a[0].b\".\r\n */\r\nexport function toPath(path: string): string[] {\r\n if (!path) return [];\r\n if (pathCache.has(path)) {\r\n return pathCache.get(path)!;\r\n }\r\n\r\n // Optimization: Regex only if brackets exist, otherwise fast split\r\n let keys: string[];\r\n if (path.includes('[')) {\r\n keys = path.replace(/\\[(\\d+)\\]/g, '.$1').split('.').filter(Boolean);\r\n } else {\r\n keys = path.split('.').filter(Boolean);\r\n }\r\n\r\n pathCache.set(path, keys);\r\n return keys;\r\n}\r\n\r\n/**\r\n * Retrieves a value from an object by path using cached key parsing.\r\n * Optimized for frequent access.\r\n */\r\nexport function getByPath(obj: any, path: string, defaultValue?: unknown): unknown {\r\n if (!path || obj === undefined || obj === null) return defaultValue ?? obj;\r\n\r\n // Fast path for direct property access (no dots/brackets)\r\n if (!path.includes('.') && !path.includes('[')) {\r\n const val = obj[path];\r\n return val !== undefined ? val : defaultValue;\r\n }\r\n\r\n const keys = toPath(path);\r\n let result = obj;\r\n\r\n for (let i = 0; i < keys.length; i++) {\r\n if (result === undefined || result === null) return defaultValue;\r\n result = result[keys[i]];\r\n }\r\n\r\n return result !== undefined ? result : defaultValue;\r\n}\r\n\r\n/**\r\n * Immutably sets a value in an object by path.\r\n * iterative implementation (stack-safe and usually faster).\r\n */\r\nexport function setByPath<T extends object>(obj: T, path: string, value: unknown): T {\r\n if (!path) return value as unknown as T;\r\n\r\n // Fast path: simple property set\r\n if (!path.includes('.') && !path.includes('[')) {\r\n // Optimization: Shallow copy mostly sufficient for root\r\n // If obj is Array, we must be careful, but typings say T extends object\r\n if (Array.isArray(obj)) {\r\n const copy = [...obj] as any;\r\n copy[path] = value;\r\n return copy;\r\n }\r\n return { ...obj, [path]: value };\r\n }\r\n\r\n const keys = toPath(path);\r\n if (keys.length === 0) return value as unknown as T;\r\n\r\n // Shallow clone root\r\n const root = Array.isArray(obj) ? [...obj] : { ...obj };\r\n let current: any = root;\r\n\r\n for (let i = 0; i < keys.length - 1; i++) {\r\n const key = keys[i];\r\n const nextKey = keys[i + 1];\r\n\r\n // Determine if next level should be array or object\r\n // If key exists, we clone it. If not, we create based on nextKey type (numeric -> array)\r\n const existing = current[key];\r\n let nextLevel;\r\n\r\n if (existing && typeof existing === 'object') {\r\n nextLevel = Array.isArray(existing) ? [...existing] : { ...existing };\r\n } else {\r\n // Predict type based on next key: is it an integer?\r\n const isNumeric = /^\\d+$/.test(nextKey);\r\n nextLevel = isNumeric ? [] : {};\r\n }\r\n\r\n current[key] = nextLevel;\r\n current = nextLevel;\r\n }\r\n\r\n // Set final value\r\n const lastKey = keys[keys.length - 1];\r\n current[lastKey] = value;\r\n\r\n return root as T;\r\n}\r\n\r\n/**\r\n * Simple shallow equality check for objects and arrays.\r\n * Useful for preventing re-renders in selectors.\r\n */\r\nexport function shallowEqual(a: any, b: any): boolean {\r\n if (Object.is(a, b)) return true;\r\n if (typeof a !== 'object' || a === null || typeof b !== 'object' || b === null) {\r\n return false;\r\n }\r\n\r\n const keysA = Object.keys(a);\r\n const keysB = Object.keys(b);\r\n\r\n if (keysA.length !== keysB.length) return false;\r\n\r\n for (let i = 0; i < keysA.length; i++) {\r\n const key = keysA[i];\r\n if (!Object.prototype.hasOwnProperty.call(b, key) || !Object.is(a[key], b[key])) {\r\n return false;\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n","import React, { useMemo } from \"react\";\r\nimport { useWizardContext } from \"../context/WizardContext\";\r\n\r\ninterface WizardStepRendererProps {\r\n /**\r\n * Optional wrapper component for each step.\r\n * Useful for adding animations (e.g., Framer Motion).\r\n */\r\n wrapper?: React.ComponentType<{ children: React.ReactNode; key: string }>;\r\n}\r\n\r\n/**\r\n * A declarative component that renders the current step based on the configuration.\r\n * It looks for the `component` property in your `steps` config.\r\n */\r\nexport const WizardStepRenderer: React.FC<WizardStepRendererProps> = ({\r\n wrapper: Wrapper,\r\n}) => {\r\n const { currentStep } = useWizardContext();\r\n\r\n const StepComponent = useMemo(() => {\r\n if (!currentStep?.component) return null;\r\n return currentStep.component;\r\n }, [currentStep]);\r\n\r\n if (!currentStep || !StepComponent) {\r\n return null;\r\n }\r\n\r\n const content = <StepComponent />;\r\n\r\n if (Wrapper) {\r\n return <Wrapper key={currentStep.id}>{content}</Wrapper>;\r\n }\r\n\r\n return content;\r\n};\r\n","import { useWizardContext } from '../context/WizardContext';\r\nimport type { IWizardContext } from '../types';\r\n\r\nexport const useWizard = <T = any, StepId extends string = string>(): IWizardContext<T, StepId> => {\r\n return useWizardContext<T, StepId>();\r\n};\r\n","import React from \"react\";\r\nimport {\r\n WizardProvider as BaseWizardProvider,\r\n useWizardContext as useBaseWizardContext,\r\n useWizardValue as useBaseWizardValue,\r\n useWizardSelector as useBaseWizardSelector,\r\n useWizardError as useBaseWizardError,\r\n useWizardActions as useBaseWizardActions,\r\n useWizardState as useBaseWizardState,\r\n} from \"./context/WizardContext\";\r\nimport { useWizard as useBaseWizard } from \"./hooks/useWizard\";\r\nimport type { IWizardConfig, IWizardContext, IStepConfig } from \"./types\";\r\nimport type { Path, PathValue } from \"./utils/types\";\r\n\r\n/**\r\n * createWizardFactory\r\n *\r\n * Creates a strongly-typed set of Wizard components and hooks for a specific data schema.\r\n * This ensures full type safety across your entire wizard implementation without manual casting.\r\n *\r\n * @template TSchema The shape of your wizard's global data state\r\n */\r\nexport function createWizardFactory<TSchema extends Record<string, any>, StepId extends string = string>() {\r\n /**\r\n * Typed Provider\r\n */\r\n const WizardProvider = ({\r\n config,\r\n initialData,\r\n children,\r\n }: {\r\n config: IWizardConfig<TSchema, StepId>;\r\n initialData?: Partial<TSchema>;\r\n children: React.ReactNode;\r\n }) => {\r\n return (\r\n <BaseWizardProvider<TSchema, StepId>\r\n config={config}\r\n initialData={initialData as TSchema}\r\n >\r\n {children}\r\n </BaseWizardProvider>\r\n );\r\n };\r\n\r\n /**\r\n * Typed useWizard\r\n * Returns the full context with TSchema typed data and methods\r\n */\r\n const useWizard = (): IWizardContext<TSchema, StepId> => {\r\n return useBaseWizard<TSchema, StepId>();\r\n };\r\n\r\n /**\r\n * Typed useWizardContext\r\n * similar to useWizard but explicit about strict context usage\r\n */\r\n const useWizardContext = () => {\r\n return useBaseWizardContext<TSchema, StepId>();\r\n };\r\n\r\n /**\r\n * Typed useWizardValue\r\n * @param path Dot-notation path to the value\r\n */\r\n const useWizardValue = <P extends Path<TSchema>>(\r\n path: P,\r\n options?: { isEqual?: (a: PathValue<TSchema, P>, b: PathValue<TSchema, P>) => boolean }\r\n ): PathValue<TSchema, P> => {\r\n return useBaseWizardValue<PathValue<TSchema, P>>(path, options);\r\n };\r\n\r\n /**\r\n * Typed useWizardSelector\r\n * @param selector Function to select a slice of state\r\n */\r\n const useWizardSelector = <TSelected,>(\r\n selector: (state: TSchema) => TSelected,\r\n options?: { isEqual?: (a: TSelected, b: TSelected) => boolean }\r\n ): TSelected => {\r\n return useBaseWizardSelector<TSelected>(selector, options);\r\n };\r\n\r\n /**\r\n * Typed useWizardError\r\n * @param path Dot-notation path to check for errors\r\n */\r\n const useWizardError = <P extends Path<TSchema>>(\r\n path: P\r\n ): string | undefined => {\r\n return useBaseWizardError(path);\r\n };\r\n\r\n /**\r\n * Typed useWizardActions\r\n * No generic needed for actions usually, but we wrap it for consistency\r\n */\r\n const useWizardActions = () => {\r\n return useBaseWizardActions<StepId>();\r\n };\r\n\r\n /**\r\n * Typed useWizardState\r\n * Access to raw internal state if needed (advanced)\r\n */\r\n const useWizardState = () => {\r\n return useBaseWizardState<TSchema, StepId>();\r\n };\r\n\r\n /**\r\n * Helper to create a typed step configuration.\r\n * By using this helper, TypeScript can infer TStepData from the validationAdapter or other properties.\r\n */\r\n const createStep = <TStepData = unknown,>(\r\n config: IStepConfig<TStepData, TSchema, StepId>\r\n ) => config;\r\n\r\n return {\r\n WizardProvider,\r\n useWizard,\r\n useWizardContext,\r\n useWizardValue,\r\n useWizardSelector,\r\n useWizardError,\r\n useWizardActions,\r\n useWizardState,\r\n createStep,\r\n };\r\n}\r\n","import type { IPersistenceAdapter } from '../../types';\r\n\r\nexport class LocalStorageAdapter implements IPersistenceAdapter {\r\n private prefix: string;\r\n\r\n constructor(prefix: string = 'wizard_') {\r\n this.prefix = prefix;\r\n }\r\n\r\n private getKey(stepId: string): string {\r\n return `${this.prefix}${stepId}`;\r\n }\r\n\r\n saveStep<T>(stepId: string, data: T): void {\r\n if (typeof window === 'undefined') return;\r\n try {\r\n localStorage.setItem(this.getKey(stepId), JSON.stringify(data));\r\n } catch (error) {\r\n console.warn('LocalStorageAdapter: Failed to save step', error);\r\n }\r\n }\r\n\r\n getStep<T>(stepId: string): T | undefined {\r\n if (typeof window === 'undefined') return undefined;\r\n try {\r\n const item = localStorage.getItem(this.getKey(stepId));\r\n return item ? JSON.parse(item) : undefined;\r\n } catch (error) {\r\n console.warn('LocalStorageAdapter: Failed to get step', error);\r\n return undefined;\r\n }\r\n }\r\n\r\n clear(): void {\r\n if (typeof window === 'undefined') return;\r\n Object.keys(localStorage).forEach((key) => {\r\n if (key.startsWith(this.prefix)) {\r\n localStorage.removeItem(key);\r\n }\r\n });\r\n }\r\n}\r\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\r\nimport type { ZodLikeSchema } from './internal-types';\r\n\r\nexport class ZodAdapter<T> implements IValidatorAdapter<T> {\r\n private schema: ZodLikeSchema<T>;\r\n\r\n constructor(schema: ZodLikeSchema<T>) {\r\n this.schema = schema;\r\n }\r\n\r\n async validate(data: unknown): Promise<ValidationResult> {\r\n const result = await this.schema.safeParseAsync(data as T);\r\n if (result.success) {\r\n return { isValid: true };\r\n }\r\n\r\n // Explicitly handle error case\r\n const errors: Record<string, string> = {};\r\n if (result.error) {\r\n result.error.issues.forEach((err) => {\r\n const path = err.path.join('.'); // nested.field\r\n errors[path] = err.message;\r\n });\r\n }\r\n return { isValid: false, errors };\r\n }\r\n}\r\n","import type { IValidatorAdapter, ValidationResult } from '../../types';\r\nimport type { YupLikeSchema, YupLikeError } from './internal-types';\r\n\r\nexport class YupAdapter<T> implements IValidatorAdapter<T> {\r\n private schema: YupLikeSchema<T>;\r\n\r\n constructor(schema: YupLikeSchema<T>) {\r\n this.schema = schema;\r\n }\r\n\r\n async validate(data: unknown): Promise<ValidationResult> {\r\n try {\r\n await this.schema.validate(data as T, { abortEarly: false });\r\n return { isValid: true };\r\n } catch (err) {\r\n if (err && typeof err === 'object' && 'inner' in err) {\r\n const yupError = err as YupLikeError;\r\n const errors: Record<string, string> = {};\r\n yupError.inner.forEach((error) => {\r\n if (error.path) {\r\n errors[error.path] = error.message;\r\n }\r\n });\r\n return { isValid: false, errors };\r\n }\r\n throw err;\r\n }\r\n }\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,mBAUO;;;ACRA,IAAM,gBAAN,MAAmD;AAAA,EAAnD;AACH,wBAAQ,WAA+B,CAAC;AAAA;AAAA,EAExC,SAAY,QAAgB,MAAe;AACvC,SAAK,QAAQ,MAAM,IAAI;AAAA,EAC3B;AAAA,EAEA,QAAW,QAA+B;AACtC,WAAO,KAAK,QAAQ,MAAM;AAAA,EAC9B;AAAA,EAEA,QAAc;AACV,SAAK,UAAU,CAAC;AAAA,EACpB;AACJ;;;ACXA,IAAM,YAAY,oBAAI,IAAsB;AAMrC,SAAS,OAAO,MAAwB;AAC3C,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,MAAI,UAAU,IAAI,IAAI,GAAG;AACrB,WAAO,UAAU,IAAI,IAAI;AAAA,EAC7B;AAGA,MAAI;AACJ,MAAI,KAAK,SAAS,GAAG,GAAG;AACpB,WAAO,KAAK,QAAQ,cAAc,KAAK,EAAE,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EACtE,OAAO;AACH,WAAO,KAAK,MAAM,GAAG,EAAE,OAAO,OAAO;AAAA,EACzC;AAEA,YAAU,IAAI,MAAM,IAAI;AACxB,SAAO;AACX;AAMO,SAAS,UAAU,KAAU,MAAc,cAAiC;AAC/E,MAAI,CAAC,QAAQ,QAAQ,UAAa,QAAQ,KAAM,QAAO,gBAAgB;AAGvE,MAAI,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAC5C,UAAM,MAAM,IAAI,IAAI;AACpB,WAAO,QAAQ,SAAY,MAAM;AAAA,EACrC;AAEA,QAAM,OAAO,OAAO,IAAI;AACxB,MAAI,SAAS;AAEb,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AAClC,QAAI,WAAW,UAAa,WAAW,KAAM,QAAO;AACpD,aAAS,OAAO,KAAK,CAAC,CAAC;AAAA,EAC3B;AAEA,SAAO,WAAW,SAAY,SAAS;AAC3C;AAMO,SAAS,UAA4B,KAAQ,MAAc,OAAmB;AACjF,MAAI,CAAC,KAAM,QAAO;AAGlB,MAAI,CAAC,KAAK,SAAS,GAAG,KAAK,CAAC,KAAK,SAAS,GAAG,GAAG;AAG5C,QAAI,MAAM,QAAQ,GAAG,GAAG;AACpB,YAAM,OAAO,CAAC,GAAG,GAAG;AACpB,WAAK,IAAI,IAAI;AACb,aAAO;AAAA,IACX;AACA,WAAO,EAAE,GAAG,KAAK,CAAC,IAAI,GAAG,MAAM;AAAA,EACnC;AAEA,QAAM,OAAO,OAAO,IAAI;AACxB,MAAI,KAAK,WAAW,EAAG,QAAO;AAG9B,QAAM,OAAO,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,GAAG,IAAI,EAAE,GAAG,IAAI;AACtD,MAAI,UAAe;AAEnB,WAAS,IAAI,GAAG,IAAI,KAAK,SAAS,GAAG,KAAK;AACtC,UAAM,MAAM,KAAK,CAAC;AAClB,UAAM,UAAU,KAAK,IAAI,CAAC;AAI1B,UAAM,WAAW,QAAQ,GAAG;AAC5B,QAAI;AAEJ,QAAI,YAAY,OAAO,aAAa,UAAU;AAC1C,kBAAY,MAAM,QAAQ,QAAQ,IAAI,CAAC,GAAG,QAAQ,IAAI,EAAE,GAAG,SAAS;AAAA,IACxE,OAAO;AAEH,YAAM,YAAY,QAAQ,KAAK,OAAO;AACtC,kBAAY,YAAY,CAAC,IAAI,CAAC;AAAA,IAClC;AAEA,YAAQ,GAAG,IAAI;AACf,cAAU;AAAA,EACd;AAGA,QAAM,UAAU,KAAK,KAAK,SAAS,CAAC;AACpC,UAAQ,OAAO,IAAI;AAEnB,SAAO;AACX;AAMO,SAAS,aAAa,GAAQ,GAAiB;AAClD,MAAI,OAAO,GAAG,GAAG,CAAC,EAAG,QAAO;AAC5B,MAAI,OAAO,MAAM,YAAY,MAAM,QAAQ,OAAO,MAAM,YAAY,MAAM,MAAM;AAC5E,WAAO;AAAA,EACX;AAEA,QAAM,QAAQ,OAAO,KAAK,CAAC;AAC3B,QAAM,QAAQ,OAAO,KAAK,CAAC;AAE3B,MAAI,MAAM,WAAW,MAAM,OAAQ,QAAO;AAE1C,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACnC,UAAM,MAAM,MAAM,CAAC;AACnB,QAAI,CAAC,OAAO,UAAU,eAAe,KAAK,GAAG,GAAG,KAAK,CAAC,OAAO,GAAG,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,GAAG;AAC7E,aAAO;AAAA,IACX;AAAA,EACJ;AAEA,SAAO;AACX;;;AF0lBM;AAnqBN,IAAM,yBAAqB;AAAA,EACzB;AACF;AACA,IAAM,2BAAuB;AAAA,EAC3B;AACF;AAGO,IAAM,cAAN,MAAqB;AAAA,EAK1B,YAAY,aAAgB;AAJ5B,wBAAQ;AACR,wBAAQ,aAAY,oBAAI,IAAgB;AACxC,qCAAY,oBAAI,IAAiC;AAwFjD,qCAAY,CAAC,aAAyB;AACpC,WAAK,UAAU,IAAI,QAAQ;AAC3B,aAAO,MAAM,KAAK,UAAU,OAAO,QAAQ;AAAA,IAC7C;AAxFE,SAAK,QAAQ;AAAA,MACX,MAAM;AAAA,MACN,QAAQ,CAAC;AAAA,IACX;AAAA,EACF;AAAA,EAEA,cAAc;AACZ,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,OAAO,SAAY;AACjB,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,MAAM,QAAQ;AAC5C,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGQ,aAAa;AACnB,UAAM,eAAuD,CAAC;AAC9D,eAAW,CAAC,QAAQ,WAAW,KAAK,KAAK,UAAU,QAAQ,GAAG;AAC5D,UAAI,YAAY,OAAO,GAAG;AACxB,qBAAa,MAAM,IAAI,OAAO,YAAY,WAAW;AAAA,MACvD;AAAA,IACF;AACA,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,QAAQ,aAAa;AACnD,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,aAAa,WAAmD;AAE9D,SAAK,UAAU,MAAM;AACrB,eAAW,CAAC,QAAQ,WAAW,KAAK,OAAO,QAAQ,SAAS,GAAG;AAC3D,YAAM,UAAU,oBAAI,IAAoB;AACxC,iBAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,WAAW,GAAG;AACpD,gBAAQ,IAAI,OAAO,GAAG;AAAA,MAC1B;AACA,UAAI,QAAQ,OAAO,EAAG,MAAK,UAAU,IAAI,QAAQ,OAAO;AAAA,IAC5D;AACA,SAAK,QAAQ,EAAE,GAAG,KAAK,OAAO,QAAQ,UAAU;AAChD,SAAK,OAAO;AAAA,EACd;AAAA;AAAA,EAGA,cAAc,QAAgB,QAAmD;AAC7E,QAAI,CAAC,UAAU,OAAO,KAAK,MAAM,EAAE,WAAW,GAAG;AAC7C,UAAI,KAAK,UAAU,IAAI,MAAM,GAAG;AAC5B,aAAK,UAAU,OAAO,MAAM;AAC5B,aAAK,WAAW;AAChB,eAAO;AAAA,MACX;AACA,aAAO;AAAA,IACX;AAGA,UAAM,UAAU,oBAAI,IAAoB;AACxC,eAAW,CAAC,OAAO,GAAG,KAAK,OAAO,QAAQ,MAAM,GAAG;AAC/C,cAAQ,IAAI,OAAO,GAAG;AAAA,IAC1B;AACA,SAAK,UAAU,IAAI,QAAQ,OAAO;AAElC,SAAK,WAAW;AAChB,WAAO;AAAA,EACX;AAAA;AAAA,EAGA,YAAY,QAAgB,MAAuB;AACjD,UAAM,aAAa,KAAK,UAAU,IAAI,MAAM;AAC5C,QAAI,CAAC,WAAY,QAAO;AAExB,QAAI,WAAW,IAAI,IAAI,GAAG;AACvB,iBAAW,OAAO,IAAI;AACtB,UAAI,WAAW,SAAS,GAAG;AACvB,aAAK,UAAU,OAAO,MAAM;AAAA,MAChC;AAEA,WAAK,WAAW;AAChB,aAAO;AAAA,IACV;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS;AACf,SAAK,UAAU,QAAQ,CAAC,MAAM,EAAE,CAAC;AAAA,EACnC;AAMF;AASO,SAAS,eAA8E;AAAA,EAC5F;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAmC;AACjC,QAAM,CAAC,eAAe,gBAAgB,QAAI,uBAAsB,EAAE;AAElE,QAAM,uBAAmB,qBAAoB,aAAa;AAC1D,8BAAU,MAAM;AACd,qBAAiB,UAAU;AAAA,EAC7B,GAAG,CAAC,aAAa,CAAC;AAElB,QAAM,CAAC,cAAc,eAAe,QAAI,uBAAsB,oBAAI,IAAI,CAAC;AACvE,QAAM,CAAC,gBAAgB,iBAAiB,QAAI,uBAAsB,oBAAI,IAAI,CAAC;AAC3E,QAAM,CAAC,YAAY,aAAa,QAAI,uBAAsB,oBAAI,IAAI,CAAC;AACnE,QAAM,CAAC,EAAE,iBAAiB,QAAI,uBAE5B,CAAC,CAAC;AACJ,QAAM,CAAC,WAAW,YAAY,QAAI,uBAAkB,IAAI;AACxD,QAAM,CAAC,WAAW,eAAe,QAAI,4BAAc;AAGnD,QAAM,eAAW,qBAAO,IAAI,YAAgB,eAAe,CAAC,CAAO,CAAC;AAGpE,QAAM,yBAAqB,sBAA6B,MAAM;AAC5D,WAAO,OAAO,aAAa,WAAW,IAAI,cAAc;AAAA,EAC1D,GAAG,CAAC,OAAO,aAAa,OAAO,CAAC;AAEhC,QAAM,kBAAkB,OAAO,aAAa,QAAQ;AAGpD,QAAM,eAAW,sBAAQ,MAAM;AAC7B,UAAM,MAAM,oBAAI,IAAyC;AACzD,WAAO,MAAM,QAAQ,CAAC,SAAsC,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC;AAClF,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,KAAK,CAAC;AAGjB,QAAM,yBAAqB,qBAAsC,CAAC,CAAC;AAGnE,QAAM,kBAAc;AAAA,IAClB,SAAS,QAAQ;AAAA,QACjB,0BAAY,MAAM;AAChB,YAAM,cAAc,SAAS,QAAQ,YAAY,EAAE;AACnD,YAAM,kBAAkB,OAAO,MAAM,OAAO,CAAC,SAAsC;AACjF,YAAI,KAAK,WAAW;AAClB,iBAAO,KAAK,UAAU,WAAW;AAAA,QACnC;AACA,eAAO;AAAA,MACT,CAAC;AAGD,YAAM,UAAU,mBAAmB,QAAQ,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,GAAG;AAClE,YAAM,UAAU,gBAAgB,IAAI,OAAK,EAAE,EAAE,EAAE,KAAK,GAAG;AAEvD,UAAI,YAAY,WAAW,mBAAmB,QAAQ,SAAS,GAAG;AAC/D,eAAO,mBAAmB;AAAA,MAC7B;AAEA,yBAAmB,UAAU;AAC7B,aAAO;AAAA,IACT,GAAG,CAAC,OAAO,KAAK,CAAC;AAAA,EACnB;AAEA,QAAM,0BAAsB,sBAAQ,MAAM;AACxC,UAAM,MAAM,oBAAI,IAAoB;AACpC,gBAAY,QAAQ,CAAC,GAAgC,MAAc,IAAI,IAAI,EAAE,IAAI,CAAC,CAAC;AACnF,WAAO;AAAA,EACT,GAAG,CAAC,WAAW,CAAC;AAGhB,8BAAU,MAAM;AACd,QAAI,CAAC,iBAAiB,YAAY,SAAS,GAAG;AAC5C,UAAI,eAAe;AAEjB,cAAM,SAAS,YAAY,KAAK,CAAC,MAAmC,EAAE,OAAO,aAAa;AAC1F,YAAI,QAAQ;AACV,2BAAiB,OAAO,EAAE;AAAA,QAC5B,OAAO;AAEL,2BAAiB,YAAY,CAAC,EAAE,EAAE;AAAA,QACpC;AAAA,MACF,OAAO;AACL,yBAAiB,YAAY,CAAC,EAAE,EAAE;AAAA,MACpC;AACA,mBAAa,KAAK;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,aAAa,eAAe,aAAa,CAAC;AAI9C,QAAM,eAAW,qBAAO;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAGD,WAAS,UAAU;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAGA,QAAM,kBAAc;AAAA,IAClB,MAAM,SAAS,IAAI,aAAuB,KAAK;AAAA,IAC/C,CAAC,UAAU,aAAa;AAAA,EAC1B;AACA,QAAM,uBAAmB;AAAA,IACvB,MAAM,oBAAoB,IAAI,aAAuB,KAAK;AAAA,IAC1D,CAAC,qBAAqB,aAAa;AAAA,EACrC;AACA,QAAM,cAAc,qBAAqB;AACzC,QAAM,aAAa,qBAAqB,YAAY,SAAS;AAG7D,QAAM,WAAW;AAIjB,QAAM,cAAU,0BAAY,MAAM;AAChC,iBAAa,IAAI;AACjB,UAAM,EAAE,oBAAAA,qBAAoB,QAAAC,QAAO,IAAI,SAAS;AAEhD,UAAM,SAASD,oBAAmB,QAI/B,QAAQ;AAEX,QAAI,QAAQ;AACV,UAAI,OAAO,cAAe,kBAAiB,OAAO,aAAuB;AACzE,UAAI,OAAO,QAAS,iBAAgB,IAAI,IAAI,OAAO,OAAmB,CAAC;AACvE,UAAI,OAAO,UAAW,mBAAkB,IAAI,IAAI,OAAO,SAAqB,CAAC;AAAA,IAC/E;AAEA,UAAM,aAAyB,CAAC;AAChC,IAAAC,QAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,YAAM,WAAWD,oBAAmB,QAAQ,KAAK,EAAE;AACnD,UAAI,UAAU;AACZ,eAAO,OAAO,YAAY,QAAQ;AAAA,MACpC;AAAA,IACF,CAAC;AAED,QAAI,OAAO,KAAK,UAAU,EAAE,SAAS,GAAG;AACtC,YAAM,cAAc,SAAS,QAAQ,YAAY,EAAE;AACnD,YAAM,UAAU,EAAE,GAAG,aAAa,GAAG,WAAW;AAChD,eAAS,QAAQ,OAAO,OAAO;AAAA,IACjC;AACA,iBAAa,KAAK;AAAA,EACpB,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACd,YAAQ;AAAA,EACV,GAAG,CAAC,OAAO,CAAC;AAIZ,QAAM,eAAW;AAAA,IACf,CAAC,MAAuB,QAAgB,SAAc;AACpD,YAAM,EAAE,UAAAE,WAAU,oBAAAF,qBAAoB,iBAAiB,WAAW,IAAI,SAAS;AAC/E,YAAM,aAAaE,UAAS,IAAI,MAAM;AACtC,YAAM,cAAc,YAAY;AAChC,YAAM,WAAW,YAAY;AAC7B,YAAM,eAAe,eAAeF;AACpC,YAAM,YAAY,YAAY;AAE9B,UAAI,SAAS,aAAa,SAAS,UAAU;AAC3C,qBAAa,SAAS,QAAQ,IAAI;AAAA,MACpC;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,2BAAuB;AAAA,IAC3B;AAAA,EACF;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO,QAAgB,SAA8B;AACnD,YAAM,EAAE,UAAAE,UAAS,IAAI,SAAS;AAC9B,YAAM,OAAOA,UAAS,IAAI,MAAM;AAChC,UAAI,CAAC,QAAQ,CAAC,KAAK,mBAAmB;AACpC,eAAO;AAAA,MACT;AAEA,YAAM,SAAS,MAAM,KAAK,kBAAkB,SAAS,IAAI;AAEzD,UAAI,OAAO,SAAS;AAGlB,cAAM,UAAU,SAAS,QAAQ,cAAc,QAAQ,IAAI;AAE3D,YAAI,SAAS;AACT,4BAAkB,SAAS,QAAQ,YAAY,EAAE,MAAM;AACvD,wBAAc,CAAC,SAAS;AACtB,kBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,iBAAK,OAAO,MAAM;AAClB,mBAAO;AAAA,UACT,CAAC;AAAA,QACL;AACA,eAAO;AAAA,MACT,OAAO;AAGL,iBAAS,QAAQ,cAAc,QAAQ,OAAO,UAAU,IAAI;AAC5D,0BAAkB,SAAS,QAAQ,YAAY,EAAE,MAAM;AAEvD,sBAAc,CAAC,SAAS;AACtB,gBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,eAAK,IAAI,MAAM;AACf,iBAAO;AAAA,QACT,CAAC;AACD,eAAO;AAAA,MACT;AAAA,IACF;AAAA,IACA,CAAC;AAAA,EACH;AAGA,QAAM,kBAAc;AAAA,IAClB,CAAC,QAAgB,SAAc;AAC7B,YAAM,EAAE,iBAAAC,iBAAgB,IAAI,SAAS;AACrC,YAAM,WAAW,SAAS,QAAQ,YAAY,EAAE;AAChD,YAAM,UAAU,EAAE,GAAG,UAAU,GAAG,KAAK;AAEvC,eAAS,QAAQ,OAAO,OAAO;AAE/B,YAAM,aAAa,SAAS,QAAQ,SAAS,IAAI,MAAgB;AACjE,YAAM,gBAAgB,YAAY,mBAAmBA;AAErD,UAAI,kBAAkB,YAAY;AAChC,iBAAS,YAAY,QAAQ,OAAO;AAAA,MACtC;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,cAAU;AAAA,IACd,CAAC,MAAc,OAAY,YAA8C;AACvE,YAAM,EAAE,iBAAAA,kBAAiB,UAAAD,UAAS,IAAI,SAAS;AAC/C,YAAM,WAAW,SAAS,QAAQ,YAAY,EAAE;AAEhD,YAAM,eAAe,UAAU,UAAU,IAAI;AAC7C,UAAI,iBAAiB,MAAO;AAE5B,YAAM,UAAU,UAAU,UAAU,MAAM,KAAK;AAG/C,eAAS,QAAQ,OAAO,OAAO;AAE/B,YAAM,eAAe,SAAS,QAAQ;AACtC,YAAM,aAAaA,UAAS,IAAI,YAAsB;AAGtD,UAAI,cAAc;AACf,cAAM,aAAa,SAAS,QAAQ,YAAY,cAAc,IAAI;AAClE,YAAI,YAAY;AAEZ,cAAI,CAAC,SAAS,QAAQ,UAAU,IAAI,YAAY,GAAG;AAC9C,0BAAc,UAAQ;AACpB,oBAAM,OAAO,IAAI,IAAI,IAAI;AACzB,mBAAK,OAAO,YAAY;AACxB,qBAAO;AAAA,YACV,CAAC;AAAA,UACL;AAAA,QACJ;AAAA,MACH;AAGA,UAAI,gBAAgB,SAAS,QAAQ,YAAY,EAAE,OAAO,YAAY,GAAG;AACtE,wBAAgB,MAAM;AACnB,4BAAkB,SAAS,QAAQ,YAAY,EAAE,MAAM;AAAA,QAC1D,CAAC;AAAA,MACJ;AAGA,YAAM,EAAE,QAAAD,QAAO,IAAI,SAAS;AAC5B,YAAM,OAAO,YAAY,kBAAkBA,QAAO,kBAAkB;AAGpE,UAAI,SAAS,YAAY;AACpB,YAAI,SAAS,oBAAoB;AAChC,cAAI,qBAAqB;AACvB,yBAAa,qBAAqB,OAAO;AAC3C,+BAAqB,UAAU,WAAW,MAAM;AAC9C,gBAAI;AACF,kBAAI,cAAc;AAChB,6BAAa,cAAwB,OAAO,EAAE,MAAM,CAAC,QAAQ;AAC3D,0BAAQ,MAAM,yCAAyC,GAAG;AAAA,gBAC5D,CAAC;AAAA,cACH;AAAA,YACF,SAAS,GAAG;AACV,sBAAQ,MAAM,uCAAuC,CAAC;AAAA,YACxD;AAAA,UACF,GAAG,QAAQ,kBAAkB;AAAA,QAC/B,OAAO;AACJ,cAAI,aAAc,cAAa,cAAwB,OAAO;AAAA,QACjE;AAAA,MACJ;AAEA,YAAM,2BAA2B,YAAY,mBAAmBE;AAChE,UAAI,6BAA6B,cAAc,cAAc;AAC3D,iBAAS,YAAY,cAAwB,OAAO;AAAA,MACtD;AAAA,IACF;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAEA,QAAM,iBAAa;AAAA,IACjB,CAAC,MAAkB,YAAuD;AACxE,YAAM,EAAE,QAAAF,QAAO,IAAI,SAAS;AAC5B,YAAM,WAAW,SAAS,QAAQ,YAAY,EAAE;AAChD,YAAM,UAAU,SAAS,UAAW,OAAa,EAAE,GAAG,UAAU,GAAG,KAAK;AAExE,eAAS,QAAQ,OAAO,OAAO;AAE/B,UAAI,SAAS,SAAS;AACpB,QAAAA,QAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,mBAAS,UAAU,KAAK,IAAI,OAAO;AAAA,QACrC,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,cAAU,0BAAY,CAAC,MAAc,iBAAuB;AAChE,WAAO,UAAU,SAAS,QAAQ,YAAY,EAAE,MAAM,MAAM,YAAY;AAAA,EAC1E,GAAG,CAAC,CAAC;AAGL,QAAM,uBAAmB;AAAA,IACvB,CAAC,OAAe,UAAe;AAC7B,YAAM,EAAE,eAAAG,eAAc,IAAI,SAAS;AACnC,UAAI,CAACA,eAAe;AACpB,cAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,CAAC,OAAO;AAAA,EACV;AAEA,QAAM,kBAAc,0BAAY,YAG1B;AACJ,UAAM,EAAE,aAAAC,aAAY,IAAI,SAAS;AAGjC,UAAM,cAAc,SAAS,QAAQ,YAAY,EAAE;AACnD,UAAM,oBAAoB,MAAM,QAAQ;AAAA,MACpCA,aAAY,IAAI,CAAC,SAAsC,aAAa,KAAK,IAAI,WAAW,CAAC;AAAA,IAC7F;AAEA,UAAM,UAAU,kBAAkB,MAAM,OAAO;AAC/C,UAAM,cAAc,SAAS,QAAQ,YAAY,EAAE;AACnD,WAAO,EAAE,SAAS,QAAQ,YAAY;AAAA,EACxC,GAAG,CAAC,YAAY,CAAC;AAEjB,QAAM,eAAW;AAAA,IACf,OAAO,WAAqC;AAC1C,YAAM;AAAA,QACF,qBAAAC;AAAA,QACA,eAAAF;AAAA,QACA,QAAAH;AAAA,QACA,iBAAAE;AAAA,QACA,cAAAI;AAAA,QACA,gBAAAC;AAAA,QACA,oBAAAR;AAAA,QACA,UAAAE;AAAA,MACJ,IAAI,SAAS;AAEb,YAAM,cAAcI,qBAAoB,IAAI,MAAM,KAAK;AACvD,UAAI,gBAAgB,GAAI,QAAO;AAE/B,YAAM,cAAc,SAAS,QAAQ,YAAY,EAAE;AACnD,YAAMG,oBAAmBH,qBAAoB,IAAIF,cAAuB,KAAK;AAC7E,YAAMM,eAAcR,UAAS,IAAIE,cAAuB;AAExD,UAAI,cAAcK,mBAAkB;AAClC,cAAM,iBACJC,cAAa,gBAAgBT,QAAO,gBAAgB;AACtD,YAAI,kBAAkBG,gBAAe;AACnC,gBAAM,UAAU,MAAM,aAAaA,gBAAyB,WAAW;AACvE,cAAI,CAAC,QAAS,QAAO;AAAA,QACvB;AAAA,MACF;AAEA,UAAIM,gBAAeN,gBAAe;AAChC,cAAM,2BAA2BM,aAAY,mBAAmBP;AAChE,YAAI,6BAA6B,gBAAgB;AAC9C,mBAAS,gBAAgBC,gBAAyB,WAAW;AAAA,QAChE;AAAA,MACF;AAEA,YAAM,cAAc,IAAI,IAAIG,aAAY;AACxC,UAAIH,eAAe,aAAY,IAAIA,cAAuB;AAE1D,sBAAgB,WAAW;AAC3B,uBAAiB,MAAM;AAEvB,UAAID,qBAAoB,UAAU;AAChC,QAAAH,oBAAmB,SAAS,UAAU;AAAA,UACpC,eAAe;AAAA,UACf,SAAS,MAAM,KAAK,WAAW;AAAA,UAC/B,WAAW,MAAM,KAAKQ,eAAc;AAAA,QACtC,CAAC;AAAA,MACH;AAGA,UAAIP,QAAO,cAAc;AACvB,QAAAA,QAAO,aAAaG,kBAAiB,MAAM,QAAQ,WAAW;AAAA,MAChE;AAEA,aAAO,SAAS,GAAG,CAAC;AACpB,aAAO;AAAA,IACT;AAAA,IACA,CAAC,UAAU,YAAY;AAAA,EACzB;AAEA,QAAM,mBAAe,0BAAY,YAAY;AAC3C,UAAM,EAAE,aAAAC,cAAa,qBAAAC,sBAAqB,eAAAF,gBAAe,gBAAAI,iBAAgB,iBAAAL,iBAAgB,IAAI,SAAS;AACtG,UAAMM,oBAAmBH,qBAAoB,IAAIF,cAAuB,KAAK;AAE7E,QAAIK,sBAAqB,MAAMA,sBAAqBJ,aAAY,SAAS,EAAG;AAE5E,UAAM,WAAWA,aAAYI,oBAAmB,CAAC;AACjD,QAAI,UAAU;AACZ,YAAM,UAAU,MAAM,SAAS,SAAS,EAAE;AAC1C,UAAI,SAAS;AACX,cAAM,gBAAgB,IAAI,IAAID,eAAc,EAAE,IAAIJ,cAAuB;AACzE,0BAAkB,aAAa;AAE/B,YAAID,qBAAoB,UAAU;AAChC,6BAAmB,SAAS,UAAU;AAAA,YACpC,eAAe,SAAS;AAAA,YACxB,SAAS,MAAM,KAAK,IAAI,IAAI,YAAY,EAAE,IAAIC,cAAuB,CAAC;AAAA,YACtE,WAAW,MAAM,KAAK,aAAa;AAAA,UACrC,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,mBAAe,0BAAY,MAAM;AACrC,UAAM,EAAE,aAAAC,cAAa,qBAAAC,sBAAqB,eAAAF,eAAc,IAAI,SAAS;AACrE,UAAMK,oBAAmBH,qBAAoB,IAAIF,cAAuB,KAAK;AAC7E,QAAIK,qBAAoB,EAAG;AAC3B,UAAM,WAAWJ,aAAYI,oBAAmB,CAAC;AACjD,QAAI,UAAU;AACZ,eAAS,SAAS,EAAE;AAAA,IACtB;AAAA,EACF,GAAG,CAAC,QAAQ,CAAC;AAEb,QAAM,mBAAe,0BAAY,MAAM;AACpC,aAAS,QAAQ,mBAAmB,MAAM;AAAA,EAC7C,GAAG,CAAC,CAAC;AAEL,QAAM,WAAO;AAAA,IACX,CAAC,YAA0C;AACzC,YAAM,EAAE,QAAAR,SAAQ,eAAAG,eAAc,IAAI,SAAS;AAC3C,YAAM,OAAO,SAAS,QAAQ,YAAY,EAAE;AAE5C,UAAI,YAAY,MAAM;AACpB,QAAAH,QAAO,MAAM,QAAQ,CAAC,SAAS;AAC7B,mBAAS,UAAU,KAAK,IAAI,IAAI;AAAA,QAClC,CAAC;AACD;AAAA,MACF;AAEA,UAAI,CAAC,SAAS;AACZ,YAAIG,gBAAe;AACjB,mBAAS,UAAUA,gBAAyB,IAAI;AAAA,QAClD;AACA;AAAA,MACF;AAEA,YAAM,MAAM,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,OAAO;AACvD,UAAI,QAAQ,CAAC,OAAO;AAClB,iBAAS,UAAU,IAAI,IAAI;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAGA,QAAM,iBAAa;AAAA,IACjB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,SAAS;AAAA,IAClB;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,mBAAe;AAAA,IACnB,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,cAAc,CAAC,QACb,aAAa,KAAK,SAAS,QAAQ,YAAY,EAAE,IAAI;AAAA,MACvD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SACE,4CAAC,mBAAmB,UAAnB,EAA4B,OAAO,YAClC,sDAAC,qBAAqB,UAArB,EAA8B,OAAO,cACnC,UACH,GACF;AAEJ;AAEO,SAAS,iBAAuF;AACrG,QAAM,cAAU,yBAAW,kBAAkB;AAC7C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,SAAO;AACT;AAEO,SAAS,eACd,MACA,SACQ;AACR,QAAM,EAAE,MAAM,IAAI,eAAe;AACjC,QAAM,mBAAe,qBAAY,IAAI;AACrC,QAAM,mBAAe,qBAAY,IAAI;AACrC,QAAM,UAAU,SAAS,WAAW,OAAO;AAE3C,QAAM,kBAAc,0BAAY,MAAM;AACpC,UAAM,YAAY,MAAM,YAAY;AACpC,UAAM,OAAO,UAAU;AACvB,QAAI,SAAS,aAAa,SAAS;AACjC,aAAO,aAAa;AAAA,IACtB;AACA,UAAM,QAAQ,UAAU,MAAM,IAAI;AAGlC,QAAI,aAAa,YAAY,UAAa,QAAQ,aAAa,SAAS,KAAK,GAAG;AAC9E,mBAAa,UAAU;AACvB,aAAO,aAAa;AAAA,IACtB;AAEA,iBAAa,UAAU;AACvB,iBAAa,UAAU;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,MAAM,OAAO,CAAC;AAEzB,aAAO,mCAAqB,MAAM,WAAW,WAAW;AAC1D;AAEO,SAAS,eAAe,MAAkC;AAC/D,QAAM,EAAE,MAAM,IAAI,eAAe;AACjC,QAAM,mBAAe,qBAAY,IAAI;AACrC,QAAM,mBAAe,qBAAY,IAAI;AAErC,QAAM,kBAAc,0BAAY,MAAM;AACpC,UAAM,YAAY,MAAM,YAAY;AACpC,UAAM,SAAS,UAAU;AACzB,QAAI,WAAW,aAAa,SAAS;AACnC,aAAO,aAAa;AAAA,IACtB;AAKA,QAAI;AACJ,WAAO,OAAO,MAAM,EAAE,QAAQ,CAAC,eAAe;AAC5C,YAAM,kBAAkB;AACxB,UAAI,gBAAgB,IAAI,EAAG,cAAa,gBAAgB,IAAI;AAAA,IAC9D,CAAC;AAED,iBAAa,UAAU;AACvB,iBAAa,UAAU;AACvB,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,IAAI,CAAC;AAEhB,aAAO,mCAAqB,MAAM,WAAW,WAAW;AAC1D;AAEO,SAAS,kBACd,UACA,SACW;AACX,QAAM,EAAE,MAAM,IAAI,eAAe;AACjC,QAAM,mBAAe,qBAAY,IAAI;AACrC,QAAM,oBAAgB,qBAAY,IAAI;AACtC,QAAM,UAAU,SAAS,WAAW,OAAO;AAE3C,QAAM,kBAAc,0BAAY,MAAM;AACpC,UAAM,YAAY,MAAM,YAAY;AACpC,QAAI,cAAc,aAAa,SAAS;AACtC,aAAO,cAAc;AAAA,IACvB;AAEA,UAAM,SAAS,SAAS,UAAU,IAAI;AAGtC,QAAI,cAAc,YAAY,QAAQ,QAAQ,cAAc,SAAS,MAAM,GAAG;AAC5E,mBAAa,UAAU;AACvB,aAAO,cAAc;AAAA,IACvB;AAEA,iBAAa,UAAU;AACvB,kBAAc,UAAU;AACxB,WAAO;AAAA,EACT,GAAG,CAAC,OAAO,UAAU,OAAO,CAAC;AAE7B,aAAO,mCAAqB,MAAM,WAAW,WAAW;AAC1D;AAEO,SAAS,mBAA2E;AACzF,QAAM,cAAU,yBAAW,oBAAoB;AAC/C,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACA,SAAO;AACT;AAEO,SAAS,mBAEd;AACA,QAAM,QAAQ,eAA0B;AACxC,QAAM,UAAU,iBAAyB;AAGzC,QAAM,aAAa,kBAAqB,CAAC,MAAM,CAAM;AACrD,QAAM,gBAAY,mCAAqB,MAAM,MAAM,WAAW,MAAM,MAAM,MAAM,YAAY,EAAE,MAAM;AAEpG,aAAO;AAAA,IACL,OAAO;AAAA,MACL,GAAG;AAAA,MACH,GAAG;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,IACA,CAAC,OAAO,SAAS,YAAY,SAAS;AAAA,EACxC;AACF;;;AGj2BA,IAAAO,gBAA+B;AA6Bb,IAAAC,sBAAA;AAdX,IAAM,qBAAwD,CAAC;AAAA,EACpE,SAAS;AACX,MAAM;AACJ,QAAM,EAAE,YAAY,IAAI,iBAAiB;AAEzC,QAAM,oBAAgB,uBAAQ,MAAM;AAClC,QAAI,CAAC,aAAa,UAAW,QAAO;AACpC,WAAO,YAAY;AAAA,EACrB,GAAG,CAAC,WAAW,CAAC;AAEhB,MAAI,CAAC,eAAe,CAAC,eAAe;AAClC,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,6CAAC,iBAAc;AAE/B,MAAI,SAAS;AACX,WAAO,6CAAC,WAA8B,qBAAjB,YAAY,EAAa;AAAA,EAChD;AAEA,SAAO;AACT;;;ACjCO,IAAM,YAAY,MAA0E;AACjG,SAAO,iBAA4B;AACrC;;;AC+BM,IAAAC,sBAAA;AAdC,SAAS,sBAA2F;AAIzG,QAAMC,kBAAiB,CAAC;AAAA,IACtB;AAAA,IACA;AAAA,IACA;AAAA,EACF,MAIM;AACJ,WACE;AAAA,MAAC;AAAA;AAAA,QACC;AAAA,QACA;AAAA,QAEC;AAAA;AAAA,IACH;AAAA,EAEJ;AAMA,QAAMC,aAAY,MAAuC;AACvD,WAAO,UAA+B;AAAA,EACxC;AAMA,QAAMC,oBAAmB,MAAM;AAC7B,WAAO,iBAAsC;AAAA,EAC/C;AAMA,QAAMC,kBAAiB,CACrB,MACA,YAC0B;AAC1B,WAAO,eAA0C,MAAM,OAAO;AAAA,EAChE;AAMA,QAAMC,qBAAoB,CACxB,UACA,YACc;AACd,WAAO,kBAAiC,UAAU,OAAO;AAAA,EAC3D;AAMA,QAAMC,kBAAiB,CACrB,SACuB;AACvB,WAAO,eAAmB,IAAI;AAAA,EAChC;AAMA,QAAMC,oBAAmB,MAAM;AAC7B,WAAO,iBAA6B;AAAA,EACtC;AAMA,QAAMC,kBAAiB,MAAM;AAC3B,WAAO,eAAoC;AAAA,EAC7C;AAMA,QAAM,aAAa,CACjB,WACG;AAEL,SAAO;AAAA,IACL,gBAAAP;AAAA,IACA,WAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA,kBAAAC;AAAA,IACA,gBAAAC;AAAA,IACA;AAAA,EACF;AACF;;;AC9HO,IAAM,sBAAN,MAAyD;AAAA,EAG5D,YAAY,SAAiB,WAAW;AAFxC,wBAAQ;AAGJ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEQ,OAAO,QAAwB;AACnC,WAAO,GAAG,KAAK,MAAM,GAAG,MAAM;AAAA,EAClC;AAAA,EAEA,SAAY,QAAgB,MAAe;AACvC,QAAI,OAAO,WAAW,YAAa;AACnC,QAAI;AACA,mBAAa,QAAQ,KAAK,OAAO,MAAM,GAAG,KAAK,UAAU,IAAI,CAAC;AAAA,IAClE,SAAS,OAAO;AACZ,cAAQ,KAAK,4CAA4C,KAAK;AAAA,IAClE;AAAA,EACJ;AAAA,EAEA,QAAW,QAA+B;AACtC,QAAI,OAAO,WAAW,YAAa,QAAO;AAC1C,QAAI;AACA,YAAM,OAAO,aAAa,QAAQ,KAAK,OAAO,MAAM,CAAC;AACrD,aAAO,OAAO,KAAK,MAAM,IAAI,IAAI;AAAA,IACrC,SAAS,OAAO;AACZ,cAAQ,KAAK,2CAA2C,KAAK;AAC7D,aAAO;AAAA,IACX;AAAA,EACJ;AAAA,EAEA,QAAc;AACV,QAAI,OAAO,WAAW,YAAa;AACnC,WAAO,KAAK,YAAY,EAAE,QAAQ,CAAC,QAAQ;AACvC,UAAI,IAAI,WAAW,KAAK,MAAM,GAAG;AAC7B,qBAAa,WAAW,GAAG;AAAA,MAC/B;AAAA,IACJ,CAAC;AAAA,EACL;AACJ;;;ACtCO,IAAM,aAAN,MAAoD;AAAA,EAGvD,YAAY,QAA0B;AAFtC,wBAAQ;AAGJ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,MAA0C;AACrD,UAAM,SAAS,MAAM,KAAK,OAAO,eAAe,IAAS;AACzD,QAAI,OAAO,SAAS;AAChB,aAAO,EAAE,SAAS,KAAK;AAAA,IAC3B;AAGA,UAAM,SAAiC,CAAC;AACxC,QAAI,OAAO,OAAO;AACd,aAAO,MAAM,OAAO,QAAQ,CAAC,QAAQ;AACjC,cAAM,OAAO,IAAI,KAAK,KAAK,GAAG;AAC9B,eAAO,IAAI,IAAI,IAAI;AAAA,MACvB,CAAC;AAAA,IACL;AACA,WAAO,EAAE,SAAS,OAAO,OAAO;AAAA,EACpC;AACJ;;;ACvBO,IAAM,aAAN,MAAoD;AAAA,EAGvD,YAAY,QAA0B;AAFtC,wBAAQ;AAGJ,SAAK,SAAS;AAAA,EAClB;AAAA,EAEA,MAAM,SAAS,MAA0C;AACrD,QAAI;AACA,YAAM,KAAK,OAAO,SAAS,MAAW,EAAE,YAAY,MAAM,CAAC;AAC3D,aAAO,EAAE,SAAS,KAAK;AAAA,IAC3B,SAAS,KAAK;AACV,UAAI,OAAO,OAAO,QAAQ,YAAY,WAAW,KAAK;AAClD,cAAM,WAAW;AACjB,cAAM,SAAiC,CAAC;AACxC,iBAAS,MAAM,QAAQ,CAAC,UAAU;AAC9B,cAAI,MAAM,MAAM;AACZ,mBAAO,MAAM,IAAI,IAAI,MAAM;AAAA,UAC/B;AAAA,QACJ,CAAC;AACD,eAAO,EAAE,SAAS,OAAO,OAAO;AAAA,MACpC;AACA,YAAM;AAAA,IACV;AAAA,EACJ;AACJ;","names":["persistenceAdapter","config","stepsMap","persistenceMode","currentStepId","activeSteps","activeStepsIndexMap","visitedSteps","completedSteps","currentStepIndex","currentStep","import_react","import_jsx_runtime","import_jsx_runtime","WizardProvider","useWizard","useWizardContext","useWizardValue","useWizardSelector","useWizardError","useWizardActions","useWizardState"]}
package/dist/index.d.cts CHANGED
@@ -22,6 +22,13 @@ interface IValidatorAdapter<TData = unknown> {
22
22
  * - 'manual': Save only when manually triggered
23
23
  */
24
24
  type PersistenceMode = 'onStepChange' | 'onChange' | 'manual';
25
+ /**
26
+ * Validation Mode
27
+ * - 'onChange': Validate on every data change (debounced)
28
+ * - 'onStepChange': Validate only when moving to next step
29
+ * - 'manual': Validate only when manually triggered
30
+ */
31
+ type ValidationMode = 'onChange' | 'onStepChange' | 'manual';
25
32
  /**
26
33
  * Persistence Adapter Interface
27
34
  */
@@ -35,8 +42,8 @@ interface IPersistenceAdapter {
35
42
  * TStepData: Type of data for this step
36
43
  * TGlobalContext: Type of the global wizard data
37
44
  */
38
- interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
39
- id: string;
45
+ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown, StepId extends string = string> {
46
+ id: StepId;
40
47
  label: string;
41
48
  /**
42
49
  * Predicate to determine if step should be included/visible.
@@ -49,8 +56,16 @@ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
49
56
  validationAdapter?: IValidatorAdapter<TStepData>;
50
57
  /**
51
58
  * Override global auto-validation setting for this step
59
+ * @deprecated Use validationMode instead
52
60
  */
53
61
  autoValidate?: boolean;
62
+ /**
63
+ * Control when validation occurs for this step.
64
+ * - 'onChange': Validate on every keystroke (debounced)
65
+ * - 'onStepChange': Validate only when attempting to leave the step
66
+ * - 'manual': Only validate when explicitly triggered
67
+ */
68
+ validationMode?: ValidationMode;
54
69
  /**
55
70
  * Optional React Component to render for this step.
56
71
  * Used by the <WizardStepRenderer /> component.
@@ -60,20 +75,32 @@ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
60
75
  * Override global persistence adapter for this specific step.
61
76
  */
62
77
  persistenceAdapter?: IPersistenceAdapter;
78
+ /**
79
+ * Control when persistence occurs for this specific step.
80
+ * - 'onStepChange': Save when moving between steps (default)
81
+ * - 'onChange': Save on every data change (debounced)
82
+ * - 'manual': Save only when manually triggered
83
+ */
84
+ persistenceMode?: PersistenceMode;
63
85
  }
64
86
  /**
65
87
  * Wizard Configuration
66
88
  * T: Type of the Global Wizard Data
67
89
  */
68
- interface IWizardConfig<T = unknown> {
90
+ interface IWizardConfig<T = unknown, StepId extends string = string> {
69
91
  /**
70
92
  * Array of step configurations
71
93
  */
72
- steps: IStepConfig<unknown, T>[];
94
+ steps: IStepConfig<unknown, T, StepId>[];
73
95
  /**
74
96
  * Global auto-validation setting (default: true)
97
+ * @deprecated Use validationMode instead
75
98
  */
76
99
  autoValidate?: boolean;
100
+ /**
101
+ * Default validation mode for all steps (default: 'onChange')
102
+ */
103
+ validationMode?: ValidationMode;
77
104
  /**
78
105
  * Persistence configuration
79
106
  */
@@ -89,13 +116,13 @@ interface IWizardConfig<T = unknown> {
89
116
  * Callback triggered when step changes.
90
117
  * Useful for routing integration or analytics.
91
118
  */
92
- onStepChange?: (fromStep: string | null, toStep: string, data: T) => void;
119
+ onStepChange?: (fromStep: StepId | null, toStep: StepId, data: T) => void;
93
120
  }
94
121
  /**
95
122
  * Core Wizard Context State
96
123
  */
97
- interface IWizardContext<T = unknown> {
98
- currentStep: IStepConfig<unknown, T> | null;
124
+ interface IWizardContext<T = unknown, StepId extends string = string> {
125
+ currentStep: IStepConfig<unknown, T, StepId> | null;
99
126
  currentStepIndex: number;
100
127
  isFirstStep: boolean;
101
128
  isLastStep: boolean;
@@ -104,7 +131,7 @@ interface IWizardContext<T = unknown> {
104
131
  /**
105
132
  * Active steps (those meeting conditions)
106
133
  */
107
- activeSteps: IStepConfig<unknown, T>[];
134
+ activeSteps: IStepConfig<unknown, T, StepId>[];
108
135
  /**
109
136
  * Unified Wizard Data
110
137
  */
@@ -116,19 +143,19 @@ interface IWizardContext<T = unknown> {
116
143
  /**
117
144
  * Steps Status
118
145
  */
119
- visitedSteps: Set<string>;
120
- completedSteps: Set<string>;
121
- errorSteps: Set<string>;
146
+ visitedSteps: Set<StepId>;
147
+ completedSteps: Set<StepId>;
148
+ errorSteps: Set<StepId>;
122
149
  /**
123
150
  * Navigation Actions
124
151
  */
125
152
  goToNextStep: () => Promise<void>;
126
153
  goToPrevStep: () => void;
127
- goToStep: (stepId: string) => Promise<boolean>;
154
+ goToStep: (stepId: StepId) => Promise<boolean>;
128
155
  /**
129
156
  * Data Actions
130
157
  */
131
- setStepData: (stepId: string, data: unknown) => void;
158
+ setStepData: (stepId: StepId, data: unknown) => void;
132
159
  handleStepChange: (field: string, value: unknown) => void;
133
160
  /**
134
161
  * Set data by path (supports dot notation and arrays, e.g., 'user.name' or 'items[0].value')
@@ -151,75 +178,84 @@ interface IWizardContext<T = unknown> {
151
178
  /**
152
179
  * Validation & Persistence
153
180
  */
154
- validateStep: (sid: string) => Promise<boolean>;
181
+ validateStep: (sid: StepId) => Promise<boolean>;
155
182
  validateAll: () => Promise<{
156
183
  isValid: boolean;
157
184
  errors: Record<string, Record<string, string>>;
158
185
  }>;
159
- save: () => void;
186
+ save: (stepIds?: StepId | StepId[] | boolean) => void;
160
187
  clearStorage: () => void;
161
188
  }
162
189
 
163
- interface IWizardState<T = unknown> {
164
- currentStep: IStepConfig<unknown, T> | null;
190
+ interface IWizardState<T = unknown, StepId extends string = string> {
191
+ currentStep: IStepConfig<unknown, T, StepId> | null;
165
192
  currentStepIndex: number;
166
193
  isFirstStep: boolean;
167
194
  isLastStep: boolean;
168
195
  isLoading: boolean;
169
196
  isPending: boolean;
170
- activeSteps: IStepConfig<unknown, T>[];
171
- visitedSteps: Set<string>;
172
- completedSteps: Set<string>;
173
- errorSteps: Set<string>;
197
+ activeSteps: IStepConfig<unknown, T, StepId>[];
198
+ visitedSteps: Set<StepId>;
199
+ completedSteps: Set<StepId>;
200
+ errorSteps: Set<StepId>;
174
201
  store: WizardStore<T>;
175
202
  }
176
- interface IWizardActions {
203
+ interface IWizardActions<StepId extends string = string> {
177
204
  goToNextStep: () => Promise<void>;
178
205
  goToPrevStep: () => void;
179
- goToStep: (stepId: string) => Promise<boolean>;
180
- setStepData: (stepId: string, data: unknown) => void;
206
+ goToStep: (stepId: StepId) => Promise<boolean>;
207
+ setStepData: (stepId: StepId, data: unknown) => void;
181
208
  handleStepChange: (field: string, value: unknown) => void;
182
- validateStep: (sid: string) => Promise<boolean>;
209
+ validateStep: (sid: StepId) => Promise<boolean>;
183
210
  validateAll: () => Promise<{
184
211
  isValid: boolean;
185
212
  errors: Record<string, Record<string, string>>;
186
213
  }>;
187
- save: () => void;
214
+ save: (stepIds?: StepId | StepId[] | boolean) => void;
188
215
  clearStorage: () => void;
189
216
  setData: (path: string, value: unknown, options?: {
190
217
  debounceValidation?: number;
191
218
  }) => void;
192
219
  updateData: (data: Partial<any>, options?: {
193
220
  replace?: boolean;
221
+ persist?: boolean;
194
222
  }) => void;
195
223
  getData: (path: string, defaultValue?: unknown) => unknown;
196
224
  }
197
225
  declare class WizardStore<T> {
198
226
  private state;
199
227
  private listeners;
228
+ errorsMap: Map<string, Map<string, string>>;
200
229
  constructor(initialData: T);
201
- getSnapshot: () => {
230
+ getSnapshot(): {
202
231
  data: T;
203
232
  errors: Record<string, Record<string, string>>;
204
233
  };
205
234
  update(newData: T): void;
235
+ private syncErrors;
206
236
  updateErrors(newErrors: Record<string, Record<string, string>>): void;
237
+ setStepErrors(stepId: string, errors: Record<string, string> | undefined | null): boolean;
238
+ deleteError(stepId: string, path: string): boolean;
207
239
  private notify;
208
240
  subscribe: (listener: () => void) => () => boolean;
209
241
  }
210
- interface WizardProviderProps<T> {
211
- config: IWizardConfig<T>;
242
+ interface WizardProviderProps<T, StepId extends string> {
243
+ config: IWizardConfig<T, StepId>;
212
244
  initialData?: T;
213
- initialStepId?: string;
245
+ initialStepId?: StepId;
214
246
  children: React$1.ReactNode;
215
247
  }
216
- declare function WizardProvider<T extends Record<string, any>>({ config, initialData, initialStepId, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
217
- declare function useWizardState<T = unknown>(): IWizardState<T>;
218
- declare function useWizardValue<TValue = any>(path: string): TValue;
248
+ declare function WizardProvider<T extends Record<string, any>, StepId extends string = string>({ config, initialData, initialStepId, children, }: WizardProviderProps<T, StepId>): react_jsx_runtime.JSX.Element;
249
+ declare function useWizardState<T = unknown, StepId extends string = string>(): IWizardState<T, StepId>;
250
+ declare function useWizardValue<TValue = any>(path: string, options?: {
251
+ isEqual?: (a: TValue, b: TValue) => boolean;
252
+ }): TValue;
219
253
  declare function useWizardError(path: string): string | undefined;
220
- declare function useWizardSelector<TSelected = any>(selector: (state: any) => TSelected): TSelected;
221
- declare function useWizardActions(): IWizardActions;
222
- declare function useWizardContext<T = any>(): IWizardContext<T> & {
254
+ declare function useWizardSelector<TSelected = any>(selector: (state: any) => TSelected, options?: {
255
+ isEqual?: (a: TSelected, b: TSelected) => boolean;
256
+ }): TSelected;
257
+ declare function useWizardActions<StepId extends string = string>(): IWizardActions<StepId>;
258
+ declare function useWizardContext<T = any, StepId extends string = string>(): IWizardContext<T, StepId> & {
223
259
  store: WizardStore<T>;
224
260
  };
225
261
 
@@ -268,25 +304,29 @@ type PathValue<T, P extends Path<T>> = T extends any ? P extends `${infer K}.${i
268
304
  *
269
305
  * @template TSchema The shape of your wizard's global data state
270
306
  */
271
- declare function createWizardFactory<TSchema extends Record<string, any>>(): {
307
+ declare function createWizardFactory<TSchema extends Record<string, any>, StepId extends string = string>(): {
272
308
  WizardProvider: ({ config, initialData, children, }: {
273
- config: IWizardConfig<TSchema>;
309
+ config: IWizardConfig<TSchema, StepId>;
274
310
  initialData?: Partial<TSchema>;
275
311
  children: React$1.ReactNode;
276
312
  }) => react_jsx_runtime.JSX.Element;
277
- useWizard: () => IWizardContext<TSchema>;
278
- useWizardContext: () => IWizardContext<TSchema> & {
313
+ useWizard: () => IWizardContext<TSchema, StepId>;
314
+ useWizardContext: () => IWizardContext<TSchema, StepId> & {
279
315
  store: WizardStore<TSchema>;
280
316
  };
281
- useWizardValue: <P extends Path<TSchema>>(path: P) => PathValue<TSchema, P>;
282
- useWizardSelector: <TSelected>(selector: (state: TSchema) => TSelected) => TSelected;
317
+ useWizardValue: <P extends Path<TSchema>>(path: P, options?: {
318
+ isEqual?: (a: PathValue<TSchema, P>, b: PathValue<TSchema, P>) => boolean;
319
+ }) => PathValue<TSchema, P>;
320
+ useWizardSelector: <TSelected>(selector: (state: TSchema) => TSelected, options?: {
321
+ isEqual?: (a: TSelected, b: TSelected) => boolean;
322
+ }) => TSelected;
283
323
  useWizardError: <P extends Path<TSchema>>(path: P) => string | undefined;
284
- useWizardActions: () => IWizardActions;
285
- useWizardState: () => IWizardState<unknown>;
286
- createStep: <TStepData = unknown>(config: IStepConfig<TStepData, TSchema>) => IStepConfig<TStepData, TSchema>;
324
+ useWizardActions: () => IWizardActions<StepId>;
325
+ useWizardState: () => IWizardState<TSchema, StepId>;
326
+ createStep: <TStepData = unknown>(config: IStepConfig<TStepData, TSchema, StepId>) => IStepConfig<TStepData, TSchema, StepId>;
287
327
  };
288
328
 
289
- declare const useWizard: <T = any>() => IWizardContext<T>;
329
+ declare const useWizard: <T = any, StepId extends string = string>() => IWizardContext<T, StepId>;
290
330
 
291
331
  declare class MemoryAdapter implements IPersistenceAdapter {
292
332
  private storage;
@@ -341,12 +381,24 @@ declare class YupAdapter<T> implements IValidatorAdapter<T> {
341
381
  }
342
382
 
343
383
  /**
344
- * Retrieves a value from an object by path (dot notation or brackets)
384
+ * Parses a string path into an array of keys using a cache.
385
+ * Handles dot notation "a.b" and bracket notation "a[0].b".
386
+ */
387
+ declare function toPath(path: string): string[];
388
+ /**
389
+ * Retrieves a value from an object by path using cached key parsing.
390
+ * Optimized for frequent access.
345
391
  */
346
392
  declare function getByPath(obj: any, path: string, defaultValue?: unknown): unknown;
347
393
  /**
348
- * Immutably sets a value in an object by path
394
+ * Immutably sets a value in an object by path.
395
+ * iterative implementation (stack-safe and usually faster).
349
396
  */
350
397
  declare function setByPath<T extends object>(obj: T, path: string, value: unknown): T;
398
+ /**
399
+ * Simple shallow equality check for objects and arrays.
400
+ * Useful for preventing re-renders in selectors.
401
+ */
402
+ declare function shallowEqual(a: any, b: any): boolean;
351
403
 
352
- export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationResult, WizardProvider, WizardStepRenderer, WizardStore, YupAdapter, ZodAdapter, createWizardFactory, getByPath, setByPath, useWizard, useWizardActions, useWizardContext, useWizardError, useWizardSelector, useWizardState, useWizardValue };
404
+ export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationMode, type ValidationResult, WizardProvider, WizardStepRenderer, WizardStore, YupAdapter, ZodAdapter, createWizardFactory, getByPath, setByPath, shallowEqual, toPath, useWizard, useWizardActions, useWizardContext, useWizardError, useWizardSelector, useWizardState, useWizardValue };