@reformer/core 1.0.0-beta.1 → 1.0.0-beta.2

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.
Files changed (79) hide show
  1. package/dist/behaviors/compute-from.js +3 -3
  2. package/dist/behaviors/enable-when.js +5 -5
  3. package/dist/behaviors/reset-when.js +1 -1
  4. package/dist/behaviors/revalidate-when.js +1 -1
  5. package/dist/behaviors/sync-fields.js +5 -5
  6. package/dist/behaviors/watch-field.js +3 -3
  7. package/dist/behaviors.js +2 -2
  8. package/dist/core/types/field-path.d.ts +2 -2
  9. package/dist/core/types/index.d.ts +1 -1
  10. package/dist/core/types/validation-schema.d.ts +21 -50
  11. package/dist/core/validation/core/index.d.ts +0 -1
  12. package/dist/core/validation/core/validate-async.d.ts +9 -15
  13. package/dist/core/validation/core/validate.d.ts +15 -15
  14. package/dist/core/validation/index.d.ts +5 -3
  15. package/dist/core/validation/validation-applicator.d.ts +2 -56
  16. package/dist/core/validation/validation-registry.d.ts +18 -16
  17. package/dist/core/validation/validators/array-validators.d.ts +6 -31
  18. package/dist/core/validation/validators/email.d.ts +5 -29
  19. package/dist/core/validation/validators/future-date.d.ts +6 -28
  20. package/dist/core/validation/validators/index.d.ts +12 -4
  21. package/dist/core/validation/validators/integer.d.ts +13 -0
  22. package/dist/core/validation/validators/is-date.d.ts +5 -28
  23. package/dist/core/validation/validators/is-number.d.ts +14 -0
  24. package/dist/core/validation/validators/max-age.d.ts +6 -29
  25. package/dist/core/validation/validators/max-date.d.ts +6 -29
  26. package/dist/core/validation/validators/max-length.d.ts +5 -30
  27. package/dist/core/validation/validators/max.d.ts +7 -29
  28. package/dist/core/validation/validators/min-age.d.ts +6 -29
  29. package/dist/core/validation/validators/min-date.d.ts +6 -29
  30. package/dist/core/validation/validators/min-length.d.ts +5 -30
  31. package/dist/core/validation/validators/min.d.ts +7 -29
  32. package/dist/core/validation/validators/multiple-of.d.ts +13 -0
  33. package/dist/core/validation/validators/non-negative.d.ts +13 -0
  34. package/dist/core/validation/validators/non-zero.d.ts +13 -0
  35. package/dist/core/validation/validators/past-date.d.ts +5 -28
  36. package/dist/core/validation/validators/pattern.d.ts +5 -32
  37. package/dist/core/validation/validators/phone.d.ts +9 -19
  38. package/dist/core/validation/validators/required.d.ts +10 -31
  39. package/dist/core/validation/validators/url.d.ts +13 -15
  40. package/dist/{index-D25LsbRm.js → index-DLh_Ryb2.js} +1 -1
  41. package/dist/index.js +465 -397
  42. package/dist/{registry-helpers-Bv_BJ1s-.js → registry-helpers-CLPXad2B.js} +152 -292
  43. package/dist/validators/email.js +7 -9
  44. package/dist/validators/future-date.js +11 -12
  45. package/dist/validators/integer.d.ts +2 -0
  46. package/dist/validators/integer.js +10 -0
  47. package/dist/validators/is-date.js +6 -7
  48. package/dist/validators/is-number.d.ts +2 -0
  49. package/dist/validators/is-number.js +10 -0
  50. package/dist/validators/max-age.js +11 -12
  51. package/dist/validators/max-date.js +11 -12
  52. package/dist/validators/max-length.js +12 -8
  53. package/dist/validators/max.js +5 -6
  54. package/dist/validators/min-age.js +10 -11
  55. package/dist/validators/min-date.js +12 -13
  56. package/dist/validators/min-length.js +12 -8
  57. package/dist/validators/min.js +6 -7
  58. package/dist/validators/multiple-of.d.ts +2 -0
  59. package/dist/validators/multiple-of.js +10 -0
  60. package/dist/validators/non-negative.d.ts +2 -0
  61. package/dist/validators/non-negative.js +10 -0
  62. package/dist/validators/non-zero.d.ts +2 -0
  63. package/dist/validators/non-zero.js +10 -0
  64. package/dist/validators/past-date.js +11 -12
  65. package/dist/validators/pattern.js +6 -7
  66. package/dist/validators/phone.js +14 -32
  67. package/dist/validators/required.js +9 -10
  68. package/dist/validators/url.js +19 -16
  69. package/dist/validators-xJyP-jLZ.js +169 -0
  70. package/dist/validators.js +54 -50
  71. package/llms.txt +505 -790
  72. package/package.json +20 -4
  73. package/dist/core/validation/core/validate-tree.d.ts +0 -35
  74. package/dist/core/validation/validation-context.d.ts +0 -86
  75. package/dist/core/validation/validators/number.d.ts +0 -31
  76. package/dist/validate-C3XiA_zf.js +0 -10
  77. package/dist/validators/number.d.ts +0 -2
  78. package/dist/validators/number.js +0 -35
  79. package/dist/validators-BGsNOgT1.js +0 -207
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reformer/core",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.0-beta.2",
4
4
  "description": "Reactive form state management library for React with signals-based architecture",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -55,9 +55,25 @@
