@reformer/core 11.0.0-beta.1 → 11.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -68
- package/dist/behaviors-value-D05z3my6.js +109 -0
- package/dist/behaviors.d.ts +1 -1
- package/dist/behaviors.js +376 -211
- package/dist/create-model-DPSG3I0O.js +30 -0
- package/dist/date-utils-90-qZbse.js +43 -0
- package/dist/en-HP8XEych.js +44 -0
- package/dist/form/aggregate-signals.d.ts +21 -63
- package/dist/form/behaviors/collections.d.ts +84 -0
- package/dist/form/behaviors/context.d.ts +56 -0
- package/dist/form/behaviors/index.d.ts +30 -0
- package/dist/form/behaviors/internals.d.ts +41 -0
- package/dist/form/{behaviors-node.d.ts → behaviors/node.d.ts} +28 -5
- package/dist/form/behaviors/operators.d.ts +59 -0
- package/dist/form/behaviors/schema-operators.d.ts +83 -0
- package/dist/form/behaviors/types.d.ts +37 -0
- package/dist/form/create-form.d.ts +59 -70
- package/dist/form/flow/flow.d.ts +87 -0
- package/dist/form/form-bundle.d.ts +153 -0
- package/dist/form/form-level.d.ts +121 -0
- package/dist/form/form-proxy-builder.d.ts +6 -22
- package/dist/form/index.d.ts +23 -24
- package/dist/form/nodes/form-array-node.d.ts +100 -0
- package/dist/form/nodes/form-control-node.d.ts +73 -0
- package/dist/form/nodes/form-group-node.d.ts +66 -0
- package/dist/form/nodes/node-kind.d.ts +29 -0
- package/dist/form/nodes/state/availability.d.ts +6 -0
- package/dist/form/nodes/state/component.d.ts +6 -0
- package/dist/form/nodes/state/index.d.ts +12 -0
- package/dist/form/nodes/state/interaction.d.ts +13 -0
- package/dist/form/nodes/state/issues.d.ts +9 -0
- package/dist/form/nodes/state/pending.d.ts +6 -0
- package/dist/form/schema/compile.d.ts +59 -0
- package/dist/form/schema/compiled.d.ts +143 -0
- package/dist/form/schema/row-key.d.ts +11 -0
- package/dist/form/schema-controller.d.ts +159 -0
- package/dist/form/schema-subtree.d.ts +28 -0
- package/dist/form/signal-node-registry.d.ts +27 -22
- package/dist/form/submission.d.ts +93 -0
- package/dist/form/type-guards.d.ts +14 -73
- package/dist/form/types/contracts.d.ts +21 -85
- package/dist/form/types/field-config.d.ts +27 -0
- package/dist/form/types/index.d.ts +5 -57
- package/dist/form/types/nodes.d.ts +159 -0
- package/dist/form/types/schema-node.d.ts +147 -46
- package/dist/form/types/validation-schema.d.ts +25 -17
- package/dist/form/validation/context.d.ts +67 -0
- package/dist/form/validation/index.d.ts +24 -28
- package/dist/form/validation/operators.d.ts +101 -0
- package/dist/form/validation/run.d.ts +120 -0
- package/dist/form/validation/strategy.d.ts +89 -0
- package/dist/form/validation/types.d.ts +83 -0
- package/dist/form/validators/date-utils.d.ts +42 -0
- package/dist/form/validators/email.d.ts +23 -0
- package/dist/form/{validation/validators → validators}/file-type.d.ts +10 -10
- package/dist/form/{validation/validators → validators}/file-utils.d.ts +3 -2
- package/dist/form/validators/future-date.d.ts +23 -0
- package/dist/form/{validation/validators → validators}/index.d.ts +7 -4
- package/dist/form/validators/integer.d.ts +22 -0
- package/dist/form/validators/is-date.d.ts +24 -0
- package/dist/form/validators/is-number.d.ts +25 -0
- package/dist/form/validators/max-age.d.ts +28 -0
- package/dist/form/validators/max-date.d.ts +25 -0
- package/dist/form/{validation/validators → validators}/max-file-size.d.ts +10 -10
- package/dist/form/validators/max-files.d.ts +26 -0
- package/dist/form/validators/max-length.d.ts +33 -0
- package/dist/form/validators/max-total-file-size.d.ts +26 -0
- package/dist/form/validators/max.d.ts +26 -0
- package/dist/form/validators/min-age.d.ts +27 -0
- package/dist/form/validators/min-date.d.ts +25 -0
- package/dist/form/{validation/validators → validators}/min-file-size.d.ts +10 -10
- package/dist/form/validators/min-files.d.ts +27 -0
- package/dist/form/validators/min-length.d.ts +33 -0
- package/dist/form/validators/min.d.ts +26 -0
- package/dist/form/validators/multiple-of.d.ts +25 -0
- package/dist/form/validators/non-negative.d.ts +22 -0
- package/dist/form/validators/non-zero.d.ts +22 -0
- package/dist/form/validators/past-date.d.ts +23 -0
- package/dist/form/validators/pattern.d.ts +26 -0
- package/dist/form/{validation/validators → validators}/phone.d.ts +11 -11
- package/dist/form/validators/required.d.ts +29 -0
- package/dist/form/validators/url.d.ts +45 -0
- package/dist/form/validators/validation-issue.d.ts +8 -0
- package/dist/i18n/descriptor.d.ts +54 -0
- package/dist/i18n/en.json.d.ts +49 -0
- package/dist/i18n/loader.d.ts +71 -0
- package/dist/i18n/locale-store.d.ts +46 -0
- package/dist/i18n/locale.d.ts +90 -0
- package/dist/i18n/message-format.d.ts +136 -0
- package/dist/i18n/resolve-localized.d.ts +17 -0
- package/dist/i18n/ru.json.d.ts +49 -0
- package/dist/i18n/translator.d.ts +61 -0
- package/dist/i18n/validation-message.d.ts +53 -0
- package/dist/i18n.d.ts +26 -0
- package/dist/i18n.js +86 -0
- package/dist/index.d.ts +17 -5
- package/dist/index.js +942 -2601
- package/dist/loader-BWkigpVe.js +52 -0
- package/dist/locale/en.d.ts +2 -0
- package/dist/locale/en.js +5 -0
- package/dist/locale/en.json +45 -0
- package/dist/locale/index.d.ts +18 -0
- package/dist/locale/ru.d.ts +2 -0
- package/dist/locale/ru.js +44 -0
- package/dist/locale/ru.json +45 -0
- package/dist/locale-CG54AU2Q.js +219 -0
- package/dist/locale.d.ts +2 -0
- package/dist/locale.js +9 -0
- package/dist/{state → model}/behaviors-value.d.ts +24 -6
- package/dist/{state/form-model.d.ts → model/create-model.d.ts} +18 -4
- package/dist/{state → model}/derived-registry.d.ts +1 -1
- package/dist/model/index.d.ts +42 -0
- package/dist/model/model-nodes.d.ts +190 -0
- package/dist/model/model-signals-proxy.d.ts +63 -0
- package/dist/model/model-value-proxy.d.ts +84 -0
- package/dist/{state → model}/safe-effect.d.ts +50 -2
- package/dist/model/types.d.ts +239 -0
- package/dist/model.d.ts +2 -0
- package/dist/model.js +27 -0
- package/dist/node-kind-C-r6ZMdo.js +15 -0
- package/dist/platforms/react/field-binding/field-adapter.d.ts +87 -0
- package/dist/platforms/react/field-binding/field-handle.d.ts +53 -0
- package/dist/platforms/react/form-bundle-context.d.ts +27 -0
- package/dist/{form → platforms/react}/hooks/types.d.ts +58 -36
- package/dist/platforms/react/hooks/use-form-bundle.d.ts +41 -0
- package/dist/platforms/react/hooks/use-form-flow.d.ts +40 -0
- package/dist/{form → platforms/react}/hooks/use-form-validation.d.ts +13 -7
- package/dist/{form → platforms/react}/hooks/useArrayLength.d.ts +6 -6
- package/dist/{form → platforms/react}/hooks/useFormControl.d.ts +7 -9
- package/dist/{form → platforms/react}/hooks/useFormControlValue.d.ts +18 -18
- package/dist/{form → platforms/react}/hooks/useSignalSubscription.d.ts +9 -1
- package/dist/platforms/react/i18n/context.d.ts +18 -0
- package/dist/platforms/react/i18n/hooks.d.ts +65 -0
- package/dist/platforms/react/i18n/provider.d.ts +59 -0
- package/dist/platforms/react/index.d.ts +30 -0
- package/dist/react.d.ts +22 -0
- package/dist/react.js +505 -0
- package/dist/runtime-token.d.ts +1 -2
- package/dist/safe-effect-BazLOv1g.js +669 -0
- package/dist/schema-controller-CpiO2JoK.js +143 -0
- package/dist/signals.d.ts +15 -9
- package/dist/signals.js +11 -6
- package/dist/strategy-DzvnsWLh.js +375 -0
- package/dist/type-guards-D-N_5Ddh.js +19 -0
- package/dist/validation-issue-B9mjI8jz.js +7 -0
- package/dist/validation-message-Ced9MGxs.js +194 -0
- package/dist/validation.d.ts +1 -1
- package/dist/validation.js +11 -165
- package/dist/validators/email.d.ts +1 -1
- package/dist/validators/email.js +5 -8
- package/dist/validators/future-date.d.ts +1 -1
- package/dist/validators/future-date.js +10 -13
- package/dist/validators/integer.d.ts +1 -1
- package/dist/validators/integer.js +4 -7
- package/dist/validators/is-date.d.ts +1 -1
- package/dist/validators/is-date.js +5 -8
- package/dist/validators/is-number.d.ts +1 -1
- package/dist/validators/is-number.js +4 -7
- package/dist/validators/max-age.d.ts +1 -1
- package/dist/validators/max-age.js +8 -12
- package/dist/validators/max-date.d.ts +1 -1
- package/dist/validators/max-date.js +10 -13
- package/dist/validators/max-length.d.ts +1 -1
- package/dist/validators/max-length.js +7 -10
- package/dist/validators/max.d.ts +1 -1
- package/dist/validators/max.js +4 -7
- package/dist/validators/min-age.d.ts +1 -1
- package/dist/validators/min-age.js +10 -11
- package/dist/validators/min-date.d.ts +1 -1
- package/dist/validators/min-date.js +8 -11
- package/dist/validators/min-length.d.ts +1 -1
- package/dist/validators/min-length.js +4 -7
- package/dist/validators/min.d.ts +1 -1
- package/dist/validators/min.js +4 -7
- package/dist/validators/multiple-of.d.ts +1 -1
- package/dist/validators/multiple-of.js +11 -10
- package/dist/validators/non-negative.d.ts +1 -1
- package/dist/validators/non-negative.js +2 -5
- package/dist/validators/non-zero.d.ts +1 -1
- package/dist/validators/non-zero.js +4 -7
- package/dist/validators/past-date.d.ts +1 -1
- package/dist/validators/past-date.js +10 -13
- package/dist/validators/pattern.d.ts +1 -1
- package/dist/validators/pattern.js +5 -8
- package/dist/validators/phone.d.ts +1 -1
- package/dist/validators/phone.js +10 -11
- package/dist/validators/required.d.ts +1 -1
- package/dist/validators/required.js +4 -7
- package/dist/validators/url.d.ts +1 -1
- package/dist/validators/url.js +48 -17
- package/dist/validators.d.ts +1 -1
- package/dist/validators.js +86 -108
- package/docs/llms/01-api-reference.md +60 -34
- package/docs/llms/02-quick-start.md +112 -74
- package/docs/llms/03-api-signatures.md +369 -148
- package/docs/llms/04-common-patterns.md +58 -56
- package/docs/llms/05-common-mistakes.md +69 -44
- package/docs/llms/06-troubleshooting.md +14 -9
- package/docs/llms/07-complete-import.md +74 -43
- package/docs/llms/08-form-types.md +11 -4
- package/docs/llms/09-formschema.md +132 -84
- package/docs/llms/10-arrays.md +141 -61
- package/docs/llms/11-async-watchfield.md +2 -2
- package/docs/llms/13-multi-step.md +134 -63
- package/docs/llms/14-extended-mistakes.md +20 -17
- package/docs/llms/15-project-structure.md +224 -70
- package/docs/llms/16-ui-components.md +86 -46
- package/docs/llms/17-nonexistent-api.md +217 -32
- package/docs/llms/18-conditional-fields.md +71 -32
- package/docs/llms/19-reading-values.md +45 -4
- package/docs/llms/20-compute-vs-watch.md +25 -10
- package/docs/llms/21-array-operations.md +76 -26
- package/docs/llms/22-cycle-detection.md +1 -1
- package/docs/llms/23-copy-from.md +2 -2
- package/docs/llms/24-sync-fields.md +6 -5
- package/docs/llms/25-reset-when.md +14 -7
- package/docs/llms/26-transform-value.md +4 -4
- package/docs/llms/27-revalidate-when.md +16 -15
- package/docs/llms/28-submit-and-reset.md +278 -128
- package/docs/llms/29-async-preload.md +41 -31
- package/docs/llms/30-type-safety-recipes.md +105 -51
- package/docs/llms/31-async-validator-debounce.md +96 -53
- package/docs/llms/33-validation-strategy.md +178 -66
- package/docs/llms/34-i18n.md +298 -0
- package/docs/llms/35-unified-contract.md +309 -0
- package/docs/llms/36-issue-messages.md +284 -0
- package/docs/llms/37-compiled-schema.md +332 -0
- package/docs/llms/38-form-flow.md +396 -0
- package/llms-index.json +1 -0
- package/llms.txt +10690 -3089
- package/package.json +48 -9
- package/dist/behaviors-node-DGEFMTQu.js +0 -18
- package/dist/behaviors-value-C7dSEhCc.js +0 -134
- package/dist/date-utils-dTT_x_Be.js +0 -31
- package/dist/derived-registry-CluZCQ7U.js +0 -16
- package/dist/form/behaviors.d.ts +0 -133
- package/dist/form/error-handler.d.ts +0 -166
- package/dist/form/factories/index.d.ts +0 -6
- package/dist/form/factories/node-factory.d.ts +0 -188
- package/dist/form/form-submitter.d.ts +0 -121
- package/dist/form/nodes/array-node.d.ts +0 -276
- package/dist/form/nodes/field-node.d.ts +0 -294
- package/dist/form/nodes/form-node.d.ts +0 -326
- package/dist/form/nodes/group-node.d.ts +0 -284
- package/dist/form/nodes/model-array-node.d.ts +0 -121
- package/dist/form/status-machine.d.ts +0 -115
- package/dist/form/types/deep-schema.d.ts +0 -107
- package/dist/form/types/form-proxy.d.ts +0 -141
- package/dist/form/unique-id.d.ts +0 -45
- package/dist/form/validation/validators/date-utils.d.ts +0 -30
- package/dist/form/validation/validators/email.d.ts +0 -23
- package/dist/form/validation/validators/future-date.d.ts +0 -23
- package/dist/form/validation/validators/integer.d.ts +0 -22
- package/dist/form/validation/validators/is-date.d.ts +0 -23
- package/dist/form/validation/validators/is-number.d.ts +0 -24
- package/dist/form/validation/validators/max-age.d.ts +0 -25
- package/dist/form/validation/validators/max-date.d.ts +0 -25
- package/dist/form/validation/validators/max-files.d.ts +0 -26
- package/dist/form/validation/validators/max-length.d.ts +0 -27
- package/dist/form/validation/validators/max-total-file-size.d.ts +0 -26
- package/dist/form/validation/validators/max.d.ts +0 -25
- package/dist/form/validation/validators/min-age.d.ts +0 -25
- package/dist/form/validation/validators/min-date.d.ts +0 -25
- package/dist/form/validation/validators/min-files.d.ts +0 -26
- package/dist/form/validation/validators/min-length.d.ts +0 -27
- package/dist/form/validation/validators/min.d.ts +0 -25
- package/dist/form/validation/validators/multiple-of.d.ts +0 -24
- package/dist/form/validation/validators/non-negative.d.ts +0 -22
- package/dist/form/validation/validators/non-zero.d.ts +0 -22
- package/dist/form/validation/validators/past-date.d.ts +0 -23
- package/dist/form/validation/validators/pattern.d.ts +0 -33
- package/dist/form/validation/validators/required.d.ts +0 -32
- package/dist/form/validation/validators/url.d.ts +0 -43
- package/dist/form/validation-schema.d.ts +0 -106
- package/dist/form/validation-strategy.d.ts +0 -55
- package/dist/form/validators.d.ts +0 -11
- package/dist/form-model-DYCzGGKF.js +0 -286
- package/dist/state/index.d.ts +0 -31
- package/dist/state/subscription-manager.d.ts +0 -180
- package/dist/state/types.d.ts +0 -144
- package/dist/state.d.ts +0 -2
- package/dist/state.js +0 -21
- package/dist/subscription-manager-705bls97.js +0 -171
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
import { FormNode } from '../nodes/form-node';
|
|
2
|
-
import { ConfigWithSchema, ConfigWithValue, UnknownRecord } from '../types/index';
|
|
3
|
-
/**
|
|
4
|
-
* Фабрика для создания узлов формы.
|
|
5
|
-
*
|
|
6
|
-
* Определяет тип конфига и создаёт соответствующий узел (FieldNode, GroupNode, ArrayNode).
|
|
7
|
-
* Используется внутри `getReformerForm`/`group`/`array` — явно вызывать обычно не нужно.
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* import { NodeFactory } from '@reformer/core';
|
|
12
|
-
*
|
|
13
|
-
* const factory = new NodeFactory();
|
|
14
|
-
* const node = factory.createNode({ value: '', component: Input }); // → FieldNode<string>
|
|
15
|
-
* ```
|
|
16
|
-
*/
|
|
17
|
-
export declare class NodeFactory {
|
|
18
|
-
/**
|
|
19
|
-
* Создает узел формы на основе конфигурации
|
|
20
|
-
*
|
|
21
|
-
* ✅ ОБНОВЛЕНО: Теперь поддерживает массивы напрямую
|
|
22
|
-
*
|
|
23
|
-
* Автоматически определяет тип узла:
|
|
24
|
-
* - FieldNode: имеет value и component
|
|
25
|
-
* - ArrayNode: массив [schema, ...items] или { schema, initialItems }
|
|
26
|
-
* - GroupNode: объект без value, component, schema
|
|
27
|
-
*
|
|
28
|
-
* @param config Конфигурация узла
|
|
29
|
-
* @returns Экземпляр FieldNode, GroupNode или ArrayNode
|
|
30
|
-
* @throws Error если конфиг не соответствует ни одному типу
|
|
31
|
-
*
|
|
32
|
-
* @example
|
|
33
|
-
* ```typescript
|
|
34
|
-
* const factory = new NodeFactory();
|
|
35
|
-
*
|
|
36
|
-
* // FieldNode
|
|
37
|
-
* const field = factory.createNode({
|
|
38
|
-
* value: 'test@mail.com',
|
|
39
|
-
* component: Input,
|
|
40
|
-
* validators: [required, email]
|
|
41
|
-
* });
|
|
42
|
-
*
|
|
43
|
-
* // GroupNode
|
|
44
|
-
* const group = factory.createNode({
|
|
45
|
-
* email: { value: '', component: Input },
|
|
46
|
-
* password: { value: '', component: Input }
|
|
47
|
-
* });
|
|
48
|
-
*
|
|
49
|
-
* // ArrayNode (объект)
|
|
50
|
-
* const array = factory.createNode({
|
|
51
|
-
* schema: { title: { value: '', component: Input } },
|
|
52
|
-
* initialItems: [{ title: 'Item 1' }]
|
|
53
|
-
* });
|
|
54
|
-
*
|
|
55
|
-
* // ArrayNode (массив) - новый формат
|
|
56
|
-
* const array2 = factory.createNode([
|
|
57
|
-
* { title: { value: '', component: Input } }, // schema
|
|
58
|
-
* { title: 'Item 1' }, // initial item 1
|
|
59
|
-
* { title: 'Item 2' } // initial item 2
|
|
60
|
-
* ]);
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
createNode(config: unknown): FormNode<unknown>;
|
|
64
|
-
/**
|
|
65
|
-
* Создать ArrayNode из массива [schema, ...initialItems]
|
|
66
|
-
*
|
|
67
|
-
* ✅ НОВОЕ: Извлечено из GroupNode для централизации логики
|
|
68
|
-
*
|
|
69
|
-
* Формат: [itemSchema, ...initialItems]
|
|
70
|
-
* - Первый элемент - схема элемента массива
|
|
71
|
-
* - Остальные элементы - начальные значения
|
|
72
|
-
*
|
|
73
|
-
* @param config Массив с схемой и начальными элементами
|
|
74
|
-
* @returns ArrayNode
|
|
75
|
-
*
|
|
76
|
-
* @example
|
|
77
|
-
* ```typescript
|
|
78
|
-
* const factory = new NodeFactory();
|
|
79
|
-
*
|
|
80
|
-
* // Массив с начальными элементами
|
|
81
|
-
* const array = factory.createArrayNodeFromArray([
|
|
82
|
-
* { title: { value: '', component: Input } }, // schema
|
|
83
|
-
* { title: 'Item 1' }, // initial value
|
|
84
|
-
* { title: 'Item 2' } // initial value
|
|
85
|
-
* ]);
|
|
86
|
-
* ```
|
|
87
|
-
* @private
|
|
88
|
-
*/
|
|
89
|
-
private createArrayNodeFromArray;
|
|
90
|
-
/**
|
|
91
|
-
* Извлечь значения из схемы (рекурсивно)
|
|
92
|
-
*
|
|
93
|
-
* ✅ НОВОЕ: Извлечено из GroupNode для централизации логики
|
|
94
|
-
*
|
|
95
|
-
* Преобразует схему формы в объект со значениями:
|
|
96
|
-
* - `{ name: { value: 'John', component: Input } } → { name: 'John' }`
|
|
97
|
-
* - Поддерживает вложенные группы
|
|
98
|
-
* - Поддерживает массивы
|
|
99
|
-
*
|
|
100
|
-
* @param schema Схема формы
|
|
101
|
-
* @returns Объект со значениями полей
|
|
102
|
-
*
|
|
103
|
-
* @example
|
|
104
|
-
* ```typescript
|
|
105
|
-
* const factory = new NodeFactory();
|
|
106
|
-
*
|
|
107
|
-
* const schema = {
|
|
108
|
-
* name: { value: 'John', component: Input },
|
|
109
|
-
* age: { value: 30, component: Input },
|
|
110
|
-
* address: {
|
|
111
|
-
* city: { value: 'Moscow', component: Input }
|
|
112
|
-
* }
|
|
113
|
-
* };
|
|
114
|
-
*
|
|
115
|
-
* factory.extractValues(schema);
|
|
116
|
-
* // { name: 'John', age: 30, address: { city: 'Moscow' } }
|
|
117
|
-
* ```
|
|
118
|
-
*/
|
|
119
|
-
extractValues(schema: unknown): unknown;
|
|
120
|
-
/**
|
|
121
|
-
* Проверяет, является ли конфиг конфигурацией поля (FieldConfig)
|
|
122
|
-
*
|
|
123
|
-
* FieldConfig имеет обязательные свойства:
|
|
124
|
-
* - value: начальное значение поля
|
|
125
|
-
* - component: React-компонент для отображения
|
|
126
|
-
*
|
|
127
|
-
* @param config Проверяемая конфигурация
|
|
128
|
-
* @returns true если config является FieldConfig
|
|
129
|
-
*
|
|
130
|
-
* @example
|
|
131
|
-
* ```typescript
|
|
132
|
-
* const factory = new NodeFactory();
|
|
133
|
-
*
|
|
134
|
-
* factory.isFieldConfig({ value: '', component: Input }); // true
|
|
135
|
-
* factory.isFieldConfig({ email: { value: '' } }); // false
|
|
136
|
-
* factory.isFieldConfig(null); // false
|
|
137
|
-
* ```
|
|
138
|
-
*/
|
|
139
|
-
isFieldConfig(config: unknown): config is ConfigWithValue;
|
|
140
|
-
/**
|
|
141
|
-
* Проверяет, является ли конфиг конфигурацией массива (ArrayConfig)
|
|
142
|
-
*
|
|
143
|
-
* ArrayConfig имеет обязательное свойство:
|
|
144
|
-
* - schema: схема для элементов массива
|
|
145
|
-
*
|
|
146
|
-
* И НЕ имеет:
|
|
147
|
-
* - value (отличие от FieldConfig)
|
|
148
|
-
*
|
|
149
|
-
* @param config Проверяемая конфигурация
|
|
150
|
-
* @returns true если config является ArrayConfig
|
|
151
|
-
*
|
|
152
|
-
* @example
|
|
153
|
-
* ```typescript
|
|
154
|
-
* const factory = new NodeFactory();
|
|
155
|
-
*
|
|
156
|
-
* factory.isArrayConfig({ schema: {}, initialItems: [] }); // true
|
|
157
|
-
* factory.isArrayConfig({ value: '', component: Input }); // false
|
|
158
|
-
* factory.isArrayConfig({ email: { value: '' } }); // false
|
|
159
|
-
* ```
|
|
160
|
-
*/
|
|
161
|
-
isArrayConfig(config: unknown): config is ConfigWithSchema;
|
|
162
|
-
/**
|
|
163
|
-
* Проверяет, является ли конфиг конфигурацией группы (GroupConfig)
|
|
164
|
-
*
|
|
165
|
-
* GroupConfig - это объект, который:
|
|
166
|
-
* - НЕ является FieldConfig (нет value/component)
|
|
167
|
-
* - НЕ является ArrayConfig (нет schema)
|
|
168
|
-
* - Содержит вложенные конфиги полей/групп/массивов
|
|
169
|
-
*
|
|
170
|
-
* @param config Проверяемая конфигурация
|
|
171
|
-
* @returns true если config является GroupConfig
|
|
172
|
-
*
|
|
173
|
-
* @example
|
|
174
|
-
* ```typescript
|
|
175
|
-
* const factory = new NodeFactory();
|
|
176
|
-
*
|
|
177
|
-
* factory.isGroupConfig({
|
|
178
|
-
* email: { value: '', component: Input },
|
|
179
|
-
* password: { value: '', component: Input }
|
|
180
|
-
* }); // true
|
|
181
|
-
*
|
|
182
|
-
* factory.isGroupConfig({ value: '', component: Input }); // false
|
|
183
|
-
* factory.isGroupConfig({ schema: {} }); // false
|
|
184
|
-
* factory.isGroupConfig(null); // false
|
|
185
|
-
* ```
|
|
186
|
-
*/
|
|
187
|
-
isGroupConfig(config: unknown): config is UnknownRecord;
|
|
188
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { ReadonlySignal } from '@preact/signals-core';
|
|
2
|
-
/**
|
|
3
|
-
* Интерфейс формы для FormSubmitter
|
|
4
|
-
* Минимальный контракт для работы с любой формой
|
|
5
|
-
*/
|
|
6
|
-
export interface SubmittableForm<T extends object> {
|
|
7
|
-
/** Пометить все поля как touched */
|
|
8
|
-
markAsTouched(): void;
|
|
9
|
-
/** Валидировать форму */
|
|
10
|
-
validate(): Promise<boolean>;
|
|
11
|
-
/** Получить значения формы */
|
|
12
|
-
getValue(): T;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Опции для submit
|
|
16
|
-
*/
|
|
17
|
-
export interface SubmitOptions {
|
|
18
|
-
/** Пропустить валидацию перед submit */
|
|
19
|
-
skipValidation?: boolean;
|
|
20
|
-
/** Пропустить markAsTouched перед submit */
|
|
21
|
-
skipTouch?: boolean;
|
|
22
|
-
}
|
|
23
|
-
/**
|
|
24
|
-
* Результат submit
|
|
25
|
-
*/
|
|
26
|
-
export interface SubmitResult<R> {
|
|
27
|
-
/** Успешно ли выполнен submit */
|
|
28
|
-
success: boolean;
|
|
29
|
-
/** Результат от onSubmit callback */
|
|
30
|
-
data: R | null;
|
|
31
|
-
/** Ошибка, если submit не удался */
|
|
32
|
-
error?: Error;
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* FormSubmitter - управляет процессом отправки формы
|
|
36
|
-
*
|
|
37
|
-
* @example
|
|
38
|
-
* ```typescript
|
|
39
|
-
* const submitter = new FormSubmitter(form);
|
|
40
|
-
*
|
|
41
|
-
* // Простой submit
|
|
42
|
-
* const result = await submitter.submit(async (values) => {
|
|
43
|
-
* return await api.saveForm(values);
|
|
44
|
-
* });
|
|
45
|
-
*
|
|
46
|
-
* // Проверка состояния
|
|
47
|
-
* if (submitter.submitting.value) {
|
|
48
|
-
* console.log('Форма отправляется...');
|
|
49
|
-
* }
|
|
50
|
-
* ```
|
|
51
|
-
*/
|
|
52
|
-
export declare class FormSubmitter<T extends object> {
|
|
53
|
-
private readonly form;
|
|
54
|
-
/** Внутренний сигнал состояния отправки */
|
|
55
|
-
private readonly _submitting;
|
|
56
|
-
/** Публичный read-only сигнал состояния отправки */
|
|
57
|
-
readonly submitting: ReadonlySignal<boolean>;
|
|
58
|
-
/**
|
|
59
|
-
* @param form - Форма для отправки
|
|
60
|
-
*/
|
|
61
|
-
constructor(form: SubmittableForm<T>);
|
|
62
|
-
/**
|
|
63
|
-
* Отправить форму
|
|
64
|
-
*
|
|
65
|
-
* Процесс:
|
|
66
|
-
* 1. Помечает все поля как touched (для отображения ошибок)
|
|
67
|
-
* 2. Валидирует форму
|
|
68
|
-
* 3. Если валидация успешна - вызывает onSubmit
|
|
69
|
-
* 4. Управляет состоянием submitting
|
|
70
|
-
*
|
|
71
|
-
* @param onSubmit - Callback для отправки данных
|
|
72
|
-
* @param options - Опции submit
|
|
73
|
-
* @returns Результат от onSubmit или `null` если валидация не пройдена
|
|
74
|
-
*
|
|
75
|
-
* @remarks
|
|
76
|
-
* Возвращаемый `null` неоднозначен: он сигналит и провал валидации, и легитимный `null`,
|
|
77
|
-
* который вернул `onSubmit` (или void-обработчик). Чтобы различать эти случаи, используйте
|
|
78
|
-
* {@link submitWithResult} — он отдаёт явный флаг `success`.
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* const result = await submitter.submit(async (values) => {
|
|
83
|
-
* const response = await fetch('/api/form', {
|
|
84
|
-
* method: 'POST',
|
|
85
|
-
* body: JSON.stringify(values)
|
|
86
|
-
* });
|
|
87
|
-
* return response.json();
|
|
88
|
-
* });
|
|
89
|
-
*
|
|
90
|
-
* if (result === null) {
|
|
91
|
-
* console.log('Форма не прошла валидацию');
|
|
92
|
-
* }
|
|
93
|
-
* ```
|
|
94
|
-
*/
|
|
95
|
-
submit<R>(onSubmit: (values: T) => Promise<R> | R, options?: SubmitOptions): Promise<R | null>;
|
|
96
|
-
/**
|
|
97
|
-
* Отправить форму с расширенным результатом
|
|
98
|
-
*
|
|
99
|
-
* В отличие от submit(), возвращает объект с информацией об успехе/ошибке
|
|
100
|
-
*
|
|
101
|
-
* @param onSubmit - Callback для отправки данных
|
|
102
|
-
* @param options - Опции submit
|
|
103
|
-
* @returns Объект SubmitResult с данными и статусом
|
|
104
|
-
*
|
|
105
|
-
* @example
|
|
106
|
-
* ```typescript
|
|
107
|
-
* const result = await submitter.submitWithResult(async (values) => {
|
|
108
|
-
* return await api.saveForm(values);
|
|
109
|
-
* });
|
|
110
|
-
*
|
|
111
|
-
* if (result.success) {
|
|
112
|
-
* console.log('Сохранено:', result.data);
|
|
113
|
-
* } else if (result.error) {
|
|
114
|
-
* console.error('Ошибка:', result.error.message);
|
|
115
|
-
* } else {
|
|
116
|
-
* console.log('Валидация не пройдена');
|
|
117
|
-
* }
|
|
118
|
-
* ```
|
|
119
|
-
*/
|
|
120
|
-
submitWithResult<R>(onSubmit: (values: T) => Promise<R> | R, options?: SubmitOptions): Promise<SubmitResult<R>>;
|
|
121
|
-
}
|
|
@@ -1,276 +0,0 @@
|
|
|
1
|
-
import { ReadonlySignal } from '@preact/signals-core';
|
|
2
|
-
import { FormNode, SetValueOptions } from './form-node';
|
|
3
|
-
import { FieldStatus, ValidationError } from '../types/index';
|
|
4
|
-
import { FormSchema } from '../types/deep-schema';
|
|
5
|
-
import { FormProxy } from '../types/form-proxy';
|
|
6
|
-
/**
|
|
7
|
-
* ArrayNode - массив форм с реактивным состоянием
|
|
8
|
-
*
|
|
9
|
-
* @group Nodes
|
|
10
|
-
*
|
|
11
|
-
* @example
|
|
12
|
-
* ```typescript
|
|
13
|
-
* const array = new ArrayNode({
|
|
14
|
-
* title: { value: '', component: Input },
|
|
15
|
-
* price: { value: 0, component: Input },
|
|
16
|
-
* });
|
|
17
|
-
*
|
|
18
|
-
* array.push({ title: 'Item 1', price: 100 });
|
|
19
|
-
* array.at(0)?.title.setValue('Updated');
|
|
20
|
-
* console.log(array.length.value); // 1
|
|
21
|
-
* ```
|
|
22
|
-
*/
|
|
23
|
-
export declare class ArrayNode<T extends object> extends FormNode<T[]> {
|
|
24
|
-
private items;
|
|
25
|
-
private itemSchema;
|
|
26
|
-
private initialItems;
|
|
27
|
-
/**
|
|
28
|
-
* Менеджер подписок для централизованного cleanup
|
|
29
|
-
* Использует SubscriptionManager вместо массива для управления подписками
|
|
30
|
-
*/
|
|
31
|
-
private disposers;
|
|
32
|
-
/** Array-level validation errors (e.g., "минимум 1 элемент") */
|
|
33
|
-
private readonly _arrayErrors;
|
|
34
|
-
readonly value: ReadonlySignal<T[]>;
|
|
35
|
-
readonly valid: ReadonlySignal<boolean>;
|
|
36
|
-
readonly invalid: ReadonlySignal<boolean>;
|
|
37
|
-
readonly touched: ReadonlySignal<boolean>;
|
|
38
|
-
readonly dirty: ReadonlySignal<boolean>;
|
|
39
|
-
readonly pending: ReadonlySignal<boolean>;
|
|
40
|
-
readonly errors: ReadonlySignal<ValidationError[]>;
|
|
41
|
-
readonly status: ReadonlySignal<FieldStatus>;
|
|
42
|
-
readonly length: ReadonlySignal<number>;
|
|
43
|
-
constructor(schema: FormSchema<T>, initialItems?: Partial<T>[]);
|
|
44
|
-
/**
|
|
45
|
-
* Добавить элемент в конец массива
|
|
46
|
-
* @param initialValue - Начальные значения для нового элемента
|
|
47
|
-
*/
|
|
48
|
-
push(initialValue?: Partial<T>): void;
|
|
49
|
-
/**
|
|
50
|
-
* Удалить элемент по индексу
|
|
51
|
-
* @param index - Индекс элемента для удаления
|
|
52
|
-
*
|
|
53
|
-
* @remarks
|
|
54
|
-
* Вызывает dispose() на удаляемом элементе для очистки подписок
|
|
55
|
-
*/
|
|
56
|
-
removeAt(index: number): void;
|
|
57
|
-
/**
|
|
58
|
-
* Вставить элемент в массив
|
|
59
|
-
* @param index - Индекс для вставки
|
|
60
|
-
* @param initialValue - Начальные значения для нового элемента
|
|
61
|
-
*/
|
|
62
|
-
insert(index: number, initialValue?: Partial<T>): void;
|
|
63
|
-
/**
|
|
64
|
-
* Переместить элемент массива с позиции `from` на позицию `to`
|
|
65
|
-
*
|
|
66
|
-
* @param from - Индекс перемещаемого элемента
|
|
67
|
-
* @param to - Целевой индекс
|
|
68
|
-
*
|
|
69
|
-
* @remarks
|
|
70
|
-
* Реордер не уничтожает элемент (dispose НЕ вызывается) — тот же инстанс под-формы
|
|
71
|
-
* переезжает на новую позицию, состояние/валидация сохраняются. Длина не меняется.
|
|
72
|
-
*
|
|
73
|
-
* @example
|
|
74
|
-
* ```typescript
|
|
75
|
-
* // Поднять элемент #2 на одну позицию вверх
|
|
76
|
-
* form.items.move(2, 1);
|
|
77
|
-
* ```
|
|
78
|
-
*/
|
|
79
|
-
move(from: number, to: number): void;
|
|
80
|
-
/**
|
|
81
|
-
* Поменять местами два элемента массива
|
|
82
|
-
*
|
|
83
|
-
* @param a - Индекс первого элемента
|
|
84
|
-
* @param b - Индекс второго элемента
|
|
85
|
-
*
|
|
86
|
-
* @remarks
|
|
87
|
-
* Как и {@link move}, не уничтожает элементы — меняет только их порядок.
|
|
88
|
-
*
|
|
89
|
-
* @example
|
|
90
|
-
* ```typescript
|
|
91
|
-
* form.items.swap(0, 2);
|
|
92
|
-
* ```
|
|
93
|
-
*/
|
|
94
|
-
swap(a: number, b: number): void;
|
|
95
|
-
/**
|
|
96
|
-
* Удалить все элементы массива
|
|
97
|
-
*
|
|
98
|
-
* @remarks
|
|
99
|
-
* Вызывает dispose() на всех элементах для очистки подписок
|
|
100
|
-
*/
|
|
101
|
-
clear(): void;
|
|
102
|
-
/**
|
|
103
|
-
* Получить элемент по индексу
|
|
104
|
-
* @param index - Индекс элемента
|
|
105
|
-
* @returns Типизированный GroupNode proxy или undefined если индекс вне границ
|
|
106
|
-
*/
|
|
107
|
-
at(index: number): FormProxy<T> | undefined;
|
|
108
|
-
getValue(): T[];
|
|
109
|
-
setValue(values: T[], options?: SetValueOptions): void;
|
|
110
|
-
patchValue(values: (T | undefined)[]): void;
|
|
111
|
-
/**
|
|
112
|
-
* Сбросить массив к указанным значениям (или очистить)
|
|
113
|
-
*
|
|
114
|
-
* @param values - опциональный массив значений для сброса
|
|
115
|
-
*
|
|
116
|
-
* @remarks
|
|
117
|
-
* Очищает текущий массив и заполняет новыми элементами
|
|
118
|
-
*
|
|
119
|
-
* @example
|
|
120
|
-
* ```typescript
|
|
121
|
-
* // Очистить массив
|
|
122
|
-
* arrayNode.reset();
|
|
123
|
-
*
|
|
124
|
-
* // Сбросить к новым значениям
|
|
125
|
-
* arrayNode.reset([{ name: 'Item 1' }, { name: 'Item 2' }]);
|
|
126
|
-
* ```
|
|
127
|
-
*/
|
|
128
|
-
reset(values?: T[]): void;
|
|
129
|
-
/**
|
|
130
|
-
* Сбросить массив к исходным значениям (initialItems)
|
|
131
|
-
*
|
|
132
|
-
* @remarks
|
|
133
|
-
* Восстанавливает массив в состояние, которое было при создании ArrayNode.
|
|
134
|
-
* Более явный способ сброса к начальным значениям по сравнению с reset()
|
|
135
|
-
*
|
|
136
|
-
* Полезно когда:
|
|
137
|
-
* - Пользователь нажал "Cancel" - вернуть массив к исходным элементам
|
|
138
|
-
* - Массив был изменен через reset(newValues), но нужно вернуться к началу
|
|
139
|
-
* - Явное намерение показать "отмена всех изменений"
|
|
140
|
-
*
|
|
141
|
-
* @example
|
|
142
|
-
* ```typescript
|
|
143
|
-
* const arrayNode = new ArrayNode(
|
|
144
|
-
* { name: { value: '', component: Input } },
|
|
145
|
-
* [{ name: 'Initial 1' }, { name: 'Initial 2' }]
|
|
146
|
-
* );
|
|
147
|
-
*
|
|
148
|
-
* arrayNode.push({ name: 'New Item' });
|
|
149
|
-
* arrayNode.reset([{ name: 'Temp' }]);
|
|
150
|
-
* console.log(arrayNode.length.value); // 1
|
|
151
|
-
*
|
|
152
|
-
* arrayNode.resetToInitial();
|
|
153
|
-
* console.log(arrayNode.length.value); // 2
|
|
154
|
-
* console.log(arrayNode.at(0)?.name.value.value); // 'Initial 1'
|
|
155
|
-
* ```
|
|
156
|
-
*/
|
|
157
|
-
resetToInitial(): void;
|
|
158
|
-
validate(): Promise<boolean>;
|
|
159
|
-
/**
|
|
160
|
-
* Установить array-level validation errors
|
|
161
|
-
*
|
|
162
|
-
* @param errors - Массив ошибок валидации уровня массива
|
|
163
|
-
*
|
|
164
|
-
* @example
|
|
165
|
-
* ```typescript
|
|
166
|
-
* arrayNode.setErrors([{
|
|
167
|
-
* code: 'minItems',
|
|
168
|
-
* message: 'Минимум 1 элемент обязателен',
|
|
169
|
-
* }]);
|
|
170
|
-
* ```
|
|
171
|
-
*/
|
|
172
|
-
setErrors(errors: ValidationError[]): void;
|
|
173
|
-
/**
|
|
174
|
-
* Очистить все errors (array-level + item-level)
|
|
175
|
-
*
|
|
176
|
-
* @example
|
|
177
|
-
* ```typescript
|
|
178
|
-
* arrayNode.clearErrors();
|
|
179
|
-
* console.log(arrayNode.errors.value); // []
|
|
180
|
-
* ```
|
|
181
|
-
*/
|
|
182
|
-
clearErrors(): void;
|
|
183
|
-
/**
|
|
184
|
-
* Hook: вызывается после markAsTouched()
|
|
185
|
-
*
|
|
186
|
-
* Для ArrayNode: рекурсивно помечаем все элементы массива как touched
|
|
187
|
-
*/
|
|
188
|
-
protected onMarkAsTouched(): void;
|
|
189
|
-
/**
|
|
190
|
-
* Hook: вызывается после markAsUntouched()
|
|
191
|
-
*
|
|
192
|
-
* Для ArrayNode: рекурсивно помечаем все элементы массива как untouched
|
|
193
|
-
*/
|
|
194
|
-
protected onMarkAsUntouched(): void;
|
|
195
|
-
/**
|
|
196
|
-
* Hook: вызывается после markAsDirty()
|
|
197
|
-
*
|
|
198
|
-
* Для ArrayNode: рекурсивно помечаем все элементы массива как dirty
|
|
199
|
-
*/
|
|
200
|
-
protected onMarkAsDirty(): void;
|
|
201
|
-
/**
|
|
202
|
-
* Hook: вызывается после markAsPristine()
|
|
203
|
-
*
|
|
204
|
-
* Для ArrayNode: рекурсивно помечаем все элементы массива как pristine
|
|
205
|
-
*/
|
|
206
|
-
protected onMarkAsPristine(): void;
|
|
207
|
-
/**
|
|
208
|
-
* Итерировать по элементам массива
|
|
209
|
-
* @param callback - Функция, вызываемая для каждого элемента с типизированным GroupNode proxy
|
|
210
|
-
*/
|
|
211
|
-
forEach(callback: (item: FormProxy<T>, index: number) => void): void;
|
|
212
|
-
/**
|
|
213
|
-
* Маппинг элементов массива
|
|
214
|
-
* @param callback - Функция преобразования с типизированным GroupNode proxy
|
|
215
|
-
* @returns Новый массив результатов
|
|
216
|
-
*/
|
|
217
|
-
map<R>(callback: (item: FormProxy<T>, index: number) => R): R[];
|
|
218
|
-
/**
|
|
219
|
-
* Создать новый элемент массива на основе схемы
|
|
220
|
-
* @param initialValue - Начальные значения
|
|
221
|
-
*/
|
|
222
|
-
private createItem;
|
|
223
|
-
/**
|
|
224
|
-
* Проверить, является ли схема групповой (объект полей)
|
|
225
|
-
* @param schema - Схема для проверки
|
|
226
|
-
*/
|
|
227
|
-
private isGroupSchema;
|
|
228
|
-
/**
|
|
229
|
-
* Очистить все ресурсы узла
|
|
230
|
-
* Рекурсивно очищает все subscriptions и элементы массива
|
|
231
|
-
*
|
|
232
|
-
* @example
|
|
233
|
-
* ```typescript
|
|
234
|
-
* useEffect(() => {
|
|
235
|
-
* return () => {
|
|
236
|
-
* arrayNode.dispose();
|
|
237
|
-
* };
|
|
238
|
-
* }, []);
|
|
239
|
-
* ```
|
|
240
|
-
*/
|
|
241
|
-
dispose(): void;
|
|
242
|
-
/**
|
|
243
|
-
* Hook: вызывается после disable()
|
|
244
|
-
*
|
|
245
|
-
* Для ArrayNode: рекурсивно отключаем все элементы массива
|
|
246
|
-
*
|
|
247
|
-
* @example
|
|
248
|
-
* ```typescript
|
|
249
|
-
* // Отключить весь массив полей
|
|
250
|
-
* form.items.disable();
|
|
251
|
-
*
|
|
252
|
-
* // Все элементы становятся disabled
|
|
253
|
-
* form.items.forEach(item => {
|
|
254
|
-
* console.log(item.status.value); // 'disabled'
|
|
255
|
-
* });
|
|
256
|
-
* ```
|
|
257
|
-
*/
|
|
258
|
-
protected onDisable(): void;
|
|
259
|
-
/**
|
|
260
|
-
* Hook: вызывается после enable()
|
|
261
|
-
*
|
|
262
|
-
* Для ArrayNode: рекурсивно включаем все элементы массива
|
|
263
|
-
*
|
|
264
|
-
* @example
|
|
265
|
-
* ```typescript
|
|
266
|
-
* // Включить весь массив полей
|
|
267
|
-
* form.items.enable();
|
|
268
|
-
*
|
|
269
|
-
* // Все элементы становятся enabled
|
|
270
|
-
* form.items.forEach(item => {
|
|
271
|
-
* console.log(item.status.value); // 'valid' или 'invalid'
|
|
272
|
-
* });
|
|
273
|
-
* ```
|
|
274
|
-
*/
|
|
275
|
-
protected onEnable(): void;
|
|
276
|
-
}
|