@reformer/core 9.0.0-beta.2 → 9.1.0
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/behaviors-node-BMOI2JJF.js +26 -0
- package/dist/behaviors-value-lCpqicfa.js +148 -0
- package/dist/behaviors.d.ts +2 -133
- package/dist/behaviors.js +29 -28
- package/dist/{core/utils → form}/aggregate-signals.d.ts +2 -2
- package/dist/form/behaviors-node.d.ts +55 -0
- package/dist/form/behaviors.d.ts +133 -0
- package/dist/{core/utils → form}/create-form.d.ts +5 -4
- package/dist/{core/utils → form}/error-handler.d.ts +1 -1
- package/dist/{core → form}/factories/node-factory.d.ts +1 -1
- package/dist/{core/utils → form}/form-proxy-builder.d.ts +2 -2
- package/dist/{hooks → form/hooks}/types.d.ts +1 -1
- package/dist/{hooks → form/hooks}/useArrayLength.d.ts +1 -1
- package/dist/{hooks → form/hooks}/useFormControl.d.ts +3 -3
- package/dist/{hooks → form/hooks}/useFormControlValue.d.ts +2 -2
- package/dist/form/index.d.ts +36 -0
- package/dist/{core → form}/nodes/array-node.d.ts +1 -1
- package/dist/{core → form}/nodes/field-node.d.ts +1 -1
- package/dist/{core → form}/nodes/form-node.d.ts +1 -1
- package/dist/{core → form}/nodes/group-node.d.ts +2 -2
- package/dist/{core → form}/nodes/model-array-node.d.ts +2 -2
- package/dist/{core/utils → form}/signal-node-registry.d.ts +1 -1
- package/dist/{core/utils → form}/status-machine.d.ts +1 -1
- package/dist/{core/utils → form}/type-guards.d.ts +5 -5
- package/dist/{core/types/index.d.ts → form/types/contracts.d.ts} +11 -90
- package/dist/form/types/index.d.ts +91 -0
- package/dist/{core → form}/types/schema-node.d.ts +1 -1
- package/dist/{core → form}/types/validation-schema.d.ts +1 -1
- package/dist/{core/model/validate-model.d.ts → form/validate-model-core.d.ts} +25 -25
- package/dist/form/validate-model.d.ts +27 -0
- package/dist/form/validators.d.ts +6 -0
- package/dist/form-model-C8Fi83k4.js +439 -0
- package/dist/index.d.ts +11 -16
- package/dist/index.js +663 -1016
- package/dist/{core/model/behaviors.d.ts → state/behaviors-value.d.ts} +0 -53
- package/dist/state/form-model.d.ts +26 -0
- package/dist/state/index.d.ts +31 -0
- package/dist/{core/utils → state}/safe-effect.d.ts +4 -4
- package/dist/{core/model → state}/types.d.ts +14 -11
- package/dist/state.d.ts +2 -0
- package/dist/state.js +19 -0
- package/dist/validators/email.d.ts +1 -1
- package/dist/validators/future-date.d.ts +1 -1
- package/dist/validators/integer.d.ts +1 -1
- package/dist/validators/is-date.d.ts +1 -1
- package/dist/validators/is-number.d.ts +1 -1
- package/dist/validators/max-age.d.ts +1 -1
- package/dist/validators/max-date.d.ts +1 -1
- package/dist/validators/max-length.d.ts +1 -1
- package/dist/validators/max.d.ts +1 -1
- package/dist/validators/min-age.d.ts +1 -1
- package/dist/validators/min-date.d.ts +1 -1
- package/dist/validators/min-length.d.ts +1 -1
- package/dist/validators/min.d.ts +1 -1
- package/dist/validators/multiple-of.d.ts +1 -1
- package/dist/validators/non-negative.d.ts +1 -1
- package/dist/validators/non-zero.d.ts +1 -1
- package/dist/validators/past-date.d.ts +1 -1
- package/dist/validators/pattern.d.ts +1 -1
- package/dist/validators/phone.d.ts +1 -1
- package/dist/validators/required.d.ts +1 -1
- package/dist/validators/url.d.ts +1 -1
- package/dist/validators.d.ts +6 -6
- package/llms.txt +161 -147
- package/package.json +5 -1
- package/dist/behaviors-Br4Im38V.js +0 -263
- package/dist/core/model/form-model.d.ts +0 -18
- package/dist/core/model/index.d.ts +0 -12
- package/dist/core/utils/index.d.ts +0 -18
- /package/dist/{core → form}/factories/index.d.ts +0 -0
- /package/dist/{core/utils → form}/form-submitter.d.ts +0 -0
- /package/dist/{hooks → form/hooks}/useSignalSubscription.d.ts +0 -0
- /package/dist/{core → form}/types/deep-schema.d.ts +0 -0
- /package/dist/{core → form}/types/form-proxy.d.ts +0 -0
- /package/dist/{core/utils → form}/unique-id.d.ts +0 -0
- /package/dist/{core → form}/validation/index.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/date-utils.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/email.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/future-date.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/index.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/integer.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/is-date.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/is-number.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/max-age.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/max-date.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/max-length.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/max.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/min-age.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/min-date.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/min-length.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/min.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/multiple-of.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/non-negative.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/non-zero.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/past-date.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/pattern.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/phone.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/required.d.ts +0 -0
- /package/dist/{core → form}/validation/validators/url.d.ts +0 -0
- /package/dist/{core/utils → state}/derived-registry.d.ts +0 -0
- /package/dist/{core/utils → state}/subscription-manager.d.ts +0 -0
package/llms.txt
CHANGED
|
@@ -242,7 +242,7 @@ model.properties.length; // реактивная длина
|
|
|
242
242
|
```typescript
|
|
243
243
|
// Модель данных (источник истины значений)
|
|
244
244
|
createModel<T extends object>(initial: T): FormModel<T>
|
|
245
|
-
// model.get() / model.set(
|
|
245
|
+
// model.get() / model.set(full) / model.patch(partial) / model.isDirty()
|
|
246
246
|
// model.reset() / model.captureInitial() / model.signalAt(path)
|
|
247
247
|
// model.$.field → PathAwareSignal<FieldType> (escape-hatch к сигналу)
|
|
248
248
|
// model.arrayField → ModelArray<Item> (push/removeAt/insertAt/move/swap/clear/at/map/length)
|
|
@@ -937,20 +937,21 @@ const form = createForm<MyForm>({ model, schema });
|
|
|
937
937
|
|
|
938
938
|
### Nested Objects
|
|
939
939
|
|
|
940
|
-
Вложенная группа —
|
|
941
|
-
|
|
940
|
+
Вложенная группа модели — это сама по себе под-модель `FormModel<Sub>` (доступна как `model.<group>`,
|
|
941
|
+
с `.$`/API). Удобно вынести в builder, принимающий `FormModel<Sub>` — симметрично builder'у элемента
|
|
942
|
+
массива. Сигналы под-модели идентичны корневым: `model.address.$.city === model.$.address.city`.
|
|
942
943
|
|
|
943
944
|
```typescript
|
|
944
|
-
import type {
|
|
945
|
+
import type { FormModel } from '@reformer/core';
|
|
945
946
|
|
|
946
|
-
const addressNodes = (
|
|
947
|
-
street: { value:
|
|
948
|
-
city: { value:
|
|
949
|
-
zip: { value:
|
|
947
|
+
const addressNodes = (m: FormModel<Address>) => ({
|
|
948
|
+
street: { value: m.$.street, component: Input, componentProps: { label: 'Street' } },
|
|
949
|
+
city: { value: m.$.city, component: Input, componentProps: { label: 'City' } },
|
|
950
|
+
zip: { value: m.$.zip, component: Input, componentProps: { label: 'ZIP' } },
|
|
950
951
|
});
|
|
951
952
|
|
|
952
953
|
const schema = {
|
|
953
|
-
address: addressNodes(model
|
|
954
|
+
address: addressNodes(model.address),
|
|
954
955
|
};
|
|
955
956
|
```
|
|
956
957
|
|
|
@@ -1963,11 +1964,12 @@ const count = useArrayLength(control.items);
|
|
|
1963
1964
|
// value-доступ (реактивно внутри effect/computed, запись присваиванием)
|
|
1964
1965
|
model.email; // читать
|
|
1965
1966
|
model.email = 'a@b.c'; // писать
|
|
1966
|
-
model.address.city; // вложенное поле
|
|
1967
|
+
model.address.city; // вложенное поле (model.address — под-модель FormModel<Address>)
|
|
1967
1968
|
|
|
1968
1969
|
// через сигнал (escape-hatch)
|
|
1969
1970
|
model.$.email.value; // реактивное чтение/запись
|
|
1970
1971
|
model.$.email.peek(); // нереактивный снимок
|
|
1972
|
+
model.$.address.city.value; // сигнал вложенного поля (≡ model.address.$.city у под-модели)
|
|
1971
1973
|
|
|
1972
1974
|
// весь объект
|
|
1973
1975
|
model.get(); // снимок { email, address: { city }, ... } — для submit
|
|
@@ -2962,7 +2964,7 @@ A: Передай в колбэк под-схему только этого по
|
|
|
2962
2964
|
// Модель (источник истины значений):
|
|
2963
2965
|
interface ModelApi<T> {
|
|
2964
2966
|
get(): T; // снимок значений — для submit
|
|
2965
|
-
set(value:
|
|
2967
|
+
set(value: T): void; // полная установка (все ключи T)
|
|
2966
2968
|
patch(value: Partial<T>): void; // частичное слияние
|
|
2967
2969
|
isDirty(): boolean; // отличаются ли значения от initial-снимка
|
|
2968
2970
|
reset(): void; // вернуть к initial-снимку
|
|
@@ -3083,7 +3085,7 @@ import { createModel, validateModel } from '@reformer/core';
|
|
|
3083
3085
|
|
|
3084
3086
|
async function processFormPayload(rawData: Partial<MyForm>) {
|
|
3085
3087
|
const model = createModel<MyForm>(initialValues);
|
|
3086
|
-
model.
|
|
3088
|
+
model.patch(rawData); // частичный load данных
|
|
3087
3089
|
|
|
3088
3090
|
const result = await validateModel(model, schema); // без нод — просто данные
|
|
3089
3091
|
if (!result.valid) return { ok: false, errors: result.errors };
|
|
@@ -3166,8 +3168,8 @@ race-guard через deps). Динамические `componentProps` (опци
|
|
|
3166
3168
|
|
|
3167
3169
|
```typescript
|
|
3168
3170
|
// Модель:
|
|
3169
|
-
model.set(value:
|
|
3170
|
-
model.patch(value: Partial<T>): void; // частичное слияние (
|
|
3171
|
+
model.set(value: T): void; // полная установка значений (load полного DTO). Не меняет initial.
|
|
3172
|
+
model.patch(value: Partial<T>): void; // частичное слияние (только переданные ключи). Не меняет initial.
|
|
3171
3173
|
model.reset(): void; // вернуть к initial-снимку
|
|
3172
3174
|
model.captureInitial(): void; // сделать текущие значения новым initial-снимком
|
|
3173
3175
|
|
|
@@ -3695,7 +3697,7 @@ _Auto-generated from JSDoc on public exports._
|
|
|
3695
3697
|
export type AnyFunction = (...args: never[]) => unknown;
|
|
3696
3698
|
```
|
|
3697
3699
|
|
|
3698
|
-
_Source: src/
|
|
3700
|
+
_Source: src/form/types/index.ts_
|
|
3699
3701
|
|
|
3700
3702
|
### ArrayConfig
|
|
3701
3703
|
|
|
@@ -3711,7 +3713,7 @@ export interface ArrayConfig<T extends object> {
|
|
|
3711
3713
|
}
|
|
3712
3714
|
```
|
|
3713
3715
|
|
|
3714
|
-
_Source: src/
|
|
3716
|
+
_Source: src/form/types/deep-schema.ts_
|
|
3715
3717
|
|
|
3716
3718
|
### ArrayControlState
|
|
3717
3719
|
|
|
@@ -3877,7 +3879,7 @@ Add Phone
|
|
|
3877
3879
|
- {@link useFormControl} - хук для получения состояния
|
|
3878
3880
|
- {@link FieldControlState} - состояние для полей
|
|
3879
3881
|
|
|
3880
|
-
_Source: src/hooks/types.ts_
|
|
3882
|
+
_Source: src/form/hooks/types.ts_
|
|
3881
3883
|
|
|
3882
3884
|
### ArrayNode
|
|
3883
3885
|
|
|
@@ -3906,7 +3908,7 @@ array.at(0)?.title.setValue('Updated');
|
|
|
3906
3908
|
console.log(array.length.value); // 1
|
|
3907
3909
|
```
|
|
3908
3910
|
|
|
3909
|
-
_Source: src/
|
|
3911
|
+
_Source: src/form/nodes/array-node.ts_
|
|
3910
3912
|
|
|
3911
3913
|
### ArrayNodeLike
|
|
3912
3914
|
|
|
@@ -3923,7 +3925,7 @@ export interface ArrayNodeLike {
|
|
|
3923
3925
|
}
|
|
3924
3926
|
```
|
|
3925
3927
|
|
|
3926
|
-
_Source: src/
|
|
3928
|
+
_Source: src/form/types/index.ts_
|
|
3927
3929
|
|
|
3928
3930
|
### AsyncValidator
|
|
3929
3931
|
|
|
@@ -3945,7 +3947,7 @@ export type AsyncValidator<TForm, TField> = (
|
|
|
3945
3947
|
потребляется — живой async-путь узла поля использует `AsyncValidatorFn` `(value, { signal })`.
|
|
3946
3948
|
Экспортируется только ради обратной совместимости.
|
|
3947
3949
|
|
|
3948
|
-
_Source: src/
|
|
3950
|
+
_Source: src/form/types/validation-schema.ts_
|
|
3949
3951
|
|
|
3950
3952
|
### AsyncValidatorFn
|
|
3951
3953
|
|
|
@@ -3985,7 +3987,7 @@ const emailExistsAbortable: AsyncValidatorFn<string> = async (value, options) =>
|
|
|
3985
3987
|
};
|
|
3986
3988
|
```
|
|
3987
3989
|
|
|
3988
|
-
_Source: src/
|
|
3990
|
+
_Source: src/form/types/contracts.ts_
|
|
3989
3991
|
|
|
3990
3992
|
### AsyncValidatorOptions
|
|
3991
3993
|
|
|
@@ -4004,7 +4006,7 @@ export interface AsyncValidatorOptions {
|
|
|
4004
4006
|
}
|
|
4005
4007
|
```
|
|
4006
4008
|
|
|
4007
|
-
_Source: src/
|
|
4009
|
+
_Source: src/form/types/contracts.ts_
|
|
4008
4010
|
|
|
4009
4011
|
### BehaviorCleanup
|
|
4010
4012
|
|
|
@@ -4017,7 +4019,7 @@ _Source: src/core/types/index.ts_
|
|
|
4017
4019
|
export type BehaviorCleanup = () => void;
|
|
4018
4020
|
```
|
|
4019
4021
|
|
|
4020
|
-
_Source: src/
|
|
4022
|
+
_Source: src/state/behaviors-value.ts_
|
|
4021
4023
|
|
|
4022
4024
|
### computeFrom
|
|
4023
4025
|
|
|
@@ -4048,7 +4050,7 @@ export function computeFrom<R>(
|
|
|
4048
4050
|
computeFrom([model.$.price, model.$.qty], model.$.total, (price, qty) => price * qty);
|
|
4049
4051
|
```
|
|
4050
4052
|
|
|
4051
|
-
_Source: src/
|
|
4053
|
+
_Source: src/state/behaviors-value.ts_
|
|
4052
4054
|
|
|
4053
4055
|
### ConditionFn
|
|
4054
4056
|
|
|
@@ -4064,7 +4066,7 @@ export type ConditionFn<T> = (value: T) => boolean;
|
|
|
4064
4066
|
**Deprecated:** Осиротевший остаток удалённого оператора `applyWhen` (Ф7). Рантаймом не
|
|
4065
4067
|
потребляется; экспортируется только ради обратной совместимости.
|
|
4066
4068
|
|
|
4067
|
-
_Source: src/
|
|
4069
|
+
_Source: src/form/types/validation-schema.ts_
|
|
4068
4070
|
|
|
4069
4071
|
### ConfigWithSchema
|
|
4070
4072
|
|
|
@@ -4080,7 +4082,7 @@ export interface ConfigWithSchema {
|
|
|
4080
4082
|
}
|
|
4081
4083
|
```
|
|
4082
4084
|
|
|
4083
|
-
_Source: src/
|
|
4085
|
+
_Source: src/form/types/index.ts_
|
|
4084
4086
|
|
|
4085
4087
|
### ConfigWithValue
|
|
4086
4088
|
|
|
@@ -4095,7 +4097,7 @@ export interface ConfigWithValue {
|
|
|
4095
4097
|
}
|
|
4096
4098
|
```
|
|
4097
4099
|
|
|
4098
|
-
_Source: src/
|
|
4100
|
+
_Source: src/form/types/index.ts_
|
|
4099
4101
|
|
|
4100
4102
|
### copyFrom
|
|
4101
4103
|
|
|
@@ -4118,7 +4120,7 @@ export function copyFrom<T>(
|
|
|
4118
4120
|
copyFrom(model.$.email, model.$.emailAdditional, { when: () => model.sameEmail });
|
|
4119
4121
|
```
|
|
4120
4122
|
|
|
4121
|
-
_Source: src/
|
|
4123
|
+
_Source: src/state/behaviors-value.ts_
|
|
4122
4124
|
|
|
4123
4125
|
### createForm
|
|
4124
4126
|
|
|
@@ -4174,7 +4176,7 @@ form.email.setValue('test@mail.com');
|
|
|
4174
4176
|
const { valid } = await validateFormModel(model, schema);
|
|
4175
4177
|
```
|
|
4176
4178
|
|
|
4177
|
-
_Source: src/
|
|
4179
|
+
_Source: src/form/create-form.ts_
|
|
4178
4180
|
|
|
4179
4181
|
### createFormFromModel
|
|
4180
4182
|
|
|
@@ -4217,6 +4219,7 @@ const schema = {
|
|
|
4217
4219
|
component: Section,
|
|
4218
4220
|
children: [
|
|
4219
4221
|
{ value: model.$.email, component: Input, validators: [required] },
|
|
4222
|
+
// вложенная группа: `model.$.profile.name` (≡ под-модель `model.profile.$.name` — тот же сигнал)
|
|
4220
4223
|
{ value: model.$.profile.name, component: Input },
|
|
4221
4224
|
],
|
|
4222
4225
|
};
|
|
@@ -4231,7 +4234,7 @@ console.log(model.email); // 'user@mail.com'
|
|
|
4231
4234
|
**See also:**
|
|
4232
4235
|
- {@link createForm} - основная фабрика (диспетчеризует сюда при аргументе `{ model, schema }`)
|
|
4233
4236
|
|
|
4234
|
-
_Source: src/
|
|
4237
|
+
_Source: src/form/create-form.ts_
|
|
4235
4238
|
|
|
4236
4239
|
### CreateFormFromModelArgs
|
|
4237
4240
|
|
|
@@ -4258,7 +4261,7 @@ export interface CreateFormFromModelArgs<T> {
|
|
|
4258
4261
|
}
|
|
4259
4262
|
```
|
|
4260
4263
|
|
|
4261
|
-
_Source: src/
|
|
4264
|
+
_Source: src/form/create-form.ts_
|
|
4262
4265
|
|
|
4263
4266
|
### createModel
|
|
4264
4267
|
|
|
@@ -4279,14 +4282,22 @@ export function createModel<T extends object>(initial: T): FormModel<T>
|
|
|
4279
4282
|
**Examples:**
|
|
4280
4283
|
|
|
4281
4284
|
```typescript
|
|
4282
|
-
const model = createModel<{ email: string;
|
|
4285
|
+
const model = createModel<{ email: string; profile: { name: string }; tags: string[] }>({
|
|
4286
|
+
email: '',
|
|
4287
|
+
profile: { name: '' },
|
|
4288
|
+
tags: [],
|
|
4289
|
+
});
|
|
4283
4290
|
model.email = 'a@b.c';
|
|
4284
|
-
model.$.email.value;
|
|
4291
|
+
model.$.email.value; // 'a@b.c' (сигнал)
|
|
4292
|
+
// вложенная объект-группа — под-модель FormModel (value-доступ + `.$` + API):
|
|
4293
|
+
model.profile.name = 'Ada'; // value-запись
|
|
4294
|
+
model.$.profile.name.value; // 'Ada' (сигнал; ≡ model.profile.$.name у под-модели)
|
|
4295
|
+
model.profile.get(); // { name: 'Ada' }
|
|
4285
4296
|
model.tags.push('x');
|
|
4286
|
-
model.get();
|
|
4297
|
+
model.get(); // { email: 'a@b.c', profile: { name: 'Ada' }, tags: ['x'] }
|
|
4287
4298
|
```
|
|
4288
4299
|
|
|
4289
|
-
_Source: src/
|
|
4300
|
+
_Source: src/state/form-model.ts_
|
|
4290
4301
|
|
|
4291
4302
|
### disableWhen
|
|
4292
4303
|
|
|
@@ -4318,7 +4329,7 @@ export function disableWhen(
|
|
|
4318
4329
|
disableWhen(model.$.discount, () => model.plan !== 'promo', { resetOnDisable: true });
|
|
4319
4330
|
```
|
|
4320
4331
|
|
|
4321
|
-
_Source: src/
|
|
4332
|
+
_Source: src/form/behaviors-node.ts_
|
|
4322
4333
|
|
|
4323
4334
|
### email
|
|
4324
4335
|
|
|
@@ -4355,7 +4366,7 @@ validators: [required(), email({ message: 'Введите корректный e
|
|
|
4355
4366
|
},
|
|
4356
4367
|
```
|
|
4357
4368
|
|
|
4358
|
-
_Source: src/
|
|
4369
|
+
_Source: src/form/validation/validators/email.ts_
|
|
4359
4370
|
|
|
4360
4371
|
### enableWhen
|
|
4361
4372
|
|
|
@@ -4399,7 +4410,7 @@ compute(model.$.initialPayment, () => model.propertyValue * 0.2, {
|
|
|
4399
4410
|
});
|
|
4400
4411
|
```
|
|
4401
4412
|
|
|
4402
|
-
_Source: src/
|
|
4413
|
+
_Source: src/form/behaviors-node.ts_
|
|
4403
4414
|
|
|
4404
4415
|
### ErrorFilterOptions
|
|
4405
4416
|
|
|
@@ -4424,7 +4435,7 @@ export interface ErrorFilterOptions {
|
|
|
4424
4435
|
}
|
|
4425
4436
|
```
|
|
4426
4437
|
|
|
4427
|
-
_Source: src/
|
|
4438
|
+
_Source: src/form/types/contracts.ts_
|
|
4428
4439
|
|
|
4429
4440
|
### ErrorStrategy
|
|
4430
4441
|
|
|
@@ -4457,7 +4468,7 @@ export enum ErrorStrategy {
|
|
|
4457
4468
|
}
|
|
4458
4469
|
```
|
|
4459
4470
|
|
|
4460
|
-
_Source: src/
|
|
4471
|
+
_Source: src/form/error-handler.ts_
|
|
4461
4472
|
|
|
4462
4473
|
### FieldConfig
|
|
4463
4474
|
|
|
@@ -4495,7 +4506,7 @@ export interface FieldConfig<T> {
|
|
|
4495
4506
|
}
|
|
4496
4507
|
```
|
|
4497
4508
|
|
|
4498
|
-
_Source: src/
|
|
4509
|
+
_Source: src/form/types/deep-schema.ts_
|
|
4499
4510
|
|
|
4500
4511
|
### FieldControlState
|
|
4501
4512
|
|
|
@@ -4719,7 +4730,7 @@ onChange={e => control.setValue(e.target.value)}
|
|
|
4719
4730
|
- {@link useFormControl} - хук для получения состояния
|
|
4720
4731
|
- {@link ArrayControlState} - состояние для массивов
|
|
4721
4732
|
|
|
4722
|
-
_Source: src/hooks/types.ts_
|
|
4733
|
+
_Source: src/form/hooks/types.ts_
|
|
4723
4734
|
|
|
4724
4735
|
### FieldNode
|
|
4725
4736
|
|
|
@@ -4749,7 +4760,7 @@ await field.validate();
|
|
|
4749
4760
|
console.log(field.valid.value); // true
|
|
4750
4761
|
```
|
|
4751
4762
|
|
|
4752
|
-
_Source: src/
|
|
4763
|
+
_Source: src/form/nodes/field-node.ts_
|
|
4753
4764
|
|
|
4754
4765
|
### FieldPathSegment
|
|
4755
4766
|
|
|
@@ -4766,7 +4777,7 @@ export type FieldPathSegment = {
|
|
|
4766
4777
|
};
|
|
4767
4778
|
```
|
|
4768
4779
|
|
|
4769
|
-
_Source: src/
|
|
4780
|
+
_Source: src/form/types/index.ts_
|
|
4770
4781
|
|
|
4771
4782
|
### FieldStatus
|
|
4772
4783
|
|
|
@@ -4779,7 +4790,7 @@ _Source: src/core/types/index.ts_
|
|
|
4779
4790
|
export type FieldStatus = 'valid' | 'invalid' | 'pending' | 'disabled';
|
|
4780
4791
|
```
|
|
4781
4792
|
|
|
4782
|
-
_Source: src/
|
|
4793
|
+
_Source: src/form/types/contracts.ts_
|
|
4783
4794
|
|
|
4784
4795
|
### FormArrayProxy
|
|
4785
4796
|
|
|
@@ -4833,7 +4844,7 @@ todos.forEach((item, i) => {
|
|
|
4833
4844
|
});
|
|
4834
4845
|
```
|
|
4835
4846
|
|
|
4836
|
-
_Source: src/
|
|
4847
|
+
_Source: src/form/types/form-proxy.ts_
|
|
4837
4848
|
|
|
4838
4849
|
### FormControlsProxy
|
|
4839
4850
|
|
|
@@ -4865,7 +4876,7 @@ export type FormControlsProxy<T> = {
|
|
|
4865
4876
|
};
|
|
4866
4877
|
```
|
|
4867
4878
|
|
|
4868
|
-
_Source: src/
|
|
4879
|
+
_Source: src/form/types/form-proxy.ts_
|
|
4869
4880
|
|
|
4870
4881
|
### FormErrorHandler
|
|
4871
4882
|
|
|
@@ -4947,20 +4958,22 @@ try {
|
|
|
4947
4958
|
}
|
|
4948
4959
|
```
|
|
4949
4960
|
|
|
4950
|
-
_Source: src/
|
|
4961
|
+
_Source: src/form/error-handler.ts_
|
|
4951
4962
|
|
|
4952
4963
|
### FormModel
|
|
4953
4964
|
|
|
4954
4965
|
**Kind:** `type`
|
|
4955
4966
|
|
|
4956
|
-
FormModel —
|
|
4967
|
+
FormModel — под-модель объекта `T`: value-доступ ({@link ModelObject}) + `.$`-сигналы + {@link ModelApi}
|
|
4968
|
+
(get/set/patch/isDirty/reset/signalAt). Вложенные объекты-группы модели — тоже {@link FormModel}
|
|
4969
|
+
(доступны как `model.<group>`), поэтому `model.<group>.$.<field>` эквивалентно `model.$.<group>.<field>`.
|
|
4957
4970
|
|
|
4958
4971
|
**Signature:**
|
|
4959
4972
|
```typescript
|
|
4960
4973
|
export type FormModel<T> = ModelObject<T> & ModelApi<T>;
|
|
4961
4974
|
```
|
|
4962
4975
|
|
|
4963
|
-
_Source: src/
|
|
4976
|
+
_Source: src/state/types.ts_
|
|
4964
4977
|
|
|
4965
4978
|
### FormNode
|
|
4966
4979
|
|
|
@@ -5000,7 +5013,7 @@ form.email instanceof FormNode; // true
|
|
|
5000
5013
|
form.email.markAsTouched();
|
|
5001
5014
|
```
|
|
5002
5015
|
|
|
5003
|
-
_Source: src/
|
|
5016
|
+
_Source: src/form/nodes/form-node.ts_
|
|
5004
5017
|
|
|
5005
5018
|
### FormProxy
|
|
5006
5019
|
|
|
@@ -5059,7 +5072,7 @@ form.email.setValue('test@mail.com');
|
|
|
5059
5072
|
form.profile.name.setValue('John');
|
|
5060
5073
|
```
|
|
5061
5074
|
|
|
5062
|
-
_Source: src/
|
|
5075
|
+
_Source: src/form/types/form-proxy.ts_
|
|
5063
5076
|
|
|
5064
5077
|
### FormSchema
|
|
5065
5078
|
|
|
@@ -5124,7 +5137,7 @@ const schema: FormSchema<Form> = {
|
|
|
5124
5137
|
};
|
|
5125
5138
|
```
|
|
5126
5139
|
|
|
5127
|
-
_Source: src/
|
|
5140
|
+
_Source: src/form/types/deep-schema.ts_
|
|
5128
5141
|
|
|
5129
5142
|
### FormSchemaNode
|
|
5130
5143
|
|
|
@@ -5183,7 +5196,7 @@ export interface FormSchemaNode {
|
|
|
5183
5196
|
}
|
|
5184
5197
|
```
|
|
5185
5198
|
|
|
5186
|
-
_Source: src/
|
|
5199
|
+
_Source: src/form/types/schema-node.ts_
|
|
5187
5200
|
|
|
5188
5201
|
### FormStatusMachine
|
|
5189
5202
|
|
|
@@ -5220,7 +5233,7 @@ statusMachine.disable();
|
|
|
5220
5233
|
console.log(statusMachine.disabled.value); // true
|
|
5221
5234
|
```
|
|
5222
5235
|
|
|
5223
|
-
_Source: src/
|
|
5236
|
+
_Source: src/form/status-machine.ts_
|
|
5224
5237
|
|
|
5225
5238
|
### FormSubmitter
|
|
5226
5239
|
|
|
@@ -5250,7 +5263,7 @@ if (submitter.submitting.value) {
|
|
|
5250
5263
|
}
|
|
5251
5264
|
```
|
|
5252
5265
|
|
|
5253
|
-
_Source: src/
|
|
5266
|
+
_Source: src/form/form-submitter.ts_
|
|
5254
5267
|
|
|
5255
5268
|
### FormValue
|
|
5256
5269
|
|
|
@@ -5273,7 +5286,7 @@ export type FormValue =
|
|
|
5273
5286
|
| { [key: string]: FormValue };
|
|
5274
5287
|
```
|
|
5275
5288
|
|
|
5276
|
-
_Source: src/
|
|
5289
|
+
_Source: src/form/types/contracts.ts_
|
|
5277
5290
|
|
|
5278
5291
|
### futureDate
|
|
5279
5292
|
|
|
@@ -5311,7 +5324,7 @@ validators: [required(), futureDate({ message: 'Дата записи должн
|
|
|
5311
5324
|
},
|
|
5312
5325
|
```
|
|
5313
5326
|
|
|
5314
|
-
_Source: src/
|
|
5327
|
+
_Source: src/form/validation/validators/future-date.ts_
|
|
5315
5328
|
|
|
5316
5329
|
### getNodeForSignal
|
|
5317
5330
|
|
|
@@ -5346,7 +5359,7 @@ getNodeForSignal(sig)?.setErrors([{ code: 'required', message: 'Обязател
|
|
|
5346
5359
|
**See also:**
|
|
5347
5360
|
- {@link registerSignalNode} - регистрация связи сигнал→нода
|
|
5348
5361
|
|
|
5349
|
-
_Source: src/
|
|
5362
|
+
_Source: src/form/signal-node-registry.ts_
|
|
5350
5363
|
|
|
5351
5364
|
### getNodeType
|
|
5352
5365
|
|
|
@@ -5372,7 +5385,7 @@ export function getNodeType(node: unknown): string
|
|
|
5372
5385
|
console.log('Node type:', getNodeType(node)); // "FieldNode" | "GroupNode" | "ArrayNode" | "FormNode" | "Unknown"
|
|
5373
5386
|
```
|
|
5374
5387
|
|
|
5375
|
-
_Source: src/
|
|
5388
|
+
_Source: src/form/type-guards.ts_
|
|
5376
5389
|
|
|
5377
5390
|
### GroupNode
|
|
5378
5391
|
|
|
@@ -5407,7 +5420,7 @@ await proxy.validate();
|
|
|
5407
5420
|
console.log(proxy.valid.value);
|
|
5408
5421
|
```
|
|
5409
5422
|
|
|
5410
|
-
_Source: src/
|
|
5423
|
+
_Source: src/form/nodes/group-node.ts_
|
|
5411
5424
|
|
|
5412
5425
|
### GroupNodeConfig
|
|
5413
5426
|
|
|
@@ -5426,7 +5439,7 @@ export interface GroupNodeConfig<T> {
|
|
|
5426
5439
|
}
|
|
5427
5440
|
```
|
|
5428
5441
|
|
|
5429
|
-
_Source: src/
|
|
5442
|
+
_Source: src/form/types/index.ts_
|
|
5430
5443
|
|
|
5431
5444
|
### integer
|
|
5432
5445
|
|
|
@@ -5462,7 +5475,7 @@ validators: [required(), integer({ message: 'Должно быть целым ч
|
|
|
5462
5475
|
},
|
|
5463
5476
|
```
|
|
5464
5477
|
|
|
5465
|
-
_Source: src/
|
|
5478
|
+
_Source: src/form/validation/validators/integer.ts_
|
|
5466
5479
|
|
|
5467
5480
|
### isArrayNode
|
|
5468
5481
|
|
|
@@ -5493,7 +5506,7 @@ if (isArrayNode(node)) {
|
|
|
5493
5506
|
}
|
|
5494
5507
|
```
|
|
5495
5508
|
|
|
5496
|
-
_Source: src/
|
|
5509
|
+
_Source: src/form/type-guards.ts_
|
|
5497
5510
|
|
|
5498
5511
|
### isDate
|
|
5499
5512
|
|
|
@@ -5530,7 +5543,7 @@ validators: [required(), isDate({ message: 'Введите корректную
|
|
|
5530
5543
|
},
|
|
5531
5544
|
```
|
|
5532
5545
|
|
|
5533
|
-
_Source: src/
|
|
5546
|
+
_Source: src/form/validation/validators/is-date.ts_
|
|
5534
5547
|
|
|
5535
5548
|
### isDerived
|
|
5536
5549
|
|
|
@@ -5564,7 +5577,7 @@ if (!isDerived(model.$.total)) {
|
|
|
5564
5577
|
**See also:**
|
|
5565
5578
|
- {@link markDerived} - пометить сигнал производным
|
|
5566
5579
|
|
|
5567
|
-
_Source: src/
|
|
5580
|
+
_Source: src/state/derived-registry.ts_
|
|
5568
5581
|
|
|
5569
5582
|
### isFieldNode
|
|
5570
5583
|
|
|
@@ -5595,7 +5608,7 @@ if (isFieldNode(node)) {
|
|
|
5595
5608
|
}
|
|
5596
5609
|
```
|
|
5597
5610
|
|
|
5598
|
-
_Source: src/
|
|
5611
|
+
_Source: src/form/type-guards.ts_
|
|
5599
5612
|
|
|
5600
5613
|
### isFormNode
|
|
5601
5614
|
|
|
@@ -5624,7 +5637,7 @@ if (isFormNode(value)) {
|
|
|
5624
5637
|
}
|
|
5625
5638
|
```
|
|
5626
5639
|
|
|
5627
|
-
_Source: src/
|
|
5640
|
+
_Source: src/form/type-guards.ts_
|
|
5628
5641
|
|
|
5629
5642
|
### isGroupNode
|
|
5630
5643
|
|
|
@@ -5653,7 +5666,7 @@ if (isGroupNode(node)) {
|
|
|
5653
5666
|
}
|
|
5654
5667
|
```
|
|
5655
5668
|
|
|
5656
|
-
_Source: src/
|
|
5669
|
+
_Source: src/form/type-guards.ts_
|
|
5657
5670
|
|
|
5658
5671
|
### isNumber
|
|
5659
5672
|
|
|
@@ -5691,7 +5704,7 @@ validators: [required(), isNumber({ message: 'Введите число' })],
|
|
|
5691
5704
|
},
|
|
5692
5705
|
```
|
|
5693
5706
|
|
|
5694
|
-
_Source: src/
|
|
5707
|
+
_Source: src/form/validation/validators/is-number.ts_
|
|
5695
5708
|
|
|
5696
5709
|
### markDerived
|
|
5697
5710
|
|
|
@@ -5727,7 +5740,7 @@ markDerived(model.$.total);
|
|
|
5727
5740
|
- {@link isDerived} - проверка пометки
|
|
5728
5741
|
- {@link unmarkDerived} - снять пометку при dispose оператора
|
|
5729
5742
|
|
|
5730
|
-
_Source: src/
|
|
5743
|
+
_Source: src/state/derived-registry.ts_
|
|
5731
5744
|
|
|
5732
5745
|
### max
|
|
5733
5746
|
|
|
@@ -5767,7 +5780,7 @@ validators: [required(), max(50, { message: 'Не более 50%' })],
|
|
|
5767
5780
|
},
|
|
5768
5781
|
```
|
|
5769
5782
|
|
|
5770
|
-
_Source: src/
|
|
5783
|
+
_Source: src/form/validation/validators/max.ts_
|
|
5771
5784
|
|
|
5772
5785
|
### maxAge
|
|
5773
5786
|
|
|
@@ -5807,7 +5820,7 @@ validators: [maxAge(100, { message: 'Проверьте дату рождени
|
|
|
5807
5820
|
},
|
|
5808
5821
|
```
|
|
5809
5822
|
|
|
5810
|
-
_Source: src/
|
|
5823
|
+
_Source: src/form/validation/validators/max-age.ts_
|
|
5811
5824
|
|
|
5812
5825
|
### maxDate
|
|
5813
5826
|
|
|
@@ -5847,7 +5860,7 @@ validators: [maxDate(new Date(), { message: 'Дата не может быть
|
|
|
5847
5860
|
},
|
|
5848
5861
|
```
|
|
5849
5862
|
|
|
5850
|
-
_Source: src/
|
|
5863
|
+
_Source: src/form/validation/validators/max-date.ts_
|
|
5851
5864
|
|
|
5852
5865
|
### maxLength
|
|
5853
5866
|
|
|
@@ -5889,7 +5902,7 @@ validators: [maxLength(500, { message: 'Максимум 500 символов' }
|
|
|
5889
5902
|
},
|
|
5890
5903
|
```
|
|
5891
5904
|
|
|
5892
|
-
_Source: src/
|
|
5905
|
+
_Source: src/form/validation/validators/max-length.ts_
|
|
5893
5906
|
|
|
5894
5907
|
### min
|
|
5895
5908
|
|
|
@@ -5929,7 +5942,7 @@ validators: [required(), min(1, { message: 'Минимум 1' })],
|
|
|
5929
5942
|
},
|
|
5930
5943
|
```
|
|
5931
5944
|
|
|
5932
|
-
_Source: src/
|
|
5945
|
+
_Source: src/form/validation/validators/min.ts_
|
|
5933
5946
|
|
|
5934
5947
|
### minAge
|
|
5935
5948
|
|
|
@@ -5969,7 +5982,7 @@ validators: [required(), minAge(18, { message: 'Вам должно быть н
|
|
|
5969
5982
|
},
|
|
5970
5983
|
```
|
|
5971
5984
|
|
|
5972
|
-
_Source: src/
|
|
5985
|
+
_Source: src/form/validation/validators/min-age.ts_
|
|
5973
5986
|
|
|
5974
5987
|
### minDate
|
|
5975
5988
|
|
|
@@ -6009,7 +6022,7 @@ validators: [required(), minDate(new Date(), { message: 'Дата не рань
|
|
|
6009
6022
|
},
|
|
6010
6023
|
```
|
|
6011
6024
|
|
|
6012
|
-
_Source: src/
|
|
6025
|
+
_Source: src/form/validation/validators/min-date.ts_
|
|
6013
6026
|
|
|
6014
6027
|
### minLength
|
|
6015
6028
|
|
|
@@ -6051,13 +6064,13 @@ validators: [required(), minLength(8, { message: 'Минимум 8 символ
|
|
|
6051
6064
|
},
|
|
6052
6065
|
```
|
|
6053
6066
|
|
|
6054
|
-
_Source: src/
|
|
6067
|
+
_Source: src/form/validation/validators/min-length.ts_
|
|
6055
6068
|
|
|
6056
6069
|
### ModelApi
|
|
6057
6070
|
|
|
6058
6071
|
**Kind:** `interface`
|
|
6059
6072
|
|
|
6060
|
-
API уровня модели (доступно на
|
|
6073
|
+
API уровня модели (доступно на корне, под-моделях вложенных объектов-групп и элементов массива).
|
|
6061
6074
|
|
|
6062
6075
|
⚠️ Имена методов (`$`/`get`/`set`/`patch`/`isDirty`/`reset`/`signalAt`/`captureInitial`)
|
|
6063
6076
|
зарезервированы: одноимённое поле формы их затеняет (редкий краевой случай).
|
|
@@ -6070,12 +6083,11 @@ export interface ModelApi<T> {
|
|
|
6070
6083
|
/** Снимок значений (без подписки) — для submit. */
|
|
6071
6084
|
get(): T;
|
|
6072
6085
|
/**
|
|
6073
|
-
*
|
|
6074
|
-
*
|
|
6075
|
-
*
|
|
6076
|
-
* `patch({ ...defaults, ...dto })` явно. Не меняет initial-снимок.
|
|
6086
|
+
* Полная установка значений: принимает объект целиком (все ключи `T`) и записывает их в модель.
|
|
6087
|
+
* Производными полями (цели `compute`) владеет compute — их значения из payload игнорируются.
|
|
6088
|
+
* Не меняет initial-снимок. Для частичного обновления (только переданные ключи) — {@link ModelApi.patch}.
|
|
6077
6089
|
*/
|
|
6078
|
-
set(value:
|
|
6090
|
+
set(value: T): void;
|
|
6079
6091
|
/**
|
|
6080
6092
|
* Частичное слияние значений (load/patch с сервера): обновляет только переданные ключи,
|
|
6081
6093
|
* отсутствующие ключи НЕ трогаются. Не меняет initial-снимок.
|
|
@@ -6092,7 +6104,7 @@ export interface ModelApi<T> {
|
|
|
6092
6104
|
}
|
|
6093
6105
|
```
|
|
6094
6106
|
|
|
6095
|
-
_Source: src/
|
|
6107
|
+
_Source: src/state/types.ts_
|
|
6096
6108
|
|
|
6097
6109
|
### ModelArray
|
|
6098
6110
|
|
|
@@ -6138,7 +6150,7 @@ export interface ModelArray<U> {
|
|
|
6138
6150
|
}
|
|
6139
6151
|
```
|
|
6140
6152
|
|
|
6141
|
-
_Source: src/
|
|
6153
|
+
_Source: src/state/types.ts_
|
|
6142
6154
|
|
|
6143
6155
|
### ModelArrayControl
|
|
6144
6156
|
|
|
@@ -6161,7 +6173,7 @@ export interface ModelArrayControl<TItem extends object> {
|
|
|
6161
6173
|
}
|
|
6162
6174
|
```
|
|
6163
6175
|
|
|
6164
|
-
_Source: src/
|
|
6176
|
+
_Source: src/form/nodes/model-array-node.ts_
|
|
6165
6177
|
|
|
6166
6178
|
### ModelArrayNode
|
|
6167
6179
|
|
|
@@ -6209,14 +6221,15 @@ rows.at(0)?.name.setValue('B'); // правка поля элемента д
|
|
|
6209
6221
|
rows.length.value; // 1 (реактивная длина)
|
|
6210
6222
|
```
|
|
6211
6223
|
|
|
6212
|
-
_Source: src/
|
|
6224
|
+
_Source: src/form/nodes/model-array-node.ts_
|
|
6213
6225
|
|
|
6214
6226
|
### ModelObject
|
|
6215
6227
|
|
|
6216
6228
|
**Kind:** `type`
|
|
6217
6229
|
|
|
6218
|
-
value
|
|
6219
|
-
внутри `effect`/`computed`, запись — присваиванием).
|
|
6230
|
+
Карта value-полей объекта (value-половина {@link FormModel}): поля доступны как обычные свойства
|
|
6231
|
+
(чтение реактивно внутри `effect`/`computed`, запись — присваиванием). Вложенные объекты-поля
|
|
6232
|
+
резолвятся в под-модели {@link FormModel} (см. {@link ModelValue}), массивы — в {@link ModelArray}.
|
|
6220
6233
|
|
|
6221
6234
|
**Signature:**
|
|
6222
6235
|
```typescript
|
|
@@ -6225,7 +6238,7 @@ export type ModelObject<T> = {
|
|
|
6225
6238
|
};
|
|
6226
6239
|
```
|
|
6227
6240
|
|
|
6228
|
-
_Source: src/
|
|
6241
|
+
_Source: src/state/types.ts_
|
|
6229
6242
|
|
|
6230
6243
|
### ModelSignals
|
|
6231
6244
|
|
|
@@ -6241,7 +6254,7 @@ export type ModelSignals<T> = {
|
|
|
6241
6254
|
};
|
|
6242
6255
|
```
|
|
6243
6256
|
|
|
6244
|
-
_Source: src/
|
|
6257
|
+
_Source: src/state/types.ts_
|
|
6245
6258
|
|
|
6246
6259
|
### ModelValidationResult
|
|
6247
6260
|
|
|
@@ -6258,7 +6271,7 @@ export interface ModelValidationResult {
|
|
|
6258
6271
|
}
|
|
6259
6272
|
```
|
|
6260
6273
|
|
|
6261
|
-
_Source: src/
|
|
6274
|
+
_Source: src/form/validate-model-core.ts_
|
|
6262
6275
|
|
|
6263
6276
|
### ModelValidator
|
|
6264
6277
|
|
|
@@ -6279,7 +6292,7 @@ export type ModelValidator<TValue = unknown, TModel = unknown, TRoot = unknown>
|
|
|
6279
6292
|
) => ValidationError | null | Promise<ValidationError | null>;
|
|
6280
6293
|
```
|
|
6281
6294
|
|
|
6282
|
-
_Source: src/
|
|
6295
|
+
_Source: src/form/validate-model-core.ts_
|
|
6283
6296
|
|
|
6284
6297
|
### ModelValue
|
|
6285
6298
|
|
|
@@ -6288,7 +6301,8 @@ _Source: src/core/model/validate-model.ts_
|
|
|
6288
6301
|
Значение поля в value-доступе модели:
|
|
6289
6302
|
- массив → {@link ModelArray}
|
|
6290
6303
|
- спец-объект (Date/File/Blob) → как есть
|
|
6291
|
-
- объект →
|
|
6304
|
+
- объект → под-модель {@link FormModel} (value-доступ + `.$`-сигналы + API get/set/patch/…);
|
|
6305
|
+
промоутится рантаймом (`makeFormModel`); сигналы идентичны `model.$.<path>`
|
|
6292
6306
|
- примитив → значение
|
|
6293
6307
|
|
|
6294
6308
|
**Signature:**
|
|
@@ -6299,11 +6313,11 @@ export type ModelValue<V> =
|
|
|
6299
6313
|
: NonNullable<V> extends Opaque
|
|
6300
6314
|
? V
|
|
6301
6315
|
: NonNullable<V> extends object
|
|
6302
|
-
?
|
|
6316
|
+
? FormModel<NonNullable<V>>
|
|
6303
6317
|
: V;
|
|
6304
6318
|
```
|
|
6305
6319
|
|
|
6306
|
-
_Source: src/
|
|
6320
|
+
_Source: src/state/types.ts_
|
|
6307
6321
|
|
|
6308
6322
|
### multipleOf
|
|
6309
6323
|
|
|
@@ -6342,7 +6356,7 @@ validators: [multipleOf(0.5, { message: 'Только шаг 0.5' })],
|
|
|
6342
6356
|
},
|
|
6343
6357
|
```
|
|
6344
6358
|
|
|
6345
|
-
_Source: src/
|
|
6359
|
+
_Source: src/form/validation/validators/multiple-of.ts_
|
|
6346
6360
|
|
|
6347
6361
|
### NodeFactory
|
|
6348
6362
|
|
|
@@ -6412,7 +6426,7 @@ const factory = new NodeFactory();
|
|
|
6412
6426
|
const node = factory.createNode({ value: '', component: Input }); // → FieldNode<string>
|
|
6413
6427
|
```
|
|
6414
6428
|
|
|
6415
|
-
_Source: src/
|
|
6429
|
+
_Source: src/form/factories/node-factory.ts_
|
|
6416
6430
|
|
|
6417
6431
|
### nonNegative
|
|
6418
6432
|
|
|
@@ -6448,7 +6462,7 @@ validators: [nonNegative({ message: 'Баланс не может быть от
|
|
|
6448
6462
|
},
|
|
6449
6463
|
```
|
|
6450
6464
|
|
|
6451
|
-
_Source: src/
|
|
6465
|
+
_Source: src/form/validation/validators/non-negative.ts_
|
|
6452
6466
|
|
|
6453
6467
|
### nonZero
|
|
6454
6468
|
|
|
@@ -6484,7 +6498,7 @@ validators: [nonZero({ message: 'Не может быть нулём' })],
|
|
|
6484
6498
|
},
|
|
6485
6499
|
```
|
|
6486
6500
|
|
|
6487
|
-
_Source: src/
|
|
6501
|
+
_Source: src/form/validation/validators/non-zero.ts_
|
|
6488
6502
|
|
|
6489
6503
|
### pastDate
|
|
6490
6504
|
|
|
@@ -6521,7 +6535,7 @@ validators: [required(), pastDate({ message: 'Дата рождения не м
|
|
|
6521
6535
|
},
|
|
6522
6536
|
```
|
|
6523
6537
|
|
|
6524
|
-
_Source: src/
|
|
6538
|
+
_Source: src/form/validation/validators/past-date.ts_
|
|
6525
6539
|
|
|
6526
6540
|
### PathAwareSignal
|
|
6527
6541
|
|
|
@@ -6538,7 +6552,7 @@ export type PathAwareSignal<T> = Signal<T> & {
|
|
|
6538
6552
|
};
|
|
6539
6553
|
```
|
|
6540
6554
|
|
|
6541
|
-
_Source: src/
|
|
6555
|
+
_Source: src/state/types.ts_
|
|
6542
6556
|
|
|
6543
6557
|
### pattern
|
|
6544
6558
|
|
|
@@ -6586,7 +6600,7 @@ pattern(/^\+7 \(\d{3}\) \d{3}-\d{2}-\d{2}$/, { message: 'Формат +7 (999) 1
|
|
|
6586
6600
|
},
|
|
6587
6601
|
```
|
|
6588
6602
|
|
|
6589
|
-
_Source: src/
|
|
6603
|
+
_Source: src/form/validation/validators/pattern.ts_
|
|
6590
6604
|
|
|
6591
6605
|
### phone
|
|
6592
6606
|
|
|
@@ -6624,7 +6638,7 @@ validators: [required(), phone({ format: 'ru' })],
|
|
|
6624
6638
|
},
|
|
6625
6639
|
```
|
|
6626
6640
|
|
|
6627
|
-
_Source: src/
|
|
6641
|
+
_Source: src/form/validation/validators/phone.ts_
|
|
6628
6642
|
|
|
6629
6643
|
### PhoneFormat
|
|
6630
6644
|
|
|
@@ -6642,7 +6656,7 @@ _Source: src/core/validation/validators/phone.ts_
|
|
|
6642
6656
|
export type PhoneFormat = 'international' | 'ru' | 'us' | 'any';
|
|
6643
6657
|
```
|
|
6644
6658
|
|
|
6645
|
-
_Source: src/
|
|
6659
|
+
_Source: src/form/validation/validators/phone.ts_
|
|
6646
6660
|
|
|
6647
6661
|
### registerSignalNode
|
|
6648
6662
|
|
|
@@ -6676,7 +6690,7 @@ if (sig && node) registerSignalNode(sig, node);
|
|
|
6676
6690
|
**See also:**
|
|
6677
6691
|
- {@link getNodeForSignal} - обратный поиск ноды по сигналу
|
|
6678
6692
|
|
|
6679
|
-
_Source: src/
|
|
6693
|
+
_Source: src/form/signal-node-registry.ts_
|
|
6680
6694
|
|
|
6681
6695
|
### required
|
|
6682
6696
|
|
|
@@ -6722,7 +6736,7 @@ validators: [required({ message: 'Необходимо принять услов
|
|
|
6722
6736
|
},
|
|
6723
6737
|
```
|
|
6724
6738
|
|
|
6725
|
-
_Source: src/
|
|
6739
|
+
_Source: src/form/validation/validators/required.ts_
|
|
6726
6740
|
|
|
6727
6741
|
### resetWhen
|
|
6728
6742
|
|
|
@@ -6745,7 +6759,7 @@ export function resetWhen<T>(
|
|
|
6745
6759
|
resetWhen(model.$.cardNumber, () => model.paymentType !== 'card', { resetValue: '' });
|
|
6746
6760
|
```
|
|
6747
6761
|
|
|
6748
|
-
_Source: src/
|
|
6762
|
+
_Source: src/state/behaviors-value.ts_
|
|
6749
6763
|
|
|
6750
6764
|
### ResourceLoadResult
|
|
6751
6765
|
|
|
@@ -6758,7 +6772,7 @@ _Source: src/core/model/behaviors.ts_
|
|
|
6758
6772
|
export type ResourceLoadResult = unknown;
|
|
6759
6773
|
```
|
|
6760
6774
|
|
|
6761
|
-
_Source: src/
|
|
6775
|
+
_Source: src/form/types/index.ts_
|
|
6762
6776
|
|
|
6763
6777
|
### revalidateWhen
|
|
6764
6778
|
|
|
@@ -6781,7 +6795,7 @@ export function revalidateWhen(
|
|
|
6781
6795
|
revalidateWhen([model.$.maxAmount], () => validateFormModel(model, schema));
|
|
6782
6796
|
```
|
|
6783
6797
|
|
|
6784
|
-
_Source: src/
|
|
6798
|
+
_Source: src/state/behaviors-value.ts_
|
|
6785
6799
|
|
|
6786
6800
|
### runOutsideEffect
|
|
6787
6801
|
|
|
@@ -6789,7 +6803,7 @@ _Source: src/core/model/behaviors.ts_
|
|
|
6789
6803
|
|
|
6790
6804
|
Выполняет функцию вне контекста effect (отложенная запись на микротаск).
|
|
6791
6805
|
|
|
6792
|
-
Сбои fn (синхронный throw и async-rejection) маршрутизируются
|
|
6806
|
+
Сбои fn (синхронный throw и async-rejection) маршрутизируются dev-логгером (logDeferError), а не
|
|
6793
6807
|
всплывают неперехваченными. Возвращает отменитель: вызов до срабатывания микротаска отменяет запись
|
|
6794
6808
|
(liveness-охрана — не писать против снесённого узла при dispose в том же тике).
|
|
6795
6809
|
|
|
@@ -6815,7 +6829,7 @@ effect(() => {
|
|
|
6815
6829
|
});
|
|
6816
6830
|
```
|
|
6817
6831
|
|
|
6818
|
-
_Source: src/
|
|
6832
|
+
_Source: src/state/safe-effect.ts_
|
|
6819
6833
|
|
|
6820
6834
|
### safeCallback
|
|
6821
6835
|
|
|
@@ -6854,7 +6868,7 @@ effect(() => {
|
|
|
6854
6868
|
});
|
|
6855
6869
|
```
|
|
6856
6870
|
|
|
6857
|
-
_Source: src/
|
|
6871
|
+
_Source: src/state/safe-effect.ts_
|
|
6858
6872
|
|
|
6859
6873
|
### safeDebouncedCallback
|
|
6860
6874
|
|
|
@@ -6864,7 +6878,7 @@ _Source: src/core/utils/safe-effect.ts_
|
|
|
6864
6878
|
|
|
6865
6879
|
`withDebounce` уже откладывает вызов (таймер) — этого достаточно для выхода из effect-контекста,
|
|
6866
6880
|
поэтому дополнительного `queueMicrotask` нет (устранён двойной defer). Сбои callback (в т.ч.
|
|
6867
|
-
async-rejection) маршрутизируются
|
|
6881
|
+
async-rejection) маршрутизируются dev-логгером (logDeferError).
|
|
6868
6882
|
|
|
6869
6883
|
**Signature:**
|
|
6870
6884
|
```typescript
|
|
@@ -6892,7 +6906,7 @@ return effect(() => {
|
|
|
6892
6906
|
});
|
|
6893
6907
|
```
|
|
6894
6908
|
|
|
6895
|
-
_Source: src/
|
|
6909
|
+
_Source: src/state/safe-effect.ts_
|
|
6896
6910
|
|
|
6897
6911
|
### SchemaArrayControl
|
|
6898
6912
|
|
|
@@ -6915,7 +6929,7 @@ export interface SchemaArrayControl {
|
|
|
6915
6929
|
}
|
|
6916
6930
|
```
|
|
6917
6931
|
|
|
6918
|
-
_Source: src/
|
|
6932
|
+
_Source: src/form/types/schema-node.ts_
|
|
6919
6933
|
|
|
6920
6934
|
### SchemaValidator
|
|
6921
6935
|
|
|
@@ -6934,7 +6948,7 @@ export type SchemaValidator = (
|
|
|
6934
6948
|
) => ValidationError | null | Promise<ValidationError | null>;
|
|
6935
6949
|
```
|
|
6936
6950
|
|
|
6937
|
-
_Source: src/
|
|
6951
|
+
_Source: src/form/types/schema-node.ts_
|
|
6938
6952
|
|
|
6939
6953
|
### SetValueOptions
|
|
6940
6954
|
|
|
@@ -6952,7 +6966,7 @@ export interface SetValueOptions {
|
|
|
6952
6966
|
}
|
|
6953
6967
|
```
|
|
6954
6968
|
|
|
6955
|
-
_Source: src/
|
|
6969
|
+
_Source: src/form/nodes/form-node.ts_
|
|
6956
6970
|
|
|
6957
6971
|
### StatusEvent
|
|
6958
6972
|
|
|
@@ -6971,7 +6985,7 @@ export type StatusEvent =
|
|
|
6971
6985
|
| { type: 'SET_ERRORS'; hasErrors: boolean };
|
|
6972
6986
|
```
|
|
6973
6987
|
|
|
6974
|
-
_Source: src/
|
|
6988
|
+
_Source: src/form/status-machine.ts_
|
|
6975
6989
|
|
|
6976
6990
|
### SubmitOptions
|
|
6977
6991
|
|
|
@@ -6989,7 +7003,7 @@ export interface SubmitOptions {
|
|
|
6989
7003
|
}
|
|
6990
7004
|
```
|
|
6991
7005
|
|
|
6992
|
-
_Source: src/
|
|
7006
|
+
_Source: src/form/form-submitter.ts_
|
|
6993
7007
|
|
|
6994
7008
|
### SubmitResult
|
|
6995
7009
|
|
|
@@ -7009,7 +7023,7 @@ export interface SubmitResult<R> {
|
|
|
7009
7023
|
}
|
|
7010
7024
|
```
|
|
7011
7025
|
|
|
7012
|
-
_Source: src/
|
|
7026
|
+
_Source: src/form/form-submitter.ts_
|
|
7013
7027
|
|
|
7014
7028
|
### SubmittableForm
|
|
7015
7029
|
|
|
@@ -7030,7 +7044,7 @@ export interface SubmittableForm<T extends object> {
|
|
|
7030
7044
|
}
|
|
7031
7045
|
```
|
|
7032
7046
|
|
|
7033
|
-
_Source: src/
|
|
7047
|
+
_Source: src/form/form-submitter.ts_
|
|
7034
7048
|
|
|
7035
7049
|
### SubscriptionManager
|
|
7036
7050
|
|
|
@@ -7073,7 +7087,7 @@ class FieldNode {
|
|
|
7073
7087
|
}
|
|
7074
7088
|
```
|
|
7075
7089
|
|
|
7076
|
-
_Source: src/
|
|
7090
|
+
_Source: src/state/subscription-manager.ts_
|
|
7077
7091
|
|
|
7078
7092
|
### syncFields
|
|
7079
7093
|
|
|
@@ -7097,7 +7111,7 @@ export function syncFields<T>(
|
|
|
7097
7111
|
syncFields(model.$.field1, model.$.field2);
|
|
7098
7112
|
```
|
|
7099
7113
|
|
|
7100
|
-
_Source: src/
|
|
7114
|
+
_Source: src/state/behaviors-value.ts_
|
|
7101
7115
|
|
|
7102
7116
|
### transformValue
|
|
7103
7117
|
|
|
@@ -7120,7 +7134,7 @@ export function transformValue<T>(
|
|
|
7120
7134
|
transformValue(model.$.promoCode, (v) => (v ?? '').toUpperCase());
|
|
7121
7135
|
```
|
|
7122
7136
|
|
|
7123
|
-
_Source: src/
|
|
7137
|
+
_Source: src/state/behaviors-value.ts_
|
|
7124
7138
|
|
|
7125
7139
|
### uniqueId
|
|
7126
7140
|
|
|
@@ -7147,7 +7161,7 @@ uniqueId(SubscriptionKey.WatchField); // → 'watchField-1'
|
|
|
7147
7161
|
uniqueId(SubscriptionKey.WatchField); // → 'watchField-2'
|
|
7148
7162
|
```
|
|
7149
7163
|
|
|
7150
|
-
_Source: src/
|
|
7164
|
+
_Source: src/form/unique-id.ts_
|
|
7151
7165
|
|
|
7152
7166
|
### UnknownCallback
|
|
7153
7167
|
|
|
@@ -7161,7 +7175,7 @@ _Source: src/core/utils/unique-id.ts_
|
|
|
7161
7175
|
export type UnknownCallback = (...args: unknown[]) => unknown;
|
|
7162
7176
|
```
|
|
7163
7177
|
|
|
7164
|
-
_Source: src/
|
|
7178
|
+
_Source: src/form/types/index.ts_
|
|
7165
7179
|
|
|
7166
7180
|
### UnknownFormValue
|
|
7167
7181
|
|
|
@@ -7175,7 +7189,7 @@ Requires explicit type checking before use
|
|
|
7175
7189
|
export type UnknownFormValue = unknown;
|
|
7176
7190
|
```
|
|
7177
7191
|
|
|
7178
|
-
_Source: src/
|
|
7192
|
+
_Source: src/form/types/contracts.ts_
|
|
7179
7193
|
|
|
7180
7194
|
### UnknownRecord
|
|
7181
7195
|
|
|
@@ -7189,7 +7203,7 @@ _Source: src/core/types/index.ts_
|
|
|
7189
7203
|
export type UnknownRecord = Record<string, unknown>;
|
|
7190
7204
|
```
|
|
7191
7205
|
|
|
7192
|
-
_Source: src/
|
|
7206
|
+
_Source: src/form/types/index.ts_
|
|
7193
7207
|
|
|
7194
7208
|
### unmarkDerived
|
|
7195
7209
|
|
|
@@ -7225,7 +7239,7 @@ onDispose(() => unmarkDerived(model.$.total)); // при снятии compute с
|
|
|
7225
7239
|
**See also:**
|
|
7226
7240
|
- {@link markDerived} - пометить сигнал производным
|
|
7227
7241
|
|
|
7228
|
-
_Source: src/
|
|
7242
|
+
_Source: src/state/derived-registry.ts_
|
|
7229
7243
|
|
|
7230
7244
|
### url
|
|
7231
7245
|
|
|
@@ -7269,7 +7283,7 @@ validators: [url({ requireProtocol: true, allowedProtocols: ['https'] })],
|
|
|
7269
7283
|
},
|
|
7270
7284
|
```
|
|
7271
7285
|
|
|
7272
|
-
_Source: src/
|
|
7286
|
+
_Source: src/form/validation/validators/url.ts_
|
|
7273
7287
|
|
|
7274
7288
|
### useArrayLength
|
|
7275
7289
|
|
|
@@ -7307,7 +7321,7 @@ function ArrayRenderer({ arrayNode }) {
|
|
|
7307
7321
|
}
|
|
7308
7322
|
```
|
|
7309
7323
|
|
|
7310
|
-
_Source: src/hooks/useArrayLength.ts_
|
|
7324
|
+
_Source: src/form/hooks/useArrayLength.ts_
|
|
7311
7325
|
|
|
7312
7326
|
### useFormControl
|
|
7313
7327
|
|
|
@@ -7541,7 +7555,7 @@ return <div>Items: {length}</div>;
|
|
|
7541
7555
|
- {@link FieldControlState} - тип состояния для FieldNode
|
|
7542
7556
|
- {@link ArrayControlState} - тип состояния для ArrayNode
|
|
7543
7557
|
|
|
7544
|
-
_Source: src/hooks/useFormControl.ts_
|
|
7558
|
+
_Source: src/form/hooks/useFormControl.ts_
|
|
7545
7559
|
|
|
7546
7560
|
### useFormControlValue
|
|
7547
7561
|
|
|
@@ -7722,7 +7736,7 @@ return (
|
|
|
7722
7736
|
- {@link useFormControl} - для полного состояния поля
|
|
7723
7737
|
- {@link FieldNode} - тип контрола поля
|
|
7724
7738
|
|
|
7725
|
-
_Source: src/hooks/useFormControlValue.ts_
|
|
7739
|
+
_Source: src/form/hooks/useFormControlValue.ts_
|
|
7726
7740
|
|
|
7727
7741
|
### ValidateAsyncOptions
|
|
7728
7742
|
|
|
@@ -7740,7 +7754,7 @@ export interface ValidateAsyncOptions extends ValidateOptions {
|
|
|
7740
7754
|
подключалась тем оператором, которого больше нет. Рантаймом не потребляется; экспортируется
|
|
7741
7755
|
только ради обратной совместимости.
|
|
7742
7756
|
|
|
7743
|
-
_Source: src/
|
|
7757
|
+
_Source: src/form/types/validation-schema.ts_
|
|
7744
7758
|
|
|
7745
7759
|
### validateFormModel
|
|
7746
7760
|
|
|
@@ -7774,7 +7788,7 @@ const res = await validateFormModel(model, schema);
|
|
|
7774
7788
|
if (res.valid) await api.save(model.get());
|
|
7775
7789
|
```
|
|
7776
7790
|
|
|
7777
|
-
_Source: src/
|
|
7791
|
+
_Source: src/form/validate-model.ts_
|
|
7778
7792
|
|
|
7779
7793
|
### validateModel
|
|
7780
7794
|
|
|
@@ -7797,7 +7811,7 @@ const res = await validateModel(model, schema);
|
|
|
7797
7811
|
if (!res.valid) console.log(res.errors); // { 'email': [{ code, message }], ... }
|
|
7798
7812
|
```
|
|
7799
7813
|
|
|
7800
|
-
_Source: src/
|
|
7814
|
+
_Source: src/form/validate-model-core.ts_
|
|
7801
7815
|
|
|
7802
7816
|
### validateModelSync
|
|
7803
7817
|
|
|
@@ -7828,7 +7842,7 @@ const res = validateModelSync(model, schema);
|
|
|
7828
7842
|
if (!res.valid) console.log(res.errors); // { 'email': [{ code, message }], ... }
|
|
7829
7843
|
```
|
|
7830
7844
|
|
|
7831
|
-
_Source: src/
|
|
7845
|
+
_Source: src/form/validate-model-core.ts_
|
|
7832
7846
|
|
|
7833
7847
|
### ValidateOptions
|
|
7834
7848
|
|
|
@@ -7848,7 +7862,7 @@ export interface ValidateOptions {
|
|
|
7848
7862
|
}
|
|
7849
7863
|
```
|
|
7850
7864
|
|
|
7851
|
-
_Source: src/
|
|
7865
|
+
_Source: src/form/types/validation-schema.ts_
|
|
7852
7866
|
|
|
7853
7867
|
### ValidationError
|
|
7854
7868
|
|
|
@@ -7867,7 +7881,7 @@ export interface ValidationError {
|
|
|
7867
7881
|
}
|
|
7868
7882
|
```
|
|
7869
7883
|
|
|
7870
|
-
_Source: src/
|
|
7884
|
+
_Source: src/form/types/contracts.ts_
|
|
7871
7885
|
|
|
7872
7886
|
### Validator
|
|
7873
7887
|
|
|
@@ -7915,7 +7929,7 @@ children: [
|
|
|
7915
7929
|
};
|
|
7916
7930
|
```
|
|
7917
7931
|
|
|
7918
|
-
_Source: src/
|
|
7932
|
+
_Source: src/form/types/validation-schema.ts_
|
|
7919
7933
|
|
|
7920
7934
|
### ValidatorFn
|
|
7921
7935
|
|
|
@@ -7928,7 +7942,7 @@ _Source: src/core/types/validation-schema.ts_
|
|
|
7928
7942
|
export type ValidatorFn<T = FormValue> = (value: T) => ValidationError | null;
|
|
7929
7943
|
```
|
|
7930
7944
|
|
|
7931
|
-
_Source: src/
|
|
7945
|
+
_Source: src/form/types/contracts.ts_
|
|
7932
7946
|
|
|
7933
7947
|
### watchField
|
|
7934
7948
|
|
|
@@ -7955,7 +7969,7 @@ watchField(model.$.country, async (country) => {
|
|
|
7955
7969
|
});
|
|
7956
7970
|
```
|
|
7957
7971
|
|
|
7958
|
-
_Source: src/
|
|
7972
|
+
_Source: src/state/behaviors-value.ts_
|
|
7959
7973
|
|
|
7960
7974
|
### WithBehaviorSchema
|
|
7961
7975
|
|
|
@@ -7970,7 +7984,7 @@ export interface WithBehaviorSchema {
|
|
|
7970
7984
|
}
|
|
7971
7985
|
```
|
|
7972
7986
|
|
|
7973
|
-
_Source: src/
|
|
7987
|
+
_Source: src/form/types/index.ts_
|
|
7974
7988
|
|
|
7975
7989
|
### WithValidationSchema
|
|
7976
7990
|
|
|
@@ -7985,4 +7999,4 @@ export interface WithValidationSchema {
|
|
|
7985
7999
|
}
|
|
7986
8000
|
```
|
|
7987
8001
|
|
|
7988
|
-
_Source: src/
|
|
8002
|
+
_Source: src/form/types/index.ts_
|