55
55
  "types": "./dist/validators/phone.d.ts",
56
56
  "import": "./dist/validators/phone.js"
57
57
  },
58
- "./validators/number": {
59
- "types": "./dist/validators/number.d.ts",
60
- "import": "./dist/validators/number.js"
58
+ "./validators/is-number": {
59
+ "types": "./dist/validators/is-number.d.ts",
60
+ "import": "./dist/validators/is-number.js"
61
+ },
62
+ "./validators/integer": {
63
+ "types": "./dist/validators/integer.d.ts",
64
+ "import": "./dist/validators/integer.js"
65
+ },
66
+ "./validators/multiple-of": {
67
+ "types": "./dist/validators/multiple-of.d.ts",
68
+ "import": "./dist/validators/multiple-of.js"
69
+ },
70
+ "./validators/non-negative": {
71
+ "types": "./dist/validators/non-negative.d.ts",
72
+ "import": "./dist/validators/non-negative.js"
73
+ },
74
+ "./validators/non-zero": {
75
+ "types": "./dist/validators/non-zero.d.ts",
76
+ "import": "./dist/validators/non-zero.js"
61
77
  },
62
78
  "./validators/date": {
63
79
  "types": "./dist/validators/date.d.ts",
@@ -1,35 +0,0 @@
1
- import { TreeValidatorFn, ValidateTreeOptions } from '../../types';
2
- /**
3
- * Зарегистрировать cross-field валидатор
4
- *
5
- * Используется для валидации, которая зависит от нескольких полей
6
- *
7
- * @group Validation
8
- * @category Core Functions
9
- *
10
- * @remarks
11
- * Параметр `ctx` в callback требует явной типизации для корректного вывода типов:
12
- * ```typescript
13
- * validateTree((ctx: { form: MyFormType }) => { ... });
14
- * ```
15
- *
16
- * @example
17
- * ```typescript
18
- * // Явная типизация ctx для избежания implicit any
19
- * validateTree(
20
- * (ctx: { form: MyForm }) => {
21
- * if (ctx.form.initialPayment && ctx.form.propertyValue) {
22
- * if (ctx.form.initialPayment > ctx.form.propertyValue) {
23
- * return {
24
- * code: 'initialPaymentTooHigh',
25
- * message: 'Первоначальный взнос не может превышать стоимость',
26
- * };
27
- * }
28
- * }
29
- * return null;
30
- * },
31
- * { targetField: 'initialPayment' }
32
- * );
33
- * ```
34
- */
35
- export declare function validateTree<TForm>(validatorFn: TreeValidatorFn<TForm>, options?: ValidateTreeOptions): void;
@@ -1,86 +0,0 @@
1
- import { GroupNode } from '../nodes/group-node';
2
- import { FieldNode } from '../nodes/field-node';
3
- import { FormProxy } from '../types/form-proxy';
4
- import { FormContext } from '../types/form-context';
5
- /**
6
- * Базовый класс контекста валидации
7
- * Содержит общую логику для всех типов контекстов
8
- * @internal
9
- */
10
- declare abstract class BaseValidationContext<TForm> implements FormContext<TForm> {
11
- protected readonly _form: GroupNode<TForm>;
12
- /**
13
- * Форма с типизированным Proxy-доступом к полям
14
- */
15
- readonly form: FormProxy<TForm>;
16
- constructor(form: GroupNode<TForm>);
17
- /**
18
- * Безопасно установить значение поля по строковому пути
19
- * Автоматически использует emitEvent: false для предотвращения циклов
20
- */
21
- setFieldValue(path: string, value: unknown): void;
22
- /**
23
- * Получить поле формы по строковому пути
24
- */
25
- getFieldByPath(path: string): import('../..').FormNode<import('../types').FormValue> | undefined;
26
- }
27
- /**
28
- * Контекст валидации одного поля. Создаётся фреймворком и передаётся в валидаторы
29
- * (`required`, `validate`, …) — напрямую инстанцировать не нужно.
30
- *
31
- * @example
32
- * ```typescript
33
- * import { validate } from '@reformer/core/validators';
34
- *
35
- * validate(path.password, (value, ctx) => {
36
- * // ctx — экземпляр ValidationContextImpl, доступ к ctx.form для cross-field логики
37
- * if (value !== ctx.form.confirmPassword.value) {
38
- * return { code: 'mismatch', message: 'Пароли не совпадают' };
39
- * }
40
- * return null;
41
- * });
42
- * ```
43
- */
44
- export declare class ValidationContextImpl<TForm, TField> extends BaseValidationContext<TForm> {
45
- private control;
46
- constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, control: FieldNode<TField>);
47
- /**
48
- * Получить текущее значение поля (внутренний метод для validation-applicator)
49
- * @internal
50
- */
51
- value(): TField;
52
- }
53
- /**
54
- * Контекст cross-field валидации. Передаётся в `validateTree`/`validateForm`
55
- * callback'и — напрямую инстанцировать не нужно.
56
- *
57
- * @example
58
- * ```typescript
59
- * import { validateForm } from '@reformer/core';
60
- *
61
- * validateForm(form, (ctx) => {
62
- * // ctx — экземпляр TreeValidationContextImpl
63
- * if (ctx.form.startDate.value > ctx.form.endDate.value) {
64
- * return [{ code: 'date-range', message: 'Дата начала позже даты окончания' }];
65
- * }
66
- * return [];
67
- * });
68
- * ```
69
- */
70
- export declare class TreeValidationContextImpl<TForm> extends BaseValidationContext<TForm> {
71
- constructor(form: GroupNode<TForm>);
72
- }
73
- /**
74
- * Контекст валидации для ArrayNode
75
- * Предоставляет доступ к значению массива
76
- */
77
- export declare class ArrayValidationContextImpl<TForm, TItem> extends BaseValidationContext<TForm> {
78
- private arrayValue;
79
- constructor(form: GroupNode<TForm>, _fieldKey: keyof TForm, arrayValue: TItem[]);
80
- /**
81
- * Получить текущее значение массива (для валидатора)
82
- * @internal
83
- */
84
- value(): TItem[];
85
- }
86
- export {};
@@ -1,31 +0,0 @@
1
- import { ValidateOptions } from '../../types/validation-schema';
2
- import { FieldPathNode } from '../../types';
3
- /**
4
- * Адаптер для number валидатора
5
- * Проверяет, что значение является числом и соответствует заданным ограничениям
6
- *
7
- * @group Validation
8
- * @category Validators
9
- *
10
- * @example
11
- * ```typescript
12
- * number(path.age);
13
- * number(path.price, { min: 0, max: 1000000 });
14
- * number(path.percentage, { min: 0, max: 100, integer: true });
15
- * number(path.rating, { min: 0, max: 5, multipleOf: 0.5 });
16
- * ```
17
- */
18
- export declare function number<TForm, TField extends number | undefined = number>(fieldPath: FieldPathNode<TForm, TField> | undefined, options?: ValidateOptions & {
19
- /** Минимальное значение (включительно) */
20
- min?: number;
21
- /** Максимальное значение (включительно) */
22
- max?: number;
23
- /** Требовать целое число */
24
- integer?: boolean;
25
- /** Значение должно быть кратно этому числу */
26
- multipleOf?: number;
27
- /** Разрешить отрицательные числа (по умолчанию true) */
28
- allowNegative?: boolean;
29
- /** Разрешить ноль (по умолчанию true) */
30
- allowZero?: boolean;
31
- }): void;
@@ -1,10 +0,0 @@
1
- import { e as i } from "./field-path-DuKdGcIE.js";
2
- import { g as o } from "./registry-helpers-Bv_BJ1s-.js";
3
- function c(t, r, a) {
4
- if (!t) return;
5
- const e = i(t);
6
- o().registerSync(e, r, a);
7
- }
8
- export {
9
- c as v
10
- };
@@ -1,2 +0,0 @@
1
- export * from '../core/validation/validators/number'
2
- export {}
@@ -1,35 +0,0 @@
1
- import { v as a } from "../validate-C3XiA_zf.js";
2
- function g(r, e) {
3
- r && a(r, (m) => m == null ? null : typeof m != "number" || isNaN(m) ? {
4
- code: "number",
5
- message: e?.message || "Значение должно быть числом",
6
- params: e?.params
7
- } : e?.integer && !Number.isInteger(m) ? {
8
- code: "number_integer",
9
- message: e?.message || "Значение должно быть целым числом",
10
- params: e?.params
11
- } : e?.min !== void 0 && m < e.min ? {
12
- code: "number_min",
13
- message: e?.message || `Значение должно быть не менее ${e.min}`,
14
- params: { min: e.min, ...e?.params }
15
- } : e?.max !== void 0 && m > e.max ? {
16
- code: "number_max",
17
- message: e?.message || `Значение должно быть не более ${e.max}`,
18
- params: { max: e.max, ...e?.params }
19
- } : e?.multipleOf !== void 0 && m % e.multipleOf !== 0 ? {
20
- code: "number_multiple",
21
- message: e?.message || `Значение должно быть кратно ${e.multipleOf}`,
22
- params: { multipleOf: e.multipleOf, ...e?.params }
23
- } : e?.allowNegative === !1 && m < 0 ? {
24
- code: "number_negative",
25
- message: e?.message || "Отрицательные числа не допускаются",
26
- params: e?.params
27
- } : e?.allowZero === !1 && m === 0 ? {
28
- code: "number_zero",
29
- message: e?.message || "Ноль не допускается",
30
- params: e?.params
31
- } : null);
32
- }
33
- export {
34
- g as number
35
- };
@@ -1,207 +0,0 @@
1
- import { g as a, V as u } from "./registry-helpers-Bv_BJ1s-.js";
2
- import { e as m, t as y, c, a as _ } from "./field-path-DuKdGcIE.js";
3
- import { v as N } from "./validate-C3XiA_zf.js";
4
- import { required as C } from "./validators/required.js";
5
- import { min as P } from "./validators/min.js";
6
- import { max as F } from "./validators/max.js";
7
- import { minLength as d } from "./validators/min-length.js";
8
- import { maxLength as b } from "./validators/max-length.js";
9
- import { email as B } from "./validators/email.js";
10
- import { pattern as T } from "./validators/pattern.js";
11
- import { url as I } from "./validators/url.js";
12
- import { phone as R } from "./validators/phone.js";
13
- import { number as w } from "./validators/number.js";
14
- import { isDate as D } from "./validators/is-date.js";
15
- import { minDate as j } from "./validators/min-date.js";
16
- import { maxDate as k } from "./validators/max-date.js";
17
- import { pastDate as E } from "./validators/past-date.js";
18
- import { futureDate as K } from "./validators/future-date.js";
19
- import { minAge as L } from "./validators/min-age.js";
20
- import { maxAge as G } from "./validators/max-age.js";
21
- function M(t, r, i) {
22
- const e = m(t);
23
- a().registerAsync(e, r, i);
24
- }
25
- function q(t, r) {
26
- a().registerTree(t, r);
27
- }
28
- function z(t, r) {
29
- if (!Array.isArray(t) && !Array.isArray(r) && t && !("__key" in t) && !("__path" in t)) {
30
- r(t);
31
- return;
32
- }
33
- const i = (Array.isArray(t) ? t : [t]).filter(
34
- Boolean
35
- ), e = Array.isArray(r) ? r : [r];
36
- for (const n of i) {
37
- const o = y(n);
38
- for (const p of e)
39
- p(o);
40
- }
41
- }
42
- function S(t, r, i) {
43
- const e = m(t);
44
- a().enterCondition(e, r);
45
- try {
46
- const n = c();
47
- i(n);
48
- } finally {
49
- a().exitCondition();
50
- }
51
- }
52
- function U(t, r) {
53
- t && d(t, 1, {
54
- message: r?.message || "Массив не должен быть пустым",
55
- params: { minLength: 1, ...r?.params }
56
- });
57
- }
58
- function W(t, r) {
59
- if (!t) return;
60
- const i = m(t);
61
- a().registerArrayItemValidation(i, r);
62
- }
63
- function s(t) {
64
- return t == null ? !1 : typeof t == "object" && "value" in t && "setValue" in t && "getValue" in t && "validate" in t;
65
- }
66
- function g(t) {
67
- return t == null ? !1 : s(t) && "validators" in t && "asyncValidators" in t && // FieldNode имеет markAsTouched метод
68
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
69
- typeof t.markAsTouched == "function" && // У FieldNode нет fields или items
70
- !("fields" in t) && !("items" in t);
71
- }
72
- function h(t) {
73
- return t == null ? !1 : s(t) && "applyValidationSchema" in t && "applyBehaviorSchema" in t && "getFieldByPath" in t && // GroupNode НЕ имеет items/push/removeAt (это ArrayNode)
74
- !("items" in t) && !("push" in t) && !("removeAt" in t);
75
- }
76
- function A(t) {
77
- return t == null ? !1 : s(t) && "items" in t && "length" in t && "push" in t && "removeAt" in t && "at" in t && // eslint-disable-next-line @typescript-eslint/no-explicit-any
78
- typeof t.push == "function" && // eslint-disable-next-line @typescript-eslint/no-explicit-any
79
- typeof t.removeAt == "function";
80
- }
81
- function yt(t) {
82
- return g(t) ? "FieldNode" : h(t) ? "GroupNode" : A(t) ? "ArrayNode" : s(t) ? "FormNode" : "Unknown";
83
- }
84
- function f(t) {
85
- return g(t) ? [t] : h(t) ? Array.from(t.getAllFields()).flatMap(f) : A(t) ? t.map((r) => f(r)).flat() : [];
86
- }
87
- async function H(t, r) {
88
- const i = new u();
89
- i.beginRegistration();
90
- let e = [], n = !1;
91
- try {
92
- const o = c();
93
- r(o), e = i.getCurrentContext()?.getValidators() || [], i.cancelRegistration(), n = !0, t.clearErrors();
94
- const x = f(t);
95
- return await Promise.allSettled(x.map((V) => V.validate())), e.length > 0 && await t.applyContextualValidators(e), t.valid.value;
96
- } catch (o) {
97
- throw n || i.cancelRegistration(), o;
98
- }
99
- }
100
- class l {
101
- _form;
102
- /**
103
- * Форма с типизированным Proxy-доступом к полям
104
- */
105
- form;
106
- constructor(r) {
107
- this._form = r, this.form = r._proxyInstance || r.getProxy();
108
- }
109
- /**
110
- * Безопасно установить значение поля по строковому пути
111
- * Автоматически использует emitEvent: false для предотвращения циклов
112
- */
113
- setFieldValue(r, i) {
114
- const e = this._form.getFieldByPath(r);
115
- e && s(e) && e.setValue(i, { emitEvent: !1 });
116
- }
117
- /**
118
- * Получить поле формы по строковому пути
119
- */
120
- getFieldByPath(r) {
121
- return this._form.getFieldByPath(r);
122
- }
123
- }
124
- class J extends l {
125
- control;
126
- constructor(r, i, e) {
127
- super(r), this.control = e;
128
- }
129
- /**
130
- * Получить текущее значение поля (внутренний метод для validation-applicator)
131
- * @internal
132
- */
133
- value() {
134
- return this.control.value.value;
135
- }
136
- }
137
- class Q extends l {
138
- constructor(r) {
139
- super(r);
140
- }
141
- }
142
- class dt extends l {
143
- arrayValue;
144
- constructor(r, i, e) {
145
- super(r), this.arrayValue = e;
146
- }
147
- /**
148
- * Получить текущее значение массива (для валидатора)
149
- * @internal
150
- */
151
- value() {
152
- return this.arrayValue;
153
- }
154
- }
155
- const gt = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
156
- __proto__: null,
157
- TreeValidationContextImpl: Q,
158
- ValidationContextImpl: J,
159
- ValidationRegistry: u,
160
- apply: z,
161
- applyWhen: S,
162
- createFieldPath: c,
163
- email: B,
164
- extractKey: _,
165
- extractPath: m,
166
- futureDate: K,
167
- isDate: D,
168
- max: F,
169
- maxAge: G,
170
- maxDate: k,
171
- maxLength: b,
172
- min: P,
173
- minAge: L,
174
- minDate: j,
175
- minLength: d,
176
- notEmpty: U,
177
- number: w,
178
- pastDate: E,
179
- pattern: T,
180
- phone: R,
181
- required: C,
182
- toFieldPath: y,
183
- url: I,
184
- validate: N,
185
- validateAsync: M,
186
- validateForm: H,
187
- validateItems: W,
188
- validateTree: q
189
- }, Symbol.toStringTag, { value: "Module" }));
190
- export {
191
- dt as A,
192
- Q as T,
193
- J as V,
194
- A as a,
195
- gt as b,
196
- s as c,
197
- h as d,
198
- M as e,
199
- q as f,
200
- yt as g,
201
- z as h,
202
- g as i,
203
- S as j,
204
- W as k,
205
- U as n,
206
- H as v
207
- };