@rilaykit/workflow 0.1.1 → 0.1.3
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/LICENSE +18 -69
- package/README.md +299 -0
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/index.mjs +1 -1
- package/package.json +14 -11
package/LICENSE
CHANGED
|
@@ -1,72 +1,21 @@
|
|
|
1
|
-
|
|
1
|
+
MIT License
|
|
2
2
|
|
|
3
3
|
Copyright (c) 2025 AND YOU CREATE
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
3. LICENSING AND WATERMARKS
|
|
24
|
-
|
|
25
|
-
The Software will display watermarks and licensing notices in both the user interface and console when used without a valid commercial license. These watermarks cannot be removed or disabled without a proper license.
|
|
26
|
-
|
|
27
|
-
Commercial licenses are available at:
|
|
28
|
-
|
|
29
|
-
Website: https://rilay.io/pricing
|
|
30
|
-
Email: license@andyoucreate.com
|
|
31
|
-
|
|
32
|
-
4. RESTRICTIONS
|
|
33
|
-
|
|
34
|
-
You may NOT:
|
|
35
|
-
- Use the Software without a valid commercial license
|
|
36
|
-
- Remove or alter any copyright notices, license terms, or watermarks
|
|
37
|
-
- Distribute the Software as part of any product without a license
|
|
38
|
-
- Reverse engineer, decompile, or disassemble the Software
|
|
39
|
-
- Use the Software to create competing workflow libraries
|
|
40
|
-
- Attempt to bypass, remove, or disable the licensing watermarks
|
|
41
|
-
|
|
42
|
-
5. ATTRIBUTION
|
|
43
|
-
|
|
44
|
-
You must retain all copyright notices and this license in all copies or substantial portions of the Software.
|
|
45
|
-
|
|
46
|
-
6. DISCLAIMER OF WARRANTY
|
|
47
|
-
|
|
48
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
49
|
-
|
|
50
|
-
7. LIMITATION OF LIABILITY
|
|
51
|
-
|
|
52
|
-
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
53
|
-
|
|
54
|
-
8. TERMINATION
|
|
55
|
-
|
|
56
|
-
This License and the rights granted hereunder will terminate automatically if you fail to comply with the terms herein. Upon termination, you must cease all use of the Software and destroy all copies.
|
|
57
|
-
|
|
58
|
-
9. CONTACT INFORMATION
|
|
59
|
-
|
|
60
|
-
For commercial licensing inquiries:
|
|
61
|
-
Email: license@andyoucreate.com
|
|
62
|
-
Website: https://rilay.io
|
|
63
|
-
|
|
64
|
-
For technical support:
|
|
65
|
-
Email: support@andyoucreate.com
|
|
66
|
-
GitHub: https://github.com/andyoucreate/rilay
|
|
67
|
-
|
|
68
|
-
---
|
|
69
|
-
|
|
70
|
-
This license allows free use for non-commercial purposes while requiring a commercial license for business use. For detailed pricing and licensing options, please visit https://rilay.io/pricing or contact us directly.
|
|
71
|
-
|
|
72
|
-
Last updated: June 2025
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# @rilaykit/workflow
|
|
2
|
+
|
|
3
|
+
The multi-step workflow engine for [RilayKit](https://rilay.dev) — build complex, production-ready wizard flows with navigation, persistence, analytics, and plugins.
|
|
4
|
+
|
|
5
|
+
`@rilaykit/workflow` extends `@rilaykit/forms` with a real workflow engine: step navigation with guards, auto-persistence to any storage backend, analytics tracking, cross-step conditions, and a plugin system for reusable behavior.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
# pnpm (recommended)
|
|
11
|
+
pnpm add @rilaykit/core @rilaykit/forms @rilaykit/workflow
|
|
12
|
+
|
|
13
|
+
# npm
|
|
14
|
+
npm install @rilaykit/core @rilaykit/forms @rilaykit/workflow
|
|
15
|
+
|
|
16
|
+
# yarn
|
|
17
|
+
yarn add @rilaykit/core @rilaykit/forms @rilaykit/workflow
|
|
18
|
+
|
|
19
|
+
# bun
|
|
20
|
+
bun add @rilaykit/core @rilaykit/forms @rilaykit/workflow
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
> `@rilaykit/core` and `@rilaykit/forms` are required peer dependencies.
|
|
24
|
+
|
|
25
|
+
### Requirements
|
|
26
|
+
|
|
27
|
+
- React >= 18
|
|
28
|
+
- React DOM >= 18
|
|
29
|
+
|
|
30
|
+
## Quick Start
|
|
31
|
+
|
|
32
|
+
### 1. Define Step Forms
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { required, email, minLength } from '@rilaykit/core';
|
|
36
|
+
|
|
37
|
+
const accountForm = rilay.form('account')
|
|
38
|
+
.add({
|
|
39
|
+
id: 'email',
|
|
40
|
+
type: 'input',
|
|
41
|
+
props: { label: 'Email' },
|
|
42
|
+
validation: { validate: [required(), email()] },
|
|
43
|
+
})
|
|
44
|
+
.add({
|
|
45
|
+
id: 'password',
|
|
46
|
+
type: 'input',
|
|
47
|
+
props: { label: 'Password', type: 'password' },
|
|
48
|
+
validation: { validate: [required(), minLength(8)] },
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const profileForm = rilay.form('profile')
|
|
52
|
+
.add(
|
|
53
|
+
{ id: 'firstName', type: 'input', props: { label: 'First Name' } },
|
|
54
|
+
{ id: 'lastName', type: 'input', props: { label: 'Last Name' } },
|
|
55
|
+
);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
### 2. Build the Workflow
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
import { LocalStorageAdapter } from '@rilaykit/workflow';
|
|
62
|
+
|
|
63
|
+
const onboarding = rilay
|
|
64
|
+
.flow('onboarding', 'User Onboarding')
|
|
65
|
+
.addStep({
|
|
66
|
+
id: 'account',
|
|
67
|
+
title: 'Create Account',
|
|
68
|
+
formConfig: accountForm,
|
|
69
|
+
})
|
|
70
|
+
.addStep({
|
|
71
|
+
id: 'profile',
|
|
72
|
+
title: 'Your Profile',
|
|
73
|
+
formConfig: profileForm,
|
|
74
|
+
allowSkip: true,
|
|
75
|
+
})
|
|
76
|
+
.configure({
|
|
77
|
+
persistence: {
|
|
78
|
+
adapter: new LocalStorageAdapter({ maxAge: 7 * 24 * 60 * 60 * 1000 }),
|
|
79
|
+
options: { autoPersist: true, debounceMs: 500 },
|
|
80
|
+
},
|
|
81
|
+
analytics: {
|
|
82
|
+
onStepComplete: (stepId, duration) => {
|
|
83
|
+
trackEvent('step_complete', { stepId, duration });
|
|
84
|
+
},
|
|
85
|
+
onWorkflowComplete: (id, totalTime) => {
|
|
86
|
+
trackEvent('workflow_complete', { id, totalTime });
|
|
87
|
+
},
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### 3. Render It
|
|
93
|
+
|
|
94
|
+
```tsx
|
|
95
|
+
import {
|
|
96
|
+
Workflow,
|
|
97
|
+
WorkflowBody,
|
|
98
|
+
WorkflowStepper,
|
|
99
|
+
WorkflowNextButton,
|
|
100
|
+
WorkflowPreviousButton,
|
|
101
|
+
} from '@rilaykit/workflow';
|
|
102
|
+
|
|
103
|
+
function OnboardingFlow() {
|
|
104
|
+
const handleComplete = (data: Record<string, unknown>) => {
|
|
105
|
+
console.log('Workflow complete:', data);
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
return (
|
|
109
|
+
<Workflow workflowConfig={onboarding} onComplete={handleComplete}>
|
|
110
|
+
<WorkflowStepper />
|
|
111
|
+
<WorkflowBody />
|
|
112
|
+
<div>
|
|
113
|
+
<WorkflowPreviousButton />
|
|
114
|
+
<WorkflowNextButton />
|
|
115
|
+
</div>
|
|
116
|
+
</Workflow>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
## Features
|
|
122
|
+
|
|
123
|
+
### Fluent Workflow Builder
|
|
124
|
+
|
|
125
|
+
Chainable API for defining multi-step flows with step-level configuration.
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
const flow = rilay
|
|
129
|
+
.flow('checkout', 'Checkout Flow')
|
|
130
|
+
.addStep({ id: 'cart', title: 'Review Cart', formConfig: cartForm })
|
|
131
|
+
.addStep({ id: 'shipping', title: 'Shipping', formConfig: shippingForm })
|
|
132
|
+
.addStep({ id: 'payment', title: 'Payment', formConfig: paymentForm })
|
|
133
|
+
.configure({ persistence: { ... }, analytics: { ... } })
|
|
134
|
+
.use(myPlugin);
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Step Navigation
|
|
138
|
+
|
|
139
|
+
Navigation with validation guards — users can't advance until the current step validates. Steps can be optional with `allowSkip: true`.
|
|
140
|
+
|
|
141
|
+
```tsx
|
|
142
|
+
.addStep({
|
|
143
|
+
id: 'profile',
|
|
144
|
+
title: 'Your Profile',
|
|
145
|
+
formConfig: profileForm,
|
|
146
|
+
allowSkip: true,
|
|
147
|
+
})
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
### Cross-Step Conditions
|
|
151
|
+
|
|
152
|
+
Use `when('stepId.fieldId')` to reference fields from other steps. Steps can be conditionally visible or skippable.
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
import { when } from '@rilaykit/core';
|
|
156
|
+
|
|
157
|
+
.addStep({
|
|
158
|
+
id: 'business-details',
|
|
159
|
+
title: 'Business Details',
|
|
160
|
+
formConfig: businessForm,
|
|
161
|
+
conditions: {
|
|
162
|
+
visible: when('account.accountType').equals('business'),
|
|
163
|
+
},
|
|
164
|
+
})
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Pre-fill Next Steps
|
|
168
|
+
|
|
169
|
+
Use `onAfterValidation` to pre-populate fields in upcoming steps based on current step data.
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
.addStep({
|
|
173
|
+
id: 'account',
|
|
174
|
+
title: 'Account',
|
|
175
|
+
formConfig: accountForm,
|
|
176
|
+
onAfterValidation: (stepData, helper) => {
|
|
177
|
+
helper.setNextStepValue('profile', 'email', stepData.email);
|
|
178
|
+
},
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Persistence
|
|
183
|
+
|
|
184
|
+
Auto-save workflow state to any storage backend through an adapter interface. Ships with `LocalStorageAdapter`, and you can implement your own for Supabase, your API, or any backend.
|
|
185
|
+
|
|
186
|
+
```tsx
|
|
187
|
+
import { LocalStorageAdapter } from '@rilaykit/workflow';
|
|
188
|
+
|
|
189
|
+
.configure({
|
|
190
|
+
persistence: {
|
|
191
|
+
adapter: new LocalStorageAdapter({
|
|
192
|
+
prefix: 'rilay-',
|
|
193
|
+
maxAge: 7 * 24 * 60 * 60 * 1000, // 7 days
|
|
194
|
+
}),
|
|
195
|
+
options: {
|
|
196
|
+
autoPersist: true,
|
|
197
|
+
debounceMs: 500,
|
|
198
|
+
storageKey: 'onboarding-v1',
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
})
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Custom adapter interface:**
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
interface WorkflowPersistenceAdapter {
|
|
208
|
+
save(key: string, data: unknown): Promise<void>;
|
|
209
|
+
load(key: string): Promise<unknown | null>;
|
|
210
|
+
remove(key: string): Promise<void>;
|
|
211
|
+
exists(key: string): Promise<boolean>;
|
|
212
|
+
listKeys?(): Promise<string[]>;
|
|
213
|
+
clear?(): Promise<void>;
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
### Analytics
|
|
218
|
+
|
|
219
|
+
Track step completions, drop-offs, time per step, and errors with callback hooks.
|
|
220
|
+
|
|
221
|
+
```tsx
|
|
222
|
+
.configure({
|
|
223
|
+
analytics: {
|
|
224
|
+
onStepComplete: (stepId, duration) => { ... },
|
|
225
|
+
onStepSkip: (stepId) => { ... },
|
|
226
|
+
onWorkflowComplete: (id, totalTime) => { ... },
|
|
227
|
+
onError: (stepId, error) => { ... },
|
|
228
|
+
},
|
|
229
|
+
})
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
### Plugin System
|
|
233
|
+
|
|
234
|
+
Encapsulate reusable cross-cutting behavior with plugins. Plugins support dependency declaration.
|
|
235
|
+
|
|
236
|
+
```tsx
|
|
237
|
+
const loggingPlugin = {
|
|
238
|
+
name: 'logging',
|
|
239
|
+
onStepEnter: (stepId) => console.log(`Entering ${stepId}`),
|
|
240
|
+
onStepLeave: (stepId) => console.log(`Leaving ${stepId}`),
|
|
241
|
+
};
|
|
242
|
+
|
|
243
|
+
const flow = rilay
|
|
244
|
+
.flow('checkout', 'Checkout')
|
|
245
|
+
.use(loggingPlugin);
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Headless React Components
|
|
249
|
+
|
|
250
|
+
| Component | Description |
|
|
251
|
+
|-----------|-------------|
|
|
252
|
+
| `<Workflow>` | Main wrapper — manages context and state |
|
|
253
|
+
| `<WorkflowProvider>` | Context provider (used separately when needed) |
|
|
254
|
+
| `<WorkflowBody>` | Renders the current step's form |
|
|
255
|
+
| `<WorkflowStepper>` | Progress indicator / step navigation |
|
|
256
|
+
| `<WorkflowNextButton>` | Advance to next step (or submit on last step) |
|
|
257
|
+
| `<WorkflowPreviousButton>` | Go back to previous step |
|
|
258
|
+
| `<WorkflowSkipButton>` | Skip the current step |
|
|
259
|
+
|
|
260
|
+
### Hooks
|
|
261
|
+
|
|
262
|
+
| Hook | Description |
|
|
263
|
+
|------|-------------|
|
|
264
|
+
| `useWorkflowContext()` | Full workflow context |
|
|
265
|
+
| `useWorkflowState()` | Current workflow state |
|
|
266
|
+
| `useWorkflowNavigation()` | Navigation actions (next, previous, goTo) |
|
|
267
|
+
| `useWorkflowConditions()` | Evaluated step conditions |
|
|
268
|
+
| `useWorkflowSubmission()` | Submission state and handlers |
|
|
269
|
+
| `useWorkflowAnalytics()` | Analytics tracking |
|
|
270
|
+
| `useConditionEvaluation()` | Condition evaluation utilities |
|
|
271
|
+
| `usePersistence()` | Persistence state and actions |
|
|
272
|
+
| `useStepMetadata()` | Current step metadata |
|
|
273
|
+
|
|
274
|
+
## Architecture
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
@rilaykit/core (registry, types, validation, conditions)
|
|
278
|
+
↑
|
|
279
|
+
@rilaykit/forms (form builder + React components)
|
|
280
|
+
↑
|
|
281
|
+
@rilaykit/workflow ← you are here
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
## Documentation
|
|
285
|
+
|
|
286
|
+
Full documentation at [rilay.dev](https://rilay.dev):
|
|
287
|
+
|
|
288
|
+
- [Building Workflows](https://rilay.dev/workflow/building-workflows)
|
|
289
|
+
- [Rendering Workflows](https://rilay.dev/workflow/rendering-workflows)
|
|
290
|
+
- [Navigation](https://rilay.dev/workflow/navigation)
|
|
291
|
+
- [Persistence](https://rilay.dev/workflow/persistence)
|
|
292
|
+
- [Analytics](https://rilay.dev/workflow/analytics)
|
|
293
|
+
- [Plugins](https://rilay.dev/workflow/plugins)
|
|
294
|
+
- [Advanced Workflows](https://rilay.dev/workflow/advanced-workflows)
|
|
295
|
+
- [API Reference](https://rilay.dev/api)
|
|
296
|
+
|
|
297
|
+
## License
|
|
298
|
+
|
|
299
|
+
MIT — see [LICENSE](./LICENSE) for details.
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, ril, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
|
|
2
2
|
import { form } from '@rilaykit/forms';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as React$1 from 'react';
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { FormConfiguration, CustomStepRenderer, StepConditionalBehavior, StepDataHelper, WorkflowContext, ril, WorkflowAnalytics, WorkflowPlugin, StepConfig, WorkflowConfig, ConditionalBehavior, ComponentRendererBaseProps, WorkflowNextButtonRendererProps, WorkflowPreviousButtonRendererProps, WorkflowSkipButtonRendererProps, WorkflowStepperRendererProps } from '@rilaykit/core';
|
|
2
2
|
import { form } from '@rilaykit/forms';
|
|
3
3
|
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
4
4
|
import * as React$1 from 'react';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Dt=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Dt__default=/*#__PURE__*/_interopDefault(Dt);var J=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(p=>p.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function le(t,e={},r={}){return Dt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Fe(t,e={}){return Dt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?core.evaluateCondition(p.build(),e):core.evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Be(t,e={}){return Dt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(i.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function pe(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function it(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function de(t,e){return e?`${e}:${t}`:t}function ue(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function st(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function $({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=Dt.useState(false),[o,f]=Dt.useState(null),[d,b]=Dt.useState(false),c=Dt.useRef(r),l=Dt.useRef(n),a=Dt.useRef({hasPendingChanges:false});Dt.useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=de(l.current.storageKey||t,i),k=Dt.useCallback(()=>{f(null);},[]),P=Dt.useCallback((u,D)=>{let I=u instanceof E?u:new E(`${D} failed: ${u.message}`,"OPERATION_FAILED",u);f(I),console.error("[WorkflowPersistence]",I);},[]),w=Dt.useCallback(async u=>{k(),p(true);try{let D=pe(t,u,l.current.metadata);await c.current.save(y,D),a.current.lastSavedState={...u},a.current.hasPendingChanges=!1;}catch(D){throw P(D,"Save"),D}finally{p(false);}},[t,y,k,P]),x=Dt.useRef(ue(async u=>{try{await w(u);}catch(D){console.debug("[WorkflowPersistence] Auto-save failed:",D);}},n.debounceMs||500)),h=Dt.useCallback((u,D)=>D?u.currentStepIndex!==D.currentStepIndex||JSON.stringify(u.allData)!==JSON.stringify(D.allData)||JSON.stringify(u.stepData)!==JSON.stringify(D.stepData)||u.visitedSteps.size!==D.visitedSteps.size||!Array.from(u.visitedSteps).every(I=>D.visitedSteps.has(I)):true,[]),m=Dt.useCallback(async()=>{k(),b(true);try{let u=await c.current.load(y);return u&&(a.current.lastSavedState={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps),passedSteps:new Set(u.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),u}catch(u){return P(u,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=Dt.useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(u){throw P(u,"Clear"),u}},[y,k,P]),L=Dt.useCallback(async()=>{try{return await c.current.exists(y)}catch(u){return P(u,"Exists check"),false}},[y,P]);Dt.useEffect(()=>{l.current.autoPersist&&(s||d||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,d,h]);let S=Dt.useCallback(async()=>{await w(e);},[w,e]);return {isPersisting:s,persistenceError:o,persistNow:S,loadPersistedData:m,clearPersistedData:W,hasPersistedData:L}}function ot(){let{workflowConfig:t,currentStep:e}=V(),r=Dt.useMemo(()=>e?.metadata,[e?.metadata]),n=Dt.useMemo(()=>d=>t.steps.find(c=>c.id===d)?.metadata,[t.steps]),i=Dt.useMemo(()=>d=>t.steps[d]?.metadata,[t.steps]),s=Dt.useMemo(()=>d=>r?d in r:false,[r]),p=Dt.useMemo(()=>(d,b)=>r&&d in r?r[d]:b,[r]),o=Dt.useMemo(()=>()=>t.steps.map((d,b)=>({id:d.id,title:d.title,index:b,metadata:d.metadata})),[t.steps]),f=Dt.useMemo(()=>d=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>d(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function fe({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Dt.useRef(Date.now()),i=Dt.useRef(new Map),s=Dt.useRef(false),p=Dt.useRef(null),o=core.getGlobalMonitor();Dt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),Dt.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=Dt.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),d=Dt.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Dt.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=Dt.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:d,trackNavigation:b,trackConditionEvaluation:c}}function te(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,te(i,s)):r[s]=i;}return r}function Se(t,e){let r=te(t),n=te(e);return {...{...t,...e},...r,...n}}function Ue(t,e){return {visible:t.visible,skippable:e===true||t.required}}function me({workflowConfig:t,workflowState:e,currentStep:r}){let n=Dt.useMemo(()=>Se(e.allData,e.stepData),[e.allData,e.stepData]),i=Dt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=le(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=Dt.useMemo(()=>Ue(s,r?.allowSkip),[s,r?.allowSkip]),o=Dt.useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{h.conditions&&(x[m]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Be(o,n),d=Dt.useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{let W=f[m];W?x[m]=Ue(W,h.allowSkip):x[m]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=Dt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Fe(b,n),l=Dt.useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.visible??true,[d,t.steps.length]),a=Dt.useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.skippable??false,[d,t.steps.length]),y=Dt.useCallback(x=>c[x]?.visible??true,[c]),k=Dt.useCallback(x=>c[x]?.disabled??false,[c]),P=Dt.useCallback(x=>c[x]?.required??false,[c]),w=Dt.useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:d,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:w}}function ge({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:d}){let b=Dt.useRef(d);b.current=d;let c=t.steps[e.currentStepIndex],l=Dt.useCallback(()=>({setStepData:(S,u)=>{f(u,S);},setStepFields:(S,u)=>{let I={...e.allData[S]||{},...u};f(I,S);},getStepData:S=>e.allData[S]||{},setNextStepField:(S,u)=>{let D=e.currentStepIndex+1;if(D<t.steps.length){let I=t.steps[D].id,A={...e.allData[I]||{},[S]:u};f(A,I);}},setNextStepFields:S=>{let u=e.currentStepIndex+1;if(u<t.steps.length){let D=t.steps[u].id,O={...e.allData[D]||{},...S};f(O,D);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=Dt.useCallback(async S=>{if(S<0||S>=t.steps.length||!n.isStepVisible(S))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,S,r),i(S),p(S,t.steps[S].id),!0}catch(u){return console.error("Step transition failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=Dt.useCallback(S=>{for(let u=S+1;u<t.steps.length;u++)if(n.isStepVisible(u))return u;return null},[t.steps.length,n]),k=Dt.useCallback(S=>{for(let u=S-1;u>=0;u--)if(n.isStepVisible(u))return u;return null},[n]),P=Dt.useCallback(async()=>{if(c?.onAfterValidation)try{let u=l();await c.onAfterValidation(e.stepData,u,r);}catch(u){return console.error("onAfterValidation failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}o(c.id);let S=y(e.currentStepIndex);return S===null?false:a(S)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),w=Dt.useCallback(async()=>{let S=k(e.currentStepIndex);return S===null?false:a(S)},[e.currentStepIndex,k,a]),x=Dt.useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=Dt.useCallback(S=>S<0||S>=t.steps.length?false:n.isStepVisible(S),[t.steps.length,n]),m=Dt.useCallback(()=>{let S=y(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,y,h]),W=Dt.useCallback(()=>{let S=k(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,k,h]),L=Dt.useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:w,skipStep:x,canGoToStep:h,canGoNext:m,canGoPrevious:W,canSkipCurrentStep:L}}function dt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ut({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Dt.useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),s=Dt.useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=Dt.useReducer(dt,p),d=n?.adapter?$({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Dt.useCallback(m=>{f({type:"SET_CURRENT_STEP",stepIndex:m});},[]),c=Dt.useCallback((m,W)=>{f({type:"SET_STEP_DATA",data:m,stepId:W});},[]),l=Dt.useCallback((m,W,L)=>{f({type:"SET_FIELD_VALUE",fieldId:m,value:W,stepId:L});},[]),a=Dt.useCallback(m=>{f({type:"SET_SUBMITTING",isSubmitting:m});},[]),y=Dt.useCallback(m=>{f({type:"SET_TRANSITIONING",isTransitioning:m});},[]),k=Dt.useCallback((m,W)=>{f({type:"MARK_STEP_VISITED",stepIndex:m,stepId:W});},[]),P=Dt.useCallback(m=>{f({type:"MARK_STEP_PASSED",stepId:m});},[]),w=Dt.useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=Dt.useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=Dt.useCallback(async()=>{if(!d)return x(),false;try{let m=await d.loadPersistedData();if(m){let W={currentStepIndex:m.currentStepIndex,allData:m.allData,stepData:m.stepData,visitedSteps:new Set(m.visitedSteps),passedSteps:new Set(m.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:W}),x(),!0}}catch(m){console.error("Failed to load persisted state:",m);}return x(),false},[d,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:w,loadPersistedState:h,persistence:d?{isPersisting:d.isPersisting,persistenceError:d.persistenceError,persistNow:d.persistNow,clearPersistedData:d.clearPersistedData,hasPersistedData:d.hasPersistedData}:null}}function be({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=Dt.useRef(i);p.current=i;let o=Dt.useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let d=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,d,e.allData);}}catch(d){throw console.error("Workflow submission failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),d}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=Dt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function $e(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(d=>({stepData:o,allData:{...d.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,d)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[d]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var ye=Dt.createContext(null);function _(){let t=Dt.useContext(ye);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function $r(){let t=_();return zustand.useStore(t,e=>e.currentStepIndex)}function Kr(){let t=_();return zustand.useStore(t,e=>e.isTransitioning)}function qr(){let t=_();return zustand.useStore(t,e=>e.isInitializing)}function Jr(){let t=_();return zustand.useStore(t,e=>e.isSubmitting)}function jr(){let t=_();return zustand.useStore(t,e=>e.allData)}function Zr(){let t=_();return zustand.useStore(t,e=>e.stepData)}function Qr(t){let e=_();return zustand.useStore(e,r=>r.allData[t])}function Hr(){let t=_();return zustand.useStore(t,e=>e.visitedSteps)}function Xr(){let t=_();return zustand.useStore(t,e=>e.passedSteps)}function Yr(t){let e=_();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function en(t){let e=_();return zustand.useStore(e,r=>r.passedSteps.has(t))}function tn(){let t=_(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function rn(){let t=_(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function nn(){let t=_();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function sn(){return _()}var Ke=Dt.createContext(null);function xt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function ke({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=Dt.useRef(i),f=Dt.useRef(s);o.current=i,f.current=s;let d=Dt.useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=Dt.useMemo(()=>xt(d,e.steps),[d,e.steps]),c=Dt.useRef(null);c.current||(c.current=$e({defaultValues:r,defaultStepIndex:d,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=Dt.useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});Dt.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Dt.useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=Dt.useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),w=Dt.useCallback((v,g,T)=>l.getState()._setFieldValue(v,g,T),[l]),x=Dt.useCallback(v=>l.getState()._setSubmitting(v),[l]),h=Dt.useCallback(v=>l.getState()._setTransitioning(v),[l]),m=Dt.useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),W=Dt.useCallback(v=>l.getState()._markStepPassed(v),[l]),L=Dt.useCallback(()=>l.getState()._reset(),[l]),S=e.persistence?.adapter?$({workflowId:e.id,workflowState:a,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}):null;Dt.useEffect(()=>{(async()=>{if(S)try{let g=await S.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,S]);let u=Dt.useMemo(()=>({isPersisting:S?.isPersisting??false,persistenceError:S?.persistenceError??null,persistNow:S?.persistNow}),[S?.isPersisting,S?.persistenceError,S?.persistNow]),D=Dt.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),I=Dt.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),O=Dt.useMemo(()=>I?.formConfig,[I?.formConfig]),A=me({workflowConfig:e,workflowState:a,currentStep:I}),z=Dt.useMemo(()=>{let v=-1;for(let R=0;R<e.steps.length;R++)if(A.isStepVisible(R)){v=R;break}let g=-1;for(let R=e.steps.length-1;R>=0;R--)if(A.isStepVisible(R)){g=R;break}let T=new Set;for(let R=0;R<e.steps.length;R++){let H=e.steps[R];A.isStepVisible(R)&&a.visitedSteps.has(H.id)&&T.add(H.id);}return {...D,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:T,passedSteps:a.passedSteps}},[D,a.currentStepIndex,a.visitedSteps,a.passedSteps,A,e.steps]),{analyticsStartTime:Ze}=fe({workflowConfig:e,workflowState:a,workflowContext:z}),{goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}=ge({workflowConfig:e,workflowState:a,workflowContext:z,conditionsHelpers:A,setCurrentStep:k,setTransitioning:h,markStepVisited:m,markStepPassed:W,setStepData:P,onStepChange:o.current}),ie=Dt.useRef(false);Dt.useEffect(()=>{if(ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(A.isStepVisible(g)){k(g),m(g,e.steps[g].id);break}}ie.current=true;},[a.currentStepIndex,e.steps,k,m,A]),Dt.useEffect(()=>{if(!ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){let g=null;for(let T=a.currentStepIndex+1;T<e.steps.length;T++)if(A.isStepVisible(T)){g=T;break}if(g===null){for(let T=a.currentStepIndex-1;T>=0;T--)if(A.isStepVisible(T)){g=T;break}}g!==null&&(k(g),m(g,e.steps[g].id));}},[A,a.currentStepIndex,e.steps,k,m]);let{submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}=be({workflowConfig:e,workflowState:a,workflowContext:z,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Ze}),se=Dt.useCallback((v,g)=>{w(v,g,I?.id||"");},[w,I?.id]),Ae=Dt.useCallback(v=>{P(v,I?.id||"");},[P,I?.id]),Qe=Dt.useCallback(async v=>{I?.id&&v&&P(v,I.id),z.isLastStep?await Q():await Z();},[z.isLastStep,Q,Z,I?.id,P]),_e=Dt.useMemo(()=>({goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}),[he,Z,Ie,We,De,we,Re,Ee]),Ve=Dt.useMemo(()=>({setValue:se,setStepData:Ae,resetWorkflow:L}),[se,Ae,L]),Ne=Dt.useMemo(()=>({submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}),[Q,Te,Ce]),He=Dt.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:I,context:z,formConfig:O,conditionsHelpers:A,currentStepMetadata:I?.metadata,..._e,...Ve,...Ne,persistNow:u.persistNow,isPersisting:u.isPersisting,persistenceError:u.persistenceError}),[a,e,I,z,O,A,_e,Ve,Ne,u]),Xe=Dt.useMemo(()=>{if(!I?.id)return {};let v=a?.allData[I.id]||{};if(!O?.allFields)return v;let g=new Set(O.allFields.map(R=>R.id)),T={};for(let[R,H]of Object.entries(v))g.has(R)&&(T[R]=H);return T},[a?.allData,I?.id,O?.allFields]),Ye=Dt.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(ye.Provider,{value:l,children:jsxRuntime.jsx(Ke.Provider,{value:He,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:O,defaultValues:Xe,onFieldChange:se,"data-workflow-id":e.id,className:p,onSubmit:Qe,children:t},Ye)})})}function V(){let t=Dt.useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function ht({children:t,workflowConfig:e,...r}){let n=Dt.useMemo(()=>e instanceof J?e.build():e,[e]);return jsxRuntime.jsx(ke,{...r,workflowConfig:n,children:t})}var wt=Dt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=V();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Nt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=V(),{submit:f}=forms.useFormConfigContext(),d=forms.useFormSubmitting(),b=forms.useFormValues(),c=Dt.useMemo(()=>{let y=d||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[d,s.isSubmitting,s.isTransitioning,r]),l=Dt.useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=Dt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var zt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:d}=V(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Dt.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=d()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:w}},[b,p.isSubmitting,p.isTransitioning,d,r]),a=Dt.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Dt.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Zt=Dt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:d}=V(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Dt.useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=(!!i?.allowSkip||d.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:w}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,d.isStepSkippable,r]),a=Dt.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Dt.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var er=Dt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=V(),{visibleSteps:d,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=Dt.useMemo(()=>{let k=[],P=new Map,w=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let m=k.length;k.push(x),P.set(m,h),w.set(h,m);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:w}},[i.steps,f]),l=Dt.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Dt.useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=Dt.useMemo(()=>({steps:d,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[d,a,p.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var Pe=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}catch(i){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=Pe;exports.Workflow=ht;exports.WorkflowBody=wt;exports.WorkflowNextButton=Nt;exports.WorkflowPersistenceError=E;exports.WorkflowPreviousButton=zt;exports.WorkflowProvider=ke;exports.WorkflowSkipButton=Zt;exports.WorkflowStepper=er;exports.WorkflowStoreContext=ye;exports.combineWorkflowDataForConditions=Se;exports.createWorkflowStore=$e;exports.debounce=ue;exports.flattenObject=te;exports.flow=J;exports.generateStorageKey=de;exports.mergePersistedState=st;exports.persistedToWorkflowState=Me;exports.useConditionEvaluation=le;exports.useCurrentStepIndex=$r;exports.useIsStepPassed=en;exports.useIsStepVisited=Yr;exports.usePassedSteps=Xr;exports.usePersistence=$;exports.useStepDataById=Qr;exports.useStepMetadata=ot;exports.useVisitedSteps=Hr;exports.useWorkflowActions=nn;exports.useWorkflowAllData=jr;exports.useWorkflowAnalytics=fe;exports.useWorkflowConditions=me;exports.useWorkflowContext=V;exports.useWorkflowInitializing=qr;exports.useWorkflowNavigation=ge;exports.useWorkflowNavigationState=tn;exports.useWorkflowState=ut;exports.useWorkflowStepData=Zr;exports.useWorkflowStore=_;exports.useWorkflowStoreApi=sn;exports.useWorkflowSubmission=be;exports.useWorkflowSubmitState=rn;exports.useWorkflowSubmitting=Jr;exports.useWorkflowTransitioning=Kr;exports.validatePersistedData=it;exports.workflowStateToPersisted=pe;
|
|
1
|
+
'use strict';var core=require('@rilaykit/core'),forms=require('@rilaykit/forms'),Tt=require('react'),zustand=require('zustand'),middleware=require('zustand/middleware'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Tt__default=/*#__PURE__*/_interopDefault(Tt);var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new core.IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof forms.form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=core.normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=core.deepClone(this.steps),n.analytics=this.analytics?core.deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?core.deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{core.ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(d=>d.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function ue(t,e={},r={}){return Tt.useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,core.evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Oe(t,e={}){return Tt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?core.evaluateCondition(d.build(),e):core.evaluateCondition(d,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Le(t,e={}){return Tt.useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let d=o=>{try{return o&&typeof o=="object"&&"build"in o?core.evaluateCondition(o.build(),e):core.evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?d(i.visible):true,disabled:i.disabled?d(i.disabled):false,required:i.required?d(i.required):false,readonly:i.readonly?d(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ce(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ue(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function at(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function fe(t,e){return e?`${e}:${t}`:t}function Se(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function lt(t,e,r="persist"){let n=Ue(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,d]=Tt.useState(false),[o,f]=Tt.useState(null),[u,b]=Tt.useState(false),c=Tt.useRef(r),l=Tt.useRef(n),a=Tt.useRef({hasPendingChanges:false});Tt.useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=fe(l.current.storageKey||t,i),k=Tt.useCallback(()=>{f(null);},[]),P=Tt.useCallback((p,W)=>{let V=p instanceof R?p:new R(`${W} failed: ${p.message}`,"OPERATION_FAILED",p);f(V),console.error("[WorkflowPersistence]",V);},[]),D=Tt.useCallback(async p=>{k(),d(true);try{let W=ce(t,p,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...p},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{d(false);}},[t,y,k,P]),x=Tt.useRef(Se(async p=>{try{await D(p);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),h=Tt.useCallback((p,W)=>W?p.currentStepIndex!==W.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(W.allData)||JSON.stringify(p.stepData)!==JSON.stringify(W.stepData)||p.visitedSteps.size!==W.visitedSteps.size||!Array.from(p.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=Tt.useCallback(async()=>{k(),b(true);try{let p=await c.current.load(y);return p&&(a.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),I=Tt.useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[y,k,P]),L=Tt.useCallback(async()=>{try{return await c.current.exists(y)}catch(p){return P(p,"Exists check"),false}},[y,P]);Tt.useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,u,h]);let m=Tt.useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:I,hasPersistedData:L}}function pt(){let{workflowConfig:t,currentStep:e}=N(),r=Tt.useMemo(()=>e?.metadata,[e?.metadata]),n=Tt.useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=Tt.useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=Tt.useMemo(()=>u=>r?u in r:false,[r]),d=Tt.useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=Tt.useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=Tt.useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:d,getAllStepsMetadata:o,findStepsByMetadata:f}}function ge({workflowConfig:t,workflowState:e,workflowContext:r}){let n=Tt.useRef(Date.now()),i=Tt.useRef(new Map),s=Tt.useRef(false),d=Tt.useRef(null),o=core.getGlobalMonitor();Tt.useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),Tt.useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&d.current!==l.id){if(d.current&&t.analytics?.onStepComplete){let a=i.current.get(d.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(d.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:d.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}d.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=Tt.useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=Tt.useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=Tt.useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=Tt.useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function be(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function $e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function ye({workflowConfig:t,workflowState:e,currentStep:r}){let n=Tt.useMemo(()=>be(e.allData,e.stepData),[e.allData,e.stepData]),i=Tt.useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ue(i,n,{visible:true,disabled:false,required:false,readonly:false}),d=Tt.useMemo(()=>$e(s,r?.allowSkip),[s,r?.allowSkip]),o=Tt.useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{h.conditions&&(x[S]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Le(o,n),u=Tt.useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{let I=f[S];I?x[S]=$e(I,h.allowSkip):x[S]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=Tt.useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Oe(b,n),l=Tt.useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.visible??true,[u,t.steps.length]),a=Tt.useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.skippable??false,[u,t.steps.length]),y=Tt.useCallback(x=>c[x]?.visible??true,[c]),k=Tt.useCallback(x=>c[x]?.disabled??false,[c]),P=Tt.useCallback(x=>c[x]?.required??false,[c]),D=Tt.useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:d,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:d,markStepPassed:o,setStepData:f,onStepChange:u}){let b=Tt.useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=Tt.useCallback(()=>({setStepData:(m,p)=>{f(p,m);},setStepFields:(m,p)=>{let V={...e.allData[m]||{},...p};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,p)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:p};f(X,V);}},setNextStepFields:m=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let W=t.steps[p].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=Tt.useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),d(m,t.steps[m].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,d]),y=Tt.useCallback(m=>{for(let p=m+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),k=Tt.useCallback(m=>{for(let p=m-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=Tt.useCallback(async()=>{if(c?.onAfterValidation)try{let p=l();await c.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=Tt.useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),x=Tt.useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=Tt.useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=Tt.useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,y,h]),I=Tt.useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,k,h]),L=Tt.useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:x,canGoToStep:h,canGoNext:S,canGoPrevious:I,canSkipCurrentStep:L}}function ft(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function St({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=Tt.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),s=Tt.useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),d={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=Tt.useReducer(ft,d),u=n?.adapter?q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=Tt.useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=Tt.useCallback((S,I)=>{f({type:"SET_STEP_DATA",data:S,stepId:I});},[]),l=Tt.useCallback((S,I,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:I,stepId:L});},[]),a=Tt.useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=Tt.useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=Tt.useCallback((S,I)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:I});},[]),P=Tt.useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=Tt.useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=Tt.useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=Tt.useCallback(async()=>{if(!u)return x(),false;try{let S=await u.loadPersistedData();if(S){let I={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:I}),x(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return x(),false},[u,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:h,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let d=Tt.useRef(i);d.current=i;let o=Tt.useCallback(async()=>{n(true);try{if(d.current&&await d.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=Tt.useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function Je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return zustand.createStore()(middleware.subscribeWithSelector((s,d)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=d();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var xe=Tt.createContext(null);function A(){let t=Tt.useContext(xe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function jr(){let t=A();return zustand.useStore(t,e=>e.currentStepIndex)}function Zr(){let t=A();return zustand.useStore(t,e=>e.isTransitioning)}function Hr(){let t=A();return zustand.useStore(t,e=>e.isInitializing)}function Qr(){let t=A();return zustand.useStore(t,e=>e.isSubmitting)}function Xr(){let t=A();return zustand.useStore(t,e=>e.allData)}function Yr(){let t=A();return zustand.useStore(t,e=>e.stepData)}function en(t){let e=A();return zustand.useStore(e,r=>r.allData[t])}function tn(){let t=A();return zustand.useStore(t,e=>e.visitedSteps)}function rn(){let t=A();return zustand.useStore(t,e=>e.passedSteps)}function nn(t){let e=A();return zustand.useStore(e,r=>r.visitedSteps.has(t))}function sn(t){let e=A();return zustand.useStore(e,r=>r.passedSteps.has(t))}function on(){let t=A(),e=zustand.useStore(t,i=>i.currentStepIndex),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function an(){let t=A(),e=zustand.useStore(t,i=>i.isSubmitting),r=zustand.useStore(t,i=>i.isTransitioning),n=zustand.useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function ln(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function pn(){return A()}var It={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=Tt.createContext(null);function Wt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:d}){let o=Tt.useRef(i),f=Tt.useRef(s);o.current=i,f.current=s;let u=Tt.useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=Tt.useMemo(()=>Wt(u,e.steps),[u,e.steps]),c=Tt.useRef(null);c.current||(c.current=Je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=Tt.useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});Tt.useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=Tt.useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=Tt.useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),D=Tt.useCallback((v,g,E)=>l.getState()._setFieldValue(v,g,E),[l]),x=Tt.useCallback(v=>l.getState()._setSubmitting(v),[l]),h=Tt.useCallback(v=>l.getState()._setTransitioning(v),[l]),S=Tt.useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),I=Tt.useCallback(v=>l.getState()._markStepPassed(v),[l]),L=Tt.useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,p=q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??It,options:e.persistence?.options,userId:e.persistence?.userId}),W=Tt.useRef(p);W.current=p;let V=Tt.useRef(false);Tt.useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=Tt.useMemo(()=>({isPersisting:m?p.isPersisting:false,persistenceError:m?p.persistenceError:null,persistNow:m?p.persistNow:void 0}),[m,p.isPersisting,p.persistenceError,p.persistNow]),X=Tt.useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=Tt.useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=Tt.useMemo(()=>C?.formConfig,[C?.formConfig]),_=ye({workflowConfig:e,workflowState:a,currentStep:C}),G=Tt.useMemo(()=>{let v=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){v=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Xe}=ge({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}=ve({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:h,markStepVisited:S,markStepPassed:I,setStepData:P,onStepChange:o.current}),ae=Tt.useRef(false);Tt.useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),Tt.useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}=ke({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Xe}),le=Tt.useCallback((v,g)=>{D(v,g,C?.id||"");},[D,C?.id]),Ne=Tt.useCallback(v=>{P(v,C?.id||"");},[P,C?.id]),Ye=Tt.useCallback(async v=>{C?.id&&v&&P(v,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Fe=Tt.useMemo(()=>({goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}),[De,Y,we,Re,Ee,Te,Ce,Ae]),Be=Tt.useMemo(()=>({setValue:le,setStepData:Ne,resetWorkflow:L}),[le,Ne,L]),Me=Tt.useMemo(()=>({submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}),[ee,_e,Ve]),et=Tt.useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Fe,...Be,...Me,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Fe,Be,Me,z]),tt=Tt.useMemo(()=>{if(!C?.id)return {};let v=a?.allData[C.id]||{};if(!K?.allFields)return v;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(v))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),rt=Tt.useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsxRuntime.jsx(xe.Provider,{value:l,children:jsxRuntime.jsx(je.Provider,{value:et,children:jsxRuntime.jsx(forms.FormProvider,{formConfig:K,defaultValues:tt,onFieldChange:le,"data-workflow-id":e.id,className:d,onSubmit:Ye,children:t},rt)})})}function N(){let t=Tt.useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function wt({children:t,workflowConfig:e,...r}){let n=Tt.useMemo(()=>e instanceof H?e.build():e,[e]);return jsxRuntime.jsx(he,{...r,workflowConfig:n,children:t})}var Ct=Tt__default.default.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsxRuntime.jsx(forms.FormBody,{}):null});var Ot=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:d,currentStep:o}=N(),{submit:f}=forms.useFormConfigContext(),u=forms.useFormSubmitting(),b=forms.useFormValues(),c=Tt.useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=Tt.useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=Tt.useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:d.renderConfig?.nextButtonRenderer,props:a,...n})});var qt=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:d,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Tt.useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=u()&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,d.isSubmitting,d.isTransitioning,u,r]),a=Tt.useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=Tt.useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Yt=Tt__default.default.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:d,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=forms.useFormSubmitting(),c=forms.useFormValues(),l=Tt.useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(d.currentStepIndex))&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,d.isSubmitting,d.isTransitioning,d.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=Tt.useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=Tt.useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var ir=Tt__default.default.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:d,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=Tt.useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let S=k.length;k.push(x),P.set(S,h),D.set(h,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=Tt.useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=Tt.useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=Tt.useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:d.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,d.visibleVisitedSteps,l,r]);return jsxRuntime.jsx(core.ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var We=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},d=JSON.stringify(s),o=this.compress?this.compressData(d):d;localStorage.setItem(i,o);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,d=JSON.parse(s);d.expiresAt&&Date.now()>d.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};exports.LocalStorageAdapter=We;exports.Workflow=wt;exports.WorkflowBody=Ct;exports.WorkflowNextButton=Ot;exports.WorkflowPersistenceError=R;exports.WorkflowPreviousButton=qt;exports.WorkflowProvider=he;exports.WorkflowSkipButton=Yt;exports.WorkflowStepper=ir;exports.WorkflowStoreContext=xe;exports.combineWorkflowDataForConditions=be;exports.createWorkflowStore=Je;exports.debounce=Se;exports.flattenObject=se;exports.flow=H;exports.generateStorageKey=fe;exports.mergePersistedState=lt;exports.persistedToWorkflowState=Ue;exports.useConditionEvaluation=ue;exports.useCurrentStepIndex=jr;exports.useIsStepPassed=sn;exports.useIsStepVisited=nn;exports.usePassedSteps=rn;exports.usePersistence=q;exports.useStepDataById=en;exports.useStepMetadata=pt;exports.useVisitedSteps=tn;exports.useWorkflowActions=ln;exports.useWorkflowAllData=Xr;exports.useWorkflowAnalytics=ge;exports.useWorkflowConditions=ye;exports.useWorkflowContext=N;exports.useWorkflowInitializing=Hr;exports.useWorkflowNavigation=ve;exports.useWorkflowNavigationState=on;exports.useWorkflowState=St;exports.useWorkflowStepData=Yr;exports.useWorkflowStore=A;exports.useWorkflowStoreApi=pn;exports.useWorkflowSubmission=ke;exports.useWorkflowSubmitState=an;exports.useWorkflowSubmitting=Qr;exports.useWorkflowTransitioning=Zr;exports.validatePersistedData=at;exports.workflowStateToPersisted=ce;
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Dt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var J=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(p=>p.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function le(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Fe(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=p=>{try{return p&&typeof p=="object"&&"build"in p?evaluateCondition(p.build(),e):evaluateCondition(p,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Be(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let p=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?p(i.visible):true,disabled:i.disabled?p(i.disabled):false,required:i.required?p(i.required):false,readonly:i.readonly?p(i.readonly):false};}}return r},[t,e])}var E=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function pe(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Me(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function it(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function de(t,e){return e?`${e}:${t}`:t}function ue(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function st(t,e,r="persist"){let n=Me(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function $({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,p]=useState(false),[o,f]=useState(null),[d,b]=useState(false),c=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=de(l.current.storageKey||t,i),k=useCallback(()=>{f(null);},[]),P=useCallback((u,D)=>{let I=u instanceof E?u:new E(`${D} failed: ${u.message}`,"OPERATION_FAILED",u);f(I),console.error("[WorkflowPersistence]",I);},[]),w=useCallback(async u=>{k(),p(true);try{let D=pe(t,u,l.current.metadata);await c.current.save(y,D),a.current.lastSavedState={...u},a.current.hasPendingChanges=!1;}catch(D){throw P(D,"Save"),D}finally{p(false);}},[t,y,k,P]),x=useRef(ue(async u=>{try{await w(u);}catch(D){console.debug("[WorkflowPersistence] Auto-save failed:",D);}},n.debounceMs||500)),h=useCallback((u,D)=>D?u.currentStepIndex!==D.currentStepIndex||JSON.stringify(u.allData)!==JSON.stringify(D.allData)||JSON.stringify(u.stepData)!==JSON.stringify(D.stepData)||u.visitedSteps.size!==D.visitedSteps.size||!Array.from(u.visitedSteps).every(I=>D.visitedSteps.has(I)):true,[]),m=useCallback(async()=>{k(),b(true);try{let u=await c.current.load(y);return u&&(a.current.lastSavedState={currentStepIndex:u.currentStepIndex,allData:u.allData,stepData:u.stepData,visitedSteps:new Set(u.visitedSteps),passedSteps:new Set(u.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),u}catch(u){return P(u,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),W=useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(u){throw P(u,"Clear"),u}},[y,k,P]),L=useCallback(async()=>{try{return await c.current.exists(y)}catch(u){return P(u,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||d||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,d,h]);let S=useCallback(async()=>{await w(e);},[w,e]);return {isPersisting:s,persistenceError:o,persistNow:S,loadPersistedData:m,clearPersistedData:W,hasPersistedData:L}}function ot(){let{workflowConfig:t,currentStep:e}=V(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>d=>t.steps.find(c=>c.id===d)?.metadata,[t.steps]),i=useMemo(()=>d=>t.steps[d]?.metadata,[t.steps]),s=useMemo(()=>d=>r?d in r:false,[r]),p=useMemo(()=>(d,b)=>r&&d in r?r[d]:b,[r]),o=useMemo(()=>()=>t.steps.map((d,b)=>({id:d.id,title:d.title,index:b,metadata:d.metadata})),[t.steps]),f=useMemo(()=>d=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>d(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:p,getAllStepsMetadata:o,findStepsByMetadata:f}}function fe({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),p=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&p.current!==l.id){if(p.current&&t.analytics?.onStepComplete){let a=i.current.get(p.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(p.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:p.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}p.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),d=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:d,trackNavigation:b,trackConditionEvaluation:c}}function te(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,te(i,s)):r[s]=i;}return r}function Se(t,e){let r=te(t),n=te(e);return {...{...t,...e},...r,...n}}function Ue(t,e){return {visible:t.visible,skippable:e===true||t.required}}function me({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>Se(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=le(i,n,{visible:true,disabled:false,required:false,readonly:false}),p=useMemo(()=>Ue(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{h.conditions&&(x[m]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Be(o,n),d=useMemo(()=>{let x={};return t.steps.forEach((h,m)=>{let W=f[m];W?x[m]=Ue(W,h.allowSkip):x[m]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Fe(b,n),l=useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.visible??true,[d,t.steps.length]),a=useCallback(x=>x<0||x>=t.steps.length?false:d[x]?.skippable??false,[d,t.steps.length]),y=useCallback(x=>c[x]?.visible??true,[c]),k=useCallback(x=>c[x]?.disabled??false,[c]),P=useCallback(x=>c[x]?.required??false,[c]),w=useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:p,fieldConditions:c,allStepConditions:d,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:w}}function ge({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:p,markStepPassed:o,setStepData:f,onStepChange:d}){let b=useRef(d);b.current=d;let c=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(S,u)=>{f(u,S);},setStepFields:(S,u)=>{let I={...e.allData[S]||{},...u};f(I,S);},getStepData:S=>e.allData[S]||{},setNextStepField:(S,u)=>{let D=e.currentStepIndex+1;if(D<t.steps.length){let I=t.steps[D].id,A={...e.allData[I]||{},[S]:u};f(A,I);}},setNextStepFields:S=>{let u=e.currentStepIndex+1;if(u<t.steps.length){let D=t.steps[u].id,O={...e.allData[D]||{},...S};f(O,D);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=useCallback(async S=>{if(S<0||S>=t.steps.length||!n.isStepVisible(S))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,S,r),i(S),p(S,t.steps[S].id),!0}catch(u){return console.error("Step transition failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,p]),y=useCallback(S=>{for(let u=S+1;u<t.steps.length;u++)if(n.isStepVisible(u))return u;return null},[t.steps.length,n]),k=useCallback(S=>{for(let u=S-1;u>=0;u--)if(n.isStepVisible(u))return u;return null},[n]),P=useCallback(async()=>{if(c?.onAfterValidation)try{let u=l();await c.onAfterValidation(e.stepData,u,r);}catch(u){return console.error("onAfterValidation failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),false}o(c.id);let S=y(e.currentStepIndex);return S===null?false:a(S)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),w=useCallback(async()=>{let S=k(e.currentStepIndex);return S===null?false:a(S)},[e.currentStepIndex,k,a]),x=useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=useCallback(S=>S<0||S>=t.steps.length?false:n.isStepVisible(S),[t.steps.length,n]),m=useCallback(()=>{let S=y(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,y,h]),W=useCallback(()=>{let S=k(e.currentStepIndex);return S!==null&&h(S)},[e.currentStepIndex,k,h]),L=useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:w,skipStep:x,canGoToStep:h,canGoNext:m,canGoPrevious:W,canSkipCurrentStep:L}}function dt(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function ut({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),s=useMemo(()=>{let m=new Set;if(e&&e>0&&r)for(let W=0;W<e;W++)r[W]&&m.add(r[W].id);return m},[e,r]),p={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=useReducer(dt,p),d=n?.adapter?$({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(m=>{f({type:"SET_CURRENT_STEP",stepIndex:m});},[]),c=useCallback((m,W)=>{f({type:"SET_STEP_DATA",data:m,stepId:W});},[]),l=useCallback((m,W,L)=>{f({type:"SET_FIELD_VALUE",fieldId:m,value:W,stepId:L});},[]),a=useCallback(m=>{f({type:"SET_SUBMITTING",isSubmitting:m});},[]),y=useCallback(m=>{f({type:"SET_TRANSITIONING",isTransitioning:m});},[]),k=useCallback((m,W)=>{f({type:"MARK_STEP_VISITED",stepIndex:m,stepId:W});},[]),P=useCallback(m=>{f({type:"MARK_STEP_PASSED",stepId:m});},[]),w=useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=useCallback(async()=>{if(!d)return x(),false;try{let m=await d.loadPersistedData();if(m){let W={currentStepIndex:m.currentStepIndex,allData:m.allData,stepData:m.stepData,visitedSteps:new Set(m.visitedSteps),passedSteps:new Set(m.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:W}),x(),!0}}catch(m){console.error("Failed to load persisted state:",m);}return x(),false},[d,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:w,loadPersistedState:h,persistence:d?{isPersisting:d.isPersisting,persistenceError:d.persistenceError,persistNow:d.persistNow,clearPersistedData:d.clearPersistedData,hasPersistedData:d.hasPersistedData}:null}}function be({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let p=useRef(i);p.current=i;let o=useCallback(async()=>{n(true);try{if(p.current&&await p.current(e.allData),t.analytics?.onWorkflowComplete){let d=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,d,e.allData);}}catch(d){throw console.error("Workflow submission failed:",d),t.analytics?.onError&&t.analytics.onError(d,r),d}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function $e(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,p)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(d=>({stepData:o,allData:{...d.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,d)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[d]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=p();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var ye=createContext(null);function _(){let t=useContext(ye);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function $r(){let t=_();return useStore(t,e=>e.currentStepIndex)}function Kr(){let t=_();return useStore(t,e=>e.isTransitioning)}function qr(){let t=_();return useStore(t,e=>e.isInitializing)}function Jr(){let t=_();return useStore(t,e=>e.isSubmitting)}function jr(){let t=_();return useStore(t,e=>e.allData)}function Zr(){let t=_();return useStore(t,e=>e.stepData)}function Qr(t){let e=_();return useStore(e,r=>r.allData[t])}function Hr(){let t=_();return useStore(t,e=>e.visitedSteps)}function Xr(){let t=_();return useStore(t,e=>e.passedSteps)}function Yr(t){let e=_();return useStore(e,r=>r.visitedSteps.has(t))}function en(t){let e=_();return useStore(e,r=>r.passedSteps.has(t))}function tn(){let t=_(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function rn(){let t=_(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function nn(){let t=_();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function sn(){return _()}var Ke=createContext(null);function xt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function ke({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:p}){let o=useRef(i),f=useRef(s);o.current=i,f.current=s;let d=useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=useMemo(()=>xt(d,e.steps),[d,e.steps]),c=useRef(null);c.current||(c.current=$e({defaultValues:r,defaultStepIndex:d,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),w=useCallback((v,g,T)=>l.getState()._setFieldValue(v,g,T),[l]),x=useCallback(v=>l.getState()._setSubmitting(v),[l]),h=useCallback(v=>l.getState()._setTransitioning(v),[l]),m=useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),W=useCallback(v=>l.getState()._markStepPassed(v),[l]),L=useCallback(()=>l.getState()._reset(),[l]),S=e.persistence?.adapter?$({workflowId:e.id,workflowState:a,adapter:e.persistence.adapter,options:e.persistence.options,userId:e.persistence.userId}):null;useEffect(()=>{(async()=>{if(S)try{let g=await S.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,S]);let u=useMemo(()=>({isPersisting:S?.isPersisting??false,persistenceError:S?.persistenceError??null,persistNow:S?.persistNow}),[S?.isPersisting,S?.persistenceError,S?.persistNow]),D=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),I=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),O=useMemo(()=>I?.formConfig,[I?.formConfig]),A=me({workflowConfig:e,workflowState:a,currentStep:I}),z=useMemo(()=>{let v=-1;for(let R=0;R<e.steps.length;R++)if(A.isStepVisible(R)){v=R;break}let g=-1;for(let R=e.steps.length-1;R>=0;R--)if(A.isStepVisible(R)){g=R;break}let T=new Set;for(let R=0;R<e.steps.length;R++){let H=e.steps[R];A.isStepVisible(R)&&a.visitedSteps.has(H.id)&&T.add(H.id);}return {...D,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:T,passedSteps:a.passedSteps}},[D,a.currentStepIndex,a.visitedSteps,a.passedSteps,A,e.steps]),{analyticsStartTime:Ze}=fe({workflowConfig:e,workflowState:a,workflowContext:z}),{goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}=ge({workflowConfig:e,workflowState:a,workflowContext:z,conditionsHelpers:A,setCurrentStep:k,setTransitioning:h,markStepVisited:m,markStepPassed:W,setStepData:P,onStepChange:o.current}),ie=useRef(false);useEffect(()=>{if(ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(A.isStepVisible(g)){k(g),m(g,e.steps[g].id);break}}ie.current=true;},[a.currentStepIndex,e.steps,k,m,A]),useEffect(()=>{if(!ie.current)return;if(!A.isStepVisible(a.currentStepIndex)){let g=null;for(let T=a.currentStepIndex+1;T<e.steps.length;T++)if(A.isStepVisible(T)){g=T;break}if(g===null){for(let T=a.currentStepIndex-1;T>=0;T--)if(A.isStepVisible(T)){g=T;break}}g!==null&&(k(g),m(g,e.steps[g].id));}},[A,a.currentStepIndex,e.steps,k,m]);let{submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}=be({workflowConfig:e,workflowState:a,workflowContext:z,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Ze}),se=useCallback((v,g)=>{w(v,g,I?.id||"");},[w,I?.id]),Ae=useCallback(v=>{P(v,I?.id||"");},[P,I?.id]),Qe=useCallback(async v=>{I?.id&&v&&P(v,I.id),z.isLastStep?await Q():await Z();},[z.isLastStep,Q,Z,I?.id,P]),_e=useMemo(()=>({goToStep:he,goNext:Z,goPrevious:Ie,skipStep:We,canGoToStep:De,canGoNext:we,canGoPrevious:Re,canSkipCurrentStep:Ee}),[he,Z,Ie,We,De,we,Re,Ee]),Ve=useMemo(()=>({setValue:se,setStepData:Ae,resetWorkflow:L}),[se,Ae,L]),Ne=useMemo(()=>({submitWorkflow:Q,isSubmitting:Te,canSubmit:Ce}),[Q,Te,Ce]),He=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:I,context:z,formConfig:O,conditionsHelpers:A,currentStepMetadata:I?.metadata,..._e,...Ve,...Ne,persistNow:u.persistNow,isPersisting:u.isPersisting,persistenceError:u.persistenceError}),[a,e,I,z,O,A,_e,Ve,Ne,u]),Xe=useMemo(()=>{if(!I?.id)return {};let v=a?.allData[I.id]||{};if(!O?.allFields)return v;let g=new Set(O.allFields.map(R=>R.id)),T={};for(let[R,H]of Object.entries(v))g.has(R)&&(T[R]=H);return T},[a?.allData,I?.id,O?.allFields]),Ye=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(ye.Provider,{value:l,children:jsx(Ke.Provider,{value:He,children:jsx(FormProvider,{formConfig:O,defaultValues:Xe,onFieldChange:se,"data-workflow-id":e.id,className:p,onSubmit:Qe,children:t},Ye)})})}function V(){let t=useContext(Ke);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function ht({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof J?e.build():e,[e]);return jsx(ke,{...r,workflowConfig:n,children:t})}var wt=Dt.memo(function({stepId:e,children:r}){let{currentStep:n}=V();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Nt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:p,currentStep:o}=V(),{submit:f}=useFormConfigContext(),d=useFormSubmitting(),b=useFormValues(),c=useMemo(()=>{let y=d||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[d,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:p.renderConfig?.nextButtonRenderer,props:a,...n})});var zt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:p,workflowConfig:o,currentStep:f,canGoPrevious:d}=V(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=d()&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:w}},[b,p.isSubmitting,p.isTransitioning,d,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Zt=Dt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:p,workflowConfig:o,context:f,conditionsHelpers:d}=V(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||p.isSubmitting,P=r??k,w=(!!i?.allowSkip||d.isStepSkippable(p.currentStepIndex))&&!p.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:w}},[b,p.isSubmitting,p.isTransitioning,p.currentStepIndex,i?.allowSkip,d.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var er=Dt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:p,goToStep:o,conditionsHelpers:f}=V(),{visibleSteps:d,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=useMemo(()=>{let k=[],P=new Map,w=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let m=k.length;k.push(x),P.set(m,h),w.set(h,m);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:w}},[i.steps,f]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=useMemo(()=>({steps:d,currentStepIndex:a,visitedSteps:p.visibleVisitedSteps,onStepClick:l,className:r}),[d,a,p.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var Pe=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),p=this.compress?this.compressData(s):s;localStorage.setItem(n,p);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},p=JSON.stringify(s),o=this.compress?this.compressData(p):p;localStorage.setItem(i,o);}catch(i){throw new E("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new E(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new E("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new E(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new E("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new E(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new E("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new E(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new E("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new E(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new E("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,p=JSON.parse(s);p.expiresAt&&Date.now()>p.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{Pe as LocalStorageAdapter,ht as Workflow,wt as WorkflowBody,Nt as WorkflowNextButton,E as WorkflowPersistenceError,zt as WorkflowPreviousButton,ke as WorkflowProvider,Zt as WorkflowSkipButton,er as WorkflowStepper,ye as WorkflowStoreContext,Se as combineWorkflowDataForConditions,$e as createWorkflowStore,ue as debounce,te as flattenObject,J as flow,de as generateStorageKey,st as mergePersistedState,Me as persistedToWorkflowState,le as useConditionEvaluation,$r as useCurrentStepIndex,en as useIsStepPassed,Yr as useIsStepVisited,Xr as usePassedSteps,$ as usePersistence,Qr as useStepDataById,ot as useStepMetadata,Hr as useVisitedSteps,nn as useWorkflowActions,jr as useWorkflowAllData,fe as useWorkflowAnalytics,me as useWorkflowConditions,V as useWorkflowContext,qr as useWorkflowInitializing,ge as useWorkflowNavigation,tn as useWorkflowNavigationState,ut as useWorkflowState,Zr as useWorkflowStepData,_ as useWorkflowStore,sn as useWorkflowStoreApi,be as useWorkflowSubmission,rn as useWorkflowSubmitState,Jr as useWorkflowSubmitting,Kr as useWorkflowTransitioning,it as validatePersistedData,pe as workflowStateToPersisted};
|
|
1
|
+
import {ComponentRendererWrapper,IdGenerator,normalizeToArray,deepClone,ensureUnique,getGlobalMonitor,evaluateCondition}from'@rilaykit/core';import {FormBody,useFormConfigContext,useFormSubmitting,useFormValues,form,FormProvider}from'@rilaykit/forms';import Tt,{createContext,useMemo,useCallback,useContext,useState,useRef,useEffect,useReducer}from'react';import {createStore,useStore}from'zustand';import {subscribeWithSelector}from'zustand/middleware';import {jsx}from'react/jsx-runtime';var H=class t{constructor(e,r,n,i){this.steps=[];this.plugins=[];this.idGenerator=new IdGenerator;this.config=e,this.workflowId=r,this.workflowName=n,this.workflowDescription=i;}static create(e,r,n,i){return new t(e,r,n,i)}createStepFromDefinition(e){return {id:e.id||this.idGenerator.next("step"),title:e.title,description:e.description,formConfig:e.formConfig instanceof form?e.formConfig.build():e.formConfig,allowSkip:e.allowSkip||false,renderer:e.renderer,conditions:e.conditions,metadata:e.metadata,onAfterValidation:e.onAfterValidation}}addStep(e){let r=normalizeToArray(e);for(let n of r){let i=this.createStepFromDefinition(n);this.steps.push(i);}return this}configure(e){return e.analytics&&(this.analytics=e.analytics),e.persistence&&(this.persistenceConfig=e.persistence),this}use(e){this.validatePluginDependencies(e),this.plugins.push(e);try{e.install(this);}catch(r){throw new Error(`Failed to install plugin "${e.name}": ${r instanceof Error?r.message:String(r)}`)}return this}validatePluginDependencies(e){if(!e.dependencies)return;let r=e.dependencies.filter(n=>!this.plugins.some(i=>i.name===n));if(r.length>0)throw new Error(`Plugin "${e.name}" requires missing dependencies: ${r.join(", ")}`)}removePlugin(e){return this.plugins=this.plugins.filter(r=>r.name!==e),this}updateStep(e,r){let n=this.steps.findIndex(i=>i.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);return this.steps[n]={...this.steps[n],...r},this}addStepConditions(e,r){let n=this.steps.findIndex(s=>s.id===e);if(n===-1)throw new Error(`Step with ID "${e}" not found`);let i={...this.steps[n].conditions,...r};return this.steps[n]={...this.steps[n],conditions:i},this}removeStep(e){return this.steps=this.steps.filter(r=>r.id!==e),this}getStep(e){return this.steps.find(r=>r.id===e)}getSteps(){return [...this.steps]}clearSteps(){return this.steps=[],this.idGenerator.reset(),this}clone(e,r){let n=new t(this.config,e||`${this.workflowId}-clone`,r||this.workflowName);return n.steps=deepClone(this.steps),n.analytics=this.analytics?deepClone(this.analytics):void 0,n.persistenceConfig=this.persistenceConfig?deepClone(this.persistenceConfig):void 0,n.plugins=[...this.plugins],n}validate(){let e=[];this.steps.length===0&&e.push("Workflow must have at least one step");let r=this.steps.map(n=>n.id);try{ensureUnique(r,"step");}catch(n){e.push(n instanceof Error?n.message:String(n));}for(let n of this.plugins)if(n.dependencies){let i=n.dependencies.filter(s=>!this.plugins.some(d=>d.name===s));i.length>0&&e.push(`Plugin "${n.name}" requires missing dependencies: ${i.join(", ")}`);}return e}getStats(){let e=this.steps.reduce((n,i)=>n+i.formConfig.allFields.length,0),r=this.steps.map(n=>n.formConfig.allFields.length);return {totalSteps:this.steps.length,totalFields:e,averageFieldsPerStep:this.steps.length>0?e/this.steps.length:0,maxFieldsInStep:r.length>0?Math.max(...r):0,minFieldsInStep:r.length>0?Math.min(...r):0,hasAnalytics:!!this.analytics}}build(){let e=this.validate();if(e.length>0)throw new Error(`Workflow validation failed: ${e.join(", ")}`);return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins,renderConfig:this.config.getWorkflowRenderConfig()}}toJSON(){return {id:this.workflowId,name:this.workflowName,description:this.workflowDescription,steps:this.steps,analytics:this.analytics,persistence:this.persistenceConfig,plugins:this.plugins.map(e=>({name:e.name,version:e.version}))}}fromJSON(e){return this.workflowId=e.workflowId,this.workflowName=e.workflowName,this.workflowDescription=e.workflowDescription,this.steps=e.steps,this.analytics=e.analytics,this.persistenceConfig=e.persistence,this.plugins=e.plugins||[],this}};function ue(t,e={},r={}){return useMemo(()=>{if(!t)return {visible:r.visible??true,disabled:r.disabled??false,required:r.required??false,readonly:r.readonly??false};let n=i=>{try{let s;return i&&typeof i=="object"&&"build"in i?s=i.build():s=i,evaluateCondition(s,e)}catch(s){return console.warn("Error evaluating condition:",s),false}};return {visible:t.visible?n(t.visible):true,disabled:t.disabled?n(t.disabled):false,required:t.required?n(t.required):false,readonly:t.readonly?n(t.readonly):false}},[t,e,r])}function Oe(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t))if(r[n]={visible:true,disabled:false,required:false,readonly:false},i){let s=d=>{try{return d&&typeof d=="object"&&"build"in d?evaluateCondition(d.build(),e):evaluateCondition(d,e)}catch(o){return console.warn(`Error evaluating condition for field ${n}:`,o),false}};r[n]={visible:i.visible?s(i.visible):true,disabled:i.disabled?s(i.disabled):false,required:i.required?s(i.required):false,readonly:i.readonly?s(i.readonly):false};}return r},[t,e])}function Le(t,e={}){return useMemo(()=>{let r={};for(let[n,i]of Object.entries(t)){let s=Number.parseInt(n,10);if(r[s]={visible:true,disabled:false,required:false,readonly:false},i){let d=o=>{try{return o&&typeof o=="object"&&"build"in o?evaluateCondition(o.build(),e):evaluateCondition(o,e)}catch(f){return console.warn(`Error evaluating condition for step ${s}:`,f),false}};r[s]={visible:i.visible?d(i.visible):true,disabled:i.disabled?d(i.disabled):false,required:i.required?d(i.required):false,readonly:i.readonly?d(i.readonly):false};}}return r},[t,e])}var R=class extends Error{constructor(r,n,i){super(`[WorkflowPersistence] ${r} (Code: ${n})`);this.code=n;this.cause=i;this.name="WorkflowPersistenceError";}};function ce(t,e,r){return {workflowId:t,currentStepIndex:e.currentStepIndex,allData:{...e.allData},stepData:{...e.stepData},visitedSteps:Array.from(e.visitedSteps),passedSteps:Array.from(e.passedSteps),lastSaved:Date.now(),metadata:r}}function Ue(t){return {currentStepIndex:t.currentStepIndex,allData:{...t.allData},stepData:{...t.stepData},visitedSteps:new Set(t.visitedSteps),passedSteps:new Set(t.passedSteps||[]),isSubmitting:false,isTransitioning:false}}function at(t){if(!t||typeof t!="object")return false;let e=["workflowId","currentStepIndex","allData","stepData","visitedSteps","lastSaved"];for(let r of e)if(!(r in t))return false;return !(typeof t.workflowId!="string"||typeof t.currentStepIndex!="number"||typeof t.allData!="object"||typeof t.stepData!="object"||!Array.isArray(t.visitedSteps)||typeof t.lastSaved!="number")}function fe(t,e){return e?`${e}:${t}`:t}function Se(t,e){let r=null;return (...n)=>{r&&clearTimeout(r),r=setTimeout(()=>{t(...n);},e);}}function lt(t,e,r="persist"){let n=Ue(e);switch(r){case "persist":return {...n,isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};case "current":return {...t,visitedSteps:new Set([...t.visitedSteps,...n.visitedSteps]),passedSteps:new Set([...t.passedSteps,...n.passedSteps||[]])};case "merge":return {currentStepIndex:t.currentStepIndex,allData:{...n.allData,...t.allData},stepData:{...n.stepData,...t.stepData},visitedSteps:new Set([...n.visitedSteps,...t.visitedSteps]),passedSteps:new Set([...n.passedSteps||[],...t.passedSteps]),isSubmitting:t.isSubmitting,isTransitioning:t.isTransitioning};default:return n}}function q({workflowId:t,workflowState:e,adapter:r,options:n={},userId:i}){let[s,d]=useState(false),[o,f]=useState(null),[u,b]=useState(false),c=useRef(r),l=useRef(n),a=useRef({hasPendingChanges:false});useEffect(()=>{c.current=r,l.current=n;},[r,n]);let y=fe(l.current.storageKey||t,i),k=useCallback(()=>{f(null);},[]),P=useCallback((p,W)=>{let V=p instanceof R?p:new R(`${W} failed: ${p.message}`,"OPERATION_FAILED",p);f(V),console.error("[WorkflowPersistence]",V);},[]),D=useCallback(async p=>{k(),d(true);try{let W=ce(t,p,l.current.metadata);await c.current.save(y,W),a.current.lastSavedState={...p},a.current.hasPendingChanges=!1;}catch(W){throw P(W,"Save"),W}finally{d(false);}},[t,y,k,P]),x=useRef(Se(async p=>{try{await D(p);}catch(W){console.debug("[WorkflowPersistence] Auto-save failed:",W);}},n.debounceMs||500)),h=useCallback((p,W)=>W?p.currentStepIndex!==W.currentStepIndex||JSON.stringify(p.allData)!==JSON.stringify(W.allData)||JSON.stringify(p.stepData)!==JSON.stringify(W.stepData)||p.visitedSteps.size!==W.visitedSteps.size||!Array.from(p.visitedSteps).every(V=>W.visitedSteps.has(V)):true,[]),S=useCallback(async()=>{k(),b(true);try{let p=await c.current.load(y);return p&&(a.current.lastSavedState={currentStepIndex:p.currentStepIndex,allData:p.allData,stepData:p.stepData,visitedSteps:new Set(p.visitedSteps),passedSteps:new Set(p.passedSteps||[]),isSubmitting:!1,isTransitioning:!1,isInitializing:!1},a.current.hasPendingChanges=!1),p}catch(p){return P(p,"Load"),null}finally{setTimeout(()=>b(false),100);}},[y,k,P]),I=useCallback(async()=>{k();try{await c.current.remove(y),a.current.lastSavedState=void 0,a.current.hasPendingChanges=!1;}catch(p){throw P(p,"Clear"),p}},[y,k,P]),L=useCallback(async()=>{try{return await c.current.exists(y)}catch(p){return P(p,"Exists check"),false}},[y,P]);useEffect(()=>{l.current.autoPersist&&(s||u||e.isInitializing||e.isSubmitting||e.isTransitioning||h(e,a.current.lastSavedState)&&(a.current.hasPendingChanges=true,x.current(e)));},[e,s,u,h]);let m=useCallback(async()=>{await D(e);},[D,e]);return {isPersisting:s,persistenceError:o,persistNow:m,loadPersistedData:S,clearPersistedData:I,hasPersistedData:L}}function pt(){let{workflowConfig:t,currentStep:e}=N(),r=useMemo(()=>e?.metadata,[e?.metadata]),n=useMemo(()=>u=>t.steps.find(c=>c.id===u)?.metadata,[t.steps]),i=useMemo(()=>u=>t.steps[u]?.metadata,[t.steps]),s=useMemo(()=>u=>r?u in r:false,[r]),d=useMemo(()=>(u,b)=>r&&u in r?r[u]:b,[r]),o=useMemo(()=>()=>t.steps.map((u,b)=>({id:u.id,title:u.title,index:b,metadata:u.metadata})),[t.steps]),f=useMemo(()=>u=>t.steps.map((b,c)=>({step:b,index:c})).filter(({step:b,index:c})=>u(b.metadata,b.id,c)).map(({step:b})=>b.id),[t.steps]);return {current:r,getByStepId:n,getByStepIndex:i,hasCurrentKey:s,getCurrentValue:d,getAllStepsMetadata:o,findStepsByMetadata:f}}function ge({workflowConfig:t,workflowState:e,workflowContext:r}){let n=useRef(Date.now()),i=useRef(new Map),s=useRef(false),d=useRef(null),o=getGlobalMonitor();useEffect(()=>{t.analytics?.onWorkflowStart&&!s.current&&(s.current=true,t.analytics.onWorkflowStart(t.id,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"start",totalSteps:t.steps.length},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:0,navigationDuration:0,conditionEvaluationDuration:0},"low"));},[t.id,t.analytics,r,o,t.steps.length]),useEffect(()=>{let l=t.steps[e.currentStepIndex];if(l&&d.current!==l.id){if(d.current&&t.analytics?.onStepComplete){let a=i.current.get(d.current);if(a){let y=Date.now()-a;t.analytics.onStepComplete(d.current,y,e.stepData,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_complete",stepId:d.current,duration:y},{timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:y,conditionEvaluationDuration:0},"low");}}d.current=l.id,i.current.set(l.id,Date.now()),t.analytics?.onStepStart&&t.analytics.onStepStart(l.id,Date.now(),r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_start",stepId:l.id,stepIndex:e.currentStepIndex},{timestamp:Date.now(),duration:0,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:0},"low");}},[e.currentStepIndex,t.steps,t.analytics,r,e.stepData,o,t.id]);let f=useCallback((l,a)=>{t.analytics?.onStepSkip&&t.analytics.onStepSkip(l,a,r),o&&o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"step_skip",stepId:l,reason:a},void 0,"medium");},[t.analytics,r,o,t.id]),u=useCallback(l=>{t.analytics?.onError&&t.analytics.onError(l,r),o&&o.trackError(l,`workflow_${t.id}`,{workflowId:t.id,currentStepIndex:e.currentStepIndex,currentStepId:t.steps[e.currentStepIndex]?.id,workflowContext:r});},[t.analytics,r,o,t.id,e.currentStepIndex,t.steps]),b=useCallback((l,a,y)=>{if(!o)return;let k={timestamp:Date.now(),duration:y,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:a,navigationDuration:y,conditionEvaluationDuration:0};o.track("workflow_navigation",`workflow_${t.id}`,{workflowId:t.id,action:"navigation",fromStep:l,toStep:a,direction:a>l?"forward":"backward"},k,y>1e3?"medium":"low");},[o,t.id,t.steps.length]),c=useCallback((l,a)=>{if(!o)return;let y={timestamp:Date.now(),duration:l,workflowId:t.id,stepCount:t.steps.length,currentStepIndex:e.currentStepIndex,navigationDuration:0,conditionEvaluationDuration:l};o.track("condition_evaluation",`workflow_${t.id}`,{workflowId:t.id,conditionsCount:a,currentStepIndex:e.currentStepIndex},y,l>100?"medium":"low");},[o,t.id,t.steps.length,e.currentStepIndex]);return {analyticsStartTime:n,trackStepSkip:f,trackError:u,trackNavigation:b,trackConditionEvaluation:c}}function se(t,e=""){let r={};for(let n in t)if(n in t){let i=t[n],s=e?`${e}.${n}`:n;i!==null&&typeof i=="object"&&!Array.isArray(i)&&!(i instanceof Date)?Object.assign(r,se(i,s)):r[s]=i;}return r}function be(t,e){let r=se(t),n=se(e);return {...{...t,...e},...r,...n}}function $e(t,e){return {visible:t.visible,skippable:e===true||t.required}}function ye({workflowConfig:t,workflowState:e,currentStep:r}){let n=useMemo(()=>be(e.allData,e.stepData),[e.allData,e.stepData]),i=useMemo(()=>{if(r?.conditions)return {visible:r.conditions.visible,required:r.conditions.skippable}},[r?.conditions]),s=ue(i,n,{visible:true,disabled:false,required:false,readonly:false}),d=useMemo(()=>$e(s,r?.allowSkip),[s,r?.allowSkip]),o=useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{h.conditions&&(x[S]={visible:h.conditions.visible,required:h.conditions.skippable});}),x},[t.steps]),f=Le(o,n),u=useMemo(()=>{let x={};return t.steps.forEach((h,S)=>{let I=f[S];I?x[S]=$e(I,h.allowSkip):x[S]={visible:true,skippable:h.allowSkip===true};}),x},[t.steps,f]),b=useMemo(()=>{if(!r?.formConfig?.allFields)return {};let x={};for(let h of r.formConfig.allFields)h.conditions&&(x[h.id]=h.conditions);return x},[r?.formConfig?.allFields]),c=Oe(b,n),l=useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.visible??true,[u,t.steps.length]),a=useCallback(x=>x<0||x>=t.steps.length?false:u[x]?.skippable??false,[u,t.steps.length]),y=useCallback(x=>c[x]?.visible??true,[c]),k=useCallback(x=>c[x]?.disabled??false,[c]),P=useCallback(x=>c[x]?.required??false,[c]),D=useCallback(x=>c[x]?.readonly??false,[c]);return {stepConditions:d,fieldConditions:c,allStepConditions:u,isStepVisible:l,isStepSkippable:a,isFieldVisible:y,isFieldDisabled:k,isFieldRequired:P,isFieldReadonly:D}}function ve({workflowConfig:t,workflowState:e,workflowContext:r,conditionsHelpers:n,setCurrentStep:i,setTransitioning:s,markStepVisited:d,markStepPassed:o,setStepData:f,onStepChange:u}){let b=useRef(u);b.current=u;let c=t.steps[e.currentStepIndex],l=useCallback(()=>({setStepData:(m,p)=>{f(p,m);},setStepFields:(m,p)=>{let V={...e.allData[m]||{},...p};f(V,m);},getStepData:m=>e.allData[m]||{},setNextStepField:(m,p)=>{let W=e.currentStepIndex+1;if(W<t.steps.length){let V=t.steps[W].id,X={...e.allData[V]||{},[m]:p};f(X,V);}},setNextStepFields:m=>{let p=e.currentStepIndex+1;if(p<t.steps.length){let W=t.steps[p].id,z={...e.allData[W]||{},...m};f(z,W);}},getAllData:()=>({...e.allData}),getSteps:()=>[...t.steps]}),[e.allData,e.currentStepIndex,t.steps,f]),a=useCallback(async m=>{if(m<0||m>=t.steps.length||!n.isStepVisible(m))return false;s(true);try{return b.current&&b.current(e.currentStepIndex,m,r),i(m),d(m,t.steps[m].id),!0}catch(p){return console.error("Step transition failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}finally{s(false);}},[t.steps,t.analytics,n,e.currentStepIndex,r,s,i,d]),y=useCallback(m=>{for(let p=m+1;p<t.steps.length;p++)if(n.isStepVisible(p))return p;return null},[t.steps.length,n]),k=useCallback(m=>{for(let p=m-1;p>=0;p--)if(n.isStepVisible(p))return p;return null},[n]),P=useCallback(async()=>{if(c?.onAfterValidation)try{let p=l();await c.onAfterValidation(e.stepData,p,r);}catch(p){return console.error("onAfterValidation failed:",p),t.analytics?.onError&&t.analytics.onError(p,r),false}o(c.id);let m=y(e.currentStepIndex);return m===null?false:a(m)},[c,l,e.stepData,r,t.analytics,e.currentStepIndex,y,a,o]),D=useCallback(async()=>{let m=k(e.currentStepIndex);return m===null?false:a(m)},[e.currentStepIndex,k,a]),x=useCallback(async()=>!c?.allowSkip&&!n.isStepSkippable(e.currentStepIndex)?false:(t.analytics?.onStepSkip&&t.analytics.onStepSkip(c.id,"user_skip",r),P()),[c,n,e.currentStepIndex,t.analytics,r,P]),h=useCallback(m=>m<0||m>=t.steps.length?false:n.isStepVisible(m),[t.steps.length,n]),S=useCallback(()=>{let m=y(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,y,h]),I=useCallback(()=>{let m=k(e.currentStepIndex);return m!==null&&h(m)},[e.currentStepIndex,k,h]),L=useCallback(()=>c?.allowSkip===true&&n.isStepSkippable(e.currentStepIndex),[c?.allowSkip,n,e.currentStepIndex]);return {goToStep:a,goNext:P,goPrevious:D,skipStep:x,canGoToStep:h,canGoNext:S,canGoPrevious:I,canSkipCurrentStep:L}}function ft(t,e){switch(e.type){case "SET_CURRENT_STEP":return {...t,currentStepIndex:e.stepIndex};case "SET_STEP_DATA":return {...t,stepData:e.data,allData:{...t.allData,[e.stepId]:e.data}};case "SET_ALL_DATA":return {...t,allData:e.data};case "SET_FIELD_VALUE":{let r={...t.stepData,[e.fieldId]:e.value};return {...t,stepData:r,allData:{...t.allData,[e.stepId]:r}}}case "SET_SUBMITTING":return {...t,isSubmitting:e.isSubmitting};case "SET_TRANSITIONING":return {...t,isTransitioning:e.isTransitioning};case "MARK_STEP_VISITED":return {...t,visitedSteps:new Set([...t.visitedSteps,e.stepId])};case "MARK_STEP_PASSED":return {...t,passedSteps:new Set([...t.passedSteps,e.stepId])};case "RESET_WORKFLOW":return {currentStepIndex:0,allData:{},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false};case "LOAD_PERSISTED_STATE":return {...t,...e.state};case "SET_INITIALIZATION_COMPLETE":return {...t,isInitializing:false};default:return t}}function St({defaultValues:t={},defaultStepIndex:e,workflowSteps:r,persistence:n}){let i=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),s=useMemo(()=>{let S=new Set;if(e&&e>0&&r)for(let I=0;I<e;I++)r[I]&&S.add(r[I].id);return S},[e,r]),d={currentStepIndex:e??0,allData:t,stepData:{},visitedSteps:i,passedSteps:s,isSubmitting:false,isTransitioning:false,isInitializing:true},[o,f]=useReducer(ft,d),u=n?.adapter?q({workflowId:n.workflowId,workflowState:o,adapter:n.adapter,options:n.options,userId:n.userId}):null,b=useCallback(S=>{f({type:"SET_CURRENT_STEP",stepIndex:S});},[]),c=useCallback((S,I)=>{f({type:"SET_STEP_DATA",data:S,stepId:I});},[]),l=useCallback((S,I,L)=>{f({type:"SET_FIELD_VALUE",fieldId:S,value:I,stepId:L});},[]),a=useCallback(S=>{f({type:"SET_SUBMITTING",isSubmitting:S});},[]),y=useCallback(S=>{f({type:"SET_TRANSITIONING",isTransitioning:S});},[]),k=useCallback((S,I)=>{f({type:"MARK_STEP_VISITED",stepIndex:S,stepId:I});},[]),P=useCallback(S=>{f({type:"MARK_STEP_PASSED",stepId:S});},[]),D=useCallback(()=>{f({type:"RESET_WORKFLOW"});},[]),x=useCallback(()=>{f({type:"SET_INITIALIZATION_COMPLETE"});},[]),h=useCallback(async()=>{if(!u)return x(),false;try{let S=await u.loadPersistedData();if(S){let I={currentStepIndex:S.currentStepIndex,allData:S.allData,stepData:S.stepData,visitedSteps:new Set(S.visitedSteps),passedSteps:new Set(S.passedSteps||[])};return f({type:"LOAD_PERSISTED_STATE",state:I}),x(),!0}}catch(S){console.error("Failed to load persisted state:",S);}return x(),false},[u,x]);return {workflowState:o,setCurrentStep:b,setStepData:c,setFieldValue:l,setSubmitting:a,setTransitioning:y,markStepVisited:k,markStepPassed:P,resetWorkflow:D,loadPersistedState:h,persistence:u?{isPersisting:u.isPersisting,persistenceError:u.persistenceError,persistNow:u.persistNow,clearPersistedData:u.clearPersistedData,hasPersistedData:u.hasPersistedData}:null}}function ke({workflowConfig:t,workflowState:e,workflowContext:r,setSubmitting:n,onWorkflowComplete:i,analyticsStartTime:s}){let d=useRef(i);d.current=i;let o=useCallback(async()=>{n(true);try{if(d.current&&await d.current(e.allData),t.analytics?.onWorkflowComplete){let u=Date.now()-s.current;t.analytics.onWorkflowComplete(t.id,u,e.allData);}}catch(u){throw console.error("Workflow submission failed:",u),t.analytics?.onError&&t.analytics.onError(u,r),u}finally{n(false);}},[e.allData,t.analytics,t.id,r,s,n]),f=useCallback(()=>e.isSubmitting?false:e.currentStepIndex===t.steps.length-1,[e.isSubmitting,e.currentStepIndex,t.steps.length]);return {submitWorkflow:o,isSubmitting:e.isSubmitting,canSubmit:f()}}function Je(t={}){let{defaultValues:e={},defaultStepIndex:r=0,initialVisitedSteps:n=new Set,initialPassedSteps:i=new Set}=t;return createStore()(subscribeWithSelector((s,d)=>({currentStepIndex:r,isTransitioning:false,isInitializing:true,allData:{...e},stepData:{},visitedSteps:new Set(n),passedSteps:new Set(i),isSubmitting:false,_defaultValues:{...e},_defaultStepIndex:r,_setCurrentStep:o=>{s({currentStepIndex:o});},_setStepData:(o,f)=>{s(u=>({stepData:o,allData:{...u.allData,[f]:o}}));},_setAllData:o=>{s({allData:o});},_setFieldValue:(o,f,u)=>{s(b=>{let c={...b.stepData,[o]:f};return {stepData:c,allData:{...b.allData,[u]:c}}});},_setSubmitting:o=>{s({isSubmitting:o});},_setTransitioning:o=>{s({isTransitioning:o});},_setInitializing:o=>{s({isInitializing:o});},_markStepVisited:o=>{s(f=>({visitedSteps:new Set([...f.visitedSteps,o])}));},_markStepPassed:o=>{s(f=>({passedSteps:new Set([...f.passedSteps,o])}));},_reset:()=>{let o=d();s({currentStepIndex:o._defaultStepIndex,allData:{...o._defaultValues},stepData:{},visitedSteps:new Set,passedSteps:new Set,isSubmitting:false,isTransitioning:false,isInitializing:false});},_loadPersistedState:o=>{s(f=>({...f,...o,isInitializing:false}));}})))}var xe=createContext(null);function A(){let t=useContext(xe);if(!t)throw new Error("useWorkflowStore must be used within a WorkflowProvider");return t}function jr(){let t=A();return useStore(t,e=>e.currentStepIndex)}function Zr(){let t=A();return useStore(t,e=>e.isTransitioning)}function Hr(){let t=A();return useStore(t,e=>e.isInitializing)}function Qr(){let t=A();return useStore(t,e=>e.isSubmitting)}function Xr(){let t=A();return useStore(t,e=>e.allData)}function Yr(){let t=A();return useStore(t,e=>e.stepData)}function en(t){let e=A();return useStore(e,r=>r.allData[t])}function tn(){let t=A();return useStore(t,e=>e.visitedSteps)}function rn(){let t=A();return useStore(t,e=>e.passedSteps)}function nn(t){let e=A();return useStore(e,r=>r.visitedSteps.has(t))}function sn(t){let e=A();return useStore(e,r=>r.passedSteps.has(t))}function on(){let t=A(),e=useStore(t,i=>i.currentStepIndex),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isSubmitting);return {currentStepIndex:e,isTransitioning:r,isSubmitting:n}}function an(){let t=A(),e=useStore(t,i=>i.isSubmitting),r=useStore(t,i=>i.isTransitioning),n=useStore(t,i=>i.isInitializing);return {isSubmitting:e,isTransitioning:r,isInitializing:n}}function ln(){let t=A();return {setCurrentStep:e=>t.getState()._setCurrentStep(e),setStepData:(e,r)=>t.getState()._setStepData(e,r),setAllData:e=>t.getState()._setAllData(e),setFieldValue:(e,r,n)=>t.getState()._setFieldValue(e,r,n),setSubmitting:e=>t.getState()._setSubmitting(e),setTransitioning:e=>t.getState()._setTransitioning(e),setInitializing:e=>t.getState()._setInitializing(e),markStepVisited:e=>t.getState()._markStepVisited(e),markStepPassed:e=>t.getState()._markStepPassed(e),reset:()=>t.getState()._reset(),loadPersistedState:e=>t.getState()._loadPersistedState(e)}}function pn(){return A()}var It={save:async()=>{},load:async()=>null,remove:async()=>{},exists:async()=>false},je=createContext(null);function Wt(t,e){let r=new Set,n=new Set;if(t>0)for(let i=0;i<t;i++)e[i]&&(r.add(e[i].id),n.add(e[i].id));return {visitedSteps:r,passedSteps:n}}function he({children:t,workflowConfig:e,defaultValues:r={},defaultStep:n,onStepChange:i,onWorkflowComplete:s,className:d}){let o=useRef(i),f=useRef(s);o.current=i,f.current=s;let u=useMemo(()=>{if(!n)return 0;let v=e.steps.findIndex(g=>g.id===n);return v===-1?(console.warn(`Default step with ID "${n}" not found. Starting at step 0.`),0):v},[n,e.steps]),b=useMemo(()=>Wt(u,e.steps),[u,e.steps]),c=useRef(null);c.current||(c.current=Je({defaultValues:r,defaultStepIndex:u,initialVisitedSteps:b.visitedSteps,initialPassedSteps:b.passedSteps}));let l=c.current,[a,y]=useState(()=>{let v=l.getState();return {currentStepIndex:v.currentStepIndex,allData:v.allData,stepData:v.stepData,visitedSteps:v.visitedSteps,passedSteps:v.passedSteps,isSubmitting:v.isSubmitting,isTransitioning:v.isTransitioning,isInitializing:v.isInitializing}});useEffect(()=>l.subscribe(g=>{y({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:g.visitedSteps,passedSteps:g.passedSteps,isSubmitting:g.isSubmitting,isTransitioning:g.isTransitioning,isInitializing:g.isInitializing});}),[l]);let k=useCallback(v=>l.getState()._setCurrentStep(v),[l]),P=useCallback((v,g)=>l.getState()._setStepData(v,g),[l]),D=useCallback((v,g,E)=>l.getState()._setFieldValue(v,g,E),[l]),x=useCallback(v=>l.getState()._setSubmitting(v),[l]),h=useCallback(v=>l.getState()._setTransitioning(v),[l]),S=useCallback((v,g)=>l.getState()._markStepVisited(g),[l]),I=useCallback(v=>l.getState()._markStepPassed(v),[l]),L=useCallback(()=>l.getState()._reset(),[l]),m=!!e.persistence?.adapter,p=q({workflowId:e.id,workflowState:a,adapter:e.persistence?.adapter??It,options:e.persistence?.options,userId:e.persistence?.userId}),W=useRef(p);W.current=p;let V=useRef(false);useEffect(()=>{if(V.current)return;V.current=true,(async()=>{if(m)try{let g=await W.current.loadPersistedData();if(g){l.getState()._loadPersistedState({currentStepIndex:g.currentStepIndex,allData:g.allData,stepData:g.stepData,visitedSteps:new Set(g.visitedSteps),passedSteps:new Set(g.passedSteps||[])});return}}catch(g){console.error("Failed to load persisted state:",g);}l.getState()._setInitializing(false);})();},[l,m]);let z=useMemo(()=>({isPersisting:m?p.isPersisting:false,persistenceError:m?p.persistenceError:null,persistNow:m?p.persistNow:void 0}),[m,p.isPersisting,p.persistenceError,p.persistNow]),X=useMemo(()=>({workflowId:e.id,currentStepIndex:a.currentStepIndex,totalSteps:e.steps.length,allData:a.allData,stepData:a.stepData,visitedSteps:a.visitedSteps}),[e.id,e.steps.length,a.currentStepIndex,a.allData,a.stepData,a.visitedSteps]),C=useMemo(()=>e.steps[a.currentStepIndex],[e.steps,a.currentStepIndex]),K=useMemo(()=>C?.formConfig,[C?.formConfig]),_=ye({workflowConfig:e,workflowState:a,currentStep:C}),G=useMemo(()=>{let v=-1;for(let w=0;w<e.steps.length;w++)if(_.isStepVisible(w)){v=w;break}let g=-1;for(let w=e.steps.length-1;w>=0;w--)if(_.isStepVisible(w)){g=w;break}let E=new Set;for(let w=0;w<e.steps.length;w++){let te=e.steps[w];_.isStepVisible(w)&&a.visitedSteps.has(te.id)&&E.add(te.id);}return {...X,isFirstStep:a.currentStepIndex===v,isLastStep:a.currentStepIndex===g,visibleVisitedSteps:E,passedSteps:a.passedSteps}},[X,a.currentStepIndex,a.visitedSteps,a.passedSteps,_,e.steps]),{analyticsStartTime:Xe}=ge({workflowConfig:e,workflowState:a,workflowContext:G}),{goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}=ve({workflowConfig:e,workflowState:a,workflowContext:G,conditionsHelpers:_,setCurrentStep:k,setTransitioning:h,markStepVisited:S,markStepPassed:I,setStepData:P,onStepChange:o.current}),ae=useRef(false);useEffect(()=>{if(ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){for(let g=0;g<e.steps.length;g++)if(_.isStepVisible(g)){k(g),S(g,e.steps[g].id);break}}ae.current=true;},[a.currentStepIndex,e.steps,k,S,_]),useEffect(()=>{if(!ae.current)return;if(!_.isStepVisible(a.currentStepIndex)){let g=null;for(let E=a.currentStepIndex+1;E<e.steps.length;E++)if(_.isStepVisible(E)){g=E;break}if(g===null){for(let E=a.currentStepIndex-1;E>=0;E--)if(_.isStepVisible(E)){g=E;break}}g!==null&&(k(g),S(g,e.steps[g].id));}},[_,a.currentStepIndex,e.steps,k,S]);let{submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}=ke({workflowConfig:e,workflowState:a,workflowContext:G,setSubmitting:x,onWorkflowComplete:f.current,analyticsStartTime:Xe}),le=useCallback((v,g)=>{D(v,g,C?.id||"");},[D,C?.id]),Ne=useCallback(v=>{P(v,C?.id||"");},[P,C?.id]),Ye=useCallback(async v=>{C?.id&&v&&P(v,C.id),G.isLastStep?await ee():await Y();},[G.isLastStep,ee,Y,C?.id,P]),Fe=useMemo(()=>({goToStep:De,goNext:Y,goPrevious:we,skipStep:Re,canGoToStep:Ee,canGoNext:Te,canGoPrevious:Ce,canSkipCurrentStep:Ae}),[De,Y,we,Re,Ee,Te,Ce,Ae]),Be=useMemo(()=>({setValue:le,setStepData:Ne,resetWorkflow:L}),[le,Ne,L]),Me=useMemo(()=>({submitWorkflow:ee,isSubmitting:_e,canSubmit:Ve}),[ee,_e,Ve]),et=useMemo(()=>({workflowState:a,workflowConfig:e,currentStep:C,context:G,formConfig:K,conditionsHelpers:_,currentStepMetadata:C?.metadata,...Fe,...Be,...Me,persistNow:z.persistNow,isPersisting:z.isPersisting,persistenceError:z.persistenceError}),[a,e,C,G,K,_,Fe,Be,Me,z]),tt=useMemo(()=>{if(!C?.id)return {};let v=a?.allData[C.id]||{};if(!K?.allFields)return v;let g=new Set(K.allFields.map(w=>w.id)),E={};for(let[w,te]of Object.entries(v))g.has(w)&&(E[w]=te);return E},[a?.allData,C?.id,K?.allFields]),rt=useMemo(()=>a.isInitializing.toString(),[a.isInitializing]);return jsx(xe.Provider,{value:l,children:jsx(je.Provider,{value:et,children:jsx(FormProvider,{formConfig:K,defaultValues:tt,onFieldChange:le,"data-workflow-id":e.id,className:d,onSubmit:Ye,children:t},rt)})})}function N(){let t=useContext(je);if(!t)throw new Error("useWorkflowContext must be used within a WorkflowProvider");return t}function wt({children:t,workflowConfig:e,...r}){let n=useMemo(()=>e instanceof H?e.build():e,[e]);return jsx(he,{...r,workflowConfig:n,children:t})}var Ct=Tt.memo(function({stepId:e,children:r}){let{currentStep:n}=N();if(!n||e&&n.id!==e)return null;let{formConfig:i,renderer:s}=n;return i?s?s(n):r??jsx(FormBody,{}):null});var Ot=Tt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,workflowState:s,workflowConfig:d,currentStep:o}=N(),{submit:f}=useFormConfigContext(),u=useFormSubmitting(),b=useFormValues(),c=useMemo(()=>{let y=u||s.isSubmitting,k=r??y,P=!s.isTransitioning&&!k;return {finalIsSubmitting:k,canGoNext:P}},[u,s.isSubmitting,s.isTransitioning,r]),l=useCallback(async y=>{y?.preventDefault(),c.canGoNext&&await f(y);},[c.canGoNext,f]),a=useMemo(()=>({isLastStep:i.isLastStep,canGoNext:c.canGoNext,isSubmitting:c.finalIsSubmitting,onSubmit:l,className:e,currentStep:o,stepData:b,allData:i.allData,context:i}),[i.isLastStep,c.canGoNext,c.finalIsSubmitting,l,e,o,b,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowNextButton",renderer:d.renderConfig?.nextButtonRenderer,props:a,...n})});var qt=Tt.memo(function({className:e,isSubmitting:r,...n}){let{context:i,goPrevious:s,workflowState:d,workflowConfig:o,currentStep:f,canGoPrevious:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=u()&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canGoPrevious:D}},[b,d.isSubmitting,d.isTransitioning,u,r]),a=useCallback(async k=>{k?.preventDefault(),l.canGoPrevious&&await s();},[l.canGoPrevious,s]),y=useMemo(()=>({canGoPrevious:l.canGoPrevious,isSubmitting:l.finalIsSubmitting,onPrevious:a,className:e,currentStep:f,stepData:c,allData:i.allData,context:i}),[l.canGoPrevious,l.finalIsSubmitting,a,e,f,c,i.allData,i]);return jsx(ComponentRendererWrapper,{name:"WorkflowPreviousButton",renderer:o.renderConfig?.previousButtonRenderer,props:y,...n})});var Yt=Tt.memo(function({className:e,isSubmitting:r,...n}){let{currentStep:i,skipStep:s,workflowState:d,workflowConfig:o,context:f,conditionsHelpers:u}=N(),b=useFormSubmitting(),c=useFormValues(),l=useMemo(()=>{let k=b||d.isSubmitting,P=r??k,D=(!!i?.allowSkip||u.isStepSkippable(d.currentStepIndex))&&!d.isTransitioning&&!P;return {finalIsSubmitting:P,canSkip:D}},[b,d.isSubmitting,d.isTransitioning,d.currentStepIndex,i?.allowSkip,u.isStepSkippable,r]),a=useCallback(async k=>{k?.preventDefault(),l.canSkip&&await s();},[l.canSkip,s]),y=useMemo(()=>({canSkip:l.canSkip,isSubmitting:l.finalIsSubmitting,onSkip:a,className:e,currentStep:i,stepData:c,allData:f.allData,context:f}),[l.canSkip,l.finalIsSubmitting,a,e,i,c,f.allData,f]);return jsx(ComponentRendererWrapper,{name:"WorkflowSkipButton",renderer:o.renderConfig?.skipButtonRenderer,props:y,...n})});var ir=Tt.memo(function({onStepClick:e,className:r,...n}){let{workflowConfig:i,workflowState:s,context:d,goToStep:o,conditionsHelpers:f}=N(),{visibleSteps:u,visibleToOriginalIndexMap:b,originalToVisibleIndexMap:c}=useMemo(()=>{let k=[],P=new Map,D=new Map;return i.steps.forEach((x,h)=>{if(f.isStepVisible(h)){let S=k.length;k.push(x),P.set(S,h),D.set(h,S);}}),{visibleSteps:k,visibleToOriginalIndexMap:P,originalToVisibleIndexMap:D}},[i.steps,f]),l=useCallback(k=>{let P=b.get(k);P!==void 0&&(e?e(P):o(P));},[b,e,o]),a=useMemo(()=>c.get(s.currentStepIndex)??-1,[c,s.currentStepIndex]),y=useMemo(()=>({steps:u,currentStepIndex:a,visitedSteps:d.visibleVisitedSteps,onStepClick:l,className:r}),[u,a,d.visibleVisitedSteps,l,r]);return jsx(ComponentRendererWrapper,{name:"WorkflowStepper",renderer:i.renderConfig?.stepperRenderer,props:y,...n})});var We=class{constructor(e={}){this.version="1.0.0";this.keyPrefix=e.keyPrefix??"rilay_workflow_",this.compress=e.compress??false,this.maxAge=e.maxAge,this._isAvailable=this.isLocalStorageAvailable();}async save(e,r){if(this._isAvailable)try{let n=this.getStorageKey(e),i={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},s=JSON.stringify(i),d=this.compress?this.compressData(s):s;localStorage.setItem(n,d);}catch(n){if(n instanceof Error)if(n.name==="QuotaExceededError"||n.message.includes("quota")){await this.clearExpiredData();try{let i=this.getStorageKey(e),s={data:{...r,lastSaved:Date.now()},version:this.version,expiresAt:this.maxAge?Date.now()+this.maxAge:void 0},d=JSON.stringify(s),o=this.compress?this.compressData(d):d;localStorage.setItem(i,o);}catch(i){throw new R("localStorage quota exceeded and cleanup failed","QUOTA_EXCEEDED",i)}}else throw new R(`Failed to save to localStorage: ${n.message}`,"SAVE_FAILED",n);else throw new R("Unknown error occurred while saving","SAVE_FAILED")}}async load(e){if(!this._isAvailable)return null;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return null;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),null):{...s.data,visitedSteps:Array.isArray(s.data.visitedSteps)?s.data.visitedSteps:[]}}catch(r){throw r instanceof Error?new R(`Failed to load from localStorage: ${r.message}`,"LOAD_FAILED",r):new R("Unknown error occurred while loading","LOAD_FAILED")}}async remove(e){if(this._isAvailable)try{let r=this.getStorageKey(e);localStorage.removeItem(r);}catch(r){throw r instanceof Error?new R(`Failed to remove from localStorage: ${r.message}`,"REMOVE_FAILED",r):new R("Unknown error occurred while removing","REMOVE_FAILED")}}async exists(e){if(!this._isAvailable)return false;try{let r=this.getStorageKey(e),n=localStorage.getItem(r);if(!n)return !1;let i=this.compress?this.decompressData(n):n,s=JSON.parse(i);return s.expiresAt&&Date.now()>s.expiresAt?(await this.remove(e),!1):!0}catch{return false}}async listKeys(){if(!this._isAvailable)return [];try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix)){let i=n.substring(this.keyPrefix.length);await this.exists(i)&&e.push(i);}}return e}catch(e){throw e instanceof Error?new R(`Failed to list keys: ${e.message}`,"LIST_FAILED",e):new R("Unknown error occurred while listing keys","LIST_FAILED")}}async clear(){try{let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);n?.startsWith(this.keyPrefix)&&e.push(n);}for(let r of e)localStorage.removeItem(r);}catch(e){throw e instanceof Error?new R(`Failed to clear localStorage: ${e.message}`,"CLEAR_FAILED",e):new R("Unknown error occurred while clearing","CLEAR_FAILED")}}getStorageKey(e){return `${this.keyPrefix}${e}`}isLocalStorageAvailable(){try{let e="__rilay_test__";return localStorage.setItem(e,"test"),localStorage.removeItem(e),!0}catch{return false}}compressData(e){return btoa(e)}decompressData(e){try{return atob(e)}catch{return e}}async clearExpiredData(){if(!this._isAvailable)return;let e=[];for(let r=0;r<localStorage.length;r++){let n=localStorage.key(r);if(n?.startsWith(this.keyPrefix))try{let i=localStorage.getItem(n);if(i){let s=this.compress?this.decompressData(i):i,d=JSON.parse(s);d.expiresAt&&Date.now()>d.expiresAt&&e.push(n);}}catch{e.push(n);}}for(let r of e)localStorage.removeItem(r);}};export{We as LocalStorageAdapter,wt as Workflow,Ct as WorkflowBody,Ot as WorkflowNextButton,R as WorkflowPersistenceError,qt as WorkflowPreviousButton,he as WorkflowProvider,Yt as WorkflowSkipButton,ir as WorkflowStepper,xe as WorkflowStoreContext,be as combineWorkflowDataForConditions,Je as createWorkflowStore,Se as debounce,se as flattenObject,H as flow,fe as generateStorageKey,lt as mergePersistedState,Ue as persistedToWorkflowState,ue as useConditionEvaluation,jr as useCurrentStepIndex,sn as useIsStepPassed,nn as useIsStepVisited,rn as usePassedSteps,q as usePersistence,en as useStepDataById,pt as useStepMetadata,tn as useVisitedSteps,ln as useWorkflowActions,Xr as useWorkflowAllData,ge as useWorkflowAnalytics,ye as useWorkflowConditions,N as useWorkflowContext,Hr as useWorkflowInitializing,ve as useWorkflowNavigation,on as useWorkflowNavigationState,St as useWorkflowState,Yr as useWorkflowStepData,A as useWorkflowStore,pn as useWorkflowStoreApi,ke as useWorkflowSubmission,an as useWorkflowSubmitState,Qr as useWorkflowSubmitting,Zr as useWorkflowTransitioning,at as validatePersistedData,ce as workflowStateToPersisted};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rilaykit/workflow",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Workflow and multi-step form utilities for RilayKit",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -16,6 +16,9 @@
|
|
|
16
16
|
"files": [
|
|
17
17
|
"dist"
|
|
18
18
|
],
|
|
19
|
+
"publishConfig": {
|
|
20
|
+
"provenance": true
|
|
21
|
+
},
|
|
19
22
|
"keywords": [
|
|
20
23
|
"react",
|
|
21
24
|
"workflow",
|
|
@@ -24,29 +27,29 @@
|
|
|
24
27
|
"typescript"
|
|
25
28
|
],
|
|
26
29
|
"author": "AND YOU CREATE <contact@andyoucreate.com>",
|
|
27
|
-
"license": "
|
|
28
|
-
"homepage": "https://rilay.
|
|
30
|
+
"license": "MIT",
|
|
31
|
+
"homepage": "https://rilay.dev",
|
|
29
32
|
"repository": {
|
|
30
33
|
"type": "git",
|
|
31
|
-
"url": "https://github.com/andyoucreate/
|
|
34
|
+
"url": "https://github.com/andyoucreate/rilaykit.git"
|
|
32
35
|
},
|
|
33
36
|
"bugs": {
|
|
34
|
-
"url": "https://github.com/andyoucreate/
|
|
37
|
+
"url": "https://github.com/andyoucreate/rilaykit/issues"
|
|
35
38
|
},
|
|
36
39
|
"dependencies": {
|
|
37
40
|
"zustand": "^5.0.9",
|
|
38
|
-
"@rilaykit/core": "0.1.
|
|
39
|
-
"@rilaykit/forms": "0.1.
|
|
41
|
+
"@rilaykit/core": "0.1.3",
|
|
42
|
+
"@rilaykit/forms": "0.1.3"
|
|
40
43
|
},
|
|
41
44
|
"peerDependencies": {
|
|
42
45
|
"react": ">=18.0.0",
|
|
43
46
|
"react-dom": ">=18.0.0"
|
|
44
47
|
},
|
|
45
48
|
"devDependencies": {
|
|
46
|
-
"@types/react": "^
|
|
47
|
-
"@types/react-dom": "^
|
|
48
|
-
"react": "^
|
|
49
|
-
"react-dom": "^
|
|
49
|
+
"@types/react": "^19.0.0",
|
|
50
|
+
"@types/react-dom": "^19.0.0",
|
|
51
|
+
"react": "^19.0.0",
|
|
52
|
+
"react-dom": "^19.0.0",
|
|
50
53
|
"typescript": "^5.8.3"
|
|
51
54
|
},
|
|
52
55
|
"scripts": {
|