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 +97 -0
- package/dist/index.cjs +70 -8
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +56 -8
- package/dist/index.d.ts +56 -8
- package/dist/index.js +69 -8
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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,
|
|
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,
|
package/dist/index.cjs.map
CHANGED
|
@@ -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: (
|
|
133
|
-
validateAll: () => Promise<
|
|
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<
|
|
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
|
-
|
|
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: (
|
|
133
|
-
validateAll: () => Promise<
|
|
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<
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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__ */
|
|
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.
|
|
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"
|