wizzard-stepper-react 1.4.0 โ†’ 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -130,6 +130,15 @@ setData('items[0].value', 'New Value');
130
130
 
131
131
  // Get with default value
132
132
  const name = getData('user.profile.name', 'Anonymous');
133
+
134
+ // ๐Ÿ†• Bulk Update (Autofill)
135
+ const autoFillParams = () => {
136
+ // Merges into existing data
137
+ updateData({
138
+ name: 'John Doe',
139
+ email: 'john@example.com'
140
+ });
141
+ };
133
142
  ```
134
143
 
135
144
  ## Performance & Optimization ๐Ÿš€
@@ -221,6 +230,80 @@ const config: IWizardConfig = {
221
230
  }
222
231
  ```
223
232
 
233
+ ## Advanced Features ๐ŸŒŸ
234
+
235
+ ### 1. Step Renderer (Declarative UI)
236
+
237
+ Instead of manual switch statements with `currentStep.id`, trust the renderer!
238
+
239
+ ```typescript
240
+ // Define component in config
241
+ const steps = [
242
+ { id: 'step1', label: 'Start', component: Step1Component },
243
+ { id: 'step2', label: 'End', component: Step2Component },
244
+ ];
245
+
246
+ // Render
247
+ const App = () => (
248
+ <WizardProvider config={{ steps }}>
249
+ <WizardStepRenderer
250
+ wrapper={({ children }) => (
251
+ <motion.div initial={{ opacity: 0 }} animate={{ opacity: 1 }}>
252
+ {children}
253
+ </motion.div>
254
+ )}
255
+ />
256
+ </WizardProvider>
257
+ );
258
+ ```
259
+
260
+ ### 2. Routing Integration
261
+
262
+ Sync wizard state with URL using `onStepChange`.
263
+
264
+ ```tsx
265
+ const navigate = useNavigate();
266
+
267
+ const config: IWizardConfig = {
268
+ // 1. Sync State -> URL
269
+ onStepChange: (prev, next, data) => {
270
+ navigate(`/wizard/${next}`);
271
+ // Optional: Send event to Analytics
272
+ trackEvent('wizard_step', { step: next });
273
+ },
274
+ steps: [...]
275
+ };
276
+
277
+ // 2. Sync URL -> State (Initial Load)
278
+ const { stepId } = useParams();
279
+
280
+ return <WizardProvider config={config} initialStepId={stepId}>...</WizardProvider>;
281
+ ```
282
+
283
+ ### 3. Granular Persistence
284
+
285
+ By default, the wizard uses `MemoryAdapter` (RAM only). You can enable `LocalStorage` globally, but override it for sensitive steps.
286
+
287
+ ```tsx
288
+ const config: IWizardConfig = {
289
+ // Global: Persist everything to LocalStorage
290
+ persistence: { adapter: new LocalStorageAdapter('wizard_') },
291
+ steps: [
292
+ {
293
+ id: 'public',
294
+ label: 'Public Info',
295
+ // Inherits global adapter (LocalStorage)
296
+ },
297
+ {
298
+ id: 'sensitive',
299
+ label: 'Credit Card',
300
+ // Override: Store strictly in memory (cleared on refresh)
301
+ persistenceAdapter: new MemoryAdapter()
302
+ }
303
+ ]
304
+ };
305
+ ```
306
+
224
307
  ## API Reference
225
308
 
226
309
  ### `IWizardConfig<T>`
