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,90 @@
|
|
|
1
|
+
import type { ExtractValues, ProxyStore } from "../store/types";
|
|
2
|
+
/**
|
|
3
|
+
* Статус шага флоу — вычисляемое свойство step-proxy, производное от
|
|
4
|
+
* навигационного состояния (currentStepKey + visited set). Не является
|
|
5
|
+
* leaf-нодой: не попадает в values, submit-payload и persisted-значения.
|
|
6
|
+
*
|
|
7
|
+
* - `null` — шаг ещё не посещался
|
|
8
|
+
* - `"active"` — текущий шаг
|
|
9
|
+
* - `"completed"` — был активен, затем ушли (вперёд или назад)
|
|
10
|
+
*/
|
|
11
|
+
export type StepStatus = "active" | "completed" | null;
|
|
12
|
+
/** Ошибка валидации флоу — та же форма, что в SubmitResult. */
|
|
13
|
+
export interface FlowError {
|
|
14
|
+
path: string;
|
|
15
|
+
message: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Результат defineStep: группа-конфиг шага + его ключ во флоу.
|
|
19
|
+
* defineFlow разворачивает шаги в обычные дочерние группы flow-ноды.
|
|
20
|
+
*/
|
|
21
|
+
export interface FlowStep<K extends string = string, C extends Record<string, any> = Record<string, any>> {
|
|
22
|
+
readonly key: K;
|
|
23
|
+
readonly config: C;
|
|
24
|
+
}
|
|
25
|
+
export type AnyFlowStep = FlowStep<string, Record<string, any>>;
|
|
26
|
+
/** Значения флоу — все шаги по ключам (аккумулированное состояние). */
|
|
27
|
+
export type FlowValues<S extends readonly AnyFlowStep[]> = {
|
|
28
|
+
[Step in S[number] as Step["key"]]: ExtractValues<Step["config"]>;
|
|
29
|
+
};
|
|
30
|
+
declare const __flowBrand: unique symbol;
|
|
31
|
+
/**
|
|
32
|
+
* Узел флоу в дереве конфига: обычная группа (шаги — дочерние группы по ключам),
|
|
33
|
+
* помеченная брендом с кортежем шагов для вывода типов proxy.
|
|
34
|
+
*/
|
|
35
|
+
export type FlowNode<S extends readonly AnyFlowStep[]> = {
|
|
36
|
+
readonly [__flowBrand]: S;
|
|
37
|
+
} & {
|
|
38
|
+
[Step in S[number] as Step["key"]]: Step["config"];
|
|
39
|
+
};
|
|
40
|
+
/** Извлечь кортеж шагов из FlowNode (never — если узел не флоу). */
|
|
41
|
+
export type InferFlowSteps<T> = T extends {
|
|
42
|
+
readonly [__flowBrand]: infer S extends readonly AnyFlowStep[];
|
|
43
|
+
} ? S : never;
|
|
44
|
+
/**
|
|
45
|
+
* Обернуть конфиг группы в шаг флоу.
|
|
46
|
+
*
|
|
47
|
+
* Конфиг шага — обычная group-нода Palistor (поля, isVisible, validate,
|
|
48
|
+
* resolve, onSubmit, …) плюс flow-lifecycle колбэки `onEnter` / `onReady`.
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* defineStep("welcome", {
|
|
52
|
+
* name: { value: "", isRequired: true },
|
|
53
|
+
* onSubmit: async (values, store, { nextStep }) => { nextStep(); },
|
|
54
|
+
* })
|
|
55
|
+
*/
|
|
56
|
+
export declare function defineStep<const K extends string, const C extends Record<string, any>>(key: K, config: C & {
|
|
57
|
+
status?: never;
|
|
58
|
+
}): FlowStep<K, C>;
|
|
59
|
+
export interface DefineFlowOptions<S extends readonly AnyFlowStep[]> {
|
|
60
|
+
/** Упорядоченный массив шагов (defineStep). Порядок определяет nextStep(). */
|
|
61
|
+
steps: S;
|
|
62
|
+
/** Flow-level submit: вызывается стандартным submit-пайплайном над всеми шагами. */
|
|
63
|
+
onSubmit?: (values: FlowValues<S>, store: ProxyStore<any>, parent?: any) => Promise<unknown> | unknown;
|
|
64
|
+
/** Group-level трансформация значений перед submit. */
|
|
65
|
+
beforeSubmit?: (values: FlowValues<S>) => FlowValues<S> | Promise<FlowValues<S>>;
|
|
66
|
+
/** Пост-обработка после успешного onSubmit. */
|
|
67
|
+
afterSubmit?: (result: unknown, actions: {
|
|
68
|
+
reset: () => void;
|
|
69
|
+
}) => void | Promise<void>;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Собрать flow-ноду из упорядоченного массива шагов.
|
|
73
|
+
*
|
|
74
|
+
* Возвращаемый узел — обычная группа в дереве конфига (шаги — дочерние группы
|
|
75
|
+
* по своим ключам), помеченная маркером {@link FLOW_STEPS_PROP} с порядком
|
|
76
|
+
* шагов. Участвует в values / persist / dirty как любая группа; NodeRegistry
|
|
77
|
+
* по маркеру создаёт FlowState (навигация, статусы, история).
|
|
78
|
+
*
|
|
79
|
+
* @example
|
|
80
|
+
* const onboarding = defineFlow({
|
|
81
|
+
* steps: [
|
|
82
|
+
* defineStep("welcome", { name: { value: "", isRequired: true } }),
|
|
83
|
+
* defineStep("summary", {}),
|
|
84
|
+
* ],
|
|
85
|
+
* onSubmit: async (allValues, store) => api.completeOnboarding(allValues),
|
|
86
|
+
* });
|
|
87
|
+
*/
|
|
88
|
+
export declare function defineFlow<const S extends readonly AnyFlowStep[]>(options: DefineFlowOptions<S>): FlowNode<S>;
|
|
89
|
+
export {};
|
|
90
|
+
//# sourceMappingURL=defineFlow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineFlow.d.ts","sourceRoot":"","sources":["../../../store/flow/defineFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { CONFIG_PROPS, FLOW_SPREAD_KEYS, FLOW_STEPS_PROP, GROUP_SPREAD_KEYS, } from "../constants";
|
|
2
|
+
// ─── defineStep ───────────────────────────────────────────────────────────────
|
|
3
|
+
/**
|
|
4
|
+
* Имя `status` зарезервировано на step-proxy под вычисляемый статус шага —
|
|
5
|
+
* поле с таким именем в конфиге шага запрещено (по аналогии с dirty/loading).
|
|
6
|
+
*/
|
|
7
|
+
const RESERVED_STEP_CONFIG_KEYS = new Set(["status"]);
|
|
8
|
+
/**
|
|
9
|
+
* Обернуть конфиг группы в шаг флоу.
|
|
10
|
+
*
|
|
11
|
+
* Конфиг шага — обычная group-нода Palistor (поля, isVisible, validate,
|
|
12
|
+
* resolve, onSubmit, …) плюс flow-lifecycle колбэки `onEnter` / `onReady`.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* defineStep("welcome", {
|
|
16
|
+
* name: { value: "", isRequired: true },
|
|
17
|
+
* onSubmit: async (values, store, { nextStep }) => { nextStep(); },
|
|
18
|
+
* })
|
|
19
|
+
*/
|
|
20
|
+
export function defineStep(key, config) {
|
|
21
|
+
if (typeof key !== "string" || key.length === 0) {
|
|
22
|
+
throw new Error("[palistor] defineStep: key must be a non-empty string.");
|
|
23
|
+
}
|
|
24
|
+
if (!config || typeof config !== "object" || Array.isArray(config)) {
|
|
25
|
+
throw new Error(`[palistor] defineStep("${key}"): config must be a plain object (group node).`);
|
|
26
|
+
}
|
|
27
|
+
if ("value" in config) {
|
|
28
|
+
throw new Error(`[palistor] defineStep("${key}"): step config must be a group node — a "value" key makes it a leaf.`);
|
|
29
|
+
}
|
|
30
|
+
for (const reserved of RESERVED_STEP_CONFIG_KEYS) {
|
|
31
|
+
if (reserved in config) {
|
|
32
|
+
throw new Error(`[palistor] defineStep("${key}"): "${reserved}" is reserved — the flow exposes it as a computed step property.`);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return { key, config: config };
|
|
36
|
+
}
|
|
37
|
+
// ─── defineFlow ───────────────────────────────────────────────────────────────
|
|
38
|
+
/**
|
|
39
|
+
* Ключи шагов, конфликтующие со свойствами flow-proxy / steps-proxy /
|
|
40
|
+
* служебными ключами конфига — запрещены как имена шагов.
|
|
41
|
+
*/
|
|
42
|
+
const RESERVED_STEP_KEYS = new Set([
|
|
43
|
+
...CONFIG_PROPS,
|
|
44
|
+
...GROUP_SPREAD_KEYS,
|
|
45
|
+
...FLOW_SPREAD_KEYS,
|
|
46
|
+
"setValues",
|
|
47
|
+
"current",
|
|
48
|
+
"length",
|
|
49
|
+
]);
|
|
50
|
+
/**
|
|
51
|
+
* Собрать flow-ноду из упорядоченного массива шагов.
|
|
52
|
+
*
|
|
53
|
+
* Возвращаемый узел — обычная группа в дереве конфига (шаги — дочерние группы
|
|
54
|
+
* по своим ключам), помеченная маркером {@link FLOW_STEPS_PROP} с порядком
|
|
55
|
+
* шагов. Участвует в values / persist / dirty как любая группа; NodeRegistry
|
|
56
|
+
* по маркеру создаёт FlowState (навигация, статусы, история).
|
|
57
|
+
*
|
|
58
|
+
* @example
|
|
59
|
+
* const onboarding = defineFlow({
|
|
60
|
+
* steps: [
|
|
61
|
+
* defineStep("welcome", { name: { value: "", isRequired: true } }),
|
|
62
|
+
* defineStep("summary", {}),
|
|
63
|
+
* ],
|
|
64
|
+
* onSubmit: async (allValues, store) => api.completeOnboarding(allValues),
|
|
65
|
+
* });
|
|
66
|
+
*/
|
|
67
|
+
export function defineFlow(options) {
|
|
68
|
+
const { steps, onSubmit, beforeSubmit, afterSubmit } = options;
|
|
69
|
+
if (!Array.isArray(steps) || steps.length === 0) {
|
|
70
|
+
throw new Error("[palistor] defineFlow: `steps` must be a non-empty array of defineStep(...) results.");
|
|
71
|
+
}
|
|
72
|
+
const node = {};
|
|
73
|
+
const stepKeys = [];
|
|
74
|
+
for (const step of steps) {
|
|
75
|
+
if (!step || typeof step !== "object" || typeof step.key !== "string" || !step.config) {
|
|
76
|
+
throw new Error("[palistor] defineFlow: each entry of `steps` must be created via defineStep(key, config).");
|
|
77
|
+
}
|
|
78
|
+
if (RESERVED_STEP_KEYS.has(step.key)) {
|
|
79
|
+
throw new Error(`[palistor] defineFlow: step key "${step.key}" is reserved by the flow/group proxy API.`);
|
|
80
|
+
}
|
|
81
|
+
if (stepKeys.includes(step.key)) {
|
|
82
|
+
throw new Error(`[palistor] defineFlow: duplicate step key "${step.key}".`);
|
|
83
|
+
}
|
|
84
|
+
node[step.key] = step.config;
|
|
85
|
+
stepKeys.push(step.key);
|
|
86
|
+
}
|
|
87
|
+
if (onSubmit)
|
|
88
|
+
node.onSubmit = onSubmit;
|
|
89
|
+
if (beforeSubmit)
|
|
90
|
+
node.beforeSubmit = beforeSubmit;
|
|
91
|
+
if (afterSubmit)
|
|
92
|
+
node.afterSubmit = afterSubmit;
|
|
93
|
+
// Маркер флоу: входит в CONFIG_PROPS → все обходы дерева его пропускают.
|
|
94
|
+
node[FLOW_STEPS_PROP] = stepKeys;
|
|
95
|
+
return node;
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=defineFlow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineFlow.js","sourceRoot":"","sources":["../../../store/flow/defineFlow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Palistor } from "../store/palistor";
|
|
2
|
+
import type { SubmitResult } from "../submitPipeline/types";
|
|
3
|
+
import type { FlowError } from "./defineFlow";
|
|
4
|
+
import type { FlowState } from "./flowState";
|
|
5
|
+
/**
|
|
6
|
+
* Навигационные методы flow-proxy. Все — bound-замыкания над (kernel, flowState),
|
|
7
|
+
* поэтому деструктуризация в onSubmit работает: `(values, store, { nextStep }) => …`.
|
|
8
|
+
*/
|
|
9
|
+
export interface FlowApi {
|
|
10
|
+
nextStep: () => void;
|
|
11
|
+
back: () => void;
|
|
12
|
+
goTo: (keyOrIndex: string | number) => void;
|
|
13
|
+
validate: () => FlowError[];
|
|
14
|
+
submit: () => Promise<SubmitResult>;
|
|
15
|
+
}
|
|
16
|
+
export declare function getFlowApi(kernel: Palistor<any, any>, flowState: FlowState): FlowApi;
|
|
17
|
+
//# sourceMappingURL=flowApi.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowApi.d.ts","sourceRoot":"","sources":["../../../store/flow/flowApi.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAS7C;;;GAGG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,EAAE,MAAM,IAAI,CAAC;IACrB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC5C,QAAQ,EAAE,MAAM,SAAS,EAAE,CAAC;IAC5B,MAAM,EAAE,MAAM,OAAO,CAAC,YAAY,CAAC,CAAC;CACrC;AAKD,wBAAgB,UAAU,CAAC,MAAM,EAAE,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAcpF"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { flowBack, flowGoTo, flowNextStep, flowSubmit, flowValidate, } from "./flowNavigation";
|
|
2
|
+
/** Стабильные ссылки на методы — один FlowApi на FlowState (для React). */
|
|
3
|
+
const flowApiCache = new WeakMap();
|
|
4
|
+
export function getFlowApi(kernel, flowState) {
|
|
5
|
+
const cached = flowApiCache.get(flowState);
|
|
6
|
+
if (cached)
|
|
7
|
+
return cached;
|
|
8
|
+
const api = {
|
|
9
|
+
nextStep: () => flowNextStep(kernel, flowState),
|
|
10
|
+
back: () => flowBack(kernel, flowState),
|
|
11
|
+
goTo: (keyOrIndex) => flowGoTo(kernel, flowState, keyOrIndex),
|
|
12
|
+
validate: () => flowValidate(kernel, flowState),
|
|
13
|
+
submit: () => flowSubmit(kernel, flowState),
|
|
14
|
+
};
|
|
15
|
+
flowApiCache.set(flowState, api);
|
|
16
|
+
return api;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=flowApi.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowApi.js","sourceRoot":"","sources":["../../../store/flow/flowApi.ts"],"names":[],"mappings":"AAIA,OAAO,EACL,QAAQ,EACR,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,YAAY,GACb,MAAM,kBAAkB,CAAC;AAc1B,2EAA2E;AAC3E,MAAM,YAAY,GAAG,IAAI,OAAO,EAAmB,CAAC;AAEpD,MAAM,UAAU,UAAU,CAAC,MAA0B,EAAE,SAAoB;IACzE,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,SAA8B,CAAC,CAAC;IAChE,IAAI,MAAM;QAAE,OAAO,MAAM,CAAC;IAE1B,MAAM,GAAG,GAAY;QACnB,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAC/C,IAAI,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;QACvC,IAAI,EAAE,CAAC,UAA2B,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC;QAC9E,QAAQ,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,EAAE,SAAS,CAAC;QAC/C,MAAM,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC;KAC5C,CAAC;IAEF,YAAY,CAAC,GAAG,CAAC,SAA8B,EAAE,GAAG,CAAC,CAAC;IACtD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { AnyConfigNode } from "../store/types";
|
|
2
|
+
import type { Palistor } from "../store/palistor";
|
|
3
|
+
import type { SubmitResult } from "../submitPipeline/types";
|
|
4
|
+
import type { FlowError, StepStatus } from "./defineFlow";
|
|
5
|
+
import type { FlowState } from "./flowState";
|
|
6
|
+
type Kernel = Palistor<any, any>;
|
|
7
|
+
/** Статус шага — производная от навигационного состояния (не хранится). */
|
|
8
|
+
export declare function getStepStatus(flowState: FlowState, stepNode: object): StepStatus;
|
|
9
|
+
/** Видимость шага — из вычисленного FieldState группы (isVisible реактивен). */
|
|
10
|
+
export declare function isStepVisible(kernel: Kernel, stepNode: object): boolean;
|
|
11
|
+
/** Композитный loading флоу: true, если резолвится хотя бы один шаг. */
|
|
12
|
+
export declare function flowLoading(kernel: Kernel, flowState: FlowState): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Собрать ошибки листьев поддерева шага. Валидация считается «вживую» через
|
|
15
|
+
* computeFieldState(revalidate=true) — не зависит от флага revalidate группы
|
|
16
|
+
* (тот выставляется только submit-пайплайном). Скрытые листья пропускаются.
|
|
17
|
+
* Списки внутри шага пропускаются (паритет с collectLeafStates).
|
|
18
|
+
*
|
|
19
|
+
* `basePath` — префикс путей ошибок. Флоу передаёт КЛЮЧ шага: пути получаются
|
|
20
|
+
* относительными flow-ноды ("welcome.name") — та же база, что у ошибок
|
|
21
|
+
* submit-пайплайна при flow.submit() (collectLeafStates строит пути от
|
|
22
|
+
* submitted-ноды).
|
|
23
|
+
*/
|
|
24
|
+
export declare function collectStepErrors(kernel: Kernel, stepNode: AnyConfigNode, basePath?: string): FlowError[];
|
|
25
|
+
/** Live-агрегат валидности шага (flow.steps.x.isInvalid). */
|
|
26
|
+
export declare function stepIsInvalid(kernel: Kernel, stepNode: AnyConfigNode): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Ошибки флоу по посещённым видимым шагам (скоуп flow.validate()).
|
|
29
|
+
* Скрытые шаги исключаются всегда — невзятая ветка не должна блокировать.
|
|
30
|
+
* Пути ошибок относительны flow-ноды ("stepKey.field") — как у SubmitResult
|
|
31
|
+
* при flow.submit().
|
|
32
|
+
*/
|
|
33
|
+
export declare function collectFlowErrors(kernel: Kernel, flowState: FlowState): FlowError[];
|
|
34
|
+
/** Агрегат flow.isInvalid: есть ли ошибки в посещённых видимых шагах. */
|
|
35
|
+
export declare function flowIsInvalid(kernel: Kernel, flowState: FlowState): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* flow.validate(): собрать ошибки посещённых шагов, записать в реактивный
|
|
38
|
+
* flow.errors и вернуть. Пустой массив = всё валидно.
|
|
39
|
+
*/
|
|
40
|
+
export declare function flowValidate(kernel: Kernel, flowState: FlowState): FlowError[];
|
|
41
|
+
/**
|
|
42
|
+
* Отфильтровать из ошибок submit-пайплайна листья, лежащие под СКРЫТЫМИ
|
|
43
|
+
* шагами любого флоу (Resolved Decision 14): базовый пайплайн валидирует все
|
|
44
|
+
* листья независимо от видимости, и без фильтра невзятая ветка с isRequired
|
|
45
|
+
* навсегда блокировала бы финализацию.
|
|
46
|
+
*
|
|
47
|
+
* `submittedNode` — узел, для которого выполнялся submit: пути ошибок пайплайна
|
|
48
|
+
* ОТНОСИТЕЛЬНЫ ему (collectLeafStates строит пути от submitted-ноды), поэтому
|
|
49
|
+
* абсолютные пути скрытых шагов приводятся к той же базе.
|
|
50
|
+
*/
|
|
51
|
+
export declare function filterHiddenFlowStepErrors(kernel: Kernel, errors: Array<{
|
|
52
|
+
path: string;
|
|
53
|
+
message: string;
|
|
54
|
+
}>, submittedNode: AnyConfigNode): Array<{
|
|
55
|
+
path: string;
|
|
56
|
+
message: string;
|
|
57
|
+
}>;
|
|
58
|
+
/**
|
|
59
|
+
* flow.submit(): стандартный group-submit пайплайн над flow-нодой
|
|
60
|
+
* (submitting → beforeSubmit → validate → onSubmit → afterSubmit; листья
|
|
61
|
+
* скрытых шагов отфильтровываются пайплайном). Ошибки валидации ложатся в
|
|
62
|
+
* реактивный flow.errors; при успехе errors очищаются.
|
|
63
|
+
*/
|
|
64
|
+
export declare function flowSubmit(kernel: Kernel, flowState: FlowState): Promise<SubmitResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Lifecycle входа в шаг: onEnter → resolve (eager) → onReady.
|
|
67
|
+
*
|
|
68
|
+
* - `onEnter` / `onReady` получают FLOW-scoped values (все шаги по ключам) —
|
|
69
|
+
* живую ссылку groupSlot флоу; fire-and-forget.
|
|
70
|
+
* - resolve шага — стандартный group resolve; флоу триггерит его НА ВХОДЕ
|
|
71
|
+
* (эквивалент первого доступа). Уже resolved/error (кэш) — не перезапускается,
|
|
72
|
+
* и onReady НЕ вызывается повторно (Resolved Decision 10).
|
|
73
|
+
* - Без resolve — onReady сразу после onEnter.
|
|
74
|
+
*/
|
|
75
|
+
export declare function runEntryLifecycle(kernel: Kernel, flowState: FlowState, stepNode: AnyConfigNode): void;
|
|
76
|
+
/**
|
|
77
|
+
* nextStep(): следующий ВИДИМЫЙ шаг по порядку массива; скрытые пропускаются.
|
|
78
|
+
* Если видимых впереди нет — финализация через flow.submit() (при ошибках
|
|
79
|
+
* валидации onSubmit не вызывается, ошибки в flow.errors, шаг не меняется).
|
|
80
|
+
*/
|
|
81
|
+
export declare function flowNextStep(kernel: Kernel, flowState: FlowState): void;
|
|
82
|
+
/** back(): вернуться по стеку посещений. No-op при пустом стеке (canGoBack). */
|
|
83
|
+
export declare function flowBack(kernel: Kernel, flowState: FlowState): void;
|
|
84
|
+
/**
|
|
85
|
+
* goTo(keyOrIndex): произвольный переход по ключу или индексу.
|
|
86
|
+
* Несуществующий ключ/индекс — throw (ловит опечатки на этапе разработки).
|
|
87
|
+
* Переход в текущий шаг — no-op.
|
|
88
|
+
*/
|
|
89
|
+
export declare function flowGoTo(kernel: Kernel, flowState: FlowState, keyOrIndex: string | number): void;
|
|
90
|
+
/**
|
|
91
|
+
* Сброс навигации флоу: первый шаг активен, стек и visited очищены,
|
|
92
|
+
* resolve-состояния шагов сброшены в idle. Lifecycle входа первого шага
|
|
93
|
+
* (onEnter → resolve → onReady) выполняется заново — зеркально инициализации.
|
|
94
|
+
*/
|
|
95
|
+
export declare function resetFlowNav(kernel: Kernel, flowState: FlowState): void;
|
|
96
|
+
/**
|
|
97
|
+
* Сбросить навигацию всех флоу, попавших в поддерево сброса.
|
|
98
|
+
* Вызывается из ResetPipeline (root reset → все флоу; reset группы → флоу внутри неё).
|
|
99
|
+
*/
|
|
100
|
+
export declare function resetFlowNavForSubtree(kernel: Kernel, groupNode: AnyConfigNode): void;
|
|
101
|
+
/**
|
|
102
|
+
* Инициализационный lifecycle: первый шаг каждого флоу «входится» при создании
|
|
103
|
+
* store (onEnter → resolve → onReady). Вызывается из конструктора Palistor.
|
|
104
|
+
*
|
|
105
|
+
* Дополнительно прогревает proxyCache flow-нод: identity-view шага снимает
|
|
106
|
+
* parent.proxy из кэша при первом step.submit(), и flow-proxy к этому моменту
|
|
107
|
+
* уже должен существовать — иначе onSubmit шага получил бы undefined
|
|
108
|
+
* третьим аргументом.
|
|
109
|
+
*/
|
|
110
|
+
export declare function initFlows(kernel: Kernel): void;
|
|
111
|
+
/** Снимок навигации флоу в persist-снапшоте (значения полей хранятся отдельно). */
|
|
112
|
+
export interface FlowNavSnapshot {
|
|
113
|
+
currentStepKey: string;
|
|
114
|
+
visitStack: string[];
|
|
115
|
+
visitedKeys: string[];
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Сериализовать навигацию всех флоу для persist: ключ — dot-путь flow-ноды.
|
|
119
|
+
* Статусы шагов не сохраняются — выводятся из навигации при гидратации.
|
|
120
|
+
*/
|
|
121
|
+
export declare function serializeFlowNav(kernel: Kernel): Record<string, FlowNavSnapshot> | null;
|
|
122
|
+
/**
|
|
123
|
+
* Восстановить навигацию флоу из persist-снимка. Неизвестные ключи шагов
|
|
124
|
+
* (конфиг изменился) отбрасываются; несовместимый currentStepKey — флоу
|
|
125
|
+
* остаётся в текущем состоянии. Возвращает изменённые узлы для notify и
|
|
126
|
+
* список флоу, чей активный шаг изменился (для повторного entry lifecycle).
|
|
127
|
+
*/
|
|
128
|
+
export declare function restoreFlowNav(kernel: Kernel, snapshots: Record<string, FlowNavSnapshot>): {
|
|
129
|
+
changed: Set<object>;
|
|
130
|
+
entered: FlowState[];
|
|
131
|
+
};
|
|
132
|
+
/** Entry lifecycle текущего шага (используется persist после гидратации). */
|
|
133
|
+
export declare function runFlowEntryLifecycle(kernel: Kernel, flowState: FlowState): void;
|
|
134
|
+
export {};
|
|
135
|
+
//# sourceMappingURL=flowNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowNavigation.d.ts","sourceRoot":"","sources":["../../../store/flow/flowNavigation.ts"],"names":[],"mappings":"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"}
|