palistor 0.0.24 → 0.0.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/react/createTrackingProxy.d.ts.map +1 -1
- package/dist/react/createTrackingProxy.js +50 -1
- package/dist/react/createTrackingProxy.js.map +1 -1
- package/dist/store/buildProxy/buildProxy.d.ts.map +1 -1
- package/dist/store/buildProxy/buildProxy.js +53 -2
- package/dist/store/buildProxy/buildProxy.js.map +1 -1
- package/dist/store/buildProxy/computeProxyKeys.d.ts.map +1 -1
- package/dist/store/buildProxy/computeProxyKeys.js +10 -5
- package/dist/store/buildProxy/computeProxyKeys.js.map +1 -1
- package/dist/store/constants.d.ts +19 -0
- package/dist/store/constants.d.ts.map +1 -1
- package/dist/store/constants.js +35 -0
- package/dist/store/constants.js.map +1 -1
- package/dist/store/flow/buildFlowStepsProxy.d.ts +17 -0
- package/dist/store/flow/buildFlowStepsProxy.d.ts.map +1 -0
- package/dist/store/flow/buildFlowStepsProxy.js +72 -0
- package/dist/store/flow/buildFlowStepsProxy.js.map +1 -0
- package/dist/store/flow/defineFlow.d.ts +90 -0
- package/dist/store/flow/defineFlow.d.ts.map +1 -0
- package/dist/store/flow/defineFlow.js +97 -0
- package/dist/store/flow/defineFlow.js.map +1 -0
- package/dist/store/flow/flowApi.d.ts +17 -0
- package/dist/store/flow/flowApi.d.ts.map +1 -0
- package/dist/store/flow/flowApi.js +18 -0
- package/dist/store/flow/flowApi.js.map +1 -0
- package/dist/store/flow/flowNavigation.d.ts +135 -0
- package/dist/store/flow/flowNavigation.d.ts.map +1 -0
- package/dist/store/flow/flowNavigation.js +382 -0
- package/dist/store/flow/flowNavigation.js.map +1 -0
- package/dist/store/flow/flowState.d.ts +41 -0
- package/dist/store/flow/flowState.d.ts.map +1 -0
- package/dist/store/flow/flowState.js +51 -0
- package/dist/store/flow/flowState.js.map +1 -0
- package/dist/store/flow/index.d.ts +10 -0
- package/dist/store/flow/index.d.ts.map +1 -0
- package/dist/store/flow/index.js +6 -0
- package/dist/store/flow/index.js.map +1 -0
- package/dist/store/persist/persistManager.d.ts.map +1 -1
- package/dist/store/persist/persistManager.js +32 -1
- package/dist/store/persist/persistManager.js.map +1 -1
- package/dist/store/resetPipeline/resetPipeline.d.ts.map +1 -1
- package/dist/store/resetPipeline/resetPipeline.js +5 -0
- package/dist/store/resetPipeline/resetPipeline.js.map +1 -1
- package/dist/store/store/NodeRegistry/nodeRegistry.d.ts +13 -0
- package/dist/store/store/NodeRegistry/nodeRegistry.d.ts.map +1 -1
- package/dist/store/store/NodeRegistry/nodeRegistry.js +17 -0
- package/dist/store/store/NodeRegistry/nodeRegistry.js.map +1 -1
- package/dist/store/store/groupDepsMap.d.ts.map +1 -1
- package/dist/store/store/groupDepsMap.js +16 -11
- package/dist/store/store/groupDepsMap.js.map +1 -1
- package/dist/store/store/palistor.d.ts.map +1 -1
- package/dist/store/store/palistor.js +6 -0
- package/dist/store/store/palistor.js.map +1 -1
- package/dist/store/store/registerNodes.d.ts.map +1 -1
- package/dist/store/store/registerNodes.js +23 -8
- package/dist/store/store/registerNodes.js.map +1 -1
- package/dist/store/store/types.d.ts +58 -6
- package/dist/store/store/types.d.ts.map +1 -1
- package/dist/store/submitPipeline/submitPipeline.d.ts.map +1 -1
- package/dist/store/submitPipeline/submitPipeline.js +5 -1
- package/dist/store/submitPipeline/submitPipeline.js.map +1 -1
- package/package.json +1 -1
- package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts +0 -11
- package/dist/store/compute/recompute/collectGroupLeafNodes.d.ts.map +0 -1
- package/dist/store/compute/recompute/collectGroupLeafNodes.js +0 -26
- package/dist/store/compute/recompute/collectGroupLeafNodes.js.map +0 -1
- package/dist/store/fieldMapping.typecheck.d.ts +0 -2
- package/dist/store/fieldMapping.typecheck.d.ts.map +0 -1
- package/dist/store/fieldMapping.typecheck.js +0 -71
- package/dist/store/fieldMapping.typecheck.js.map +0 -1
- package/dist/store/submitPipeline/getSubValues.d.ts +0 -9
- package/dist/store/submitPipeline/getSubValues.d.ts.map +0 -1
- package/dist/store/submitPipeline/getSubValues.js +0 -26
- package/dist/store/submitPipeline/getSubValues.js.map +0 -1
|
@@ -0,0 +1,382 @@
|
|
|
1
|
+
import { computeFieldState } from "../compute";
|
|
2
|
+
import { walkFull } from "../traversal";
|
|
3
|
+
import { resetResolveState } from "../resolvePipeline";
|
|
4
|
+
// ─── Derived state ────────────────────────────────────────────────────────────
|
|
5
|
+
/** Статус шага — производная от навигационного состояния (не хранится). */
|
|
6
|
+
export function getStepStatus(flowState, stepNode) {
|
|
7
|
+
const idx = flowState.stepNodes.indexOf(stepNode);
|
|
8
|
+
if (idx === -1)
|
|
9
|
+
return null;
|
|
10
|
+
if (idx === flowState.currentIndex)
|
|
11
|
+
return "active";
|
|
12
|
+
return flowState.visitedKeys.has(flowState.stepKeys[idx]) ? "completed" : null;
|
|
13
|
+
}
|
|
14
|
+
/** Видимость шага — из вычисленного FieldState группы (isVisible реактивен). */
|
|
15
|
+
export function isStepVisible(kernel, stepNode) {
|
|
16
|
+
return kernel.nodes.nodeState.get(stepNode)?.isVisible !== false;
|
|
17
|
+
}
|
|
18
|
+
/** Композитный loading флоу: true, если резолвится хотя бы один шаг. */
|
|
19
|
+
export function flowLoading(kernel, flowState) {
|
|
20
|
+
for (const stepNode of flowState.stepNodes) {
|
|
21
|
+
if (kernel.nodes.nodeState.get(stepNode)?.loading === true)
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
// ─── Validation ───────────────────────────────────────────────────────────────
|
|
27
|
+
/**
|
|
28
|
+
* Собрать ошибки листьев поддерева шага. Валидация считается «вживую» через
|
|
29
|
+
* computeFieldState(revalidate=true) — не зависит от флага revalidate группы
|
|
30
|
+
* (тот выставляется только submit-пайплайном). Скрытые листья пропускаются.
|
|
31
|
+
* Списки внутри шага пропускаются (паритет с collectLeafStates).
|
|
32
|
+
*
|
|
33
|
+
* `basePath` — префикс путей ошибок. Флоу передаёт КЛЮЧ шага: пути получаются
|
|
34
|
+
* относительными flow-ноды ("welcome.name") — та же база, что у ошибок
|
|
35
|
+
* submit-пайплайна при flow.submit() (collectLeafStates строит пути от
|
|
36
|
+
* submitted-ноды).
|
|
37
|
+
*/
|
|
38
|
+
export function collectStepErrors(kernel, stepNode, basePath = "") {
|
|
39
|
+
const errors = [];
|
|
40
|
+
const { nodeState } = kernel.nodes;
|
|
41
|
+
const translate = kernel.services.translate;
|
|
42
|
+
walkFull(stepNode, {
|
|
43
|
+
onLeaf(leaf, _key, path) {
|
|
44
|
+
const state = nodeState.get(leaf);
|
|
45
|
+
if (!state || state.isVisible === false)
|
|
46
|
+
return;
|
|
47
|
+
const groupValues = kernel.values.nodeSlot.get(leaf)?.parent ?? kernel.values.values;
|
|
48
|
+
const computed = computeFieldState(leaf, state.value, groupValues, true, translate);
|
|
49
|
+
if (computed.isInvalid && computed.errorMessage) {
|
|
50
|
+
errors.push({ path, message: computed.errorMessage });
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
}, basePath);
|
|
54
|
+
return errors;
|
|
55
|
+
}
|
|
56
|
+
/** Live-агрегат валидности шага (flow.steps.x.isInvalid). */
|
|
57
|
+
export function stepIsInvalid(kernel, stepNode) {
|
|
58
|
+
return collectStepErrors(kernel, stepNode).length > 0;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Ошибки флоу по посещённым видимым шагам (скоуп flow.validate()).
|
|
62
|
+
* Скрытые шаги исключаются всегда — невзятая ветка не должна блокировать.
|
|
63
|
+
* Пути ошибок относительны flow-ноды ("stepKey.field") — как у SubmitResult
|
|
64
|
+
* при flow.submit().
|
|
65
|
+
*/
|
|
66
|
+
export function collectFlowErrors(kernel, flowState) {
|
|
67
|
+
const errors = [];
|
|
68
|
+
for (let i = 0; i < flowState.stepNodes.length; i++) {
|
|
69
|
+
const stepNode = flowState.stepNodes[i];
|
|
70
|
+
if (!flowState.visitedKeys.has(flowState.stepKeys[i]))
|
|
71
|
+
continue;
|
|
72
|
+
if (!isStepVisible(kernel, stepNode))
|
|
73
|
+
continue;
|
|
74
|
+
errors.push(...collectStepErrors(kernel, stepNode, flowState.stepKeys[i]));
|
|
75
|
+
}
|
|
76
|
+
return errors;
|
|
77
|
+
}
|
|
78
|
+
/** Агрегат flow.isInvalid: есть ли ошибки в посещённых видимых шагах. */
|
|
79
|
+
export function flowIsInvalid(kernel, flowState) {
|
|
80
|
+
return collectFlowErrors(kernel, flowState).length > 0;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* flow.validate(): собрать ошибки посещённых шагов, записать в реактивный
|
|
84
|
+
* flow.errors и вернуть. Пустой массив = всё валидно.
|
|
85
|
+
*/
|
|
86
|
+
export function flowValidate(kernel, flowState) {
|
|
87
|
+
const errors = collectFlowErrors(kernel, flowState);
|
|
88
|
+
flowState.errors = errors;
|
|
89
|
+
kernel.notifyChanged(new Set([flowState, flowState.flowNode]));
|
|
90
|
+
return errors;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Отфильтровать из ошибок submit-пайплайна листья, лежащие под СКРЫТЫМИ
|
|
94
|
+
* шагами любого флоу (Resolved Decision 14): базовый пайплайн валидирует все
|
|
95
|
+
* листья независимо от видимости, и без фильтра невзятая ветка с isRequired
|
|
96
|
+
* навсегда блокировала бы финализацию.
|
|
97
|
+
*
|
|
98
|
+
* `submittedNode` — узел, для которого выполнялся submit: пути ошибок пайплайна
|
|
99
|
+
* ОТНОСИТЕЛЬНЫ ему (collectLeafStates строит пути от submitted-ноды), поэтому
|
|
100
|
+
* абсолютные пути скрытых шагов приводятся к той же базе.
|
|
101
|
+
*/
|
|
102
|
+
export function filterHiddenFlowStepErrors(kernel, errors, submittedNode) {
|
|
103
|
+
const flows = kernel.nodes.allFlowStates;
|
|
104
|
+
if (flows.length === 0 || errors.length === 0)
|
|
105
|
+
return errors;
|
|
106
|
+
const basePath = submittedNode === kernel.rootConfig
|
|
107
|
+
? ""
|
|
108
|
+
: kernel.nodes.nodePaths.get(submittedNode) ?? "";
|
|
109
|
+
const hiddenPrefixes = [];
|
|
110
|
+
for (const flowState of flows) {
|
|
111
|
+
for (const stepNode of flowState.stepNodes) {
|
|
112
|
+
if (isStepVisible(kernel, stepNode))
|
|
113
|
+
continue;
|
|
114
|
+
const stepPath = kernel.nodes.nodePaths.get(stepNode);
|
|
115
|
+
if (!stepPath)
|
|
116
|
+
continue;
|
|
117
|
+
if (basePath === "") {
|
|
118
|
+
hiddenPrefixes.push(stepPath + ".");
|
|
119
|
+
}
|
|
120
|
+
else if (stepPath.startsWith(basePath + ".")) {
|
|
121
|
+
hiddenPrefixes.push(stepPath.slice(basePath.length + 1) + ".");
|
|
122
|
+
}
|
|
123
|
+
// stepPath вне поддерева submitted-ноды — его листья в errors не попадают.
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (hiddenPrefixes.length === 0)
|
|
127
|
+
return errors;
|
|
128
|
+
return errors.filter((e) => !hiddenPrefixes.some((prefix) => e.path.startsWith(prefix)));
|
|
129
|
+
}
|
|
130
|
+
// ─── Submit (финализация) ─────────────────────────────────────────────────────
|
|
131
|
+
/**
|
|
132
|
+
* flow.submit(): стандартный group-submit пайплайн над flow-нодой
|
|
133
|
+
* (submitting → beforeSubmit → validate → onSubmit → afterSubmit; листья
|
|
134
|
+
* скрытых шагов отфильтровываются пайплайном). Ошибки валидации ложатся в
|
|
135
|
+
* реактивный flow.errors; при успехе errors очищаются.
|
|
136
|
+
*/
|
|
137
|
+
export async function flowSubmit(kernel, flowState) {
|
|
138
|
+
const result = await kernel.submitPipeline.execute(flowState.flowNode);
|
|
139
|
+
flowState.errors = result.success ? [] : result.errors;
|
|
140
|
+
kernel.notifyChanged(new Set([flowState, flowState.flowNode]));
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
// ─── Entry lifecycle ─────────────────────────────────────────────────────────
|
|
144
|
+
function fireCallback(cb, values, kernel) {
|
|
145
|
+
if (typeof cb !== "function")
|
|
146
|
+
return;
|
|
147
|
+
try {
|
|
148
|
+
void Promise.resolve(cb(values, kernel))
|
|
149
|
+
.catch(() => { });
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
/* синхронный throw тоже подавляется */
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Lifecycle входа в шаг: onEnter → resolve (eager) → onReady.
|
|
157
|
+
*
|
|
158
|
+
* - `onEnter` / `onReady` получают FLOW-scoped values (все шаги по ключам) —
|
|
159
|
+
* живую ссылку groupSlot флоу; fire-and-forget.
|
|
160
|
+
* - resolve шага — стандартный group resolve; флоу триггерит его НА ВХОДЕ
|
|
161
|
+
* (эквивалент первого доступа). Уже resolved/error (кэш) — не перезапускается,
|
|
162
|
+
* и onReady НЕ вызывается повторно (Resolved Decision 10).
|
|
163
|
+
* - Без resolve — onReady сразу после onEnter.
|
|
164
|
+
*/
|
|
165
|
+
export function runEntryLifecycle(kernel, flowState, stepNode) {
|
|
166
|
+
const flowValues = kernel.values.groupSlot.get(flowState.flowNode) ?? kernel.values.values;
|
|
167
|
+
fireCallback(stepNode.onEnter, flowValues, kernel);
|
|
168
|
+
const onReady = stepNode.onReady;
|
|
169
|
+
const fireReady = () => fireCallback(onReady, flowValues, kernel);
|
|
170
|
+
const resolve = stepNode.resolve;
|
|
171
|
+
const hasResolve = !!resolve && typeof resolve.resolver === "function";
|
|
172
|
+
if (!hasResolve) {
|
|
173
|
+
fireReady();
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
const state = kernel.resolveManager.getResolveState(stepNode);
|
|
177
|
+
if (state && state.status === "idle") {
|
|
178
|
+
kernel.resolveManager.triggerResolve(stepNode);
|
|
179
|
+
const after = kernel.resolveManager.getResolveState(stepNode);
|
|
180
|
+
if (after?.promise) {
|
|
181
|
+
void after.promise.then(fireReady).catch(() => { });
|
|
182
|
+
}
|
|
183
|
+
else {
|
|
184
|
+
fireReady();
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// pending — resolve уже запущен другим входом (onReady прикреплён там);
|
|
188
|
+
// resolved / error — кэш: onReady не перезапускается.
|
|
189
|
+
}
|
|
190
|
+
// ─── Navigation ──────────────────────────────────────────────────────────────
|
|
191
|
+
function notifyNavigation(kernel, flowState, prevNode, nextNode) {
|
|
192
|
+
const changed = new Set([
|
|
193
|
+
flowState,
|
|
194
|
+
flowState.flowNode,
|
|
195
|
+
prevNode,
|
|
196
|
+
nextNode,
|
|
197
|
+
]);
|
|
198
|
+
kernel.notifyChanged(changed);
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Общий переход на шаг targetIndex.
|
|
202
|
+
* `push: true` — nextStep()/goTo() (текущий ключ кладётся в стек);
|
|
203
|
+
* `push: false` — back() (стек уже уменьшен вызывающим).
|
|
204
|
+
*/
|
|
205
|
+
function enterStep(kernel, flowState, targetIndex, push) {
|
|
206
|
+
const prevIndex = flowState.currentIndex;
|
|
207
|
+
const prevKey = flowState.stepKeys[prevIndex];
|
|
208
|
+
const prevNode = flowState.stepNodes[prevIndex];
|
|
209
|
+
if (push)
|
|
210
|
+
flowState.visitStack.push(prevKey);
|
|
211
|
+
flowState.currentIndex = targetIndex;
|
|
212
|
+
const nextKey = flowState.stepKeys[targetIndex];
|
|
213
|
+
const nextNode = flowState.stepNodes[targetIndex];
|
|
214
|
+
// Предыдущий шаг был посещён (status → "completed"), новый — активен.
|
|
215
|
+
flowState.visitedKeys.add(prevKey);
|
|
216
|
+
flowState.visitedKeys.add(nextKey);
|
|
217
|
+
notifyNavigation(kernel, flowState, prevNode, nextNode);
|
|
218
|
+
runEntryLifecycle(kernel, flowState, nextNode);
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* nextStep(): следующий ВИДИМЫЙ шаг по порядку массива; скрытые пропускаются.
|
|
222
|
+
* Если видимых впереди нет — финализация через flow.submit() (при ошибках
|
|
223
|
+
* валидации onSubmit не вызывается, ошибки в flow.errors, шаг не меняется).
|
|
224
|
+
*/
|
|
225
|
+
export function flowNextStep(kernel, flowState) {
|
|
226
|
+
for (let i = flowState.currentIndex + 1; i < flowState.stepNodes.length; i++) {
|
|
227
|
+
if (isStepVisible(kernel, flowState.stepNodes[i])) {
|
|
228
|
+
enterStep(kernel, flowState, i, true);
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
void flowSubmit(kernel, flowState);
|
|
233
|
+
}
|
|
234
|
+
/** back(): вернуться по стеку посещений. No-op при пустом стеке (canGoBack). */
|
|
235
|
+
export function flowBack(kernel, flowState) {
|
|
236
|
+
if (flowState.visitStack.length === 0)
|
|
237
|
+
return;
|
|
238
|
+
const targetKey = flowState.visitStack.pop();
|
|
239
|
+
const targetIndex = flowState.stepKeys.indexOf(targetKey);
|
|
240
|
+
if (targetIndex === -1)
|
|
241
|
+
return; // повреждённый стек (после гидратации со старым конфигом)
|
|
242
|
+
enterStep(kernel, flowState, targetIndex, false);
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* goTo(keyOrIndex): произвольный переход по ключу или индексу.
|
|
246
|
+
* Несуществующий ключ/индекс — throw (ловит опечатки на этапе разработки).
|
|
247
|
+
* Переход в текущий шаг — no-op.
|
|
248
|
+
*/
|
|
249
|
+
export function flowGoTo(kernel, flowState, keyOrIndex) {
|
|
250
|
+
let targetIndex;
|
|
251
|
+
if (typeof keyOrIndex === "number") {
|
|
252
|
+
if (!Number.isInteger(keyOrIndex) || keyOrIndex < 0 || keyOrIndex >= flowState.stepKeys.length) {
|
|
253
|
+
throw new Error(`[palistor] flow.goTo(${keyOrIndex}): step index out of range (0..${flowState.stepKeys.length - 1}).`);
|
|
254
|
+
}
|
|
255
|
+
targetIndex = keyOrIndex;
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
targetIndex = flowState.stepKeys.indexOf(keyOrIndex);
|
|
259
|
+
if (targetIndex === -1) {
|
|
260
|
+
throw new Error(`[palistor] flow.goTo("${keyOrIndex}"): unknown step key. Steps: ${flowState.stepKeys.join(", ")}.`);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
if (targetIndex === flowState.currentIndex)
|
|
264
|
+
return;
|
|
265
|
+
enterStep(kernel, flowState, targetIndex, true);
|
|
266
|
+
}
|
|
267
|
+
// ─── Reset ───────────────────────────────────────────────────────────────────
|
|
268
|
+
/**
|
|
269
|
+
* Сброс навигации флоу: первый шаг активен, стек и visited очищены,
|
|
270
|
+
* resolve-состояния шагов сброшены в idle. Lifecycle входа первого шага
|
|
271
|
+
* (onEnter → resolve → onReady) выполняется заново — зеркально инициализации.
|
|
272
|
+
*/
|
|
273
|
+
export function resetFlowNav(kernel, flowState) {
|
|
274
|
+
flowState.currentIndex = 0;
|
|
275
|
+
flowState.visitStack = [];
|
|
276
|
+
flowState.visitedKeys = new Set([flowState.stepKeys[0]]);
|
|
277
|
+
flowState.errors = [];
|
|
278
|
+
const changed = new Set([flowState, flowState.flowNode]);
|
|
279
|
+
for (const stepNode of flowState.stepNodes) {
|
|
280
|
+
changed.add(stepNode);
|
|
281
|
+
const resolve = stepNode.resolve;
|
|
282
|
+
if (resolve && typeof resolve.resolver === "function") {
|
|
283
|
+
resetResolveState(stepNode, kernel.resolveManager.states);
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
kernel.notifyChanged(changed);
|
|
287
|
+
runEntryLifecycle(kernel, flowState, flowState.stepNodes[0]);
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Сбросить навигацию всех флоу, попавших в поддерево сброса.
|
|
291
|
+
* Вызывается из ResetPipeline (root reset → все флоу; reset группы → флоу внутри неё).
|
|
292
|
+
*/
|
|
293
|
+
export function resetFlowNavForSubtree(kernel, groupNode) {
|
|
294
|
+
const flows = kernel.nodes.allFlowStates;
|
|
295
|
+
if (flows.length === 0)
|
|
296
|
+
return;
|
|
297
|
+
const basePath = groupNode === kernel.rootConfig
|
|
298
|
+
? ""
|
|
299
|
+
: kernel.nodes.nodePaths.get(groupNode);
|
|
300
|
+
if (basePath === undefined)
|
|
301
|
+
return;
|
|
302
|
+
for (const flowState of flows) {
|
|
303
|
+
const within = basePath === "" ||
|
|
304
|
+
flowState.path === basePath ||
|
|
305
|
+
flowState.path.startsWith(basePath + ".");
|
|
306
|
+
if (within)
|
|
307
|
+
resetFlowNav(kernel, flowState);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// ─── Init ────────────────────────────────────────────────────────────────────
|
|
311
|
+
/**
|
|
312
|
+
* Инициализационный lifecycle: первый шаг каждого флоу «входится» при создании
|
|
313
|
+
* store (onEnter → resolve → onReady). Вызывается из конструктора Palistor.
|
|
314
|
+
*
|
|
315
|
+
* Дополнительно прогревает proxyCache flow-нод: identity-view шага снимает
|
|
316
|
+
* parent.proxy из кэша при первом step.submit(), и flow-proxy к этому моменту
|
|
317
|
+
* уже должен существовать — иначе onSubmit шага получил бы undefined
|
|
318
|
+
* третьим аргументом.
|
|
319
|
+
*/
|
|
320
|
+
export function initFlows(kernel) {
|
|
321
|
+
for (const flowState of kernel.nodes.allFlowStates) {
|
|
322
|
+
kernel.proxyBuilder.build(flowState.flowNode);
|
|
323
|
+
runEntryLifecycle(kernel, flowState, flowState.stepNodes[flowState.currentIndex]);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Сериализовать навигацию всех флоу для persist: ключ — dot-путь flow-ноды.
|
|
328
|
+
* Статусы шагов не сохраняются — выводятся из навигации при гидратации.
|
|
329
|
+
*/
|
|
330
|
+
export function serializeFlowNav(kernel) {
|
|
331
|
+
const flows = kernel.nodes.allFlowStates;
|
|
332
|
+
if (flows.length === 0)
|
|
333
|
+
return null;
|
|
334
|
+
const out = {};
|
|
335
|
+
for (const flowState of flows) {
|
|
336
|
+
out[flowState.path] = {
|
|
337
|
+
currentStepKey: flowState.stepKeys[flowState.currentIndex],
|
|
338
|
+
visitStack: [...flowState.visitStack],
|
|
339
|
+
visitedKeys: [...flowState.visitedKeys],
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
return out;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Восстановить навигацию флоу из persist-снимка. Неизвестные ключи шагов
|
|
346
|
+
* (конфиг изменился) отбрасываются; несовместимый currentStepKey — флоу
|
|
347
|
+
* остаётся в текущем состоянии. Возвращает изменённые узлы для notify и
|
|
348
|
+
* список флоу, чей активный шаг изменился (для повторного entry lifecycle).
|
|
349
|
+
*/
|
|
350
|
+
export function restoreFlowNav(kernel, snapshots) {
|
|
351
|
+
const changed = new Set();
|
|
352
|
+
const entered = [];
|
|
353
|
+
for (const flowState of kernel.nodes.allFlowStates) {
|
|
354
|
+
const snap = snapshots[flowState.path];
|
|
355
|
+
if (!snap || typeof snap !== "object" || typeof snap.currentStepKey !== "string")
|
|
356
|
+
continue;
|
|
357
|
+
const targetIndex = flowState.stepKeys.indexOf(snap.currentStepKey);
|
|
358
|
+
if (targetIndex === -1)
|
|
359
|
+
continue;
|
|
360
|
+
const isKnownKey = (k) => typeof k === "string" && flowState.stepKeys.includes(k);
|
|
361
|
+
const prevIndex = flowState.currentIndex;
|
|
362
|
+
flowState.currentIndex = targetIndex;
|
|
363
|
+
flowState.visitStack = Array.isArray(snap.visitStack)
|
|
364
|
+
? snap.visitStack.filter(isKnownKey)
|
|
365
|
+
: [];
|
|
366
|
+
flowState.visitedKeys = new Set(Array.isArray(snap.visitedKeys) ? snap.visitedKeys.filter(isKnownKey) : []);
|
|
367
|
+
flowState.visitedKeys.add(snap.currentStepKey);
|
|
368
|
+
flowState.errors = [];
|
|
369
|
+
changed.add(flowState);
|
|
370
|
+
changed.add(flowState.flowNode);
|
|
371
|
+
for (const stepNode of flowState.stepNodes)
|
|
372
|
+
changed.add(stepNode);
|
|
373
|
+
if (prevIndex !== targetIndex)
|
|
374
|
+
entered.push(flowState);
|
|
375
|
+
}
|
|
376
|
+
return { changed, entered };
|
|
377
|
+
}
|
|
378
|
+
/** Entry lifecycle текущего шага (используется persist после гидратации). */
|
|
379
|
+
export function runFlowEntryLifecycle(kernel, flowState) {
|
|
380
|
+
runEntryLifecycle(kernel, flowState, flowState.stepNodes[flowState.currentIndex]);
|
|
381
|
+
}
|
|
382
|
+
//# sourceMappingURL=flowNavigation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowNavigation.js","sourceRoot":"","sources":["../../../store/flow/flowNavigation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AnyConfigNode } from "../store/types";
|
|
2
|
+
import type { FlowError } from "./defineFlow";
|
|
3
|
+
/**
|
|
4
|
+
* Навигационное состояние одного флоу — ЕДИНЫЙ кубик «флоу».
|
|
5
|
+
*
|
|
6
|
+
* Идентичность узла для tracking — сам объект `FlowState` (ключ в хабе, как
|
|
7
|
+
* `ListState` у списков): навигация бампает его версию через notifyChanged.
|
|
8
|
+
* Статусы шагов НЕ хранятся — выводятся из (currentIndex + visitedKeys).
|
|
9
|
+
*/
|
|
10
|
+
export interface FlowState {
|
|
11
|
+
/** Сам конфиг-узел флоу — ключ в flowStates. */
|
|
12
|
+
flowNode: AnyConfigNode;
|
|
13
|
+
/** Абсолютный dot-путь flow-ноды (для persist-снимка и reset-скоупа). */
|
|
14
|
+
path: string;
|
|
15
|
+
/** Упорядоченные ключи шагов (копия FLOW_STEPS_PROP). */
|
|
16
|
+
stepKeys: string[];
|
|
17
|
+
/** Конфиг-ноды шагов в том же порядке. */
|
|
18
|
+
stepNodes: AnyConfigNode[];
|
|
19
|
+
/** Индекс активного шага. */
|
|
20
|
+
currentIndex: number;
|
|
21
|
+
/** Стек посещений — pop в back(). */
|
|
22
|
+
visitStack: string[];
|
|
23
|
+
/** Все когда-либо посещённые шаги (стек lossy — back() убирает записи). */
|
|
24
|
+
visitedKeys: Set<string>;
|
|
25
|
+
/** Ошибки последнего validate()/finalize — реактивные (flow.errors). */
|
|
26
|
+
errors: FlowError[];
|
|
27
|
+
}
|
|
28
|
+
/** Минимальный интерфейс реестра для регистрации флоу (NodeRegistry). */
|
|
29
|
+
export interface FlowRegistrySlice {
|
|
30
|
+
readonly flowStates: WeakMap<object, FlowState>;
|
|
31
|
+
readonly allFlowStates: FlowState[];
|
|
32
|
+
readonly stepToFlow: WeakMap<object, FlowState>;
|
|
33
|
+
readonly nodePaths: WeakMap<object, string>;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Обойти дерево конфига и создать FlowState для каждого узла с маркером
|
|
37
|
+
* {@link FLOW_STEPS_PROP} (проставляется defineFlow). Вызывается из
|
|
38
|
+
* конструктора NodeRegistry ПОСЛЕ buildNodeMaps — пути уже известны.
|
|
39
|
+
*/
|
|
40
|
+
export declare function collectFlowStates(root: AnyConfigNode, registry: FlowRegistrySlice): void;
|
|
41
|
+
//# sourceMappingURL=flowState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowState.d.ts","sourceRoot":"","sources":["../../../store/flow/flowState.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C;;;;;;GAMG;AACH,MAAM,WAAW,SAAS;IACxB,gDAAgD;IAChD,QAAQ,EAAE,aAAa,CAAC;IACxB,yEAAyE;IACzE,IAAI,EAAE,MAAM,CAAC;IACb,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,0CAA0C;IAC1C,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,6BAA6B;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,qCAAqC;IACrC,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,2EAA2E;IAC3E,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,wEAAwE;IACxE,MAAM,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,yEAAyE;AACzE,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,aAAa,EAAE,SAAS,EAAE,CAAC;IACpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IAChD,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC7C;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAwCxF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { CONFIG_PROPS, FLOW_STEPS_PROP } from "../constants";
|
|
2
|
+
import { isGroupNode } from "../traversal";
|
|
3
|
+
/**
|
|
4
|
+
* Обойти дерево конфига и создать FlowState для каждого узла с маркером
|
|
5
|
+
* {@link FLOW_STEPS_PROP} (проставляется defineFlow). Вызывается из
|
|
6
|
+
* конструктора NodeRegistry ПОСЛЕ buildNodeMaps — пути уже известны.
|
|
7
|
+
*/
|
|
8
|
+
export function collectFlowStates(root, registry) {
|
|
9
|
+
walk(root);
|
|
10
|
+
function walk(node) {
|
|
11
|
+
const marker = node[FLOW_STEPS_PROP];
|
|
12
|
+
if (Array.isArray(marker)) {
|
|
13
|
+
const stepKeys = marker;
|
|
14
|
+
const stepNodes = [];
|
|
15
|
+
for (const key of stepKeys) {
|
|
16
|
+
const child = node[key];
|
|
17
|
+
if (!child || typeof child !== "object" || Array.isArray(child) || "value" in child) {
|
|
18
|
+
throw new Error(`[palistor] defineFlow: step "${key}" is not a group node in the flow config.`);
|
|
19
|
+
}
|
|
20
|
+
// Пустой шаг ({} — read-only summary) эвристика hasChildren в
|
|
21
|
+
// registerNodes пометила бы как "leaf"; шаг по определению — группа.
|
|
22
|
+
child.__kind = "group";
|
|
23
|
+
stepNodes.push(child);
|
|
24
|
+
}
|
|
25
|
+
const flowState = {
|
|
26
|
+
flowNode: node,
|
|
27
|
+
path: registry.nodePaths.get(node) ?? "",
|
|
28
|
+
stepKeys: [...stepKeys],
|
|
29
|
+
stepNodes,
|
|
30
|
+
currentIndex: 0,
|
|
31
|
+
visitStack: [],
|
|
32
|
+
visitedKeys: new Set([stepKeys[0]]),
|
|
33
|
+
errors: [],
|
|
34
|
+
};
|
|
35
|
+
registry.flowStates.set(node, flowState);
|
|
36
|
+
registry.allFlowStates.push(flowState);
|
|
37
|
+
for (const stepNode of stepNodes)
|
|
38
|
+
registry.stepToFlow.set(stepNode, flowState);
|
|
39
|
+
}
|
|
40
|
+
for (const key of Object.keys(node)) {
|
|
41
|
+
if (CONFIG_PROPS.has(key))
|
|
42
|
+
continue;
|
|
43
|
+
const child = node[key];
|
|
44
|
+
if (!child || typeof child !== "object" || Array.isArray(child))
|
|
45
|
+
continue;
|
|
46
|
+
if (isGroupNode(child))
|
|
47
|
+
walk(child);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=flowState.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowState.js","sourceRoot":"","sources":["../../../store/flow/flowState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsC3C;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAmB,EAAE,QAA2B;IAChF,IAAI,CAAC,IAAI,CAAC,CAAC;IAEX,SAAS,IAAI,CAAC,IAAmB;QAC/B,MAAM,MAAM,GAAI,IAAgC,CAAC,eAAe,CAAC,CAAC;QAClE,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAkB,CAAC;YACpC,MAAM,SAAS,GAAoB,EAAE,CAAC;YACtC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;gBAC3B,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;gBACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;oBACpF,MAAM,IAAI,KAAK,CAAC,gCAAgC,GAAG,2CAA2C,CAAC,CAAC;gBAClG,CAAC;gBACD,8DAA8D;gBAC9D,qEAAqE;gBACpE,KAAiC,CAAC,MAAM,GAAG,OAAO,CAAC;gBACpD,SAAS,CAAC,IAAI,CAAC,KAAsB,CAAC,CAAC;YACzC,CAAC;YACD,MAAM,SAAS,GAAc;gBAC3B,QAAQ,EAAE,IAAI;gBACd,IAAI,EAAE,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,IAAc,CAAC,IAAI,EAAE;gBAClD,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;gBACvB,SAAS;gBACT,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,EAAE;gBACd,WAAW,EAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACnC,MAAM,EAAE,EAAE;aACX,CAAC;YACF,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,IAAc,EAAE,SAAS,CAAC,CAAC;YACnD,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACvC,KAAK,MAAM,QAAQ,IAAI,SAAS;gBAAE,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,QAAkB,EAAE,SAAS,CAAC,CAAC;QAC3F,CAAC;QAED,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,IAAI,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC;gBAAE,SAAS;YACpC,MAAM,KAAK,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;YACrD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBAAE,SAAS;YAC1E,IAAI,WAAW,CAAC,KAAe,CAAC;gBAAE,IAAI,CAAC,KAAsB,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { defineFlow, defineStep } from "./defineFlow";
|
|
2
|
+
export type { AnyFlowStep, DefineFlowOptions, FlowError, FlowNode, FlowStep, FlowValues, InferFlowSteps, StepStatus, } from "./defineFlow";
|
|
3
|
+
export type { FlowState } from "./flowState";
|
|
4
|
+
export { collectFlowStates } from "./flowState";
|
|
5
|
+
export { collectFlowErrors, collectStepErrors, filterHiddenFlowStepErrors, flowBack, flowGoTo, flowIsInvalid, flowLoading, flowNextStep, flowSubmit, flowValidate, getStepStatus, initFlows, isStepVisible, resetFlowNav, resetFlowNavForSubtree, restoreFlowNav, runFlowEntryLifecycle, serializeFlowNav, stepIsInvalid, } from "./flowNavigation";
|
|
6
|
+
export type { FlowNavSnapshot } from "./flowNavigation";
|
|
7
|
+
export { buildFlowStepsProxy } from "./buildFlowStepsProxy";
|
|
8
|
+
export { getFlowApi } from "./flowApi";
|
|
9
|
+
export type { FlowApi } from "./flowApi";
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../store/flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EACV,WAAW,EACX,iBAAiB,EACjB,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,cAAc,EACd,UAAU,GACX,MAAM,cAAc,CAAC;AAEtB,YAAY,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAC1B,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,YAAY,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { defineFlow, defineStep } from "./defineFlow";
|
|
2
|
+
export { collectFlowStates } from "./flowState";
|
|
3
|
+
export { collectFlowErrors, collectStepErrors, filterHiddenFlowStepErrors, flowBack, flowGoTo, flowIsInvalid, flowLoading, flowNextStep, flowSubmit, flowValidate, getStepStatus, initFlows, isStepVisible, resetFlowNav, resetFlowNavForSubtree, restoreFlowNav, runFlowEntryLifecycle, serializeFlowNav, stepIsInvalid, } from "./flowNavigation";
|
|
4
|
+
export { buildFlowStepsProxy } from "./buildFlowStepsProxy";
|
|
5
|
+
export { getFlowApi } from "./flowApi";
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../store/flow/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAatD,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,0BAA0B,EAC1B,QAAQ,EACR,QAAQ,EACR,aAAa,EACb,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACZ,aAAa,EACb,SAAS,EACT,aAAa,EACb,YAAY,EACZ,sBAAsB,EACtB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,aAAa,GACd,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistManager.d.ts","sourceRoot":"","sources":["../../../store/persist/persistManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"persistManager.d.ts","sourceRoot":"","sources":["../../../store/persist/persistManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,SAAS,CAAC;AAG7D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAiDlD;;;;GAIG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAI5C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAA0D;IAC3E,OAAO,CAAC,WAAW,CAAwD;IAC3E,OAAO,CAAC,UAAU,CAAO;IACzB,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,UAAU,CAAuB;IAEzC,kCAAkC;IAClC,OAAO,CAAC,WAAW,CAA6B;IAEhD,2BAA2B;IAC3B,OAAO,CAAC,aAAa,CAA8C;IAEnE,4DAA4D;IAC5D,OAAO,CAAC,WAAW,CAAS;gBAEhB,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC;IAMtC,OAAO,CAAC,cAAc;IAOtB;;OAEG;YACW,aAAa;IAmB3B;;OAEG;IACH,OAAO,CAAC,YAAY,CAclB;IAEF;;OAEG;YACW,kBAAkB;IAsEhC;;;;;OAKG;IACH,MAAM,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAqB9C,4EAA4E;IAC5E,OAAO,IAAI,IAAI;IAaf,yEAAyE;IACnE,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,8CAA8C;IACxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,mDAAmD;IAC7C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAU5B,+CAA+C;IAC/C,SAAS,IAAI,OAAO;CAGrB"}
|
|
@@ -11,6 +11,14 @@
|
|
|
11
11
|
*/
|
|
12
12
|
import { applyPatch } from "../applyPatch/applyPatch";
|
|
13
13
|
import { recomputeAndNotify } from "../compute/recompute";
|
|
14
|
+
import { restoreFlowNav, runFlowEntryLifecycle, serializeFlowNav, } from "../flow/flowNavigation";
|
|
15
|
+
/**
|
|
16
|
+
* Зарезервированный ключ persist-снимка для навигации флоу (defineFlow):
|
|
17
|
+
* `{ [flowPath]: { currentStepKey, visitStack, visitedKeys } }`.
|
|
18
|
+
* Значения полей шагов хранятся как обычные значения; статусы шагов
|
|
19
|
+
* не сохраняются — выводятся из навигации при гидратации.
|
|
20
|
+
*/
|
|
21
|
+
const FLOWS_PERSIST_KEY = "__flows";
|
|
14
22
|
// ─── Фильтрация полей ────────────────────────────────────────────────────────
|
|
15
23
|
/**
|
|
16
24
|
* Отфильтровать значения по pick/omit.
|
|
@@ -90,8 +98,12 @@ export class PersistManager {
|
|
|
90
98
|
return;
|
|
91
99
|
const allValues = this.kernel.getValues();
|
|
92
100
|
const filtered = filterValues(allValues, this.pickFields, this.omitFields);
|
|
101
|
+
// Flow: навигация сохраняется отдельным зарезервированным ключом,
|
|
102
|
+
// не подпадающим под pick/omit (он не является полем формы).
|
|
103
|
+
const flowNav = serializeFlowNav(this.kernel);
|
|
104
|
+
const payload = flowNav ? { ...filtered, [FLOWS_PERSIST_KEY]: flowNav } : filtered;
|
|
93
105
|
try {
|
|
94
|
-
const serialized = this.serialize(
|
|
106
|
+
const serialized = this.serialize(payload);
|
|
95
107
|
await Promise.resolve(this.currentDriver.setItem(this.currentKey, serialized));
|
|
96
108
|
}
|
|
97
109
|
catch {
|
|
@@ -116,6 +128,11 @@ export class PersistManager {
|
|
|
116
128
|
this.isHydrating = false;
|
|
117
129
|
return;
|
|
118
130
|
}
|
|
131
|
+
// Flow: извлекаем снимок навигации до применения патча значений.
|
|
132
|
+
const flowSnapshots = values[FLOWS_PERSIST_KEY];
|
|
133
|
+
if (flowSnapshots !== undefined) {
|
|
134
|
+
delete values[FLOWS_PERSIST_KEY];
|
|
135
|
+
}
|
|
119
136
|
// Применяем как патч — applyPatch рекурсивно обходит дерево конфига
|
|
120
137
|
// (скалярные/групповые поля; list-узлы он пропускает).
|
|
121
138
|
const patchedNodes = applyPatch(this.kernel.rootConfig, this.kernel.nodes.nodeState, values, new Set());
|
|
@@ -124,8 +141,22 @@ export class PersistManager {
|
|
|
124
141
|
const listChanged = this.kernel.restoreLists(values);
|
|
125
142
|
for (const n of listChanged)
|
|
126
143
|
patchedNodes.add(n);
|
|
144
|
+
// Flow: восстанавливаем навигацию (активный шаг, стек, visited).
|
|
145
|
+
// Статусы шагов пересчитываются из навигационного состояния.
|
|
146
|
+
let enteredFlows = [];
|
|
147
|
+
if (flowSnapshots && typeof flowSnapshots === "object") {
|
|
148
|
+
const { changed: flowChanged, entered } = restoreFlowNav(this.kernel, flowSnapshots);
|
|
149
|
+
for (const n of flowChanged)
|
|
150
|
+
patchedNodes.add(n);
|
|
151
|
+
enteredFlows = entered;
|
|
152
|
+
}
|
|
127
153
|
// Пересчитываем, объединяем и уведомляем подписчиков
|
|
128
154
|
recomputeAndNotify(patchedNodes, () => this.kernel.recompute(), (c) => this.kernel.notifyChanged(c));
|
|
155
|
+
// Flow: если активный шаг изменился при гидратации — восстановленный шаг
|
|
156
|
+
// «входится» заново: onEnter → resolve → onReady.
|
|
157
|
+
for (const flowState of enteredFlows) {
|
|
158
|
+
runFlowEntryLifecycle(this.kernel, flowState);
|
|
159
|
+
}
|
|
129
160
|
}
|
|
130
161
|
catch {
|
|
131
162
|
// Ошибки десериализации — молчим
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistManager.js","sourceRoot":"","sources":["../../../store/persist/persistManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"persistManager.js","sourceRoot":"","sources":["../../../store/persist/persistManager.ts"],"names":[],"mappings":"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"}
|