@@ -267,6 +350,20 @@ Check out the [Live Demo](https://ZizzX.github.io/wizzard-stepper-react/), [NPM]
267
350
  - **React Hook Form + Zod** integration.
268
351
  - **Formik + Yup** integration.
269
352
  - **Conditional Routing** logic.
353
+ - **Advanced Features Demo**: (`/advanced`) showcasing:
354
+ - **Autofill**: `updateData` global merge.
355
+ - **Declarative Rendering**: `<WizardStepRenderer />`.
356
+ - **Granular Persistence**: Hybrid Memory/LocalStorage.
357
+
358
+ ## Advanced Demo Guide ๐Ÿงช
359
+
360
+ Visit `/advanced` in the demo to try:
361
+
362
+ 1. **Autofill**: Click "Magic Autofill" to test `updateData()`. It instantly populates the form (merged with existing data).
363
+ 2. **Hybrid Persistence**:
364
+ * **Step 1 (Identity)**: Refreshes persist (LocalStorage).
365
+ * **Step 2 (Security)**: Refreshes CLEAR data (MemoryAdapter).
366
+ 3. **Declarative UI**: The steps are rendered using `<WizardStepRenderer />` with Framer Motion animations, defined in the config!
270
367
 
271
368
  ## License
272
369
 
package/dist/index.cjs CHANGED
@@ -25,6 +25,7 @@ __export(index_exports, {
25
25
  LocalStorageAdapter: () => LocalStorageAdapter,
26
26
  MemoryAdapter: () => MemoryAdapter,
27
27
  WizardProvider: () => WizardProvider,
28
+ WizardStepRenderer: () => WizardStepRenderer,
28
29
  WizardStore: () => WizardStore,
29
30
  YupAdapter: () => YupAdapter,
30
31
  ZodAdapter: () => ZodAdapter,
@@ -128,6 +129,7 @@ var WizardStore = class {
128
129
  function WizardProvider({
129
130
  config,
130
131
  initialData,
132
+ initialStepId,
131
133
  children
132
134
  }) {
133
135
  const [currentStepId, setCurrentStepId] = (0, import_react.useState)("");
@@ -161,10 +163,19 @@ function WizardProvider({
161
163
  }, [config.steps, wizardData, activeSteps]);
162
164
  (0, import_react.useEffect)(() => {
163
165
  if (!currentStepId && activeSteps.length > 0) {
164
- setCurrentStepId(activeSteps[0].id);
166
+ if (initialStepId) {
167
+ const target = activeSteps.find((s) => s.id === initialStepId);
168
+ if (target) {
169
+ setCurrentStepId(target.id);
170
+ } else {
171
+ setCurrentStepId(activeSteps[0].id);
172
+ }
173
+ } else {
174
+ setCurrentStepId(activeSteps[0].id);
175
+ }
165
176
  setIsLoading(false);
166
177
  }
167
- }, [activeSteps, currentStepId]);
178
+ }, [activeSteps, currentStepId, initialStepId]);
168
179
  const currentStep = (0, import_react.useMemo)(
169
180
  () => activeSteps.find((s) => s.id === currentStepId) || null,
170
181
  [activeSteps, currentStepId]
@@ -205,11 +216,14 @@ function WizardProvider({
205
216
  }, [hydrate]);
206
217
  const saveData = (0, import_react.useCallback)(
207
218
  (mode, stepId, data) => {
219
+ const stepConfig = config.steps.find((s) => s.id === stepId);
220
+ const stepAdapter = stepConfig?.persistenceAdapter;
221
+ const adapterToUse = stepAdapter || persistenceAdapter;
208
222
  if (mode === persistenceMode || mode === "manual") {
209
- persistenceAdapter.saveStep(stepId, data);
223
+ adapterToUse.saveStep(stepId, data);
210
224
  }
211
225
  },
212
- [persistenceAdapter, persistenceMode]
226
+ [persistenceAdapter, persistenceMode, config.steps]
213
227
  );
214
228
  const validationTimeoutRef = (0, import_react.useRef)(
215
229
  null
@@ -273,7 +287,13 @@ function WizardProvider({
273
287
  if (validationTimeoutRef.current)
274
288
  clearTimeout(validationTimeoutRef.current);
275
289
  validationTimeoutRef.current = setTimeout(() => {
276
- validateStep(currentStepId, newData);
290
+ try {
291
+ validateStep(currentStepId, newData).catch((err) => {
292
+ console.error("[Wizard] Debounced validation failed:", err);
293
+ });
294
+ } catch (e) {
295
+ console.error("[Wizard] Error starting validation:", e);
296
+ }
277
297
  }, options.debounceValidation);
278
298
  } else {
279
299
  validateStep(currentStepId, newData);
@@ -284,6 +304,20 @@ function WizardProvider({
284
304
  },
285
305
  [persistenceMode, saveData, currentStepId, validateStep]
286
306
  );
307
+ const updateData = (0, import_react.useCallback)(
308
+ (data, options) => {
309
+ const prevData = storeRef.current.getSnapshot().data;
310
+ const newData = options?.replace ? data : { ...prevData, ...data };
311
+ storeRef.current.update(newData);
312
+ startTransition(() => {
313
+ setWizardData(newData);
314
+ });
315
+ config.steps.forEach((step) => {
316
+ saveData("manual", step.id, newData);
317
+ });
318
+ },
319
+ [saveData, config.steps]
320
+ );
287
321
  const getData = (0, import_react.useCallback)((path, defaultValue) => {
288
322
  return getByPath(storeRef.current.getSnapshot().data, path, defaultValue);
289
323
  }, []);
@@ -301,7 +335,8 @@ function WizardProvider({
301
335
  const stepValid = await validateStep(step.id, currentData);
302
336
  if (!stepValid) isValid = false;
303
337
  }
304
- return isValid;
338
+ const finalErrors = storeRef.current.getSnapshot().errors;
339
+ return { isValid, errors: finalErrors };
305
340
  }, [activeSteps, validateStep]);
306
341
  const goToStep = (0, import_react.useCallback)(
307
342
  async (stepId) => {
@@ -328,6 +363,9 @@ function WizardProvider({
328
363
  completed: Array.from(completedSteps)
329
364
  });
330
365
  }
366
+ if (config.onStepChange) {
367
+ config.onStepChange(currentStepId, stepId, currentData);
368
+ }
331
369
  window.scrollTo(0, 0);
332
370
  return true;
333
371
  },
@@ -427,6 +465,7 @@ function WizardProvider({
427
465
  save,
428
466
  clearStorage,
429
467
  setData,
468
+ updateData,
430
469
  getData
431
470
  }),
432
471
  [
@@ -440,6 +479,7 @@ function WizardProvider({
440
479
  save,
441
480
  clearStorage,
442
481
  setData,
482
+ updateData,
443
483
  getData
444
484
  ]
445
485
  );
@@ -529,20 +569,41 @@ function useWizardContext() {
529
569
  );
530
570
  }
531
571
 
572
+ // src/components/WizardStepRenderer.tsx
573
+ var import_react2 = require("react");
574
+ var import_jsx_runtime2 = require("react/jsx-runtime");
575
+ var WizardStepRenderer = ({
576
+ wrapper: Wrapper
577
+ }) => {
578
+ const { currentStep } = useWizardContext();
579
+ const StepComponent = (0, import_react2.useMemo)(() => {
580
+ if (!currentStep?.component) return null;
581
+ return currentStep.component;
582
+ }, [currentStep]);
583
+ if (!currentStep || !StepComponent) {
584
+ return null;
585
+ }
586
+ const content = /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(StepComponent, {});
587
+ if (Wrapper) {
588
+ return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(Wrapper, { children: content }, currentStep.id);
589
+ }
590
+ return content;
591
+ };
592
+
532
593
  // src/hooks/useWizard.ts
533
594
  var useWizard = () => {
534
595
  return useWizardContext();
535
596
  };
536
597
 
537
598
  // src/factory.tsx
538
- var import_jsx_runtime2 = require("react/jsx-runtime");
599
+ var import_jsx_runtime3 = require("react/jsx-runtime");
539
600
  function createWizardFactory() {
540
601
  const WizardProvider2 = ({
541
602
  config,
542
603
  initialData,
543
604
  children
544
605
  }) => {
545
- return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
606
+ return /* @__PURE__ */ (0, import_jsx_runtime3.jsx)(
546
607
  WizardProvider,
547
608
  {
548
609
  config,
@@ -675,6 +736,7 @@ var YupAdapter = class {
675
736
  LocalStorageAdapter,
676
737
  MemoryAdapter,
677
738
  WizardProvider,
739
+ WizardStepRenderer,
678
740
  WizardStore,
679
741
  YupAdapter,
680
742
  ZodAdapter,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../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';\nexport * 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<boolean>;\n save: () => void;\n clearStorage: () => void;\n setData: (\n path: string,\n value: unknown,\n options?: { debounceValidation?: number }\n ) => 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 children: React.ReactNode;\n}\n\nexport function WizardProvider<T extends Record<string, any>>({\n config,\n initialData,\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\n useEffect(() => {\n if (!currentStepId && activeSteps.length > 0) {\n setCurrentStepId(activeSteps[0].id);\n setIsLoading(false);\n }\n }, [activeSteps, currentStepId]);\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 if (mode === persistenceMode || mode === \"manual\") {\n persistenceAdapter.saveStep(stepId, data);\n }\n },\n [persistenceAdapter, persistenceMode]\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 validateStep(currentStepId, newData);\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 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<boolean> => {\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 return isValid;\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 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 getData,\n }),\n [\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep,\n validateAll,\n save,\n clearStorage,\n setData,\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 { 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_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';\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"]}
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React from 'react';
2
+ import React$1 from 'react';
3
3
 
4
4
  /**
5
5
  * Validation Result Interface
@@ -51,6 +51,15 @@ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
51
51
  * Override global auto-validation setting for this step
52
52
  */
53
53
  autoValidate?: boolean;
54
+ /**
55
+ * Optional React Component to render for this step.
56
+ * Used by the <WizardStepRenderer /> component.
57
+ */
58
+ component?: React.ComponentType<any>;
59
+ /**
60
+ * Override global persistence adapter for this specific step.
61
+ */
62
+ persistenceAdapter?: IPersistenceAdapter;
54
63
  }
55
64
  /**
56
65
  * Wizard Configuration
@@ -76,6 +85,11 @@ interface IWizardConfig<T = unknown> {
76
85
  */
77
86
  storageKey?: string;
78
87
  };
88
+ /**
89
+ * Callback triggered when step changes.
90
+ * Useful for routing integration or analytics.
91
+ */
92
+ onStepChange?: (fromStep: string | null, toStep: string, data: T) => void;
79
93
  }
80
94
  /**
81
95
  * Core Wizard Context State
@@ -122,6 +136,14 @@ interface IWizardContext<T = unknown> {
122
136
  setData: (path: string, value: unknown, options?: {
123
137
  debounceValidation?: number;
124
138
  }) => void;
139
+ /**
140
+ * Bulk update wizard data.
141
+ * @param data Partial data to merge.
142
+ * @param options.replace If true, replaces entire state instead of merging.
143
+ */
144
+ updateData: (data: Partial<T>, options?: {
145
+ replace?: boolean;
146
+ }) => void;
125
147
  /**
126
148
  * Get data by path
127
149
  */
@@ -129,8 +151,11 @@ interface IWizardContext<T = unknown> {
129
151
  /**
130
152
  * Validation & Persistence
131
153
  */
132
- validateStep: (stepId: string) => Promise<boolean>;
133
- validateAll: () => Promise<boolean>;
154
+ validateStep: (sid: string) => Promise<boolean>;
155
+ validateAll: () => Promise<{
156
+ isValid: boolean;
157
+ errors: Record<string, Record<string, string>>;
158
+ }>;
134
159
  save: () => void;
135
160
  clearStorage: () => void;
136
161
  }
@@ -155,12 +180,18 @@ interface IWizardActions {
155
180
  setStepData: (stepId: string, data: unknown) => void;
156
181
  handleStepChange: (field: string, value: unknown) => void;
157
182
  validateStep: (sid: string) => Promise<boolean>;
158
- validateAll: () => Promise<boolean>;
183
+ validateAll: () => Promise<{
184
+ isValid: boolean;
185
+ errors: Record<string, Record<string, string>>;
186
+ }>;
159
187
  save: () => void;
160
188
  clearStorage: () => void;
161
189
  setData: (path: string, value: unknown, options?: {
162
190
  debounceValidation?: number;
163
191
  }) => void;
192
+ updateData: (data: Partial<any>, options?: {
193
+ replace?: boolean;
194
+ }) => void;
164
195
  getData: (path: string, defaultValue?: unknown) => unknown;
165
196
  }
166
197
  declare class WizardStore<T> {
@@ -179,9 +210,10 @@ declare class WizardStore<T> {
179
210
  interface WizardProviderProps<T> {
180
211
  config: IWizardConfig<T>;
181
212
  initialData?: T;
182
- children: React.ReactNode;
213
+ initialStepId?: string;
214
+ children: React$1.ReactNode;
183
215
  }
184
- declare function WizardProvider<T extends Record<string, any>>({ config, initialData, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
216
+ declare function WizardProvider<T extends Record<string, any>>({ config, initialData, initialStepId, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
185
217
  declare function useWizardState<T = unknown>(): IWizardState<T>;
186
218
  declare function useWizardValue<TValue = any>(path: string): TValue;
187
219
  declare function useWizardError(path: string): string | undefined;
@@ -191,6 +223,22 @@ declare function useWizardContext<T = any>(): IWizardContext<T> & {
191
223
  store: WizardStore<T>;
192
224
  };
193
225
 
226
+ interface WizardStepRendererProps {
227
+ /**
228
+ * Optional wrapper component for each step.
229
+ * Useful for adding animations (e.g., Framer Motion).
230
+ */
231
+ wrapper?: React$1.ComponentType<{
232
+ children: React$1.ReactNode;
233
+ key: string;
234
+ }>;
235
+ }
236
+ /**
237
+ * A declarative component that renders the current step based on the configuration.
238
+ * It looks for the `component` property in your `steps` config.
239
+ */
240
+ declare const WizardStepRenderer: React$1.FC<WizardStepRendererProps>;
241
+
194
242
  /**
195
243
  * Utility types for dot-notation paths
196
244
  * heavily inspired by react-hook-form and generic type manipulations
@@ -224,7 +272,7 @@ declare function createWizardFactory<TSchema extends Record<string, any>>(): {
224
272
  WizardProvider: ({ config, initialData, children, }: {
225
273
  config: IWizardConfig<TSchema>;
226
274
  initialData?: Partial<TSchema>;
227
- children: React.ReactNode;
275
+ children: React$1.ReactNode;
228
276
  }) => react_jsx_runtime.JSX.Element;
229
277
  useWizard: () => IWizardContext<TSchema>;
230
278
  useWizardContext: () => IWizardContext<TSchema> & {
@@ -301,4 +349,4 @@ declare function getByPath(obj: any, path: string, defaultValue?: unknown): unkn
301
349
  */
302
350
  declare function setByPath<T extends object>(obj: T, path: string, value: unknown): T;
303
351
 
304
- export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationResult, WizardProvider, WizardStore, YupAdapter, ZodAdapter, createWizardFactory, getByPath, setByPath, useWizard, useWizardActions, useWizardContext, useWizardError, useWizardSelector, useWizardState, useWizardValue };
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 };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as react_jsx_runtime from 'react/jsx-runtime';
2
- import React from 'react';
2
+ import React$1 from 'react';
3
3
 
4
4
  /**
5
5
  * Validation Result Interface
@@ -51,6 +51,15 @@ interface IStepConfig<TStepData = unknown, TGlobalContext = unknown> {
51
51
  * Override global auto-validation setting for this step
52
52
  */
53
53
  autoValidate?: boolean;
54
+ /**
55
+ * Optional React Component to render for this step.
56
+ * Used by the <WizardStepRenderer /> component.
57
+ */
58
+ component?: React.ComponentType<any>;
59
+ /**
60
+ * Override global persistence adapter for this specific step.
61
+ */
62
+ persistenceAdapter?: IPersistenceAdapter;
54
63
  }
55
64
  /**
56
65
  * Wizard Configuration
@@ -76,6 +85,11 @@ interface IWizardConfig<T = unknown> {
76
85
  */
77
86
  storageKey?: string;
78
87
  };
88
+ /**
89
+ * Callback triggered when step changes.
90
+ * Useful for routing integration or analytics.
91
+ */
92
+ onStepChange?: (fromStep: string | null, toStep: string, data: T) => void;
79
93
  }
80
94
  /**
81
95
  * Core Wizard Context State
@@ -122,6 +136,14 @@ interface IWizardContext<T = unknown> {
122
136
  setData: (path: string, value: unknown, options?: {
123
137
  debounceValidation?: number;
124
138
  }) => void;
139
+ /**
140
+ * Bulk update wizard data.
141
+ * @param data Partial data to merge.
142
+ * @param options.replace If true, replaces entire state instead of merging.
143
+ */
144
+ updateData: (data: Partial<T>, options?: {
145
+ replace?: boolean;
146
+ }) => void;
125
147
  /**
126
148
  * Get data by path
127
149
  */
@@ -129,8 +151,11 @@ interface IWizardContext<T = unknown> {
129
151
  /**
130
152
  * Validation & Persistence
131
153
  */
132
- validateStep: (stepId: string) => Promise<boolean>;
133
- validateAll: () => Promise<boolean>;
154
+ validateStep: (sid: string) => Promise<boolean>;
155
+ validateAll: () => Promise<{
156
+ isValid: boolean;
157
+ errors: Record<string, Record<string, string>>;
158
+ }>;
134
159
  save: () => void;
135
160
  clearStorage: () => void;
136
161
  }
@@ -155,12 +180,18 @@ interface IWizardActions {
155
180
  setStepData: (stepId: string, data: unknown) => void;
156
181
  handleStepChange: (field: string, value: unknown) => void;
157
182
  validateStep: (sid: string) => Promise<boolean>;
158
- validateAll: () => Promise<boolean>;
183
+ validateAll: () => Promise<{
184
+ isValid: boolean;
185
+ errors: Record<string, Record<string, string>>;
186
+ }>;
159
187
  save: () => void;
160
188
  clearStorage: () => void;
161
189
  setData: (path: string, value: unknown, options?: {
162
190
  debounceValidation?: number;
163
191
  }) => void;
192
+ updateData: (data: Partial<any>, options?: {
193
+ replace?: boolean;
194
+ }) => void;
164
195
  getData: (path: string, defaultValue?: unknown) => unknown;
165
196
  }
166
197
  declare class WizardStore<T> {
@@ -179,9 +210,10 @@ declare class WizardStore<T> {
179
210
  interface WizardProviderProps<T> {
180
211
  config: IWizardConfig<T>;
181
212
  initialData?: T;
182
- children: React.ReactNode;
213
+ initialStepId?: string;
214
+ children: React$1.ReactNode;
183
215
  }
184
- declare function WizardProvider<T extends Record<string, any>>({ config, initialData, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
216
+ declare function WizardProvider<T extends Record<string, any>>({ config, initialData, initialStepId, children, }: WizardProviderProps<T>): react_jsx_runtime.JSX.Element;
185
217
  declare function useWizardState<T = unknown>(): IWizardState<T>;
186
218
  declare function useWizardValue<TValue = any>(path: string): TValue;
187
219
  declare function useWizardError(path: string): string | undefined;
@@ -191,6 +223,22 @@ declare function useWizardContext<T = any>(): IWizardContext<T> & {
191
223
  store: WizardStore<T>;
192
224
  };
193
225
 
226
+ interface WizardStepRendererProps {
227
+ /**
228
+ * Optional wrapper component for each step.
229
+ * Useful for adding animations (e.g., Framer Motion).
230
+ */
231
+ wrapper?: React$1.ComponentType<{
232
+ children: React$1.ReactNode;
233
+ key: string;
234
+ }>;
235
+ }
236
+ /**
237
+ * A declarative component that renders the current step based on the configuration.
238
+ * It looks for the `component` property in your `steps` config.
239
+ */
240
+ declare const WizardStepRenderer: React$1.FC<WizardStepRendererProps>;
241
+
194
242
  /**
195
243
  * Utility types for dot-notation paths
196
244
  * heavily inspired by react-hook-form and generic type manipulations
@@ -224,7 +272,7 @@ declare function createWizardFactory<TSchema extends Record<string, any>>(): {
224
272
  WizardProvider: ({ config, initialData, children, }: {
225
273
  config: IWizardConfig<TSchema>;
226
274
  initialData?: Partial<TSchema>;
227
- children: React.ReactNode;
275
+ children: React$1.ReactNode;
228
276
  }) => react_jsx_runtime.JSX.Element;
229
277
  useWizard: () => IWizardContext<TSchema>;
230
278
  useWizardContext: () => IWizardContext<TSchema> & {
@@ -301,4 +349,4 @@ declare function getByPath(obj: any, path: string, defaultValue?: unknown): unkn
301
349
  */
302
350
  declare function setByPath<T extends object>(obj: T, path: string, value: unknown): T;
303
351
 
304
- export { type IPersistenceAdapter, type IStepConfig, type IValidatorAdapter, type IWizardActions, type IWizardConfig, type IWizardContext, type IWizardState, LocalStorageAdapter, MemoryAdapter, type PersistenceMode, type ValidationResult, WizardProvider, WizardStore, YupAdapter, ZodAdapter, createWizardFactory, getByPath, setByPath, useWizard, useWizardActions, useWizardContext, useWizardError, useWizardSelector, useWizardState, useWizardValue };
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 };
package/dist/index.js CHANGED
@@ -99,6 +99,7 @@ var WizardStore = class {
99
99
  function WizardProvider({
100
100
  config,
101
101
  initialData,
102
+ initialStepId,
102
103
  children
103
104
  }) {
104
105
  const [currentStepId, setCurrentStepId] = useState("");
@@ -132,10 +133,19 @@ function WizardProvider({
132
133
  }, [config.steps, wizardData, activeSteps]);
133
134
  useEffect(() => {
134
135
  if (!currentStepId && activeSteps.length > 0) {
135
- setCurrentStepId(activeSteps[0].id);
136
+ if (initialStepId) {
137
+ const target = activeSteps.find((s) => s.id === initialStepId);
138
+ if (target) {
139
+ setCurrentStepId(target.id);
140
+ } else {
141
+ setCurrentStepId(activeSteps[0].id);
142
+ }
143
+ } else {
144
+ setCurrentStepId(activeSteps[0].id);
145
+ }
136
146
  setIsLoading(false);
137
147
  }
138
- }, [activeSteps, currentStepId]);
148
+ }, [activeSteps, currentStepId, initialStepId]);
139
149
  const currentStep = useMemo(
140
150
  () => activeSteps.find((s) => s.id === currentStepId) || null,
141
151
  [activeSteps, currentStepId]
@@ -176,11 +186,14 @@ function WizardProvider({
176
186
  }, [hydrate]);
177
187
  const saveData = useCallback(
178
188
  (mode, stepId, data) => {
189
+ const stepConfig = config.steps.find((s) => s.id === stepId);
190
+ const stepAdapter = stepConfig?.persistenceAdapter;
191
+ const adapterToUse = stepAdapter || persistenceAdapter;
179
192
  if (mode === persistenceMode || mode === "manual") {
180
- persistenceAdapter.saveStep(stepId, data);
193
+ adapterToUse.saveStep(stepId, data);
181
194
  }
182
195
  },
183
- [persistenceAdapter, persistenceMode]
196
+ [persistenceAdapter, persistenceMode, config.steps]
184
197
  );
185
198
  const validationTimeoutRef = useRef(
186
199
  null
@@ -244,7 +257,13 @@ function WizardProvider({
244
257
  if (validationTimeoutRef.current)
245
258
  clearTimeout(validationTimeoutRef.current);
246
259
  validationTimeoutRef.current = setTimeout(() => {
247
- validateStep(currentStepId, newData);
260
+ try {
261
+ validateStep(currentStepId, newData).catch((err) => {
262
+ console.error("[Wizard] Debounced validation failed:", err);
263
+ });
264
+ } catch (e) {
265
+ console.error("[Wizard] Error starting validation:", e);
266
+ }
248
267
  }, options.debounceValidation);
249
268
  } else {
250
269
  validateStep(currentStepId, newData);
@@ -255,6 +274,20 @@ function WizardProvider({
255
274
  },
256
275
  [persistenceMode, saveData, currentStepId, validateStep]
257
276
  );
277
+ const updateData = useCallback(
278
+ (data, options) => {
279
+ const prevData = storeRef.current.getSnapshot().data;
280
+ const newData = options?.replace ? data : { ...prevData, ...data };
281
+ storeRef.current.update(newData);
282
+ startTransition(() => {
283
+ setWizardData(newData);
284
+ });
285
+ config.steps.forEach((step) => {
286
+ saveData("manual", step.id, newData);
287
+ });
288
+ },
289
+ [saveData, config.steps]
290
+ );
258
291
  const getData = useCallback((path, defaultValue) => {
259
292
  return getByPath(storeRef.current.getSnapshot().data, path, defaultValue);
260
293
  }, []);
@@ -272,7 +305,8 @@ function WizardProvider({
272
305
  const stepValid = await validateStep(step.id, currentData);
273
306
  if (!stepValid) isValid = false;
274
307
  }
275
- return isValid;
308
+ const finalErrors = storeRef.current.getSnapshot().errors;
309
+ return { isValid, errors: finalErrors };
276
310
  }, [activeSteps, validateStep]);
277
311
  const goToStep = useCallback(
278
312
  async (stepId) => {
@@ -299,6 +333,9 @@ function WizardProvider({
299
333
  completed: Array.from(completedSteps)
300
334
  });
301
335
  }
336
+ if (config.onStepChange) {
337
+ config.onStepChange(currentStepId, stepId, currentData);
338
+ }
302
339
  window.scrollTo(0, 0);
303
340
  return true;
304
341
  },
@@ -398,6 +435,7 @@ function WizardProvider({
398
435
  save,
399
436
  clearStorage,
400
437
  setData,
438
+ updateData,
401
439
  getData
402
440
  }),
403
441
  [
@@ -411,6 +449,7 @@ function WizardProvider({
411
449
  save,
412
450
  clearStorage,
413
451
  setData,
452
+ updateData,
414
453
  getData
415
454
  ]
416
455
  );
@@ -500,20 +539,41 @@ function useWizardContext() {
500
539
  );
501
540
  }
502
541
 
542
+ // src/components/WizardStepRenderer.tsx
543
+ import { useMemo as useMemo2 } from "react";
544
+ import { jsx as jsx2 } from "react/jsx-runtime";
545
+ var WizardStepRenderer = ({
546
+ wrapper: Wrapper
547
+ }) => {
548
+ const { currentStep } = useWizardContext();
549
+ const StepComponent = useMemo2(() => {
550
+ if (!currentStep?.component) return null;
551
+ return currentStep.component;
552
+ }, [currentStep]);
553
+ if (!currentStep || !StepComponent) {
554
+ return null;
555
+ }
556
+ const content = /* @__PURE__ */ jsx2(StepComponent, {});
557
+ if (Wrapper) {
558
+ return /* @__PURE__ */ jsx2(Wrapper, { children: content }, currentStep.id);
559
+ }
560
+ return content;
561
+ };
562
+
503
563
  // src/hooks/useWizard.ts
504
564
  var useWizard = () => {
505
565
  return useWizardContext();
506
566
  };
507
567
 
508
568
  // src/factory.tsx
509
- import { jsx as jsx2 } from "react/jsx-runtime";
569
+ import { jsx as jsx3 } from "react/jsx-runtime";
510
570
  function createWizardFactory() {
511
571
  const WizardProvider2 = ({
512
572
  config,
513
573
  initialData,
514
574
  children
515
575
  }) => {
516
- return /* @__PURE__ */ jsx2(
576
+ return /* @__PURE__ */ jsx3(
517
577
  WizardProvider,
518
578
  {
519
579
  config,
@@ -645,6 +705,7 @@ export {
645
705
  LocalStorageAdapter,
646
706
  MemoryAdapter,
647
707
  WizardProvider,
708
+ WizardStepRenderer,
648
709
  WizardStore,
649
710
  YupAdapter,
650
711
  ZodAdapter,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/context/WizardContext.tsx","../src/adapters/persistence/MemoryAdapter.ts","../src/utils/data.ts","../src/hooks/useWizard.ts","../src/factory.tsx","../src/adapters/persistence/LocalStorageAdapter.ts","../src/adapters/validation/ZodAdapter.ts","../src/adapters/validation/YupAdapter.ts"],"sourcesContent":["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<boolean>;\n save: () => void;\n clearStorage: () => void;\n setData: (\n path: string,\n value: unknown,\n options?: { debounceValidation?: number }\n ) => 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 children: React.ReactNode;\n}\n\nexport function WizardProvider<T extends Record<string, any>>({\n config,\n initialData,\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\n useEffect(() => {\n if (!currentStepId && activeSteps.length > 0) {\n setCurrentStepId(activeSteps[0].id);\n setIsLoading(false);\n }\n }, [activeSteps, currentStepId]);\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 if (mode === persistenceMode || mode === \"manual\") {\n persistenceAdapter.saveStep(stepId, data);\n }\n },\n [persistenceAdapter, persistenceMode]\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 validateStep(currentStepId, newData);\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 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<boolean> => {\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 return isValid;\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 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 getData,\n }),\n [\n goToNextStep,\n goToPrevStep,\n goToStep,\n setStepData,\n handleStepChange,\n validateStep,\n validateAll,\n save,\n clearStorage,\n setData,\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 { 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":["jsx","WizardProvider","useWizard","useWizardContext","useWizardValue","useWizardSelector","useWizardError","useWizardActions","useWizardState"]}
1
+ {"version":3,"sources":["../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":["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":["useMemo","jsx","useMemo","jsx","WizardProvider","useWizard","useWizardContext","useWizardValue","useWizardSelector","useWizardError","useWizardActions","useWizardState"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wizzard-stepper-react",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "A flexible, headless, and strictly typed multi-step wizard library for React.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.cjs",
@@ -24,7 +24,7 @@
24
24
  "test:run": "vitest run",
25
25
  "release": "release-it",
26
26
  "commit": "cz",
27
- "prepare": "husky"
27
+ "prepare": "husky || true"
28
28
  },
29
29
  "overrides": {
30
30
  "glob": "^9.0.0"