@deijose/nix-js 2.5.4 → 2.6.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/README.md +4 -4
- package/dist/lib/form.cjs +1 -1
- package/dist/lib/form.js +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/nix/form.d.ts +47 -4
- package/dist/lib/nix/index.d.ts +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
[](https://www.npmjs.com/package/@deijose/nix-js)
|
|
4
4
|
[](https://opensource.org/licenses/MIT)
|
|
5
|
-
[]()
|
|
6
6
|
[]()
|
|
7
|
-
[]()
|
|
8
8
|
[]()
|
|
9
9
|
[](https://nix-js.dev/)
|
|
10
10
|
|
|
@@ -13,7 +13,7 @@ A lightweight, fully reactive micro-framework for building modern web UIs — no
|
|
|
13
13
|
**[→ Documentation & Live Demo](https://nix-js.dev/)**
|
|
14
14
|
|
|
15
15
|
```
|
|
16
|
-
~24 KB minified · ~
|
|
16
|
+
~24 KB minified · ~14 KB gzipped · zero dependencies · TypeScript-first · ES2022
|
|
17
17
|
```
|
|
18
18
|
|
|
19
19
|
## Installation
|
|
@@ -113,7 +113,7 @@ Everything ships in a single zero-dependency import:
|
|
|
113
113
|
| **Templates** | `` html` ` ``, `repeat`, `ref`, `portal`, `transition`, `showWhen` |
|
|
114
114
|
| **Components** | `NixTemplate` (function components), `NixComponent` (lifecycle class), `mount`, children & named slots |
|
|
115
115
|
| **Router** | `createRouter`, `RouterView`, `Link`, `nixRouter`, `RouterKey`, guards, nested routes, named routes (`name` + `navigate({ name })`), `mount(..., { router })` |
|
|
116
|
-
| **Forms** | `nixField`, `createForm`, built-in validators, Zod/Valibot interop |
|
|
116
|
+
| **Forms** | `nixField`, `createForm`, `nixFieldArray`, built-in validators, programmatic value setting, Zod/Valibot interop |
|
|
117
117
|
| **State** | `createStore`, `provide`, `inject`, `createInjectionKey` |
|
|
118
118
|
| **Async** | `suspend` (with `invalidate` for re-fetching), `lazy` |
|
|
119
119
|
| **Error handling** | `createErrorBoundary` |
|
package/dist/lib/form.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function n(e,t){return
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./signals.cjs");function t(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function n(e,t){return l=>"string"==typeof l&&l.length<e?t??`Minimum ${e} characters`:null}function r(e,t){return l=>"string"==typeof l&&l.length>e?t??`Maximum ${e} characters`:null}function i(e,t="Invalid format"){return l=>"string"!=typeof l||e.test(l)?null:t}function a(e="Invalid email"){return i(/^[^\s@]+@[^\s@]+\.[^\s@]+$/,e)}function o(e,t){return l=>"number"==typeof l&&l<e?t??`Minimum value is ${e}`:null}function s(e,t){return l=>"number"==typeof l&&l>e?t??`Maximum value is ${e}`:null}function c(e){return e}var l={required:t,minLength:n,maxLength:r,email:a,pattern:i,min:o,max:s};function u(e,t){return{...e,...t}}function d(t,l=[],r="blur",n){let u=e.signal(t),i=e.signal(!1),o=e.signal(!1),a=e.signal(null),s=e.signal(!1),f=t,c=!0,v=e.effect(()=>{u.value,c?c=!1:null!==a.peek()&&(a.value=null)}),d=e.computed(()=>{if(a.value)return a.value;let e=n?.();for(let t of l){let l=t(u.value,e);if(l)return l}return null}),p=e.computed(()=>("input"===r?o.value||i.value:"submit"===r?s.value:i.value)?d.value:null);return{value:u,error:p,rawError:d,touched:i,dirty:o,onInput:e=>{u.value=function(e){if(!e||!("value"in e))return t;let l=e,r=l.value;return"boolean"==typeof t?!0===l.checked||!function(e){return"checkbox"===e.type||"radio"===e.type}(l)&&("true"===r||"1"===r||"false"!==r&&"0"!==r&&""!==r&&t):"number"==typeof t?""===r?NaN:Number(r):r}(e.target),o.value=!0},onBlur:()=>{i.value=!0},reset:function(){e.batch(()=>{u.value=f,i.value=!1,o.value=!1,a.value=null,s.value=!1})},setValue:function(t,l={}){let{shouldTouch:r=!1,shouldDirty:n=!0,shouldValidate:a=!0}=l;e.batch(()=>{u.value=t,n&&(o.value=!0),r&&(i.value=!0),a&&(s.value=!0)})},_setExternalError:function(e){a.value=e,e&&(i.value=!0)},_forceVisible:function(){i.value=!0,s.value=!0},_setInitialValue:function(e){f=e},_dispose:function(){v(),p.dispose(),d.dispose()}}}function f(t,l={},r="blur"){function n(e){let t={};for(let n in e){let u=l[n]??[];t[n]=d(e[n],u,r)}return t}let u=e.signal(t.map(n)),i=t,o=e.computed(()=>u.value.length);return{fields:u,append:function(e){u.value=[...u.value,n(e)]},remove:function(e){let t=u.value;if(!(e<0||e>=t.length)){for(let l in t[e])t[e][l]._dispose();u.value=t.filter((t,l)=>l!==e)}},move:function(e,t){let l=[...u.value];if(e<0||e>=l.length||t<0||t>=l.length||e===t)return;let[r]=l.splice(e,1);l.splice(t,0,r),u.value=l},replace:function(e,t){let l=[...u.value];if(!(e<0||e>=l.length)){for(let t in l[e])l[e][t]._dispose();l[e]=n(t),u.value=l}},length:o,setValues:function(e){for(let e of u.value)for(let t in e)e[t]._dispose();u.value=e.map(n)},patchValues:function(e){let t=[...u.value];for(let l=0;l<e.length;l++){let r=e[l];if(l>=t.length){t.push(n(r));continue}let u=t[l];for(let[e,t]of Object.entries(r))u[e]&&u[e].setValue(t,{shouldDirty:!1,shouldTouch:!1,shouldValidate:!1})}u.value=t},reset:function(e){e&&(i=e);for(let e of u.value)for(let t in e)e[t]._dispose();u.value=i.map(n)},_dispose:function(){for(let e of u.value)for(let t in e)e[t]._dispose();o.dispose()}}}function p(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function m(e,t="",l=[]){for(let[r,n]of Object.entries(e)){let e=t?`${t}.${r}`:r;p(n)&&Object.keys(n).length>0?m(n,e,l):l.push([e,n])}return l}function h(e,t,l){let r=t.split("."),n=e;for(let e=0;e<r.length-1;e++){let t=r[e];p(n[t])||(n[t]={}),n=n[t]}n[r[r.length-1]]=l}function g(t,l={}){let r=l.validateOn??"blur",n={},u=l.validators;function i(){let e={};for(let t in n)h(e,t,n[t].value.value);return e}for(let[e,l]of m(t))n[e]=d(l,u?.[e]??[],r,i);let o=e.signal(!1),a=e.signal(0),s=e.computed(()=>i()),f=e.computed(()=>{let e={};for(let t in n){let l=n[t].error.value;l&&(e[t]=l)}return e}),c=e.computed(()=>{for(let e in n)if(n[e].rawError.value)return!1;return!0}),v=e.computed(()=>{for(let e in n)if(n[e].error.value)return!1;return!0}),p=e.computed(()=>{for(let e in n)if(n[e].dirty.value)return!0;return!1}),g=e.computed(()=>{for(let e in n)if(n[e].touched.value)return!0;return!1});function y(e){for(let t in e)n[t]?._setExternalError(e[t]??null)}return{fields:n,values:s,errors:f,canSubmit:c,valid:v,dirty:p,touched:g,isSubmitting:o,submitCount:a,handleSubmit:function(e){return t=>{t.preventDefault(),a.value++;for(let e in n)n[e]._forceVisible();let r=s.value;if(l.validate){let e=l.validate(r);if(e){let t={},l=!1;for(let r in e){let n=e[r],u=Array.isArray(n)?n[0]??null:n??null;u&&(t[r]=u,l=!0)}if(l)return void y(t)}}for(let e in n)if(n[e].rawError.value)return;let u=e(r);u instanceof Promise&&(o.value=!0,u.finally(()=>{o.value=!1}).catch(()=>{}))}},reset:function(e){if(e)for(let[t,l]of m(e)){let e=n[t];e&&e._setInitialValue(l)}for(let e in n)n[e].reset();o.value=!1,a.value=0},setValue:function(e,t,l={}){let r=n[e];r&&r.setValue(t,l)},setValues:function(t,l={}){let{keepDirty:r=!1,keepTouched:u=!1,keepErrors:i=!0}=l;e.batch(()=>{for(let[e,l]of m(t)){let t=n[e];t&&(t.setValue(l,{shouldDirty:!r,shouldTouch:!1,shouldValidate:!i}),u||(t.touched.value=!1))}})},setErrors:y,dispose:function(){s.dispose(),f.dispose(),c.dispose(),v.dispose(),p.dispose(),g.dispose();for(let e in n)n[e]._dispose()}}}exports.createForm=g,exports.createValidator=c,exports.email=a,exports.extendValidators=u,exports.max=s,exports.maxLength=r,exports.min=o,exports.minLength=n,exports.nixField=d,exports.nixFieldArray=f,exports.pattern=i,exports.required=t,exports.validators=l;
|
package/dist/lib/form.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{batch as e,computed as t,effect as n,signal as r}from"./signals.js";function i(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function a(e,t){return
|
|
1
|
+
import{batch as e,computed as t,effect as n,signal as r}from"./signals.js";function i(e="Required"){return t=>null==t||""===t||Array.isArray(t)&&0===t.length?e:null}function a(e,t){return l=>"string"==typeof l&&l.length<e?t??`Minimum ${e} characters`:null}function o(e,t){return l=>"string"==typeof l&&l.length>e?t??`Maximum ${e} characters`:null}function s(e,t="Invalid format"){return l=>"string"!=typeof l||e.test(l)?null:t}function c(e="Invalid email"){return s(/^[^\s@]+@[^\s@]+\.[^\s@]+$/,e)}function l(e,t){return l=>"number"==typeof l&&l<e?t??`Minimum value is ${e}`:null}function u(e,t){return l=>"number"==typeof l&&l>e?t??`Maximum value is ${e}`:null}function d(e){return e}var f={required:i,minLength:a,maxLength:o,email:c,pattern:s,min:l,max:u};function p(e,t){return{...e,...t}}function m(l,u=[],i="blur",a){let o=r(l),s=r(!1),f=r(!1),c=r(null),v=r(!1),d=l,p=!0,h=n(()=>{o.value,p?p=!1:null!==c.peek()&&(c.value=null)}),m=t(()=>{if(c.value)return c.value;let e=a?.();for(let t of u){let l=t(o.value,e);if(l)return l}return null}),g=t(()=>("input"===i?f.value||s.value:"submit"===i?v.value:s.value)?m.value:null);return{value:o,error:g,rawError:m,touched:s,dirty:f,onInput:e=>{o.value=function(e){if(!e||!("value"in e))return l;let t=e,r=t.value;return"boolean"==typeof l?!0===t.checked||!function(e){return"checkbox"===e.type||"radio"===e.type}(t)&&("true"===r||"1"===r||"false"!==r&&"0"!==r&&""!==r&&l):"number"==typeof l?""===r?NaN:Number(r):r}(e.target),f.value=!0},onBlur:()=>{s.value=!0},reset:function(){e(()=>{o.value=d,s.value=!1,f.value=!1,c.value=null,v.value=!1})},setValue:function(t,l={}){let{shouldTouch:r=!1,shouldDirty:n=!0,shouldValidate:u=!0}=l;e(()=>{o.value=t,n&&(f.value=!0),r&&(s.value=!0),u&&(v.value=!0)})},_setExternalError:function(e){c.value=e,e&&(s.value=!0)},_forceVisible:function(){s.value=!0,v.value=!0},_setInitialValue:function(e){d=e},_dispose:function(){h(),g.dispose(),m.dispose()}}}function h(e,l={},n="blur"){function u(e){let t={};for(let r in e){let u=l[r]??[];t[r]=m(e[r],u,n)}return t}let i=r(e.map(u)),a=e,o=t(()=>i.value.length);return{fields:i,append:function(e){i.value=[...i.value,u(e)]},remove:function(e){let t=i.value;if(!(e<0||e>=t.length)){for(let l in t[e])t[e][l]._dispose();i.value=t.filter((t,l)=>l!==e)}},move:function(e,t){let l=[...i.value];if(e<0||e>=l.length||t<0||t>=l.length||e===t)return;let[r]=l.splice(e,1);l.splice(t,0,r),i.value=l},replace:function(e,t){let l=[...i.value];if(!(e<0||e>=l.length)){for(let t in l[e])l[e][t]._dispose();l[e]=u(t),i.value=l}},length:o,setValues:function(e){for(let e of i.value)for(let t in e)e[t]._dispose();i.value=e.map(u)},patchValues:function(e){let t=[...i.value];for(let l=0;l<e.length;l++){let r=e[l];if(l>=t.length){t.push(u(r));continue}let n=t[l];for(let[e,t]of Object.entries(r))n[e]&&n[e].setValue(t,{shouldDirty:!1,shouldTouch:!1,shouldValidate:!1})}i.value=t},reset:function(e){e&&(a=e);for(let e of i.value)for(let t in e)e[t]._dispose();i.value=a.map(u)},_dispose:function(){for(let e of i.value)for(let t in e)e[t]._dispose();o.dispose()}}}function g(e){return"object"==typeof e&&!!e&&!Array.isArray(e)}function _(e,t="",l=[]){for(let[r,n]of Object.entries(e)){let e=t?`${t}.${r}`:r;g(n)&&Object.keys(n).length>0?_(n,e,l):l.push([e,n])}return l}function v(e,t,l){let r=t.split("."),n=e;for(let e=0;e<r.length-1;e++){let t=r[e];g(n[t])||(n[t]={}),n=n[t]}n[r[r.length-1]]=l}function y(l,n={}){let u=n.validateOn??"blur",i={},a=n.validators;function o(){let e={};for(let t in i)v(e,t,i[t].value.value);return e}for(let[e,t]of _(l))i[e]=m(t,a?.[e]??[],u,o);let s=r(!1),f=r(0),c=t(()=>o()),d=t(()=>{let e={};for(let t in i){let l=i[t].error.value;l&&(e[t]=l)}return e}),p=t(()=>{for(let e in i)if(i[e].rawError.value)return!1;return!0}),h=t(()=>{for(let e in i)if(i[e].error.value)return!1;return!0}),g=t(()=>{for(let e in i)if(i[e].dirty.value)return!0;return!1}),y=t(()=>{for(let e in i)if(i[e].touched.value)return!0;return!1});function b(e){for(let t in e)i[t]?._setExternalError(e[t]??null)}return{fields:i,values:c,errors:d,canSubmit:p,valid:h,dirty:g,touched:y,isSubmitting:s,submitCount:f,handleSubmit:function(e){return t=>{t.preventDefault(),f.value++;for(let e in i)i[e]._forceVisible();let l=c.value;if(n.validate){let e=n.validate(l);if(e){let t={},l=!1;for(let r in e){let n=e[r],u=Array.isArray(n)?n[0]??null:n??null;u&&(t[r]=u,l=!0)}if(l)return void b(t)}}for(let e in i)if(i[e].rawError.value)return;let r=e(l);r instanceof Promise&&(s.value=!0,r.finally(()=>{s.value=!1}).catch(()=>{}))}},reset:function(e){if(e)for(let[t,l]of _(e)){let e=i[t];e&&e._setInitialValue(l)}for(let e in i)i[e].reset();s.value=!1,f.value=0},setValue:function(e,t,l={}){let r=i[e];r&&r.setValue(t,l)},setValues:function(t,l={}){let{keepDirty:r=!1,keepTouched:n=!1,keepErrors:u=!0}=l;e(()=>{for(let[e,l]of _(t)){let t=i[e];t&&(t.setValue(l,{shouldDirty:!r,shouldTouch:!1,shouldValidate:!u}),n||(t.touched.value=!1))}})},setErrors:b,dispose:function(){c.dispose(),d.dispose(),p.dispose(),h.dispose(),g.dispose(),y.dispose();for(let e in i)i[e]._dispose()}}}export{y as createForm,d as createValidator,c as email,p as extendValidators,u as max,o as maxLength,l as min,a as minLength,m as nixField,h as nixFieldArray,s as pattern,i as required,f as validators};
|
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { Signal, signal, effect, computed, batch, watch, untrack, nextTick, html, repeat, ref, showWhen, portal, createPortalOutlet, portalOutlet, provideOutlet, injectOutlet, createErrorBoundary, transition, mount, NixComponent, createStore, persistPlugin, loggerPlugin, guardPlugin, bridgePlugin, createRouter, RouterView, Link, nixRouter, RouterKey, _hasActiveRouter, suspend, lazy, provide, inject, createInjectionKey, nixField, nixFieldArray, createForm, required, minLength, maxLength, email, pattern, min, max, createValidator, validators, extendValidators, } from "./nix";
|
|
2
|
-
export type { WatchOptions, NixTemplate, NixMountHandle, MountOptions, KeyedList, NixRef, PortalOutlet, ErrorFallback, TransitionOptions, TransitionContent, Store, StoreSignals, NixPlugin, Router, NamedRouteLocation, RouteLocation, RouteRecord, RouterOptions, NavigationGuard, NavigationGuardResult, AfterEachHook, ResolvedRoute, ScrollPosition, ScrollBehavior, RouterMode, NavigationDirection, NavigationIntent, NavigationAction, NavigateOptions, SuspenseOptions, InjectionKey, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase, NixChildren, } from "./nix";
|
|
2
|
+
export type { WatchOptions, NixTemplate, NixMountHandle, MountOptions, KeyedList, NixRef, PortalOutlet, ErrorFallback, TransitionOptions, TransitionContent, Store, StoreSignals, NixPlugin, Router, NamedRouteLocation, RouteLocation, RouteRecord, RouterOptions, NavigationGuard, NavigationGuardResult, AfterEachHook, ResolvedRoute, ScrollPosition, ScrollBehavior, RouterMode, NavigationDirection, NavigationIntent, NavigationAction, NavigateOptions, SuspenseOptions, InjectionKey, DeepPartial, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase, NixChildren, } from "./nix";
|
package/dist/lib/nix/form.d.ts
CHANGED
|
@@ -69,6 +69,18 @@ export interface FieldState<T> {
|
|
|
69
69
|
readonly onBlur: () => void;
|
|
70
70
|
/** Reset to initial value and clear touched/dirty/error state. */
|
|
71
71
|
reset(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Set the field value programmatically.
|
|
74
|
+
*
|
|
75
|
+
* @param value — new value for the field.
|
|
76
|
+
* @param options — control whether to touch/dirty the field and whether to force
|
|
77
|
+
* validation visibility.
|
|
78
|
+
*/
|
|
79
|
+
setValue(value: T, options?: {
|
|
80
|
+
shouldTouch?: boolean;
|
|
81
|
+
shouldDirty?: boolean;
|
|
82
|
+
shouldValidate?: boolean;
|
|
83
|
+
}): void;
|
|
72
84
|
/**
|
|
73
85
|
* @internal — inject an external error message (server / schema validator).
|
|
74
86
|
* The error clears automatically when the user next edits the field.
|
|
@@ -76,6 +88,8 @@ export interface FieldState<T> {
|
|
|
76
88
|
_setExternalError(msg: string | null): void;
|
|
77
89
|
/** @internal — force error visibility (e.g., on submit). */
|
|
78
90
|
_forceVisible(): void;
|
|
91
|
+
/** @internal — update the stored initial value so a later reset() returns here. */
|
|
92
|
+
_setInitialValue(value: T): void;
|
|
79
93
|
/** @internal — dispose computed signals. */
|
|
80
94
|
_dispose(): void;
|
|
81
95
|
}
|
|
@@ -100,8 +114,12 @@ export interface FieldArrayState<T extends Record<string, unknown>> {
|
|
|
100
114
|
replace(index: number, value: T): void;
|
|
101
115
|
/** Number of items in the array. Reactive. */
|
|
102
116
|
readonly length: Signal<number>;
|
|
103
|
-
/**
|
|
104
|
-
|
|
117
|
+
/** Replaces the whole array with a new list of items. */
|
|
118
|
+
setValues(items: T[]): void;
|
|
119
|
+
/** Patches existing items and appends any extras without touching untouched items. */
|
|
120
|
+
patchValues(items: Partial<T>[]): void;
|
|
121
|
+
/** Resets the array to its initial value, optionally updating that initial value. */
|
|
122
|
+
reset(items?: T[]): void;
|
|
105
123
|
/** @internal */
|
|
106
124
|
_dispose(): void;
|
|
107
125
|
}
|
|
@@ -130,6 +148,9 @@ export type FieldErrors<T extends Record<string, unknown>> = {
|
|
|
130
148
|
export type FormValidators<T extends Record<string, unknown>> = {
|
|
131
149
|
[K in keyof T]?: Validator<T[K], T>[];
|
|
132
150
|
} & Record<string, Validator<any, any>[] | undefined>;
|
|
151
|
+
export type DeepPartial<T> = T extends object ? {
|
|
152
|
+
[P in keyof T]?: DeepPartial<T[P]>;
|
|
153
|
+
} : T;
|
|
133
154
|
export interface FormState<T extends Record<string, unknown>> {
|
|
134
155
|
/** Individual field states — access value, error, event handlers. */
|
|
135
156
|
fields: FormFields<T>;
|
|
@@ -191,8 +212,30 @@ export interface FormState<T extends Record<string, unknown>> {
|
|
|
191
212
|
* 5. Manages `isSubmitting` across async callbacks
|
|
192
213
|
*/
|
|
193
214
|
handleSubmit(fn: (values: T) => void | Promise<void>): (e: Event) => void;
|
|
194
|
-
/**
|
|
195
|
-
|
|
215
|
+
/**
|
|
216
|
+
* Reset all fields to their initial values. If `newInitialValues` is provided,
|
|
217
|
+
* it becomes the new baseline and subsequent reset() calls will use it.
|
|
218
|
+
*/
|
|
219
|
+
reset(newInitialValues?: T): void;
|
|
220
|
+
/**
|
|
221
|
+
* Set a single field value by its path (top-level or nested dot-path).
|
|
222
|
+
*/
|
|
223
|
+
setValue(path: string, value: unknown, options?: {
|
|
224
|
+
shouldTouch?: boolean;
|
|
225
|
+
shouldDirty?: boolean;
|
|
226
|
+
shouldValidate?: boolean;
|
|
227
|
+
}): void;
|
|
228
|
+
/**
|
|
229
|
+
* Set multiple field values at once.
|
|
230
|
+
*
|
|
231
|
+
* @param values — partial object with top-level and/or nested values.
|
|
232
|
+
* @param options — control whether to preserve existing touched/dirty/error state.
|
|
233
|
+
*/
|
|
234
|
+
setValues(values: DeepPartial<T>, options?: {
|
|
235
|
+
keepDirty?: boolean;
|
|
236
|
+
keepTouched?: boolean;
|
|
237
|
+
keepErrors?: boolean;
|
|
238
|
+
}): void;
|
|
196
239
|
/**
|
|
197
240
|
* Inject external errors (e.g., from a server response) into specific fields.
|
|
198
241
|
* Each field's error clears automatically the next time the user edits it.
|
package/dist/lib/nix/index.d.ts
CHANGED
|
@@ -16,4 +16,4 @@ export type { SuspenseOptions } from "./async";
|
|
|
16
16
|
export { provide, inject, createInjectionKey } from "./context";
|
|
17
17
|
export type { InjectionKey } from "./context";
|
|
18
18
|
export { nixField, nixFieldArray, createForm, required, minLength, maxLength, email, pattern, min, max, createValidator, validators, extendValidators, } from "./form";
|
|
19
|
-
export type { Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase } from "./form";
|
|
19
|
+
export type { DeepPartial, Validator, ValidateOn, FieldState, FieldArrayState, FieldErrors, FormState, FormOptions, ValidatorsBase } from "./form";
|
package/package.json
CHANGED