@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,294 +0,0 @@
|
|
|
1
|
-
import { ReadonlySignal } from '@preact/signals-core';
|
|
2
|
-
import { FormNode, SetValueOptions } from './form-node';
|
|
3
|
-
import { FieldConfig, FieldStatus, ValidationError } from '../types/index';
|
|
4
|
-
/**
|
|
5
|
-
* FieldNode - узел для отдельного поля формы
|
|
6
|
-
*
|
|
7
|
-
* @group Nodes
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const field = new FieldNode({
|
|
12
|
-
* value: '',
|
|
13
|
-
* component: Input,
|
|
14
|
-
* validators: [required, email],
|
|
15
|
-
* });
|
|
16
|
-
*
|
|
17
|
-
* field.setValue('test@mail.com');
|
|
18
|
-
* await field.validate();
|
|
19
|
-
* console.log(field.valid.value); // true
|
|
20
|
-
* ```
|
|
21
|
-
*/
|
|
22
|
-
export declare class FieldNode<T> extends FormNode<T> {
|
|
23
|
-
private _value;
|
|
24
|
-
private _errors;
|
|
25
|
-
private _componentProps;
|
|
26
|
-
/**
|
|
27
|
-
* State machine для управления статусом поля
|
|
28
|
-
* Централизует логику переходов между valid/invalid/pending/disabled
|
|
29
|
-
*/
|
|
30
|
-
private readonly statusMachine;
|
|
31
|
-
readonly value: ReadonlySignal<T>;
|
|
32
|
-
readonly valid: ReadonlySignal<boolean>;
|
|
33
|
-
readonly invalid: ReadonlySignal<boolean>;
|
|
34
|
-
readonly pending: ReadonlySignal<boolean>;
|
|
35
|
-
readonly status: ReadonlySignal<FieldStatus>;
|
|
36
|
-
readonly disabled: ReadonlySignal<boolean>;
|
|
37
|
-
readonly errors: ReadonlySignal<ValidationError[]>;
|
|
38
|
-
readonly componentProps: ReadonlySignal<Record<string, unknown>>;
|
|
39
|
-
/**
|
|
40
|
-
* Вычисляемое свойство: нужно ли показывать ошибку
|
|
41
|
-
* Ошибка показывается если поле невалидно И (touched ИЛИ dirty)
|
|
42
|
-
*/
|
|
43
|
-
readonly shouldShowError: ReadonlySignal<boolean>;
|
|
44
|
-
private validators;
|
|
45
|
-
private asyncValidators;
|
|
46
|
-
private updateOn;
|
|
47
|
-
private initialValue;
|
|
48
|
-
private currentAbortController?;
|
|
49
|
-
private debounceMs;
|
|
50
|
-
private validateDebounceTimer?;
|
|
51
|
-
/**
|
|
52
|
-
* Pending debounced validation state
|
|
53
|
-
* Contains resolve function and AbortController for cancellation
|
|
54
|
-
*/
|
|
55
|
-
private pendingValidation?;
|
|
56
|
-
/**
|
|
57
|
-
* Менеджер подписок для централизованного cleanup
|
|
58
|
-
* Использует SubscriptionManager вместо массива для управления подписками
|
|
59
|
-
*/
|
|
60
|
-
private disposers;
|
|
61
|
-
readonly component: FieldConfig<T>['component'];
|
|
62
|
-
constructor(config: FieldConfig<T>);
|
|
63
|
-
getValue(): T;
|
|
64
|
-
setValue(value: T, options?: SetValueOptions): void;
|
|
65
|
-
patchValue(value: Partial<T>): void;
|
|
66
|
-
/**
|
|
67
|
-
* Сбросить поле к указанному значению (или к initialValue)
|
|
68
|
-
*
|
|
69
|
-
* @param value - опциональное значение для сброса. Если не указано, используется initialValue
|
|
70
|
-
*
|
|
71
|
-
* @remarks
|
|
72
|
-
* Этот метод:
|
|
73
|
-
* - Устанавливает значение в value или initialValue
|
|
74
|
-
* - Очищает ошибки валидации
|
|
75
|
-
* - Сбрасывает touched/dirty флаги
|
|
76
|
-
* - Устанавливает статус в 'valid'
|
|
77
|
-
*
|
|
78
|
-
* Если вам нужно сбросить к исходному значению, используйте resetToInitial()
|
|
79
|
-
*
|
|
80
|
-
* @example
|
|
81
|
-
* ```typescript
|
|
82
|
-
* // Сброс к initialValue
|
|
83
|
-
* field.reset();
|
|
84
|
-
*
|
|
85
|
-
* // Сброс к новому значению
|
|
86
|
-
* field.reset('new value');
|
|
87
|
-
* ```
|
|
88
|
-
*/
|
|
89
|
-
reset(value?: T): void;
|
|
90
|
-
/**
|
|
91
|
-
* Сбросить поле к исходному значению (initialValue)
|
|
92
|
-
*
|
|
93
|
-
* @remarks
|
|
94
|
-
* Алиас для reset() без параметров, но более явный:
|
|
95
|
-
* - resetToInitial() - явно показывает намерение вернуться к начальному значению
|
|
96
|
-
* - reset() - может принимать новое значение
|
|
97
|
-
*
|
|
98
|
-
* Полезно когда:
|
|
99
|
-
* - Пользователь нажал "Cancel" - вернуть форму в исходное состояние
|
|
100
|
-
* - Форма была изменена через reset(newValue), но нужно вернуться к самому началу
|
|
101
|
-
* - Явное намерение показать "отмену всех изменений"
|
|
102
|
-
*
|
|
103
|
-
* @example
|
|
104
|
-
* ```typescript
|
|
105
|
-
* const field = new FieldNode({ value: 'initial', component: Input });
|
|
106
|
-
*
|
|
107
|
-
* field.setValue('changed');
|
|
108
|
-
* field.reset('temp value');
|
|
109
|
-
* console.log(field.value.value); // 'temp value'
|
|
110
|
-
*
|
|
111
|
-
* field.resetToInitial();
|
|
112
|
-
* console.log(field.value.value); // 'initial'
|
|
113
|
-
* ```
|
|
114
|
-
*/
|
|
115
|
-
resetToInitial(): void;
|
|
116
|
-
/**
|
|
117
|
-
* Cancel any pending validation (debounced or running)
|
|
118
|
-
* @private
|
|
119
|
-
* @remarks
|
|
120
|
-
* Centralizes all cancellation logic:
|
|
121
|
-
* - Aborts pending debounced validation and resolves its promise
|
|
122
|
-
* - Clears debounce timer
|
|
123
|
-
* - Aborts currently running async validation
|
|
124
|
-
*/
|
|
125
|
-
private cancelPendingValidation;
|
|
126
|
-
/**
|
|
127
|
-
* Запустить валидацию поля
|
|
128
|
-
* @param options - опции валидации
|
|
129
|
-
* @returns `Promise<boolean>` - true если поле валидно
|
|
130
|
-
*
|
|
131
|
-
* @remarks
|
|
132
|
-
* Метод защищен от race conditions через AbortController.
|
|
133
|
-
* При быстром вводе только последняя валидация применяет результаты.
|
|
134
|
-
*
|
|
135
|
-
* @example
|
|
136
|
-
* ```typescript
|
|
137
|
-
* // Обычная валидация
|
|
138
|
-
* await field.validate();
|
|
139
|
-
*
|
|
140
|
-
* // С debounce
|
|
141
|
-
* await field.validate({ debounce: 300 });
|
|
142
|
-
* ```
|
|
143
|
-
*/
|
|
144
|
-
validate(options?: {
|
|
145
|
-
debounce?: number;
|
|
146
|
-
}): Promise<boolean>;
|
|
147
|
-
/**
|
|
148
|
-
* Немедленная валидация без debounce
|
|
149
|
-
* @private
|
|
150
|
-
* @param providedController - AbortController from debounced validate()
|
|
151
|
-
* @remarks
|
|
152
|
-
* Защищена от race conditions через AbortController:
|
|
153
|
-
* - Отменяет предыдущую валидацию при запуске новой (if no controller provided)
|
|
154
|
-
* - Передаёт AbortSignal в async валидаторы для отмены операций (например, fetch)
|
|
155
|
-
* - Проверяет signal.aborted в ключевых точках
|
|
156
|
-
*/
|
|
157
|
-
private validateImmediate;
|
|
158
|
-
setErrors(errors: ValidationError[]): void;
|
|
159
|
-
clearErrors(): void;
|
|
160
|
-
/**
|
|
161
|
-
* Hook: вызывается после markAsTouched()
|
|
162
|
-
*
|
|
163
|
-
* Для FieldNode: если updateOn === 'blur', запускаем валидацию
|
|
164
|
-
*/
|
|
165
|
-
protected onMarkAsTouched(): void;
|
|
166
|
-
/**
|
|
167
|
-
* Hook: вызывается после disable()
|
|
168
|
-
*
|
|
169
|
-
* Для FieldNode: синхронизируем statusMachine и очищаем ошибки
|
|
170
|
-
*/
|
|
171
|
-
protected onDisable(): void;
|
|
172
|
-
/**
|
|
173
|
-
* Hook: вызывается после enable()
|
|
174
|
-
*
|
|
175
|
-
* Для FieldNode: синхронизируем statusMachine и запускаем валидацию
|
|
176
|
-
*/
|
|
177
|
-
protected onEnable(): void;
|
|
178
|
-
/**
|
|
179
|
-
* Обновляет свойства компонента (например, опции для Select)
|
|
180
|
-
*
|
|
181
|
-
* @example
|
|
182
|
-
* ```typescript
|
|
183
|
-
* // Обновление опций для Select после загрузки справочников
|
|
184
|
-
* form.registrationAddress.city.updateComponentProps({
|
|
185
|
-
* options: cities
|
|
186
|
-
* });
|
|
187
|
-
* ```
|
|
188
|
-
*/
|
|
189
|
-
updateComponentProps(props: Partial<Record<string, unknown>>): void;
|
|
190
|
-
/**
|
|
191
|
-
* Динамически изменяет триггер валидации (updateOn)
|
|
192
|
-
* Полезно для адаптивной валидации - например, переключиться на instant feedback после первого submit
|
|
193
|
-
*
|
|
194
|
-
* @param updateOn - новый триггер валидации: 'change' | 'blur' | 'submit'
|
|
195
|
-
*
|
|
196
|
-
* @example
|
|
197
|
-
* ```typescript
|
|
198
|
-
* // Сценарий 1: Instant feedback после submit
|
|
199
|
-
* const form = createForm({
|
|
200
|
-
* email: {
|
|
201
|
-
* value: '',
|
|
202
|
-
* component: Input,
|
|
203
|
-
* updateOn: 'submit', // Изначально валидация только при submit
|
|
204
|
-
* validators: [required, email],
|
|
205
|
-
* },
|
|
206
|
-
* });
|
|
207
|
-
*
|
|
208
|
-
* await form.submit(async (values) => {
|
|
209
|
-
* // После submit переключаем на instant feedback
|
|
210
|
-
* form.email.setUpdateOn('change');
|
|
211
|
-
* await api.save(values);
|
|
212
|
-
* });
|
|
213
|
-
*
|
|
214
|
-
* // Теперь валидация происходит при каждом изменении
|
|
215
|
-
*
|
|
216
|
-
* // Сценарий 2: Прогрессивное улучшение
|
|
217
|
-
* form.email.setUpdateOn('blur'); // Сначала только при blur
|
|
218
|
-
* // ... пользователь начинает вводить ...
|
|
219
|
-
* form.email.setUpdateOn('change'); // Переключаем на change для real-time feedback
|
|
220
|
-
* ```
|
|
221
|
-
*/
|
|
222
|
-
setUpdateOn(updateOn: 'change' | 'blur' | 'submit'): void;
|
|
223
|
-
getUpdateOn(): 'change' | 'blur' | 'submit';
|
|
224
|
-
/**
|
|
225
|
-
* Подписка на изменения значения поля
|
|
226
|
-
* Автоматически отслеживает изменения через @preact/signals effect
|
|
227
|
-
*
|
|
228
|
-
* @param callback - Функция, вызываемая при изменении значения.
|
|
229
|
-
* Для async операций передается AbortSignal во втором параметре.
|
|
230
|
-
* @returns Функция отписки для cleanup
|
|
231
|
-
*
|
|
232
|
-
* @example
|
|
233
|
-
* ```typescript
|
|
234
|
-
* // Синхронный callback
|
|
235
|
-
* const unsubscribe = form.email.watch((value) => {
|
|
236
|
-
* console.log('Email changed:', value);
|
|
237
|
-
* });
|
|
238
|
-
*
|
|
239
|
-
* // Асинхронный callback с поддержкой отмены
|
|
240
|
-
* const unsubscribe = form.email.watch(async (value, signal) => {
|
|
241
|
-
* const result = await fetch('/api/validate', { signal });
|
|
242
|
-
* // ...
|
|
243
|
-
* });
|
|
244
|
-
*
|
|
245
|
-
* // Cleanup
|
|
246
|
-
* useEffect(() => unsubscribe, []);
|
|
247
|
-
* ```
|
|
248
|
-
*/
|
|
249
|
-
watch(callback: (value: T, signal: AbortSignal) => void | Promise<void>): () => void;
|
|
250
|
-
/**
|
|
251
|
-
* Вычисляемое значение из других полей
|
|
252
|
-
* Автоматически обновляет текущее поле при изменении источников
|
|
253
|
-
*
|
|
254
|
-
* @param sources - Массив ReadonlySignal для отслеживания
|
|
255
|
-
* @param computeFn - Функция вычисления нового значения
|
|
256
|
-
* @returns Функция отписки для cleanup
|
|
257
|
-
*
|
|
258
|
-
* @example
|
|
259
|
-
* ```typescript
|
|
260
|
-
* // Автоматический расчет первоначального взноса (20% от стоимости)
|
|
261
|
-
* const dispose = form.initialPayment.computeFrom(
|
|
262
|
-
* [form.propertyValue.value],
|
|
263
|
-
* (propertyValue) => {
|
|
264
|
-
* return propertyValue ? propertyValue * 0.2 : null;
|
|
265
|
-
* }
|
|
266
|
-
* );
|
|
267
|
-
*
|
|
268
|
-
* // Cleanup
|
|
269
|
-
* useEffect(() => dispose, []);
|
|
270
|
-
* ```
|
|
271
|
-
*/
|
|
272
|
-
computeFrom<TSource extends readonly unknown[]>(sources: ReadonlySignal<TSource[number]>[], computeFn: (...values: TSource) => T): () => void;
|
|
273
|
-
/**
|
|
274
|
-
* Очистить все ресурсы и таймеры
|
|
275
|
-
* Должен вызываться при unmount компонента
|
|
276
|
-
*
|
|
277
|
-
* @remarks
|
|
278
|
-
* Освобождает все ресурсы:
|
|
279
|
-
* - Отписывает все subscriptions через SubscriptionManager
|
|
280
|
-
* - Отменяет pending/running валидации через cancelPendingValidation()
|
|
281
|
-
*
|
|
282
|
-
* Использует try-finally для гарантированного cleanup даже при ошибках.
|
|
283
|
-
*
|
|
284
|
-
* @example
|
|
285
|
-
* ```typescript
|
|
286
|
-
* useEffect(() => {
|
|
287
|
-
* return () => {
|
|
288
|
-
* field.dispose();
|
|
289
|
-
* };
|
|
290
|
-
* }, []);
|
|
291
|
-
* ```
|
|
292
|
-
*/
|
|
293
|
-
dispose(): void;
|
|
294
|
-
}
|
|
@@ -1,326 +0,0 @@
|
|
|
1
|
-
import { ReadonlySignal, Signal } from '@preact/signals-core';
|
|
2
|
-
import { FieldStatus, ValidationError, ErrorFilterOptions } from '../types/index';
|
|
3
|
-
/**
|
|
4
|
-
* Опции для setValue
|
|
5
|
-
* @group Nodes
|
|
6
|
-
*/
|
|
7
|
-
export interface SetValueOptions {
|
|
8
|
-
/** Не вызывать событие изменения (не триггерить валидацию) */
|
|
9
|
-
emitEvent?: boolean;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Абстрактный базовый класс для всех узлов формы.
|
|
13
|
-
*
|
|
14
|
-
* Все узлы (поля, группы, массивы) наследуют от этого класса и реализуют
|
|
15
|
-
* единый интерфейс для работы с состоянием и валидацией.
|
|
16
|
-
*
|
|
17
|
-
* Template Method паттерн используется для управления состоянием:
|
|
18
|
-
* общие signals (`_touched`, `_dirty`, `_status`) живут в базовом классе,
|
|
19
|
-
* publi-методы (`markAsTouched`, `disable`, …) реализованы здесь, а protected
|
|
20
|
-
* hooks (`onMarkAsTouched`, `onDisable`, …) переопределяются в наследниках.
|
|
21
|
-
*
|
|
22
|
-
* @group Nodes
|
|
23
|
-
*
|
|
24
|
-
* @example
|
|
25
|
-
* ```typescript
|
|
26
|
-
* // FormNode не используется напрямую — экземпляры приходят из getReformerForm.
|
|
27
|
-
* import { getReformerForm, FormNode } from '@reformer/core';
|
|
28
|
-
*
|
|
29
|
-
* const form = getReformerForm({ email: '' });
|
|
30
|
-
* form.email instanceof FormNode; // true
|
|
31
|
-
* form.email.markAsTouched();
|
|
32
|
-
* ```
|
|
33
|
-
*/
|
|
34
|
-
export declare abstract class FormNode<T> {
|
|
35
|
-
/**
|
|
36
|
-
* Пользователь взаимодействовал с узлом (touched)
|
|
37
|
-
* Protected: наследники могут читать/изменять через методы
|
|
38
|
-
*/
|
|
39
|
-
protected _touched: Signal<boolean>;
|
|
40
|
-
/**
|
|
41
|
-
* Значение узла было изменено (dirty)
|
|
42
|
-
* Protected: наследники могут читать/изменять через методы
|
|
43
|
-
*/
|
|
44
|
-
protected _dirty: Signal<boolean>;
|
|
45
|
-
/**
|
|
46
|
-
* Текущий статус узла
|
|
47
|
-
* Protected: наследники могут читать/изменять через методы
|
|
48
|
-
*/
|
|
49
|
-
protected _status: Signal<FieldStatus>;
|
|
50
|
-
/**
|
|
51
|
-
* Пользователь взаимодействовал с узлом (touched)
|
|
52
|
-
* Computed из _touched для предоставления readonly интерфейса
|
|
53
|
-
*/
|
|
54
|
-
readonly touched: ReadonlySignal<boolean>;
|
|
55
|
-
/**
|
|
56
|
-
* Значение узла было изменено (dirty)
|
|
57
|
-
* Computed из _dirty для предоставления readonly интерфейса
|
|
58
|
-
*/
|
|
59
|
-
readonly dirty: ReadonlySignal<boolean>;
|
|
60
|
-
/**
|
|
61
|
-
* Текущий статус узла
|
|
62
|
-
* Computed из _status для предоставления readonly интерфейса
|
|
63
|
-
*/
|
|
64
|
-
readonly status: ReadonlySignal<FieldStatus>;
|
|
65
|
-
/**
|
|
66
|
-
* Узел отключен (disabled)
|
|
67
|
-
*/
|
|
68
|
-
readonly disabled: ReadonlySignal<boolean>;
|
|
69
|
-
/**
|
|
70
|
-
* Текущее значение узла
|
|
71
|
-
* - Для FieldNode: значение поля
|
|
72
|
-
* - Для GroupNode: объект со значениями всех полей
|
|
73
|
-
* - Для ArrayNode: массив значений элементов
|
|
74
|
-
*/
|
|
75
|
-
abstract readonly value: ReadonlySignal<T>;
|
|
76
|
-
/**
|
|
77
|
-
* Узел валиден (все валидаторы прошли успешно)
|
|
78
|
-
*/
|
|
79
|
-
abstract readonly valid: ReadonlySignal<boolean>;
|
|
80
|
-
/**
|
|
81
|
-
* Узел невалиден (есть ошибки валидации)
|
|
82
|
-
*/
|
|
83
|
-
abstract readonly invalid: ReadonlySignal<boolean>;
|
|
84
|
-
/**
|
|
85
|
-
* Выполняется асинхронная валидация
|
|
86
|
-
*/
|
|
87
|
-
abstract readonly pending: ReadonlySignal<boolean>;
|
|
88
|
-
/**
|
|
89
|
-
* Массив ошибок валидации
|
|
90
|
-
*/
|
|
91
|
-
abstract readonly errors: ReadonlySignal<ValidationError[]>;
|
|
92
|
-
/**
|
|
93
|
-
* Получить значение узла (non-reactive)
|
|
94
|
-
* Использует .peek() для получения значения без создания зависимости
|
|
95
|
-
*/
|
|
96
|
-
abstract getValue(): T;
|
|
97
|
-
/**
|
|
98
|
-
* Установить значение узла
|
|
99
|
-
* @param value - новое значение
|
|
100
|
-
* @param options - опции установки значения
|
|
101
|
-
*/
|
|
102
|
-
abstract setValue(value: T, options?: SetValueOptions): void;
|
|
103
|
-
/**
|
|
104
|
-
* Частично обновить значение узла
|
|
105
|
-
* Для FieldNode: работает как setValue
|
|
106
|
-
* Для GroupNode: обновляет только указанные поля
|
|
107
|
-
* Для ArrayNode: обновляет только указанные элементы
|
|
108
|
-
*
|
|
109
|
-
* @param value - частичное значение для обновления
|
|
110
|
-
*/
|
|
111
|
-
abstract patchValue(value: Partial<T>): void;
|
|
112
|
-
/**
|
|
113
|
-
* Сбросить узел к начальному состоянию
|
|
114
|
-
* @param value - опциональное новое начальное значение
|
|
115
|
-
*/
|
|
116
|
-
abstract reset(value?: T): void;
|
|
117
|
-
/**
|
|
118
|
-
* Запустить валидацию узла
|
|
119
|
-
* @returns `Promise<boolean>` - true если валидация успешна
|
|
120
|
-
*/
|
|
121
|
-
abstract validate(): Promise<boolean>;
|
|
122
|
-
/**
|
|
123
|
-
* Установить ошибки валидации извне
|
|
124
|
-
* @param errors - массив ошибок
|
|
125
|
-
*/
|
|
126
|
-
abstract setErrors(errors: ValidationError[]): void;
|
|
127
|
-
/**
|
|
128
|
-
* Очистить ошибки валидации
|
|
129
|
-
*/
|
|
130
|
-
abstract clearErrors(): void;
|
|
131
|
-
/**
|
|
132
|
-
* Получить ошибки валидации с фильтрацией
|
|
133
|
-
*
|
|
134
|
-
* Позволяет фильтровать ошибки по различным критериям:
|
|
135
|
-
* - По коду ошибки
|
|
136
|
-
* - По сообщению (частичное совпадение)
|
|
137
|
-
* - По параметрам
|
|
138
|
-
* - Через кастомный предикат
|
|
139
|
-
*
|
|
140
|
-
* Без параметров возвращает все ошибки (эквивалент errors.value)
|
|
141
|
-
*
|
|
142
|
-
* @param options - Опции фильтрации ошибок
|
|
143
|
-
* @returns Отфильтрованный массив ошибок валидации
|
|
144
|
-
*
|
|
145
|
-
* @example
|
|
146
|
-
* ```typescript
|
|
147
|
-
* // Все ошибки
|
|
148
|
-
* const allErrors = form.getErrors();
|
|
149
|
-
*
|
|
150
|
-
* // Ошибки с конкретным кодом
|
|
151
|
-
* const requiredErrors = form.getErrors({ code: 'required' });
|
|
152
|
-
*
|
|
153
|
-
* // Ошибки с несколькими кодами
|
|
154
|
-
* const errors = form.getErrors({ code: ['required', 'email'] });
|
|
155
|
-
*
|
|
156
|
-
* // Ошибки по сообщению
|
|
157
|
-
* const passwordErrors = form.getErrors({ message: 'Password' });
|
|
158
|
-
*
|
|
159
|
-
* // Ошибки по параметрам
|
|
160
|
-
* const minLengthErrors = form.getErrors({
|
|
161
|
-
* params: { minLength: 8 }
|
|
162
|
-
* });
|
|
163
|
-
*
|
|
164
|
-
* // Кастомная фильтрация
|
|
165
|
-
* const customErrors = form.getErrors({
|
|
166
|
-
* predicate: (err) => err.code.startsWith('custom_')
|
|
167
|
-
* });
|
|
168
|
-
* ```
|
|
169
|
-
*/
|
|
170
|
-
getErrors(options?: ErrorFilterOptions): ValidationError[];
|
|
171
|
-
/**
|
|
172
|
-
* Отметить узел как touched (пользователь взаимодействовал)
|
|
173
|
-
*
|
|
174
|
-
* Template Method: обновляет signal в базовом классе,
|
|
175
|
-
* вызывает hook для кастомной логики в наследниках
|
|
176
|
-
*/
|
|
177
|
-
markAsTouched(): void;
|
|
178
|
-
/**
|
|
179
|
-
* Отметить узел как untouched
|
|
180
|
-
*
|
|
181
|
-
* Template Method: обновляет signal в базовом классе,
|
|
182
|
-
* вызывает hook для кастомной логики в наследниках
|
|
183
|
-
*/
|
|
184
|
-
markAsUntouched(): void;
|
|
185
|
-
/**
|
|
186
|
-
* Отметить узел как dirty (значение изменено)
|
|
187
|
-
*
|
|
188
|
-
* Template Method: обновляет signal в базовом классе,
|
|
189
|
-
* вызывает hook для кастомной логики в наследниках
|
|
190
|
-
*/
|
|
191
|
-
markAsDirty(): void;
|
|
192
|
-
/**
|
|
193
|
-
* Отметить узел как pristine (значение не изменено)
|
|
194
|
-
*
|
|
195
|
-
* Template Method: обновляет signal в базовом классе,
|
|
196
|
-
* вызывает hook для кастомной логики в наследниках
|
|
197
|
-
*/
|
|
198
|
-
markAsPristine(): void;
|
|
199
|
-
/**
|
|
200
|
-
* Пометить все поля (включая вложенные) как touched
|
|
201
|
-
* Алиас для markAsTouched(), но более явно показывает намерение
|
|
202
|
-
* пометить ВСЕ поля рекурсивно
|
|
203
|
-
*
|
|
204
|
-
* Полезно для:
|
|
205
|
-
* - Показа всех ошибок валидации перед submit
|
|
206
|
-
* - Принудительного отображения ошибок при нажатии "Validate All"
|
|
207
|
-
* - Отображения невалидных полей в wizard/step form
|
|
208
|
-
*
|
|
209
|
-
* @example
|
|
210
|
-
* ```typescript
|
|
211
|
-
* // Показать все ошибки перед submit
|
|
212
|
-
* form.touchAll();
|
|
213
|
-
* const isValid = await form.validate();
|
|
214
|
-
* if (!isValid) {
|
|
215
|
-
* // Все ошибки теперь видны пользователю
|
|
216
|
-
* }
|
|
217
|
-
*
|
|
218
|
-
* // Или использовать submit() который уже вызывает touchAll
|
|
219
|
-
* await form.submit(async (values) => {
|
|
220
|
-
* await api.save(values);
|
|
221
|
-
* });
|
|
222
|
-
* ```
|
|
223
|
-
*/
|
|
224
|
-
touchAll(): void;
|
|
225
|
-
/**
|
|
226
|
-
* Отключить узел
|
|
227
|
-
*
|
|
228
|
-
* Template Method: обновляет статус в базовом классе,
|
|
229
|
-
* вызывает hook для кастомной логики в наследниках
|
|
230
|
-
*
|
|
231
|
-
* Отключенные узлы не проходят валидацию и не включаются в getValue()
|
|
232
|
-
*/
|
|
233
|
-
disable(): void;
|
|
234
|
-
/**
|
|
235
|
-
* Включить узел
|
|
236
|
-
*
|
|
237
|
-
* Template Method: обновляет статус в базовом классе,
|
|
238
|
-
* вызывает hook для кастомной логики в наследниках
|
|
239
|
-
*/
|
|
240
|
-
enable(): void;
|
|
241
|
-
/**
|
|
242
|
-
* Очистить все ресурсы узла
|
|
243
|
-
* Должен вызываться при unmount компонента для предотвращения memory leaks
|
|
244
|
-
*
|
|
245
|
-
* @example
|
|
246
|
-
* ```typescript
|
|
247
|
-
* // React component
|
|
248
|
-
* useEffect(() => {
|
|
249
|
-
* return () => {
|
|
250
|
-
* form.dispose(); // Cleanup при unmount
|
|
251
|
-
* };
|
|
252
|
-
* }, []);
|
|
253
|
-
* ```
|
|
254
|
-
*/
|
|
255
|
-
dispose?(): void;
|
|
256
|
-
/**
|
|
257
|
-
* Hook: вызывается после markAsTouched()
|
|
258
|
-
*
|
|
259
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
260
|
-
* - GroupNode: пометить все дочерние узлы как touched
|
|
261
|
-
* - ArrayNode: пометить все элементы массива как touched
|
|
262
|
-
* - FieldNode: пустая реализация (нет дочерних узлов)
|
|
263
|
-
*
|
|
264
|
-
* @example
|
|
265
|
-
* ```typescript
|
|
266
|
-
* // GroupNode
|
|
267
|
-
* protected onMarkAsTouched(): void {
|
|
268
|
-
* this.fields.forEach(field => field.markAsTouched());
|
|
269
|
-
* }
|
|
270
|
-
* ```
|
|
271
|
-
*/
|
|
272
|
-
protected onMarkAsTouched(): void;
|
|
273
|
-
/**
|
|
274
|
-
* Hook: вызывается после markAsUntouched()
|
|
275
|
-
*
|
|
276
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
277
|
-
* - GroupNode: пометить все дочерние узлы как untouched
|
|
278
|
-
* - ArrayNode: пометить все элементы массива как untouched
|
|
279
|
-
* - FieldNode: пустая реализация (нет дочерних узлов)
|
|
280
|
-
*/
|
|
281
|
-
protected onMarkAsUntouched(): void;
|
|
282
|
-
/**
|
|
283
|
-
* Hook: вызывается после markAsDirty()
|
|
284
|
-
*
|
|
285
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
286
|
-
* - GroupNode: может обновить родительскую форму
|
|
287
|
-
* - ArrayNode: может обновить родительскую форму
|
|
288
|
-
* - FieldNode: пустая реализация
|
|
289
|
-
*/
|
|
290
|
-
protected onMarkAsDirty(): void;
|
|
291
|
-
/**
|
|
292
|
-
* Hook: вызывается после markAsPristine()
|
|
293
|
-
*
|
|
294
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
295
|
-
* - GroupNode: пометить все дочерние узлы как pristine
|
|
296
|
-
* - ArrayNode: пометить все элементы массива как pristine
|
|
297
|
-
* - FieldNode: пустая реализация
|
|
298
|
-
*/
|
|
299
|
-
protected onMarkAsPristine(): void;
|
|
300
|
-
/**
|
|
301
|
-
* Hook: вызывается после disable()
|
|
302
|
-
*
|
|
303
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
304
|
-
* - GroupNode: отключить все дочерние узлы
|
|
305
|
-
* - ArrayNode: отключить все элементы массива
|
|
306
|
-
* - FieldNode: очистить ошибки валидации
|
|
307
|
-
*
|
|
308
|
-
* @example
|
|
309
|
-
* ```typescript
|
|
310
|
-
* // GroupNode
|
|
311
|
-
* protected onDisable(): void {
|
|
312
|
-
* this.fields.forEach(field => field.disable());
|
|
313
|
-
* }
|
|
314
|
-
* ```
|
|
315
|
-
*/
|
|
316
|
-
protected onDisable(): void;
|
|
317
|
-
/**
|
|
318
|
-
* Hook: вызывается после enable()
|
|
319
|
-
*
|
|
320
|
-
* Переопределите в наследниках для дополнительной логики:
|
|
321
|
-
* - GroupNode: включить все дочерние узлы
|
|
322
|
-
* - ArrayNode: включить все элементы массива
|
|
323
|
-
* - FieldNode: пустая реализация
|
|
324
|
-
*/
|
|
325
|
-
protected onEnable(): void;
|
|
326
|
-
}
|