@reformer/core 10.1.0 → 11.0.0-beta.1
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-DUrqAqp1.js → behaviors-node-DGEFMTQu.js} +1 -1
- package/dist/{behaviors-value-lCpqicfa.js → behaviors-value-C7dSEhCc.js} +43 -57
- package/dist/behaviors.js +108 -107
- package/dist/derived-registry-CluZCQ7U.js +16 -0
- package/dist/form/form-submitter.d.ts +0 -4
- package/dist/form/hooks/types.d.ts +3 -3
- package/dist/form/hooks/use-form-validation.d.ts +48 -0
- package/dist/form/index.d.ts +2 -3
- package/dist/form/nodes/array-node.d.ts +0 -84
- package/dist/form/nodes/form-node.d.ts +0 -14
- package/dist/form/nodes/group-node.d.ts +0 -4
- package/dist/form/status-machine.d.ts +0 -38
- package/dist/form/types/contracts.d.ts +0 -6
- package/dist/form/types/deep-schema.d.ts +0 -9
- package/dist/form/types/index.d.ts +4 -38
- package/dist/form/types/schema-node.d.ts +13 -16
- package/dist/form/types/validation-schema.d.ts +0 -25
- package/dist/form/unique-id.d.ts +3 -11
- package/dist/form/validation-schema.d.ts +16 -3
- package/dist/form/validation-strategy.d.ts +55 -0
- package/dist/form/validators.d.ts +8 -3
- package/dist/form-model-DYCzGGKF.js +286 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +477 -648
- package/dist/runtime-token.d.ts +23 -0
- package/dist/state/form-model.d.ts +12 -1
- package/dist/state.js +17 -15
- package/dist/subscription-manager-705bls97.js +171 -0
- package/dist/validation.js +133 -81
- package/dist/validators.d.ts +0 -4
- package/dist/validators.js +88 -122
- package/docs/llms/01-api-reference.md +63 -0
- package/docs/llms/02-quick-start.md +143 -0
- package/docs/llms/03-api-signatures.md +273 -0
- package/docs/llms/04-common-patterns.md +202 -0
- package/docs/llms/05-common-mistakes.md +167 -0
- package/docs/llms/06-troubleshooting.md +11 -0
- package/docs/llms/07-complete-import.md +99 -0
- package/docs/llms/08-form-types.md +47 -0
- package/docs/llms/09-formschema.md +143 -0
- package/docs/llms/10-arrays.md +161 -0
- package/docs/llms/11-async-watchfield.md +53 -0
- package/docs/llms/12-array-cleanup.md +31 -0
- package/docs/llms/13-multi-step.md +91 -0
- package/docs/llms/14-extended-mistakes.md +98 -0
- package/docs/llms/15-project-structure.md +125 -0
- package/docs/llms/16-ui-components.md +189 -0
- package/docs/llms/17-nonexistent-api.md +93 -0
- package/docs/llms/18-conditional-fields.md +183 -0
- package/docs/llms/19-reading-values.md +59 -0
- package/docs/llms/20-compute-vs-watch.md +138 -0
- package/docs/llms/21-array-operations.md +113 -0
- package/docs/llms/22-cycle-detection.md +86 -0
- package/docs/llms/23-copy-from.md +141 -0
- package/docs/llms/24-sync-fields.md +114 -0
- package/docs/llms/25-reset-when.md +115 -0
- package/docs/llms/26-transform-value.md +136 -0
- package/docs/llms/27-revalidate-when.md +132 -0
- package/docs/llms/28-submit-and-reset.md +259 -0
- package/docs/llms/29-async-preload.md +193 -0
- package/docs/llms/30-type-safety-recipes.md +159 -0
- package/docs/llms/31-async-validator-debounce.md +135 -0
- package/docs/llms/32-async-options-loading.md +108 -0
- package/docs/llms/33-validation-strategy.md +193 -0
- package/llms.txt +435 -1580
- package/package.json +33 -10
- package/dist/form-model-C8Fi83k4.js +0 -439
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Штамп копии рантайма ядра.
|
|
3
|
+
*
|
|
4
|
+
* Единственное назначение — быть объектом, уникальным в пределах ОДНОЙ копии модуля. Две
|
|
5
|
+
* независимо загруженные копии `@reformer/core` дадут два разных объекта, и по их несовпадению
|
|
6
|
+
* guard распознаёт дубль рантайма.
|
|
7
|
+
*
|
|
8
|
+
* Почему именно объект, а не строка с версией: две копии ОДНОЙ версии ломают всё ровно так же,
|
|
9
|
+
* как две копии разных версий, — раздваиваются модульные `WeakMap` (`derived-registry`,
|
|
10
|
+
* `signal-node-registry`) и перестают работать проверки `instanceof Signal`. Сравнение версий
|
|
11
|
+
* такой случай пропустило бы.
|
|
12
|
+
*
|
|
13
|
+
* @see `@reformer/form-registry/guard`
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```ts
|
|
17
|
+
* import { CORE_RUNTIME_TOKEN } from '@reformer/core';
|
|
18
|
+
* import { stampRuntime } from '@reformer/form-registry/guard';
|
|
19
|
+
*
|
|
20
|
+
* stampRuntime('@reformer/core', CORE_RUNTIME_TOKEN);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare const CORE_RUNTIME_TOKEN: object;
|
|
@@ -1,4 +1,15 @@
|
|
|
1
|
-
import { FormModel } from './types';
|
|
1
|
+
import { FormModel, PathAwareSignal } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Обойти ВСЕ листовые сигналы модели (включая элементы массивов), вызвав `visit` на каждом.
|
|
4
|
+
*
|
|
5
|
+
* Внутри реактивного `effect` служит подпиской «любое поле изменилось»: `visit(sig => void sig.value)`
|
|
6
|
+
* подписывает на значения листьев, а обход массивов через `items.value` — на их состав. Так строятся
|
|
7
|
+
* триггеры `change`/`blur` стратегий валидации (см. `createFormValidation`), тем же паттерном, что
|
|
8
|
+
* `revalidateWhen`, но без ручного перечисления зависимостей.
|
|
9
|
+
*
|
|
10
|
+
* @group Model
|
|
11
|
+
*/
|
|
12
|
+
export declare function eachLeafSignal<T>(model: FormModel<T>, visit: (signal: PathAwareSignal<unknown>) => void): void;
|
|
2
13
|
/**
|
|
3
14
|
* Создать реактивную модель данных формы (слой M1).
|
|
4
15
|
*
|
package/dist/state.js
CHANGED
|
@@ -1,19 +1,21 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { c as o, a as t,
|
|
1
|
+
import { c as s } from "./form-model-DYCzGGKF.js";
|
|
2
|
+
import { c as o, a as t, r as c, b as i, d as m, e as d, f, s as l, t as n, w as u } from "./behaviors-value-C7dSEhCc.js";
|
|
3
|
+
import { i as b, m as k, u as v } from "./derived-registry-CluZCQ7U.js";
|
|
4
|
+
import { S as D } from "./subscription-manager-705bls97.js";
|
|
3
5
|
export {
|
|
4
|
-
|
|
6
|
+
D as SubscriptionManager,
|
|
5
7
|
o as computeFrom,
|
|
6
8
|
t as copyFrom,
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
9
|
+
s as createModel,
|
|
10
|
+
b as isDerived,
|
|
11
|
+
k as markDerived,
|
|
12
|
+
c as resetWhen,
|
|
13
|
+
i as revalidateWhen,
|
|
14
|
+
m as runOutsideEffect,
|
|
15
|
+
d as safeCallback,
|
|
16
|
+
f as safeDebouncedCallback,
|
|
17
|
+
l as syncFields,
|
|
18
|
+
n as transformValue,
|
|
19
|
+
v as unmarkDerived,
|
|
20
|
+
u as watchField
|
|
19
21
|
};
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
class t {
|
|
2
|
+
/**
|
|
3
|
+
* Хранилище подписок
|
|
4
|
+
* Ключ: уникальный идентификатор подписки
|
|
5
|
+
* Значение: функция отписки (dispose)
|
|
6
|
+
*/
|
|
7
|
+
subscriptions = /* @__PURE__ */ new Map();
|
|
8
|
+
/**
|
|
9
|
+
* Добавляет подписку
|
|
10
|
+
*
|
|
11
|
+
* Если подписка с таким ключом уже существует, отписывается от неё
|
|
12
|
+
* и заменяет новой. Это предотвращает утечки памяти при повторной
|
|
13
|
+
* регистрации подписки с тем же ключом.
|
|
14
|
+
*
|
|
15
|
+
* @param key Уникальный ключ подписки
|
|
16
|
+
* @param dispose Функция отписки (обычно возвращаемая из effect())
|
|
17
|
+
* @returns Функция для отписки от этой конкретной подписки
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const manager = new SubscriptionManager();
|
|
22
|
+
*
|
|
23
|
+
* // Добавление подписки
|
|
24
|
+
* const unsubscribe = manager.add('mySubscription', () => {
|
|
25
|
+
* console.log('Disposing subscription');
|
|
26
|
+
* });
|
|
27
|
+
*
|
|
28
|
+
* // Отписка через возвращаемую функцию
|
|
29
|
+
* unsubscribe();
|
|
30
|
+
*
|
|
31
|
+
* // Или через manager.remove()
|
|
32
|
+
* manager.add('anotherSub', disposeFn);
|
|
33
|
+
* manager.remove('anotherSub');
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
add(s, i) {
|
|
37
|
+
return this.subscriptions.has(s) && (process.env.NODE_ENV !== "production" && console.warn(`[SubscriptionManager] Subscription "${s}" already exists, replacing`), this.subscriptions.get(s)?.()), this.subscriptions.set(s, i), () => this.remove(s);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Удаляет подписку по ключу
|
|
41
|
+
*
|
|
42
|
+
* Вызывает функцию отписки и удаляет подписку из хранилища.
|
|
43
|
+
* Если подписка с таким ключом не найдена, ничего не делает.
|
|
44
|
+
*
|
|
45
|
+
* @param key Ключ подписки
|
|
46
|
+
* @returns true, если подписка была удалена, false если не найдена
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* const manager = new SubscriptionManager();
|
|
51
|
+
* manager.add('mySub', disposeFn);
|
|
52
|
+
*
|
|
53
|
+
* // Удаление подписки
|
|
54
|
+
* const removed = manager.remove('mySub'); // true
|
|
55
|
+
*
|
|
56
|
+
* // Попытка удалить несуществующую подписку
|
|
57
|
+
* const removed2 = manager.remove('nonExistent'); // false
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
remove(s) {
|
|
61
|
+
const i = this.subscriptions.get(s);
|
|
62
|
+
return i ? (i(), this.subscriptions.delete(s), !0) : !1;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Очищает все подписки
|
|
66
|
+
*
|
|
67
|
+
* Вызывает функции отписки для всех активных подписок
|
|
68
|
+
* и очищает хранилище. Обычно используется при dispose узла формы.
|
|
69
|
+
*
|
|
70
|
+
* @example
|
|
71
|
+
* ```typescript
|
|
72
|
+
* class FieldNode {
|
|
73
|
+
* private subscriptions = new SubscriptionManager();
|
|
74
|
+
*
|
|
75
|
+
* dispose() {
|
|
76
|
+
* // Отписываемся от всех effect
|
|
77
|
+
* this.subscriptions.clear();
|
|
78
|
+
* }
|
|
79
|
+
* }
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
clear() {
|
|
83
|
+
this.subscriptions.forEach((s) => {
|
|
84
|
+
s();
|
|
85
|
+
}), this.subscriptions.clear();
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Возвращает количество активных подписок
|
|
89
|
+
*
|
|
90
|
+
* Полезно для отладки утечек памяти. Если количество подписок
|
|
91
|
+
* растет без ограничений, это может указывать на то, что
|
|
92
|
+
* компоненты не отписываются должным образом.
|
|
93
|
+
*
|
|
94
|
+
* @returns Количество активных подписок
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const manager = new SubscriptionManager();
|
|
99
|
+
* console.log(manager.size()); // 0
|
|
100
|
+
*
|
|
101
|
+
* manager.add('sub1', disposeFn1);
|
|
102
|
+
* manager.add('sub2', disposeFn2);
|
|
103
|
+
* console.log(manager.size()); // 2
|
|
104
|
+
*
|
|
105
|
+
* manager.clear();
|
|
106
|
+
* console.log(manager.size()); // 0
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
size() {
|
|
110
|
+
return this.subscriptions.size;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Проверяет, есть ли подписка с данным ключом
|
|
114
|
+
*
|
|
115
|
+
* @param key Ключ подписки
|
|
116
|
+
* @returns true, если подписка существует
|
|
117
|
+
*
|
|
118
|
+
* @example
|
|
119
|
+
* ```typescript
|
|
120
|
+
* const manager = new SubscriptionManager();
|
|
121
|
+
* manager.add('mySub', disposeFn);
|
|
122
|
+
*
|
|
123
|
+
* console.log(manager.has('mySub')); // true
|
|
124
|
+
* console.log(manager.has('nonExistent')); // false
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
has(s) {
|
|
128
|
+
return this.subscriptions.has(s);
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Возвращает список всех ключей активных подписок
|
|
132
|
+
*
|
|
133
|
+
* Полезно для отладки: можно увидеть, какие подписки активны.
|
|
134
|
+
*
|
|
135
|
+
* @returns Массив ключей всех активных подписок
|
|
136
|
+
*
|
|
137
|
+
* @example
|
|
138
|
+
* ```typescript
|
|
139
|
+
* const manager = new SubscriptionManager();
|
|
140
|
+
* manager.add('watch-value', disposeFn1);
|
|
141
|
+
* manager.add('watch-errors', disposeFn2);
|
|
142
|
+
*
|
|
143
|
+
* console.log(manager.getKeys()); // ['watch-value', 'watch-errors']
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
getKeys() {
|
|
147
|
+
return Array.from(this.subscriptions.keys());
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Отписывается от всех подписок (алиас для clear())
|
|
151
|
+
*
|
|
152
|
+
* Используется при dispose() узла формы для совместимости с ожидаемым API.
|
|
153
|
+
*
|
|
154
|
+
* @example
|
|
155
|
+
* ```typescript
|
|
156
|
+
* class FieldNode {
|
|
157
|
+
* private subscriptions = new SubscriptionManager();
|
|
158
|
+
*
|
|
159
|
+
* dispose() {
|
|
160
|
+
* this.subscriptions.dispose();
|
|
161
|
+
* }
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*/
|
|
165
|
+
dispose() {
|
|
166
|
+
this.clear();
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
export {
|
|
170
|
+
t as S
|
|
171
|
+
};
|
package/dist/validation.js
CHANGED
|
@@ -1,115 +1,167 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
import { signal as M, effect as E } from "@preact/signals-core";
|
|
2
|
+
import { e as L } from "./form-model-DYCzGGKF.js";
|
|
3
|
+
import { g as p } from "./signal-node-registry-tiwel-TV.js";
|
|
4
|
+
let v = null;
|
|
5
|
+
function f(e) {
|
|
6
|
+
if (!v)
|
|
5
7
|
throw new Error(
|
|
6
|
-
`[@reformer/core/validation] "${
|
|
8
|
+
`[@reformer/core/validation] "${e}" вызван вне схемы валидации — операторы валидации можно вызывать только внутри прогона validateModel(...) (напрямую или через apply/each).`
|
|
7
9
|
);
|
|
8
|
-
return
|
|
10
|
+
return v;
|
|
9
11
|
}
|
|
10
|
-
function
|
|
11
|
-
let
|
|
12
|
-
return
|
|
12
|
+
function b(e, r) {
|
|
13
|
+
let t = e.errors.get(r);
|
|
14
|
+
return t || e.errors.set(r, t = []), t;
|
|
13
15
|
}
|
|
14
|
-
const
|
|
15
|
-
function
|
|
16
|
-
const
|
|
17
|
-
if (!
|
|
18
|
-
const o =
|
|
19
|
-
for (const
|
|
20
|
-
const s =
|
|
21
|
-
s &&
|
|
16
|
+
const y = (e) => e.whenStack.every((r) => r());
|
|
17
|
+
function D(e, r) {
|
|
18
|
+
const t = f("validate"), n = b(t, e);
|
|
19
|
+
if (!y(t)) return;
|
|
20
|
+
const o = e.peek();
|
|
21
|
+
for (const i of r) {
|
|
22
|
+
const s = i(o, t.model, t.model);
|
|
23
|
+
s && n.push(s);
|
|
22
24
|
}
|
|
23
25
|
}
|
|
24
|
-
function
|
|
25
|
-
const
|
|
26
|
-
if (!
|
|
27
|
-
const o =
|
|
28
|
-
for (const s of
|
|
29
|
-
|
|
30
|
-
s(o, { signal:
|
|
31
|
-
(
|
|
32
|
-
|
|
26
|
+
function N(e, r) {
|
|
27
|
+
const t = f("validateAsync"), n = b(t, e);
|
|
28
|
+
if (!y(t)) return;
|
|
29
|
+
const o = e.peek(), i = t.signal;
|
|
30
|
+
for (const s of r)
|
|
31
|
+
t.pending.push(
|
|
32
|
+
s(o, { signal: i }).then(
|
|
33
|
+
(a) => {
|
|
34
|
+
a && !i.aborted && n.push(a);
|
|
33
35
|
},
|
|
34
36
|
() => {
|
|
35
37
|
}
|
|
36
38
|
)
|
|
37
39
|
);
|
|
38
40
|
}
|
|
39
|
-
function
|
|
40
|
-
const
|
|
41
|
-
|
|
41
|
+
function R(e, r) {
|
|
42
|
+
const t = f("validateWhen");
|
|
43
|
+
t.whenStack.push(e);
|
|
42
44
|
try {
|
|
43
|
-
|
|
45
|
+
r();
|
|
44
46
|
} finally {
|
|
45
|
-
|
|
47
|
+
t.whenStack.pop();
|
|
46
48
|
}
|
|
47
49
|
}
|
|
48
|
-
function
|
|
49
|
-
const
|
|
50
|
-
if (!
|
|
51
|
-
const o =
|
|
52
|
-
o &&
|
|
50
|
+
function _(e, r) {
|
|
51
|
+
const t = f("cross"), n = b(t, e);
|
|
52
|
+
if (!y(t)) return;
|
|
53
|
+
const o = r(t.model.get());
|
|
54
|
+
o && n.push(o);
|
|
53
55
|
}
|
|
54
|
-
function
|
|
55
|
-
|
|
56
|
-
const
|
|
57
|
-
for (let
|
|
56
|
+
function $(e, r) {
|
|
57
|
+
f("each");
|
|
58
|
+
const t = e.length;
|
|
59
|
+
for (let n = 0; n < t; n++) r(e.at(n));
|
|
58
60
|
}
|
|
59
|
-
function
|
|
60
|
-
const
|
|
61
|
-
for (const
|
|
61
|
+
function j(...e) {
|
|
62
|
+
const t = f("apply").model;
|
|
63
|
+
for (const n of e) n({ model: t });
|
|
62
64
|
}
|
|
63
|
-
function
|
|
64
|
-
return
|
|
65
|
+
function z(e) {
|
|
66
|
+
return e;
|
|
65
67
|
}
|
|
66
|
-
const
|
|
67
|
-
function
|
|
68
|
-
let
|
|
69
|
-
|
|
70
|
-
let
|
|
71
|
-
return
|
|
68
|
+
const F = /* @__PURE__ */ new WeakMap();
|
|
69
|
+
function P(e, r) {
|
|
70
|
+
let t = F.get(e);
|
|
71
|
+
t || F.set(e, t = /* @__PURE__ */ new WeakMap());
|
|
72
|
+
let n = t.get(r);
|
|
73
|
+
return n || t.set(r, n = { fields: /* @__PURE__ */ new Set(), ac: null }), n;
|
|
72
74
|
}
|
|
73
|
-
const
|
|
74
|
-
for (const
|
|
75
|
+
const T = (e) => {
|
|
76
|
+
for (const r of e.values()) for (const t of r) if (t.severity !== "warning") return !0;
|
|
75
77
|
return !1;
|
|
76
78
|
};
|
|
77
|
-
function
|
|
78
|
-
return
|
|
79
|
-
|
|
79
|
+
function W(e) {
|
|
80
|
+
return e.aborted ? Promise.resolve() : new Promise((r) => {
|
|
81
|
+
e.addEventListener("abort", () => r(), { once: !0 });
|
|
80
82
|
});
|
|
81
83
|
}
|
|
82
|
-
async function
|
|
83
|
-
const
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
const
|
|
88
|
-
model:
|
|
84
|
+
async function V(e, r, t) {
|
|
85
|
+
const n = P(e, r);
|
|
86
|
+
n.ac?.abort();
|
|
87
|
+
const o = new AbortController();
|
|
88
|
+
n.ac = o;
|
|
89
|
+
const i = {
|
|
90
|
+
model: e,
|
|
89
91
|
errors: /* @__PURE__ */ new Map(),
|
|
90
92
|
pending: [],
|
|
91
93
|
whenStack: [],
|
|
92
|
-
signal:
|
|
93
|
-
},
|
|
94
|
-
|
|
94
|
+
signal: o.signal
|
|
95
|
+
}, s = v;
|
|
96
|
+
v = i;
|
|
95
97
|
try {
|
|
96
|
-
|
|
98
|
+
r({ model: e });
|
|
97
99
|
} finally {
|
|
98
|
-
|
|
100
|
+
v = s;
|
|
99
101
|
}
|
|
100
|
-
if (
|
|
101
|
-
const
|
|
102
|
-
for (const c of
|
|
103
|
-
for (const c of
|
|
104
|
-
|
|
102
|
+
if (i.pending.length && await Promise.race([Promise.all(i.pending), W(o.signal)]), o.signal.aborted) return !1;
|
|
103
|
+
const a = new Set(i.errors.keys());
|
|
104
|
+
for (const c of n.fields) a.has(c) || p(c)?.setErrors([]);
|
|
105
|
+
for (const c of a) p(c)?.setErrors(i.errors.get(c) ?? []);
|
|
106
|
+
if (t?.touch) for (const c of a) p(c)?.markAsTouched();
|
|
107
|
+
return n.fields = a, !T(i.errors);
|
|
108
|
+
}
|
|
109
|
+
function G(e, r, t = {}) {
|
|
110
|
+
const { strategy: n = "submit", debounce: o = 0, liveAfterSubmit: i = "change" } = t, s = M(!1);
|
|
111
|
+
let a = 0, c = !1, w = !1, d, l;
|
|
112
|
+
const k = async (u) => {
|
|
113
|
+
a++, s.value = !0;
|
|
114
|
+
try {
|
|
115
|
+
return await V(e, r, { touch: u });
|
|
116
|
+
} finally {
|
|
117
|
+
--a === 0 && (s.value = !1);
|
|
118
|
+
}
|
|
119
|
+
}, h = () => {
|
|
120
|
+
k(!1);
|
|
121
|
+
}, A = () => {
|
|
122
|
+
if (!o) {
|
|
123
|
+
h();
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
l && clearTimeout(l), l = setTimeout(h, o);
|
|
127
|
+
}, S = (u, g) => {
|
|
128
|
+
let x = !0;
|
|
129
|
+
return E(() => {
|
|
130
|
+
if (L(e, u), x) {
|
|
131
|
+
x = !1;
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
n === "afterFirstSubmit" && !c || g();
|
|
135
|
+
});
|
|
136
|
+
}, m = {
|
|
137
|
+
async validate() {
|
|
138
|
+
return c = !0, k(!0);
|
|
139
|
+
},
|
|
140
|
+
start() {
|
|
141
|
+
if (w || d) return () => m.dispose();
|
|
142
|
+
const u = n === "afterFirstSubmit" ? i : n;
|
|
143
|
+
return u === "change" ? d = S((g) => void g.value, A) : u === "blur" && (d = S((g) => void p(g)?.touched.value, h)), () => m.dispose();
|
|
144
|
+
},
|
|
145
|
+
dispose() {
|
|
146
|
+
w = !0, l && (clearTimeout(l), l = void 0), d?.(), d = void 0;
|
|
147
|
+
},
|
|
148
|
+
get isValidating() {
|
|
149
|
+
return s.value;
|
|
150
|
+
},
|
|
151
|
+
get validating() {
|
|
152
|
+
return s;
|
|
153
|
+
}
|
|
154
|
+
};
|
|
155
|
+
return m;
|
|
105
156
|
}
|
|
106
157
|
export {
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
158
|
+
j as apply,
|
|
159
|
+
G as createFormValidation,
|
|
160
|
+
_ as cross,
|
|
161
|
+
z as defineValidationSchema,
|
|
162
|
+
$ as each,
|
|
163
|
+
D as validate,
|
|
164
|
+
N as validateAsync,
|
|
165
|
+
V as validateModel,
|
|
166
|
+
R as validateWhen
|
|
115
167
|
};
|