@bquery/bquery 1.7.0 → 1.8.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.
- package/README.md +760 -716
- package/dist/{a11y-C5QOVvRn.js → a11y-DVBCy09c.js} +3 -3
- package/dist/a11y-DVBCy09c.js.map +1 -0
- package/dist/a11y.es.mjs +1 -1
- package/dist/component/library.d.ts.map +1 -1
- package/dist/{component-CuuTijA6.js → component-L3-JfOFz.js} +5 -5
- package/dist/component-L3-JfOFz.js.map +1 -0
- package/dist/component.es.mjs +1 -1
- package/dist/{config-BW35FKuA.js → config-DhT9auRm.js} +1 -1
- package/dist/{config-BW35FKuA.js.map → config-DhT9auRm.js.map} +1 -1
- package/dist/{constraints-3lV9yyBw.js → constraints-D5RHQLmP.js} +1 -1
- package/dist/constraints-D5RHQLmP.js.map +1 -0
- package/dist/core/collection.d.ts +86 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/element.d.ts +28 -0
- package/dist/core/element.d.ts.map +1 -1
- package/dist/core/shared.d.ts +6 -0
- package/dist/core/shared.d.ts.map +1 -1
- package/dist/core-DdtZHzsS.js +168 -0
- package/dist/core-DdtZHzsS.js.map +1 -0
- package/dist/{core-Cjl7GUu8.js → core-EMYSLzaT.js} +289 -259
- package/dist/core-EMYSLzaT.js.map +1 -0
- package/dist/core.es.mjs +48 -47
- package/dist/{custom-directives-7wAShnnd.js → custom-directives-Dr4C5lVV.js} +1 -1
- package/dist/custom-directives-Dr4C5lVV.js.map +1 -0
- package/dist/{devtools-D2fQLhDN.js → devtools-BhB2iDPT.js} +2 -2
- package/dist/devtools-BhB2iDPT.js.map +1 -0
- package/dist/devtools.es.mjs +1 -1
- package/dist/{dnd-B8EgyzaI.js → dnd-NwZBYh4l.js} +1 -1
- package/dist/dnd-NwZBYh4l.js.map +1 -0
- package/dist/dnd.es.mjs +1 -1
- package/dist/{env-NeVmr4Gf.js → env-CTdvLaH2.js} +1 -1
- package/dist/env-CTdvLaH2.js.map +1 -0
- package/dist/forms/create-form.d.ts.map +1 -1
- package/dist/forms/index.d.ts +3 -2
- package/dist/forms/index.d.ts.map +1 -1
- package/dist/forms/types.d.ts +46 -0
- package/dist/forms/types.d.ts.map +1 -1
- package/dist/forms/use-field.d.ts +34 -0
- package/dist/forms/use-field.d.ts.map +1 -0
- package/dist/forms/validators.d.ts +25 -0
- package/dist/forms/validators.d.ts.map +1 -1
- package/dist/forms-UcRHsYxC.js +227 -0
- package/dist/forms-UcRHsYxC.js.map +1 -0
- package/dist/forms.es.mjs +14 -12
- package/dist/full.d.ts +17 -26
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +206 -181
- package/dist/full.iife.js +33 -33
- package/dist/full.iife.js.map +1 -1
- package/dist/full.umd.js +33 -33
- package/dist/full.umd.js.map +1 -1
- package/dist/function-Cybd57JV.js +33 -0
- package/dist/function-Cybd57JV.js.map +1 -0
- package/dist/{i18n-BnnhTFOS.js → i18n-kuF6Ekj6.js} +3 -3
- package/dist/i18n-kuF6Ekj6.js.map +1 -0
- package/dist/i18n.es.mjs +1 -1
- package/dist/index.es.mjs +251 -228
- package/dist/media/breakpoints.d.ts.map +1 -1
- package/dist/media/types.d.ts +2 -2
- package/dist/media/types.d.ts.map +1 -1
- package/dist/{media-Di2Ta22s.js → media-i-fB5WxI.js} +3 -3
- package/dist/media-i-fB5WxI.js.map +1 -0
- package/dist/media.es.mjs +1 -1
- package/dist/{motion-qPj_TYGv.js → motion-BJsAuULb.js} +2 -2
- package/dist/motion-BJsAuULb.js.map +1 -0
- package/dist/motion.es.mjs +1 -1
- package/dist/{mount-SM07RUa6.js → mount-B4Y8bk8Z.js} +5 -5
- package/dist/mount-B4Y8bk8Z.js.map +1 -0
- package/dist/{platform-CPbCprb6.js → platform-Dw2gE3zI.js} +3 -3
- package/dist/{platform-CPbCprb6.js.map → platform-Dw2gE3zI.js.map} +1 -1
- package/dist/platform.es.mjs +2 -2
- package/dist/plugin/registry.d.ts.map +1 -1
- package/dist/{plugin-cPoOHFLY.js → plugin-C2WuC8SF.js} +20 -18
- package/dist/plugin-C2WuC8SF.js.map +1 -0
- package/dist/plugin.es.mjs +1 -1
- package/dist/reactive/async-data.d.ts +28 -3
- package/dist/reactive/async-data.d.ts.map +1 -1
- package/dist/reactive/computed.d.ts +3 -0
- package/dist/reactive/computed.d.ts.map +1 -1
- package/dist/reactive/effect.d.ts +3 -0
- package/dist/reactive/effect.d.ts.map +1 -1
- package/dist/reactive/http.d.ts +194 -0
- package/dist/reactive/http.d.ts.map +1 -0
- package/dist/reactive/index.d.ts +2 -2
- package/dist/reactive/index.d.ts.map +1 -1
- package/dist/reactive/pagination.d.ts +126 -0
- package/dist/reactive/pagination.d.ts.map +1 -0
- package/dist/reactive/polling.d.ts +55 -0
- package/dist/reactive/polling.d.ts.map +1 -0
- package/dist/reactive/readonly.d.ts +20 -1
- package/dist/reactive/readonly.d.ts.map +1 -1
- package/dist/reactive/rest.d.ts +293 -0
- package/dist/reactive/rest.d.ts.map +1 -0
- package/dist/reactive/scope.d.ts +140 -0
- package/dist/reactive/scope.d.ts.map +1 -0
- package/dist/reactive/signal.d.ts +16 -2
- package/dist/reactive/signal.d.ts.map +1 -1
- package/dist/reactive/to-value.d.ts +57 -0
- package/dist/reactive/to-value.d.ts.map +1 -0
- package/dist/reactive/websocket.d.ts +285 -0
- package/dist/reactive/websocket.d.ts.map +1 -0
- package/dist/reactive-DwkhUJfP.js +1148 -0
- package/dist/reactive-DwkhUJfP.js.map +1 -0
- package/dist/reactive.es.mjs +38 -19
- package/dist/{registry-CWf368tT.js → registry-B08iilIh.js} +1 -1
- package/dist/{registry-CWf368tT.js.map → registry-B08iilIh.js.map} +1 -1
- package/dist/router/constraints.d.ts.map +1 -1
- package/dist/router/index.d.ts +1 -1
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/state.d.ts +25 -2
- package/dist/router/state.d.ts.map +1 -1
- package/dist/router-CQikC9Ed.js +492 -0
- package/dist/router-CQikC9Ed.js.map +1 -0
- package/dist/router.es.mjs +9 -8
- package/dist/ssr/hydrate.d.ts.map +1 -1
- package/dist/{ssr-B2qd_WBB.js → ssr-_dAcGdzu.js} +4 -4
- package/dist/ssr-_dAcGdzu.js.map +1 -0
- package/dist/ssr.es.mjs +1 -1
- package/dist/store/persisted.d.ts.map +1 -1
- package/dist/{store-DWpyH6p5.js → store-Cb3gPRve.js} +7 -7
- package/dist/store-Cb3gPRve.js.map +1 -0
- package/dist/store.es.mjs +2 -2
- package/dist/storybook.es.mjs.map +1 -1
- package/dist/{testing-CsqjNUyy.js → testing-C5Sjfsna.js} +8 -8
- package/dist/testing-C5Sjfsna.js.map +1 -0
- package/dist/testing.es.mjs +1 -1
- package/dist/{type-guards-Do9DWgNp.js → type-guards-BMX2c0LP.js} +1 -1
- package/dist/{type-guards-Do9DWgNp.js.map → type-guards-BMX2c0LP.js.map} +1 -1
- package/dist/untrack-D0fnO5k2.js +36 -0
- package/dist/untrack-D0fnO5k2.js.map +1 -0
- package/dist/view/custom-directives.d.ts.map +1 -1
- package/dist/view.es.mjs +4 -4
- package/package.json +178 -177
- package/src/a11y/announce.ts +131 -131
- package/src/a11y/audit.ts +314 -314
- package/src/a11y/index.ts +68 -68
- package/src/a11y/media-preferences.ts +255 -255
- package/src/a11y/roving-tab-index.ts +164 -164
- package/src/a11y/skip-link.ts +255 -255
- package/src/a11y/trap-focus.ts +184 -184
- package/src/a11y/types.ts +183 -183
- package/src/component/component.ts +599 -599
- package/src/component/html.ts +153 -153
- package/src/component/index.ts +52 -52
- package/src/component/library.ts +540 -542
- package/src/component/scope.ts +212 -212
- package/src/component/types.ts +310 -310
- package/src/core/collection.ts +876 -707
- package/src/core/element.ts +1015 -981
- package/src/core/env.ts +60 -60
- package/src/core/index.ts +49 -49
- package/src/core/shared.ts +77 -62
- package/src/core/utils/index.ts +148 -148
- package/src/devtools/devtools.ts +410 -410
- package/src/devtools/index.ts +48 -48
- package/src/devtools/types.ts +104 -104
- package/src/dnd/draggable.ts +296 -296
- package/src/dnd/droppable.ts +228 -228
- package/src/dnd/index.ts +62 -62
- package/src/dnd/sortable.ts +307 -307
- package/src/dnd/types.ts +293 -293
- package/src/forms/create-form.ts +320 -278
- package/src/forms/index.ts +70 -65
- package/src/forms/types.ts +203 -154
- package/src/forms/use-field.ts +231 -0
- package/src/forms/validators.ts +294 -265
- package/src/full.ts +554 -480
- package/src/i18n/formatting.ts +67 -67
- package/src/i18n/i18n.ts +200 -200
- package/src/i18n/index.ts +67 -67
- package/src/i18n/translate.ts +182 -182
- package/src/i18n/types.ts +171 -171
- package/src/index.ts +108 -108
- package/src/media/battery.ts +116 -116
- package/src/media/breakpoints.ts +129 -131
- package/src/media/clipboard.ts +80 -80
- package/src/media/device-sensors.ts +158 -158
- package/src/media/geolocation.ts +119 -119
- package/src/media/index.ts +76 -76
- package/src/media/media-query.ts +92 -92
- package/src/media/network.ts +115 -115
- package/src/media/types.ts +177 -177
- package/src/media/viewport.ts +84 -84
- package/src/motion/index.ts +57 -57
- package/src/motion/morph.ts +151 -151
- package/src/motion/parallax.ts +120 -120
- package/src/motion/reduced-motion.ts +66 -66
- package/src/motion/types.ts +271 -271
- package/src/motion/typewriter.ts +164 -164
- package/src/plugin/index.ts +37 -37
- package/src/plugin/registry.ts +284 -269
- package/src/plugin/types.ts +137 -137
- package/src/reactive/async-data.ts +250 -29
- package/src/reactive/computed.ts +144 -130
- package/src/reactive/effect.ts +29 -6
- package/src/reactive/http.ts +790 -0
- package/src/reactive/index.ts +60 -0
- package/src/reactive/pagination.ts +317 -0
- package/src/reactive/polling.ts +179 -0
- package/src/reactive/readonly.ts +52 -8
- package/src/reactive/rest.ts +859 -0
- package/src/reactive/scope.ts +276 -0
- package/src/reactive/signal.ts +61 -1
- package/src/reactive/to-value.ts +71 -0
- package/src/reactive/websocket.ts +849 -0
- package/src/router/bq-link.ts +279 -279
- package/src/router/constraints.ts +204 -201
- package/src/router/index.ts +49 -49
- package/src/router/match.ts +312 -312
- package/src/router/path-pattern.ts +52 -52
- package/src/router/query.ts +38 -38
- package/src/router/router.ts +421 -402
- package/src/router/state.ts +51 -3
- package/src/router/types.ts +139 -139
- package/src/router/use-route.ts +68 -68
- package/src/router/utils.ts +157 -157
- package/src/security/index.ts +12 -12
- package/src/ssr/hydrate.ts +84 -82
- package/src/ssr/index.ts +70 -70
- package/src/ssr/render.ts +508 -508
- package/src/ssr/serialize.ts +296 -296
- package/src/ssr/types.ts +81 -81
- package/src/store/create-store.ts +467 -467
- package/src/store/index.ts +27 -27
- package/src/store/persisted.ts +245 -249
- package/src/store/types.ts +247 -247
- package/src/store/utils.ts +135 -135
- package/src/storybook/index.ts +480 -480
- package/src/testing/index.ts +42 -42
- package/src/testing/testing.ts +593 -593
- package/src/testing/types.ts +170 -170
- package/src/view/custom-directives.ts +28 -30
- package/src/view/evaluate.ts +292 -292
- package/src/view/process.ts +108 -108
- package/dist/a11y-C5QOVvRn.js.map +0 -1
- package/dist/component-CuuTijA6.js.map +0 -1
- package/dist/constraints-3lV9yyBw.js.map +0 -1
- package/dist/core-Cjl7GUu8.js.map +0 -1
- package/dist/core-DnlyjbF2.js +0 -112
- package/dist/core-DnlyjbF2.js.map +0 -1
- package/dist/custom-directives-7wAShnnd.js.map +0 -1
- package/dist/devtools-D2fQLhDN.js.map +0 -1
- package/dist/dnd-B8EgyzaI.js.map +0 -1
- package/dist/env-NeVmr4Gf.js.map +0 -1
- package/dist/forms-C3yovgH9.js +0 -141
- package/dist/forms-C3yovgH9.js.map +0 -1
- package/dist/i18n-BnnhTFOS.js.map +0 -1
- package/dist/media-Di2Ta22s.js.map +0 -1
- package/dist/motion-qPj_TYGv.js.map +0 -1
- package/dist/mount-SM07RUa6.js.map +0 -1
- package/dist/plugin-cPoOHFLY.js.map +0 -1
- package/dist/reactive-Cfv0RK6x.js +0 -233
- package/dist/reactive-Cfv0RK6x.js.map +0 -1
- package/dist/router-BrthaP_z.js +0 -473
- package/dist/router-BrthaP_z.js.map +0 -1
- package/dist/ssr-B2qd_WBB.js.map +0 -1
- package/dist/store-DWpyH6p5.js.map +0 -1
- package/dist/testing-CsqjNUyy.js.map +0 -1
- package/dist/untrack-DJVQQ2WM.js +0 -33
- package/dist/untrack-DJVQQ2WM.js.map +0 -1
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standalone reactive field composable.
|
|
3
|
+
*
|
|
4
|
+
* @module bquery/forms
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { debounce } from '../core/utils/function';
|
|
8
|
+
import { isPromise } from '../core/utils/type-guards';
|
|
9
|
+
import { Computed } from '../reactive/computed';
|
|
10
|
+
import { Signal } from '../reactive/core';
|
|
11
|
+
import { computed, effect, signal } from '../reactive/index';
|
|
12
|
+
import type { MaybeSignal } from '../reactive/index';
|
|
13
|
+
import { isReadonlySignal } from '../reactive/readonly';
|
|
14
|
+
import type { UseFormFieldOptions, UseFormFieldReturn, ValidationResult, Validator } from './types';
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Determines whether a validator returned a valid result.
|
|
18
|
+
* @internal
|
|
19
|
+
*/
|
|
20
|
+
const isValidationSuccess = (result: ValidationResult): boolean =>
|
|
21
|
+
result === true || result === undefined;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Runs a single validator, normalising sync and async results.
|
|
25
|
+
* @internal
|
|
26
|
+
*/
|
|
27
|
+
const runValidator = async <T>(validator: Validator<T>, value: T): Promise<string | undefined> => {
|
|
28
|
+
const result = validator(value);
|
|
29
|
+
const resolved = isPromise(result) ? await result : result;
|
|
30
|
+
return isValidationSuccess(resolved) ? undefined : (resolved as string);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Creates a standalone reactive form field with optional automatic validation.
|
|
35
|
+
*
|
|
36
|
+
* This helper is useful when you want field-level state without creating a full form,
|
|
37
|
+
* or when you want to bind an existing signal to the forms validation model.
|
|
38
|
+
*
|
|
39
|
+
* @template T - The type of the field value
|
|
40
|
+
* @param initialValue - Plain initial value, an existing writable signal to reuse, or a
|
|
41
|
+
* computed / readonly reactive source to snapshot
|
|
42
|
+
* @param options - Validation mode, validators, debounce, and initial error configuration
|
|
43
|
+
* @returns A reactive field handle with validation helpers
|
|
44
|
+
*
|
|
45
|
+
* @example
|
|
46
|
+
* ```ts
|
|
47
|
+
* import { useFormField, required } from '@bquery/bquery/forms';
|
|
48
|
+
*
|
|
49
|
+
* const email = useFormField('', {
|
|
50
|
+
* validators: [required()],
|
|
51
|
+
* validateOn: 'blur',
|
|
52
|
+
* });
|
|
53
|
+
*
|
|
54
|
+
* email.value.value = 'ada@example.com';
|
|
55
|
+
* email.touch();
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export const useFormField = <T>(
|
|
59
|
+
initialValue: MaybeSignal<T>,
|
|
60
|
+
options: UseFormFieldOptions<T> = {}
|
|
61
|
+
): UseFormFieldReturn<T> => {
|
|
62
|
+
let value: Signal<T>;
|
|
63
|
+
|
|
64
|
+
if (isSignal(initialValue)) {
|
|
65
|
+
value = initialValue as Signal<T>;
|
|
66
|
+
} else {
|
|
67
|
+
const startingValue: T =
|
|
68
|
+
isReadonlySignal<T>(initialValue) || isComputedValue<T>(initialValue)
|
|
69
|
+
? initialValue.peek()
|
|
70
|
+
: (initialValue as T);
|
|
71
|
+
value = signal(startingValue);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
const initial = value.peek();
|
|
75
|
+
const error = signal(options.initialError ?? '');
|
|
76
|
+
const isTouched = signal(false);
|
|
77
|
+
const isValidating = signal(false);
|
|
78
|
+
const isDirty = computed(() => !Object.is(value.value, initial));
|
|
79
|
+
const isPristine = computed(() => !isDirty.value);
|
|
80
|
+
const isValid = computed(() => error.value === '');
|
|
81
|
+
const validateOn = options.validateOn ?? 'manual';
|
|
82
|
+
const debounceMs = Math.max(0, options.debounceMs ?? 0);
|
|
83
|
+
|
|
84
|
+
let validationId = 0;
|
|
85
|
+
let changeInitialized = false;
|
|
86
|
+
let suppressNextChangeValidation = false;
|
|
87
|
+
let isDestroyed = false;
|
|
88
|
+
let stopChangeValidationEffect: (() => void) | undefined;
|
|
89
|
+
|
|
90
|
+
const logValidationError = (validationError: unknown): void => {
|
|
91
|
+
console.error('bQuery forms: Error in scheduled field validation', validationError);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const runValidation = async (): Promise<boolean> => {
|
|
95
|
+
const currentValidationId = ++validationId;
|
|
96
|
+
const validators = options.validators;
|
|
97
|
+
|
|
98
|
+
if (!validators || validators.length === 0) {
|
|
99
|
+
error.value = '';
|
|
100
|
+
isValidating.value = false;
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
isValidating.value = true;
|
|
105
|
+
|
|
106
|
+
try {
|
|
107
|
+
const currentValue = value.peek();
|
|
108
|
+
|
|
109
|
+
for (const validator of validators) {
|
|
110
|
+
const nextError = await runValidator(validator, currentValue);
|
|
111
|
+
|
|
112
|
+
if (currentValidationId !== validationId) {
|
|
113
|
+
return error.peek() === '';
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
if (nextError) {
|
|
117
|
+
error.value = nextError;
|
|
118
|
+
return false;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
if (currentValidationId === validationId) {
|
|
123
|
+
error.value = '';
|
|
124
|
+
}
|
|
125
|
+
return true;
|
|
126
|
+
} finally {
|
|
127
|
+
if (currentValidationId === validationId) {
|
|
128
|
+
isValidating.value = false;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
const debouncedValidate = debounce(() => {
|
|
134
|
+
void runValidation().catch(logValidationError);
|
|
135
|
+
}, debounceMs);
|
|
136
|
+
|
|
137
|
+
const scheduleValidation = (): void => {
|
|
138
|
+
if (isDestroyed) {
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
if (debounceMs > 0) {
|
|
143
|
+
debouncedValidate();
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
void runValidation().catch(logValidationError);
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
if (validateOn === 'change' || validateOn === 'both') {
|
|
151
|
+
stopChangeValidationEffect = effect(() => {
|
|
152
|
+
void value.value;
|
|
153
|
+
|
|
154
|
+
if (!changeInitialized) {
|
|
155
|
+
changeInitialized = true;
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
if (suppressNextChangeValidation) {
|
|
160
|
+
suppressNextChangeValidation = false;
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
scheduleValidation();
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const destroy = (): void => {
|
|
169
|
+
if (isDestroyed) {
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
isDestroyed = true;
|
|
174
|
+
validationId += 1;
|
|
175
|
+
debouncedValidate.cancel();
|
|
176
|
+
stopChangeValidationEffect?.();
|
|
177
|
+
stopChangeValidationEffect = undefined;
|
|
178
|
+
isDirty.dispose();
|
|
179
|
+
isPristine.dispose();
|
|
180
|
+
isValid.dispose();
|
|
181
|
+
isValidating.value = false;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
return {
|
|
185
|
+
value,
|
|
186
|
+
error,
|
|
187
|
+
isDirty,
|
|
188
|
+
isTouched,
|
|
189
|
+
isPristine,
|
|
190
|
+
isValid,
|
|
191
|
+
isValidating,
|
|
192
|
+
touch: () => {
|
|
193
|
+
isTouched.value = true;
|
|
194
|
+
if (validateOn === 'blur' || validateOn === 'both') {
|
|
195
|
+
scheduleValidation();
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
reset: () => {
|
|
199
|
+
validationId += 1;
|
|
200
|
+
debouncedValidate.cancel();
|
|
201
|
+
if (!Object.is(value.peek(), initial)) {
|
|
202
|
+
suppressNextChangeValidation = true;
|
|
203
|
+
}
|
|
204
|
+
value.value = initial;
|
|
205
|
+
error.value = options.initialError ?? '';
|
|
206
|
+
isTouched.value = false;
|
|
207
|
+
isValidating.value = false;
|
|
208
|
+
},
|
|
209
|
+
validate: async () => {
|
|
210
|
+
debouncedValidate.cancel();
|
|
211
|
+
return runValidation();
|
|
212
|
+
},
|
|
213
|
+
destroy,
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Determines whether a value looks like a writable signal.
|
|
219
|
+
* @internal
|
|
220
|
+
*/
|
|
221
|
+
const isSignal = (value: unknown): value is Signal<unknown> => {
|
|
222
|
+
return value instanceof Signal;
|
|
223
|
+
};
|
|
224
|
+
|
|
225
|
+
/**
|
|
226
|
+
* Determines whether a value is a computed reactive source.
|
|
227
|
+
* @internal
|
|
228
|
+
*/
|
|
229
|
+
const isComputedValue = <T>(value: unknown): value is Computed<T> => {
|
|
230
|
+
return value instanceof Computed;
|
|
231
|
+
};
|