mobx-react-hook-form 5.10.0 → 6.0.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.
@@ -1,6 +1,6 @@
1
1
  import { BaseSyntheticEvent } from 'react';
2
2
  import { Control, createFormControl, DeepMap, DeepPartial, DefaultValues, FieldErrors, FieldPath, FieldPathValue, FieldValues, FormState, SetValueConfig, UseFormClearErrors, UseFormGetValues, UseFormRegister, UseFormReset, UseFormResetField, UseFormSetError, UseFormSetFocus, UseFormSetValue, UseFormTrigger, UseFormUnregister } from 'react-hook-form';
3
- import { ErrorWithPath, FormParams } from './mobx-form.types.js';
3
+ import { ErrorWithPath, FormParams } from './form.types.js';
4
4
  type FormFullState<TFieldValues extends FieldValues> = FormState<TFieldValues> & {
5
5
  values: TFieldValues;
6
6
  };
@@ -280,6 +280,7 @@ export declare class Form<TFieldValues extends FieldValues = FieldValues, TConte
280
280
  private _observableStruct;
281
281
  shouldFocusError: boolean;
282
282
  private config;
283
+ private forceFormUpdate;
283
284
  constructor(config: FormParams<TFieldValues, TContext, TTransformedValues>);
284
285
  /**
285
286
  * The same as setValue, but will trigger validation if form was submitted, also marks this field as dirty
@@ -330,10 +331,11 @@ export declare class Form<TFieldValues extends FieldValues = FieldValues, TConte
330
331
  private scheduleUpdateFormState;
331
332
  destroy(): void;
332
333
  }
334
+ export declare const createForm: <TFieldValues extends FieldValues = FieldValues, TContext = any, TTransformedValues = TFieldValues>(config: FormParams<TFieldValues, TContext, TTransformedValues>) => Form<TFieldValues, TContext, TTransformedValues>;
333
335
  /**
334
336
  * @deprecated ⚠️ use `Form`. This export will be removed in next major release
335
337
  */
336
338
  export declare class MobxForm<TFieldValues extends FieldValues = FieldValues, TContext = any, TTransformedValues = TFieldValues> extends Form<TFieldValues, TContext, TTransformedValues> {
337
339
  }
338
340
  export {};
339
- //# sourceMappingURL=mobx-form.d.ts.map
341
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../../src/form/form.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { DeepPartial, FieldError, FieldPath, FieldValues, SubmitErrorHandler, SubmitHandler, UseFormProps } from 'react-hook-form';
2
- import { Form } from './mobx-form.js';
2
+ import { Form } from './form.js';
3
3
  export type AnyForm = Form<any, any, any>;
4
4
  /**
5
5
  * @deprecated ⚠️ use `AnyForm`. This export will be removed in next major release
@@ -54,4 +54,4 @@ export interface ErrorWithPath<TFieldValues extends FieldValues = FieldValues, T
54
54
  path: TFieldName;
55
55
  error: FieldError;
56
56
  }
57
- //# sourceMappingURL=mobx-form.types.d.ts.map
57
+ //# sourceMappingURL=form.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.types.d.ts","sourceRoot":"","sources":["../../src/form/form.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,UAAU,CACzB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,CACjC,SAAQ,IAAI,CACV,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACxD,eAAe,CAChB;IACD;;OAEG;IACH,aAAa,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1C;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC7C;;OAEG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAClD;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,IAC/B,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAE3D,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,OAAO,IAAI,OAAO,CAC7D,CAAC,CAAC,QAAQ,CAAC,EACX,SAAS,GAAG,IAAI,CACjB,CAAC;AAEF,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,IAAI,CAC1E,GAAG,EACH,GAAG,EACH,MAAM,kBAAkB,CACzB,GACG,kBAAkB,GAClB,KAAK,CAAC;AAEV,MAAM,WAAW,aAAa,CAC5B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,UAAU,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC;IAEpE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB"}
@@ -0,0 +1,3 @@
1
+ export * from './form.js';
2
+ export * from './form.types.js';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/form/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,iBAAiB,CAAC"}
package/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),e=require("mobx-react-lite"),r=require("react-hook-form"),s=require("linked-abort-controller"),i=require("mobx"),o=require("yummies/mobx"),a=require("yummies/type-guard"),l=t=>a.typeGuard.isObject(t)&&"type"in t;class u{values;isDirty=!1;isLoading=!1;isSubmitted=!1;isSubmitSuccessful=!1;isSubmitting=!1;isValidating=!1;isValid=!1;disabled=!1;submitCount=0;defaultValues;dirtyFields;touchedFields;validatingFields;errors;isReady=!1;setError;clearErrors;trigger;resetField;unregister;control;register;setFocus;setValue;getValues;resetForm;abortController;originalForm;_observableStruct;shouldFocusError;config;constructor(t){this.abortController=new s.LinkedAbortController(t.abortSignal),this.shouldFocusError=t.shouldFocusError??!0,this.config={...t,defaultValues:{...t.defaultValues}},Object.defineProperty(this.config,"shouldFocusError",{get(){return this.shouldFocusError}}),this.originalForm=r.createFormControl(this.config);const e=t.defaultValues?{...t.defaultValues}:{};this.setError=i.action((...t)=>(r.set(this.errors,t[0],t[1]),this.originalForm.setError(...t))),this.clearErrors=this.originalForm.clearErrors,this.trigger=this.originalForm.trigger,this.resetField=i.action((...t)=>(r.set(this.values,t[0],r.get(this.defaultValues,t[0])),this.originalForm.resetField(...t))),this.unregister=this.originalForm.unregister,this.control=this.originalForm.control,this.register=this.originalForm.register,this.setFocus=this.originalForm.setFocus,this.setValue=i.action((...t)=>(r.set(this.values,t[0],t[1]),this.originalForm.setValue(...t))),this.getValues=this.originalForm.getValues,this.resetForm=i.action((...t)=>{let e=t[0]??this.defaultValues;return e=i.isObservableObject(e)?i.toJS(e):structuredClone(e),this.values=e,this.originalForm.reset(...t)}),this._observableStruct=new o.DeepObservableStruct({values:this.originalForm.getValues(),errors:{},dirtyFields:{},touchedFields:{},validatingFields:{}}),this.values=this._observableStruct.data.values,this.errors=this._observableStruct.data.errors,this.validatingFields=this._observableStruct.data.validatingFields,this.dirtyFields=this._observableStruct.data.dirtyFields,this.touchedFields=this._observableStruct.data.touchedFields,Object.assign(this,{defaultValues:e});const a=this.originalForm.subscribe({formState:{values:!0,errors:!0,isValid:!0,isDirty:!0,isValidating:!0,dirtyFields:!0,touchedFields:!0,validatingFields:!0},callback:t=>{!1===this.config.lazyUpdates?this.updateFormState(t):this.scheduleUpdateFormState(t)}});i.observable.ref(this,"isDirty"),i.observable.ref(this,"isLoading"),i.observable.ref(this,"isSubmitted"),i.observable.ref(this,"isSubmitSuccessful"),i.observable.ref(this,"isSubmitting"),i.observable.ref(this,"isValidating"),i.observable.ref(this,"isValid"),i.observable.ref(this,"disabled"),i.observable.ref(this,"submitCount"),i.observable.ref(this,"isReady"),i.observable.deep(this,"defaultValues"),i.computed(this,"hasErrors"),i.action(this,"updateFormState"),i.observable.ref(this,"originalForm"),i.action.bound(this,"submit"),i.action.bound(this,"reset"),i.makeObservable(this),this.abortController.signal.addEventListener("abort",()=>{a(),this.originalForm=null})}changeField=(t,e,r)=>{this.setValue(t,e,{shouldDirty:!0,shouldValidate:this.isSubmitted,...r})};submit(t){return new Promise((e,r)=>{if(!this.originalForm){const t=this.values??{},r=this.config.onSubmit?.(t);return r instanceof Promise?r.then(()=>e(t)):Promise.resolve(t)}this.originalForm.handleSubmit(async(t,s)=>{if(this.config.strictSubmitChecks){const t=this.getErrorsWithPaths(!0)[0];if(t)return this.setFocus(t.path),await(this.config.onSubmitFailed?.(this.errors,s)),void r(this.errors)}await(this.config.onSubmit?.(t,s)),e(t)},async(t,e)=>{await(this.config.onSubmitFailed?.(t,e)),r(t)})(t)})}reset(t){this.resetForm(),this.config.onReset?.(t)}get hasErrors(){return Object.keys(this.errors).length>0}getErrorsWithPaths(t){const e=[],r=(s,i="")=>{s&&"object"==typeof s&&Object.entries(s).forEach(([s,o])=>{const a=i?`${i}.${s}`:s;if(l(o)){if(e.push({path:a,error:o}),t)return}else Array.isArray(o)?o.forEach((s,i)=>{const o=`${a}.${i}`;if(l(s)){if(e.push({path:o,error:s}),t)return}else"object"==typeof s&&r(s,o)}):"object"==typeof o&&r(o,a)})};return r(this.errors),e}updateFormState({values:t,errors:e,dirtyFields:r,validatingFields:s,touchedFields:i,...o}){Object.entries(o).forEach(([t,e])=>{null!=e&&(this[t]=e)}),this._observableStruct.set({dirtyFields:r,errors:e,touchedFields:i,validatingFields:s,values:t})}lastTimeoutId;stopScheduledFormStateUpdate=()=>{void 0!==this.lastTimeoutId&&(clearTimeout(this.lastTimeoutId),this.lastTimeoutId=void 0)};scheduleUpdateFormState=t=>{this.stopScheduledFormStateUpdate(),this.lastTimeoutId=setTimeout(()=>{this.updateFormState(t),this.lastTimeoutId=void 0},this.config.lazyUpdatesTimer??0)};destroy(){this.abortController.abort(),this.stopScheduledFormStateUpdate()}}exports.Controller=s=>t.jsx(r.Controller,{...s,render:r=>t.jsx(e.Observer,{children:()=>s.render(r)})}),exports.Form=u,exports.MobxForm=class extends u{},exports.isFieldError=l;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),e=require("mobx-react-lite"),r=require("react-hook-form"),i=require("linked-abort-controller"),s=require("mobx"),o=require("yummies/mobx"),a=require("yummies/type-guard"),l=t=>a.typeGuard.isObject(t)&&"type"in t;class d{values;isDirty=!1;isLoading=!1;isSubmitted=!1;isSubmitSuccessful=!1;isSubmitting=!1;isValidating=!1;isValid=!1;disabled=!1;submitCount=0;defaultValues;dirtyFields;touchedFields;validatingFields;errors;isReady=!1;setError;clearErrors;trigger;resetField;unregister;control;register;setFocus;setValue;getValues;resetForm;abortController;originalForm;_observableStruct;shouldFocusError;config;forceFormUpdate;constructor(t){this.abortController=new i.LinkedAbortController(t.abortSignal),this.shouldFocusError=t.shouldFocusError??!0,this.forceFormUpdate=!1,this.config={...t,defaultValues:{...t.defaultValues}},Object.defineProperty(this.config,"shouldFocusError",{get(){return this.shouldFocusError}}),this.originalForm=r.createFormControl(this.config);const e=t.defaultValues?{...t.defaultValues}:{};this.setError=(...t)=>(this.forceFormUpdate=!0,this.originalForm.setError(...t)),this.clearErrors=(...t)=>(this.forceFormUpdate=!0,this.originalForm.clearErrors(...t)),this.trigger=this.originalForm.trigger,this.resetField=(...t)=>(this.forceFormUpdate=!0,this.originalForm.resetField(...t)),this.unregister=this.originalForm.unregister,this.control=this.originalForm.control,this.register=this.originalForm.register,this.setFocus=this.originalForm.setFocus,this.setValue=(...t)=>(this.forceFormUpdate=!0,this.originalForm.setValue(...t)),this.getValues=this.originalForm.getValues,this.resetForm=(...t)=>(this.forceFormUpdate=!0,this.originalForm.reset(...t)),this._observableStruct=new o.DeepObservableStruct({values:this.originalForm.getValues(),errors:{},dirtyFields:{},touchedFields:{},validatingFields:{}}),this.values=this._observableStruct.data.values,this.errors=this._observableStruct.data.errors,this.validatingFields=this._observableStruct.data.validatingFields,this.dirtyFields=this._observableStruct.data.dirtyFields,this.touchedFields=this._observableStruct.data.touchedFields,Object.assign(this,{defaultValues:e});const a=this.originalForm.subscribe({formState:{values:!0,errors:!0,isValid:!0,isDirty:!0,isValidating:!0,dirtyFields:!0,touchedFields:!0,validatingFields:!0},callback:t=>{this.forceFormUpdate||!1===this.config.lazyUpdates?(this.forceFormUpdate=!1,this.updateFormState(t)):this.scheduleUpdateFormState(t)}});s.observable.ref(this,"isDirty"),s.observable.ref(this,"isLoading"),s.observable.ref(this,"isSubmitted"),s.observable.ref(this,"isSubmitSuccessful"),s.observable.ref(this,"isSubmitting"),s.observable.ref(this,"isValidating"),s.observable.ref(this,"isValid"),s.observable.ref(this,"disabled"),s.observable.ref(this,"submitCount"),s.observable.ref(this,"isReady"),s.observable.deep(this,"defaultValues"),s.computed(this,"hasErrors"),s.action(this,"updateFormState"),s.observable.ref(this,"originalForm"),s.action.bound(this,"submit"),s.action.bound(this,"reset"),s.makeObservable(this),this.abortController.signal.addEventListener("abort",()=>{a(),this.originalForm=null})}changeField=(t,e,r)=>this.setValue(t,e,{shouldDirty:!0,shouldValidate:this.isSubmitted,...r});submit(t){return new Promise((e,r)=>{if(!this.originalForm){const t=this.values??{},r=this.config.onSubmit?.(t);return r instanceof Promise?r.then(()=>e(t)):Promise.resolve(t)}this.originalForm.handleSubmit(async(t,i)=>{if(this.config.strictSubmitChecks){const t=this.getErrorsWithPaths(!0)[0];if(t)return this.setFocus(t.path),await(this.config.onSubmitFailed?.(this.errors,i)),void r(this.errors)}await(this.config.onSubmit?.(t,i)),e(t)},async(t,e)=>{await(this.config.onSubmitFailed?.(t,e)),r(t)})(t)})}reset(t){this.resetForm(),this.config.onReset?.(t)}get hasErrors(){return Object.keys(this.errors).length>0}getErrorsWithPaths(t){const e=[],r=(i,s="")=>{i&&"object"==typeof i&&Object.entries(i).forEach(([i,o])=>{const a=s?`${s}.${i}`:i;if(l(o)){if(e.push({path:a,error:o}),t)return}else Array.isArray(o)?o.forEach((i,s)=>{const o=`${a}.${s}`;if(l(i)){if(e.push({path:o,error:i}),t)return}else"object"==typeof i&&r(i,o)}):"object"==typeof o&&r(o,a)})};return r(this.errors),e}updateFormState({values:t,errors:e,dirtyFields:r,validatingFields:i,touchedFields:s,...o}){this.stopScheduledFormStateUpdate(),Object.entries(o).forEach(([t,e])=>{null!=e&&(this[t]=e)}),this._observableStruct.set({dirtyFields:r,errors:e,touchedFields:s,validatingFields:i,values:t})}lastTimeoutId;stopScheduledFormStateUpdate=()=>{void 0!==this.lastTimeoutId&&(clearTimeout(this.lastTimeoutId),this.lastTimeoutId=void 0)};scheduleUpdateFormState=t=>{this.stopScheduledFormStateUpdate(),this.lastTimeoutId=setTimeout(()=>{this.updateFormState(t),this.lastTimeoutId=void 0},this.config.lazyUpdatesTimer??0)};destroy(){this.abortController.abort(),this.stopScheduledFormStateUpdate()}}exports.Controller=i=>t.jsx(r.Controller,{...i,render:r=>t.jsx(e.Observer,{children:()=>i.render(r)})}),exports.Form=d,exports.MobxForm=class extends d{},exports.createForm=t=>new d(t),exports.isFieldError=l;
2
2
  //# sourceMappingURL=index.cjs.map
package/index.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["../src/utils/is-field-error.ts","../src/mobx-form/mobx-form.ts","../src/components/controller.tsx"],"sourcesContent":["import type { FieldError } from 'react-hook-form';\nimport { typeGuard } from 'yummies/type-guard';\n\nexport const isFieldError = (value: unknown): value is FieldError => {\n return typeGuard.isObject(value) && 'type' in value;\n};\n","import { LinkedAbortController } from 'linked-abort-controller';\nimport {\n action,\n computed,\n isObservableObject,\n makeObservable,\n observable,\n toJS,\n} from 'mobx';\nimport type { BaseSyntheticEvent } from 'react';\nimport {\n type Control,\n createFormControl,\n type DeepMap,\n type DeepPartial,\n type DefaultValues,\n type FieldErrors,\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type FormState,\n get,\n type SetValueConfig,\n set,\n type UseFormClearErrors,\n type UseFormGetValues,\n type UseFormRegister,\n type UseFormReset,\n type UseFormResetField,\n type UseFormSetError,\n type UseFormSetFocus,\n type UseFormSetValue,\n type UseFormTrigger,\n type UseFormUnregister,\n} from 'react-hook-form';\nimport { DeepObservableStruct } from 'yummies/mobx';\nimport { isFieldError } from '../utils/index.js';\nimport type { ErrorWithPath, FormParams } from './mobx-form.types.js';\n\ntype FormFullState<TFieldValues extends FieldValues> =\n FormState<TFieldValues> & {\n values: TFieldValues;\n };\n\nexport class Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> implements FormFullState<TFieldValues>\n{\n values: TFieldValues;\n isDirty: boolean = false;\n isLoading: boolean = false;\n isSubmitted: boolean = false;\n isSubmitSuccessful: boolean = false;\n isSubmitting: boolean = false;\n isValidating: boolean = false;\n isValid: boolean = false;\n disabled: boolean = false;\n submitCount: number = 0;\n /**\n * If you want to change this property\n * Use {resetForm} method\n */\n defaultValues!: Readonly<DefaultValues<TFieldValues>>;\n dirtyFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n touchedFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n validatingFields: Partial<\n Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>\n >;\n errors: FieldErrors<TFieldValues>;\n isReady: boolean = false;\n\n /**\n * Set an error for the field. When set an error which is not associated to a field then manual `clearErrors` invoke is required.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/seterror) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-seterror-nfxxu) • [Video](https://www.youtube.com/watch?v=raMqvE0YyIY)\n *\n * @param name - the path name to the form field value.\n * @param error - an error object which contains type and optional message\n * @param options - whether or not to focus on the field\n *\n * @example\n * ```tsx\n * // when the error is not associated with any fields, `clearError` will need to invoke to clear the error\n * const onSubmit = () => setError(\"serverError\", { type: \"server\", message: \"Error occurred\"})\n *\n * <button onClick={() => setError(\"name\", { type: \"min\" })} />\n *\n * // focus on the input after setting the error\n * <button onClick={() => setError(\"name\", { type: \"max\" }, { shouldFocus: true })} />\n * ```\n */\n setError: UseFormSetError<TFieldValues>;\n\n /**\n * Clear the entire form errors.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/clearerrors) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-clearerrors-w3ymx)\n *\n * @param name - the path name to the form field value.\n *\n * @example\n * Clear all errors\n * ```tsx\n * clearErrors(); // clear the entire form error\n * clearErrors([\"name\", \"name1\"]) // clear an array of fields' error\n * clearErrors(\"name2\"); // clear a single field error\n * ```\n */\n clearErrors: UseFormClearErrors<TFieldValues>;\n\n /**\n * Trigger field or form validation\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/trigger) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-triggervalidation-forked-xs7hl) • [Video](https://www.youtube.com/watch?v=-bcyJCDjksE)\n *\n * @param name - provide empty argument will trigger the entire form validation, an array of field names will validate an array of fields, and a single field name will only trigger that field's validation.\n * @param options - should focus on the error field\n *\n * @returns validation result\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * trigger();\n * }, [trigger])\n *\n * <button onClick={async () => {\n * const result = await trigger(); // result will be a boolean value\n * }}>\n * trigger\n * </button>\n * ```\n */\n trigger: UseFormTrigger<TFieldValues>;\n\n /**\n * Reset a field state and reference.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/resetfield) • [Demo](https://codesandbox.io/s/priceless-firefly-d0kuv) • [Video](https://www.youtube.com/watch?v=IdLFcNaEFEo)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * <input {...register(\"firstName\", { required: true })} />\n * <button type=\"button\" onClick={() => resetField(\"firstName\"))}>Reset</button>\n * ```\n */\n resetField: UseFormResetField<TFieldValues>;\n\n /**\n * Unregister a field reference and remove its value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/unregister) • [Demo](https://codesandbox.io/s/react-hook-form-unregister-4k2ey) • [Video](https://www.youtube.com/watch?v=TM99g_NW5Gk&feature=emb_imp_woyt)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * register(\"name\", { required: true })\n *\n * <button onClick={() => unregister(\"name\")} />\n * // there are various keep options to retain formState\n * <button onClick={() => unregister(\"name\", { keepErrors: true })} />\n * ```\n */\n unregister: UseFormUnregister<TFieldValues>;\n\n /**\n * Form control\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/control)\n *\n */\n control: Control<TFieldValues, TContext, TTransformedValues>;\n\n /**\n * Register field into hook form with or without the actual DOM ref. You can invoke register anywhere in the component including at `useEffect`.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/register) • [Demo](https://codesandbox.io/s/react-hook-form-register-ts-ip2j3) • [Video](https://www.youtube.com/watch?v=JFIpCoajYkA)\n *\n * @param name - the path name to the form field value, name is required and unique\n * @param options - register options include validation, disabled, unregister, value as and dependent validation\n *\n * @returns onChange, onBlur, name, ref, and native contribute attribute if browser validation is enabled.\n *\n * @example\n * ```tsx\n * // Register HTML native input\n * <input {...register(\"input\")} />\n * <select {...register(\"select\")} />\n *\n * // Register options\n * <textarea {...register(\"textarea\", { required: \"This is required.\", maxLength: 20 })} />\n * <input type=\"number\" {...register(\"name2\", { valueAsNumber: true })} />\n * <input {...register(\"name3\", { deps: [\"name2\"] })} />\n *\n * // Register custom field at useEffect\n * useEffect(() => {\n * register(\"name4\");\n * register(\"name5\", { value: \"hiddenValue\" });\n * }, [register])\n *\n * // Register without ref\n * const { onChange, onBlur, name } = register(\"name6\")\n * <input onChange={onChange} onBlur={onBlur} name={name} />\n * ```\n */\n register: UseFormRegister<TFieldValues>;\n\n /**\n * Set focus on a registered field. You can start to invoke this method after all fields are mounted to the DOM.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setfocus) • [Demo](https://codesandbox.io/s/setfocus-rolus)\n *\n * @param name - the path name to the form field value.\n * @param options - input focus behavior options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * setFocus(\"name\");\n * }, [setFocus])\n * // shouldSelect allows to select input's content on focus\n * <button onClick={() => setFocus(\"name\", { shouldSelect: true })}>Focus</button>\n * ```\n */\n setFocus: UseFormSetFocus<TFieldValues>;\n\n /**\n * Set a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setvalue) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-setvalue-8z9hx) • [Video](https://www.youtube.com/watch?v=qpv51sCH3fI)\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * setValue('name', 'value', {\n * shouldValidate: true, // trigger validation\n * shouldTouch: true, // update touched fields form state\n * shouldDirty: true, // update dirty and dirty fields form state\n * });\n *\n * // Update a group fields\n * setValue('root', {\n * a: 'test', // setValue('root.a', 'data')\n * b: 'test1', // setValue('root.b', 'data')\n * });\n *\n * // Update a nested object field\n * setValue('select', { label: 'test', value: 'Test' });\n * ```\n */\n setValue: UseFormSetValue<TFieldValues>;\n\n /**\n * Get a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/getvalues) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-getvalues-txsfg)\n *\n * @param fieldNames - the path name to the form field value.\n * @param options - returns only dirty fields or return only touchedFields\n *\n * @example\n * ```tsx\n * // Update a single field\n * getValues('name', 'value', {\n * dirtyFields: true, // returns only dirty fields\n * touchedFields: true, // returns only touchedFields\n * });\n *\n * // Get nested values\n * getValues('root.nested.0.value');\n * ```\n */\n getValues: UseFormGetValues<TFieldValues>;\n\n /**\n * Reset at the entire form state.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/reset) • [Demo](https://codesandbox.io/s/react-hook-form-reset-v7-ts-pu901) • [Video](https://www.youtube.com/watch?v=qmCLBjyPwVk)\n *\n * @param values - the entire form values to be reset\n * @param keepStateOptions - keep form state options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * // reset the entire form after component mount or form defaultValues is ready\n * reset({\n * fieldA: \"test\"\n * fieldB: \"test\"\n * });\n * }, [reset])\n *\n * // reset by combine with existing form values\n * reset({\n * ...getValues(),\n * fieldB: \"test\"\n *});\n *\n * // reset and keep form state\n * reset({\n * ...getValues(),\n *}, {\n * keepErrors: true,\n * keepDirty: true\n *});\n * ```\n */\n resetForm: UseFormReset<TFieldValues>;\n\n protected abortController: AbortController;\n\n /**\n * Original react-hook-form form\n */\n originalForm: ReturnType<\n typeof createFormControl<TFieldValues, TContext, TTransformedValues>\n >;\n\n private _observableStruct: DeepObservableStruct<\n Pick<\n FormFullState<TFieldValues>,\n 'dirtyFields' | 'errors' | 'touchedFields' | 'validatingFields' | 'values'\n >\n >;\n\n shouldFocusError: boolean;\n\n private config: FormParams<TFieldValues, TContext, TTransformedValues>;\n\n constructor(config: FormParams<TFieldValues, TContext, TTransformedValues>) {\n this.abortController = new LinkedAbortController(config.abortSignal);\n\n this.shouldFocusError = config.shouldFocusError ?? true;\n\n this.config = {\n ...config,\n defaultValues: {\n ...config.defaultValues,\n } as DefaultValues<TFieldValues>,\n };\n\n Object.defineProperty(this.config, 'shouldFocusError', {\n get() {\n return this.shouldFocusError;\n },\n });\n\n this.originalForm = createFormControl<\n TFieldValues,\n TContext,\n TTransformedValues\n >(this.config as any);\n\n const defaultValues = config.defaultValues\n ? { ...config.defaultValues }\n : ({} as any);\n\n this.setError = action((...args) => {\n set(this.errors, args[0], args[1]);\n return this.originalForm.setError(...args);\n });\n this.clearErrors = this.originalForm.clearErrors;\n this.trigger = this.originalForm.trigger;\n this.resetField = action((...args) => {\n set(this.values, args[0], get(this.defaultValues, args[0]));\n return this.originalForm.resetField(...args);\n });\n this.unregister = this.originalForm.unregister;\n this.control = this.originalForm.control;\n this.register = this.originalForm.register;\n this.setFocus = this.originalForm.setFocus;\n this.setValue = action((...args) => {\n set(this.values, args[0], args[1]);\n return this.originalForm.setValue(...args);\n });\n this.getValues = this.originalForm.getValues;\n this.resetForm = action((...args) => {\n let defaultValues = args[0] ?? this.defaultValues;\n\n if (isObservableObject(defaultValues)) {\n defaultValues = toJS(defaultValues);\n } else {\n defaultValues = structuredClone(defaultValues);\n }\n\n // @ts-expect-error\n this.values = defaultValues;\n return this.originalForm.reset(...args);\n });\n\n this._observableStruct = new DeepObservableStruct({\n values: this.originalForm.getValues(),\n errors: {},\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n });\n\n this.values = this._observableStruct.data.values;\n this.errors = this._observableStruct.data.errors;\n this.validatingFields = this._observableStruct.data.validatingFields;\n this.dirtyFields = this._observableStruct.data.dirtyFields;\n this.touchedFields = this._observableStruct.data.touchedFields;\n\n Object.assign(this, {\n defaultValues,\n });\n\n const subscription = this.originalForm.subscribe({\n formState: {\n values: true,\n errors: true,\n isValid: true,\n isDirty: true,\n isValidating: true,\n dirtyFields: true,\n touchedFields: true,\n validatingFields: true,\n },\n callback: (rawFormState) => {\n if (this.config.lazyUpdates === false) {\n this.updateFormState(rawFormState);\n } else {\n this.scheduleUpdateFormState(rawFormState);\n }\n },\n });\n\n observable.ref(this, 'isDirty');\n observable.ref(this, 'isLoading');\n observable.ref(this, 'isSubmitted');\n observable.ref(this, 'isSubmitSuccessful');\n observable.ref(this, 'isSubmitting');\n observable.ref(this, 'isValidating');\n observable.ref(this, 'isValid');\n observable.ref(this, 'disabled');\n observable.ref(this, 'submitCount');\n observable.ref(this, 'isReady');\n observable.deep(this, 'defaultValues');\n computed(this, 'hasErrors');\n action(this, 'updateFormState');\n\n observable.ref(this, 'originalForm');\n action.bound(this, 'submit');\n action.bound(this, 'reset');\n\n makeObservable(this);\n\n this.abortController.signal.addEventListener('abort', () => {\n subscription();\n // @ts-expect-error\n this.originalForm = null;\n });\n }\n\n /**\n * The same as setValue, but will trigger validation if form was submitted, also marks this field as dirty\n * It should work the same as field.onChange from react-hook-form's Controller\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true });\n *\n * ** form submitted **\n *\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true, shouldValidate: true });\n * ```\n */\n changeField = <\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n >(\n name: TFieldName,\n value: FieldPathValue<TFieldValues, TFieldName> | undefined,\n options?: SetValueConfig,\n ) => {\n this.setValue(name, value as any, {\n shouldDirty: true,\n shouldValidate: this.isSubmitted,\n ...options,\n });\n };\n\n /**\n * Method to manually submit form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onSubmit={form.submit} />\n */\n submit(e?: BaseSyntheticEvent) {\n return new Promise<TTransformedValues>((resolve, reject) => {\n if (this.originalForm) {\n this.originalForm.handleSubmit(\n async (data, event) => {\n if (this.config.strictSubmitChecks) {\n const anyErrorWithPath = this.getErrorsWithPaths(true)[0];\n if (anyErrorWithPath) {\n this.setFocus(anyErrorWithPath.path);\n await this.config.onSubmitFailed?.(this.errors, event);\n reject(this.errors);\n return;\n }\n }\n await this.config.onSubmit?.(data, event);\n resolve(data);\n },\n async (errors, event) => {\n await this.config.onSubmitFailed?.(errors, event);\n reject(errors);\n },\n )(e);\n } else {\n const emptyData = (this.values ?? {}) as unknown as TTransformedValues;\n const result = this.config.onSubmit?.(emptyData);\n if (result instanceof Promise) {\n return result.then(() => resolve(emptyData));\n } else {\n return Promise.resolve(emptyData);\n }\n }\n });\n }\n\n /**\n * Method to manually reset all form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onReset={form.reset} />\n */\n reset(e?: BaseSyntheticEvent) {\n this.resetForm();\n this.config.onReset?.(e);\n }\n\n get hasErrors() {\n return Object.keys(this.errors).length > 0;\n }\n\n getErrorsWithPaths(getOnlyFirst?: boolean): ErrorWithPath<TFieldValues>[] {\n const result: ErrorWithPath<TFieldValues>[] = [];\n\n const traverse = (obj: any, prefix = '') => {\n if (!obj || typeof obj !== 'object') return;\n\n Object.entries(obj).forEach(([key, value]) => {\n const path = (prefix ? `${prefix}.${key}` : key) as any;\n\n if (isFieldError(value)) {\n result.push({ path, error: value });\n if (getOnlyFirst) {\n return;\n }\n } else if (Array.isArray(value)) {\n value.forEach((item, idx) => {\n const arrayPath = `${path}.${idx}` as any;\n\n if (isFieldError(item)) {\n result.push({ path: arrayPath, error: item });\n if (getOnlyFirst) {\n return;\n }\n } else if (typeof item === 'object') {\n traverse(item, arrayPath);\n }\n });\n } else if (typeof value === 'object') {\n traverse(value, path);\n }\n });\n };\n\n traverse(this.errors);\n\n return result;\n }\n\n private updateFormState({\n values,\n errors,\n dirtyFields,\n validatingFields,\n touchedFields,\n ...simpleProperties\n }: Partial<FormFullState<TFieldValues>>) {\n Object.entries(simpleProperties).forEach(([key, value]) => {\n if (value != null) {\n // @ts-expect-error\n this[key] = value;\n }\n });\n\n this._observableStruct.set({\n dirtyFields,\n errors,\n touchedFields,\n validatingFields,\n values,\n });\n }\n\n protected lastTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n private stopScheduledFormStateUpdate = () => {\n if (this.lastTimeoutId !== undefined) {\n clearTimeout(this.lastTimeoutId);\n this.lastTimeoutId = undefined;\n }\n };\n\n private scheduleUpdateFormState = (\n rawFormState: Partial<FormFullState<TFieldValues>>,\n ) => {\n this.stopScheduledFormStateUpdate();\n this.lastTimeoutId = setTimeout(() => {\n this.updateFormState(rawFormState);\n this.lastTimeoutId = undefined;\n }, this.config.lazyUpdatesTimer ?? 0);\n };\n\n destroy(): void {\n this.abortController.abort();\n this.stopScheduledFormStateUpdate();\n }\n}\n\n/**\n * @deprecated ⚠️ use `Form`. This export will be removed in next major release\n */\nexport class MobxForm<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> extends Form<TFieldValues, TContext, TTransformedValues> {}\n","import { Observer } from 'mobx-react-lite';\nimport { Controller as LibController } from 'react-hook-form';\n\nexport const Controller = ((props: any) => (\n <LibController\n {...props}\n render={(renderProps) => (\n <Observer>{() => props.render(renderProps)}</Observer>\n )}\n />\n)) as unknown as typeof LibController;\n"],"names":["isFieldError","value","typeGuard","isObject","Form","values","isDirty","isLoading","isSubmitted","isSubmitSuccessful","isSubmitting","isValidating","isValid","disabled","submitCount","defaultValues","dirtyFields","touchedFields","validatingFields","errors","isReady","setError","clearErrors","trigger","resetField","unregister","control","register","setFocus","setValue","getValues","resetForm","abortController","originalForm","_observableStruct","shouldFocusError","config","constructor","this","LinkedAbortController","abortSignal","Object","defineProperty","get","createFormControl","action","args","set","isObservableObject","toJS","structuredClone","reset","DeepObservableStruct","data","assign","subscription","subscribe","formState","callback","rawFormState","lazyUpdates","updateFormState","scheduleUpdateFormState","observable","ref","deep","computed","bound","makeObservable","signal","addEventListener","changeField","name","options","shouldDirty","shouldValidate","submit","e","Promise","resolve","reject","emptyData","result","onSubmit","then","handleSubmit","async","event","strictSubmitChecks","anyErrorWithPath","getErrorsWithPaths","path","onSubmitFailed","onReset","hasErrors","keys","length","getOnlyFirst","traverse","obj","prefix","entries","forEach","key","push","error","Array","isArray","item","idx","arrayPath","simpleProperties","lastTimeoutId","stopScheduledFormStateUpdate","clearTimeout","setTimeout","lazyUpdatesTimer","destroy","abort","props","jsx","LibController","render","renderProps","Observer","children"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["../src/utils/is-field-error.ts","../src/form/form.ts","../src/components/controller.tsx"],"sourcesContent":["import type { FieldError } from 'react-hook-form';\nimport { typeGuard } from 'yummies/type-guard';\n\nexport const isFieldError = (value: unknown): value is FieldError => {\n return typeGuard.isObject(value) && 'type' in value;\n};\n","import { LinkedAbortController } from 'linked-abort-controller';\nimport { action, computed, makeObservable, observable } from 'mobx';\nimport type { BaseSyntheticEvent } from 'react';\nimport {\n type Control,\n createFormControl,\n type DeepMap,\n type DeepPartial,\n type DefaultValues,\n type FieldErrors,\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type FormState,\n type SetValueConfig,\n type UseFormClearErrors,\n type UseFormGetValues,\n type UseFormRegister,\n type UseFormReset,\n type UseFormResetField,\n type UseFormSetError,\n type UseFormSetFocus,\n type UseFormSetValue,\n type UseFormTrigger,\n type UseFormUnregister,\n} from 'react-hook-form';\nimport { DeepObservableStruct } from 'yummies/mobx';\nimport { isFieldError } from '../utils/index.js';\nimport type { ErrorWithPath, FormParams } from './form.types.js';\n\ntype FormFullState<TFieldValues extends FieldValues> =\n FormState<TFieldValues> & {\n values: TFieldValues;\n };\n\nexport class Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> implements FormFullState<TFieldValues>\n{\n values: TFieldValues;\n isDirty: boolean = false;\n isLoading: boolean = false;\n isSubmitted: boolean = false;\n isSubmitSuccessful: boolean = false;\n isSubmitting: boolean = false;\n isValidating: boolean = false;\n isValid: boolean = false;\n disabled: boolean = false;\n submitCount: number = 0;\n /**\n * If you want to change this property\n * Use {resetForm} method\n */\n defaultValues!: Readonly<DefaultValues<TFieldValues>>;\n dirtyFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n touchedFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n validatingFields: Partial<\n Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>\n >;\n errors: FieldErrors<TFieldValues>;\n isReady: boolean = false;\n\n /**\n * Set an error for the field. When set an error which is not associated to a field then manual `clearErrors` invoke is required.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/seterror) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-seterror-nfxxu) • [Video](https://www.youtube.com/watch?v=raMqvE0YyIY)\n *\n * @param name - the path name to the form field value.\n * @param error - an error object which contains type and optional message\n * @param options - whether or not to focus on the field\n *\n * @example\n * ```tsx\n * // when the error is not associated with any fields, `clearError` will need to invoke to clear the error\n * const onSubmit = () => setError(\"serverError\", { type: \"server\", message: \"Error occurred\"})\n *\n * <button onClick={() => setError(\"name\", { type: \"min\" })} />\n *\n * // focus on the input after setting the error\n * <button onClick={() => setError(\"name\", { type: \"max\" }, { shouldFocus: true })} />\n * ```\n */\n setError: UseFormSetError<TFieldValues>;\n\n /**\n * Clear the entire form errors.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/clearerrors) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-clearerrors-w3ymx)\n *\n * @param name - the path name to the form field value.\n *\n * @example\n * Clear all errors\n * ```tsx\n * clearErrors(); // clear the entire form error\n * clearErrors([\"name\", \"name1\"]) // clear an array of fields' error\n * clearErrors(\"name2\"); // clear a single field error\n * ```\n */\n clearErrors: UseFormClearErrors<TFieldValues>;\n\n /**\n * Trigger field or form validation\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/trigger) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-triggervalidation-forked-xs7hl) • [Video](https://www.youtube.com/watch?v=-bcyJCDjksE)\n *\n * @param name - provide empty argument will trigger the entire form validation, an array of field names will validate an array of fields, and a single field name will only trigger that field's validation.\n * @param options - should focus on the error field\n *\n * @returns validation result\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * trigger();\n * }, [trigger])\n *\n * <button onClick={async () => {\n * const result = await trigger(); // result will be a boolean value\n * }}>\n * trigger\n * </button>\n * ```\n */\n trigger: UseFormTrigger<TFieldValues>;\n\n /**\n * Reset a field state and reference.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/resetfield) • [Demo](https://codesandbox.io/s/priceless-firefly-d0kuv) • [Video](https://www.youtube.com/watch?v=IdLFcNaEFEo)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * <input {...register(\"firstName\", { required: true })} />\n * <button type=\"button\" onClick={() => resetField(\"firstName\"))}>Reset</button>\n * ```\n */\n resetField: UseFormResetField<TFieldValues>;\n\n /**\n * Unregister a field reference and remove its value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/unregister) • [Demo](https://codesandbox.io/s/react-hook-form-unregister-4k2ey) • [Video](https://www.youtube.com/watch?v=TM99g_NW5Gk&feature=emb_imp_woyt)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * register(\"name\", { required: true })\n *\n * <button onClick={() => unregister(\"name\")} />\n * // there are various keep options to retain formState\n * <button onClick={() => unregister(\"name\", { keepErrors: true })} />\n * ```\n */\n unregister: UseFormUnregister<TFieldValues>;\n\n /**\n * Form control\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/control)\n *\n */\n control: Control<TFieldValues, TContext, TTransformedValues>;\n\n /**\n * Register field into hook form with or without the actual DOM ref. You can invoke register anywhere in the component including at `useEffect`.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/register) • [Demo](https://codesandbox.io/s/react-hook-form-register-ts-ip2j3) • [Video](https://www.youtube.com/watch?v=JFIpCoajYkA)\n *\n * @param name - the path name to the form field value, name is required and unique\n * @param options - register options include validation, disabled, unregister, value as and dependent validation\n *\n * @returns onChange, onBlur, name, ref, and native contribute attribute if browser validation is enabled.\n *\n * @example\n * ```tsx\n * // Register HTML native input\n * <input {...register(\"input\")} />\n * <select {...register(\"select\")} />\n *\n * // Register options\n * <textarea {...register(\"textarea\", { required: \"This is required.\", maxLength: 20 })} />\n * <input type=\"number\" {...register(\"name2\", { valueAsNumber: true })} />\n * <input {...register(\"name3\", { deps: [\"name2\"] })} />\n *\n * // Register custom field at useEffect\n * useEffect(() => {\n * register(\"name4\");\n * register(\"name5\", { value: \"hiddenValue\" });\n * }, [register])\n *\n * // Register without ref\n * const { onChange, onBlur, name } = register(\"name6\")\n * <input onChange={onChange} onBlur={onBlur} name={name} />\n * ```\n */\n register: UseFormRegister<TFieldValues>;\n\n /**\n * Set focus on a registered field. You can start to invoke this method after all fields are mounted to the DOM.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setfocus) • [Demo](https://codesandbox.io/s/setfocus-rolus)\n *\n * @param name - the path name to the form field value.\n * @param options - input focus behavior options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * setFocus(\"name\");\n * }, [setFocus])\n * // shouldSelect allows to select input's content on focus\n * <button onClick={() => setFocus(\"name\", { shouldSelect: true })}>Focus</button>\n * ```\n */\n setFocus: UseFormSetFocus<TFieldValues>;\n\n /**\n * Set a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setvalue) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-setvalue-8z9hx) • [Video](https://www.youtube.com/watch?v=qpv51sCH3fI)\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * setValue('name', 'value', {\n * shouldValidate: true, // trigger validation\n * shouldTouch: true, // update touched fields form state\n * shouldDirty: true, // update dirty and dirty fields form state\n * });\n *\n * // Update a group fields\n * setValue('root', {\n * a: 'test', // setValue('root.a', 'data')\n * b: 'test1', // setValue('root.b', 'data')\n * });\n *\n * // Update a nested object field\n * setValue('select', { label: 'test', value: 'Test' });\n * ```\n */\n setValue: UseFormSetValue<TFieldValues>;\n\n /**\n * Get a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/getvalues) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-getvalues-txsfg)\n *\n * @param fieldNames - the path name to the form field value.\n * @param options - returns only dirty fields or return only touchedFields\n *\n * @example\n * ```tsx\n * // Update a single field\n * getValues('name', 'value', {\n * dirtyFields: true, // returns only dirty fields\n * touchedFields: true, // returns only touchedFields\n * });\n *\n * // Get nested values\n * getValues('root.nested.0.value');\n * ```\n */\n getValues: UseFormGetValues<TFieldValues>;\n\n /**\n * Reset at the entire form state.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/reset) • [Demo](https://codesandbox.io/s/react-hook-form-reset-v7-ts-pu901) • [Video](https://www.youtube.com/watch?v=qmCLBjyPwVk)\n *\n * @param values - the entire form values to be reset\n * @param keepStateOptions - keep form state options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * // reset the entire form after component mount or form defaultValues is ready\n * reset({\n * fieldA: \"test\"\n * fieldB: \"test\"\n * });\n * }, [reset])\n *\n * // reset by combine with existing form values\n * reset({\n * ...getValues(),\n * fieldB: \"test\"\n *});\n *\n * // reset and keep form state\n * reset({\n * ...getValues(),\n *}, {\n * keepErrors: true,\n * keepDirty: true\n *});\n * ```\n */\n resetForm: UseFormReset<TFieldValues>;\n\n protected abortController: AbortController;\n\n /**\n * Original react-hook-form form\n */\n originalForm: ReturnType<\n typeof createFormControl<TFieldValues, TContext, TTransformedValues>\n >;\n\n private _observableStruct: DeepObservableStruct<\n Pick<\n FormFullState<TFieldValues>,\n 'dirtyFields' | 'errors' | 'touchedFields' | 'validatingFields' | 'values'\n >\n >;\n\n shouldFocusError: boolean;\n\n private config: FormParams<TFieldValues, TContext, TTransformedValues>;\n\n // special hack to apply the same form value changes from the original form\n // using subscription\n private forceFormUpdate: boolean;\n\n constructor(config: FormParams<TFieldValues, TContext, TTransformedValues>) {\n this.abortController = new LinkedAbortController(config.abortSignal);\n\n this.shouldFocusError = config.shouldFocusError ?? true;\n this.forceFormUpdate = false;\n\n this.config = {\n ...config,\n defaultValues: {\n ...config.defaultValues,\n } as DefaultValues<TFieldValues>,\n };\n\n Object.defineProperty(this.config, 'shouldFocusError', {\n get() {\n return this.shouldFocusError;\n },\n });\n\n this.originalForm = createFormControl<\n TFieldValues,\n TContext,\n TTransformedValues\n >(this.config as any);\n\n const defaultValues = config.defaultValues\n ? { ...config.defaultValues }\n : ({} as any);\n\n this.setError = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.setError(...args);\n };\n this.clearErrors = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.clearErrors(...args);\n };\n this.trigger = this.originalForm.trigger;\n this.resetField = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.resetField(...args);\n };\n this.unregister = this.originalForm.unregister;\n this.control = this.originalForm.control;\n this.register = this.originalForm.register;\n this.setFocus = this.originalForm.setFocus;\n this.setValue = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.setValue(...args);\n };\n this.getValues = this.originalForm.getValues;\n this.resetForm = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.reset(...args);\n };\n\n this._observableStruct = new DeepObservableStruct({\n values: this.originalForm.getValues(),\n errors: {},\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n });\n\n this.values = this._observableStruct.data.values;\n this.errors = this._observableStruct.data.errors;\n this.validatingFields = this._observableStruct.data.validatingFields;\n this.dirtyFields = this._observableStruct.data.dirtyFields;\n this.touchedFields = this._observableStruct.data.touchedFields;\n\n Object.assign(this, {\n defaultValues,\n });\n\n const subscription = this.originalForm.subscribe({\n formState: {\n values: true,\n errors: true,\n isValid: true,\n isDirty: true,\n isValidating: true,\n dirtyFields: true,\n touchedFields: true,\n validatingFields: true,\n },\n callback: (rawFormState) => {\n if (this.forceFormUpdate || this.config.lazyUpdates === false) {\n this.forceFormUpdate = false;\n this.updateFormState(rawFormState);\n } else {\n this.scheduleUpdateFormState(rawFormState);\n }\n },\n });\n\n observable.ref(this, 'isDirty');\n observable.ref(this, 'isLoading');\n observable.ref(this, 'isSubmitted');\n observable.ref(this, 'isSubmitSuccessful');\n observable.ref(this, 'isSubmitting');\n observable.ref(this, 'isValidating');\n observable.ref(this, 'isValid');\n observable.ref(this, 'disabled');\n observable.ref(this, 'submitCount');\n observable.ref(this, 'isReady');\n observable.deep(this, 'defaultValues');\n computed(this, 'hasErrors');\n action(this, 'updateFormState');\n\n observable.ref(this, 'originalForm');\n action.bound(this, 'submit');\n action.bound(this, 'reset');\n\n makeObservable(this);\n\n this.abortController.signal.addEventListener('abort', () => {\n subscription();\n // @ts-expect-error\n this.originalForm = null;\n });\n }\n\n /**\n * The same as setValue, but will trigger validation if form was submitted, also marks this field as dirty\n * It should work the same as field.onChange from react-hook-form's Controller\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true });\n *\n * ** form submitted **\n *\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true, shouldValidate: true });\n * ```\n */\n changeField = <\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n >(\n name: TFieldName,\n value: FieldPathValue<TFieldValues, TFieldName> | undefined,\n options?: SetValueConfig,\n ) => {\n return this.setValue(name, value as any, {\n shouldDirty: true,\n shouldValidate: this.isSubmitted,\n ...options,\n });\n };\n\n /**\n * Method to manually submit form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onSubmit={form.submit} />\n */\n submit(e?: BaseSyntheticEvent) {\n return new Promise<TTransformedValues>((resolve, reject) => {\n if (this.originalForm) {\n this.originalForm.handleSubmit(\n async (data, event) => {\n if (this.config.strictSubmitChecks) {\n const anyErrorWithPath = this.getErrorsWithPaths(true)[0];\n if (anyErrorWithPath) {\n this.setFocus(anyErrorWithPath.path);\n await this.config.onSubmitFailed?.(this.errors, event);\n reject(this.errors);\n return;\n }\n }\n await this.config.onSubmit?.(data, event);\n resolve(data);\n },\n async (errors, event) => {\n await this.config.onSubmitFailed?.(errors, event);\n reject(errors);\n },\n )(e);\n } else {\n const emptyData = (this.values ?? {}) as unknown as TTransformedValues;\n const result = this.config.onSubmit?.(emptyData);\n if (result instanceof Promise) {\n return result.then(() => resolve(emptyData));\n } else {\n return Promise.resolve(emptyData);\n }\n }\n });\n }\n\n /**\n * Method to manually reset all form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onReset={form.reset} />\n */\n reset(e?: BaseSyntheticEvent) {\n this.resetForm();\n this.config.onReset?.(e);\n }\n\n get hasErrors() {\n return Object.keys(this.errors).length > 0;\n }\n\n getErrorsWithPaths(getOnlyFirst?: boolean): ErrorWithPath<TFieldValues>[] {\n const result: ErrorWithPath<TFieldValues>[] = [];\n\n const traverse = (obj: any, prefix = '') => {\n if (!obj || typeof obj !== 'object') return;\n\n Object.entries(obj).forEach(([key, value]) => {\n const path = (prefix ? `${prefix}.${key}` : key) as any;\n\n if (isFieldError(value)) {\n result.push({ path, error: value });\n if (getOnlyFirst) {\n return;\n }\n } else if (Array.isArray(value)) {\n value.forEach((item, idx) => {\n const arrayPath = `${path}.${idx}` as any;\n\n if (isFieldError(item)) {\n result.push({ path: arrayPath, error: item });\n if (getOnlyFirst) {\n return;\n }\n } else if (typeof item === 'object') {\n traverse(item, arrayPath);\n }\n });\n } else if (typeof value === 'object') {\n traverse(value, path);\n }\n });\n };\n\n traverse(this.errors);\n\n return result;\n }\n\n private updateFormState({\n values,\n errors,\n dirtyFields,\n validatingFields,\n touchedFields,\n ...simpleProperties\n }: Partial<FormFullState<TFieldValues>>) {\n this.stopScheduledFormStateUpdate();\n Object.entries(simpleProperties).forEach(([key, value]) => {\n if (value != null) {\n // @ts-expect-error\n this[key] = value;\n }\n });\n\n this._observableStruct.set({\n dirtyFields,\n errors,\n touchedFields,\n validatingFields,\n values,\n });\n }\n\n protected lastTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n private stopScheduledFormStateUpdate = () => {\n if (this.lastTimeoutId !== undefined) {\n clearTimeout(this.lastTimeoutId);\n this.lastTimeoutId = undefined;\n }\n };\n\n private scheduleUpdateFormState = (\n rawFormState: Partial<FormFullState<TFieldValues>>,\n ) => {\n this.stopScheduledFormStateUpdate();\n this.lastTimeoutId = setTimeout(() => {\n this.updateFormState(rawFormState);\n this.lastTimeoutId = undefined;\n }, this.config.lazyUpdatesTimer ?? 0);\n };\n\n destroy(): void {\n this.abortController.abort();\n this.stopScheduledFormStateUpdate();\n }\n}\n\nexport const createForm = <\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n>(\n config: FormParams<TFieldValues, TContext, TTransformedValues>,\n) => new Form(config);\n\n/**\n * @deprecated ⚠️ use `Form`. This export will be removed in next major release\n */\nexport class MobxForm<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> extends Form<TFieldValues, TContext, TTransformedValues> {}\n","import { Observer } from 'mobx-react-lite';\nimport { Controller as LibController } from 'react-hook-form';\n\nexport const Controller = ((props: any) => (\n <LibController\n {...props}\n render={(renderProps) => (\n <Observer>{() => props.render(renderProps)}</Observer>\n )}\n />\n)) as unknown as typeof LibController;\n"],"names":["isFieldError","value","typeGuard","isObject","Form","values","isDirty","isLoading","isSubmitted","isSubmitSuccessful","isSubmitting","isValidating","isValid","disabled","submitCount","defaultValues","dirtyFields","touchedFields","validatingFields","errors","isReady","setError","clearErrors","trigger","resetField","unregister","control","register","setFocus","setValue","getValues","resetForm","abortController","originalForm","_observableStruct","shouldFocusError","config","forceFormUpdate","constructor","this","LinkedAbortController","abortSignal","Object","defineProperty","get","createFormControl","args","reset","DeepObservableStruct","data","assign","subscription","subscribe","formState","callback","rawFormState","lazyUpdates","updateFormState","scheduleUpdateFormState","observable","ref","deep","computed","action","bound","makeObservable","signal","addEventListener","changeField","name","options","shouldDirty","shouldValidate","submit","e","Promise","resolve","reject","emptyData","result","onSubmit","then","handleSubmit","async","event","strictSubmitChecks","anyErrorWithPath","getErrorsWithPaths","path","onSubmitFailed","onReset","hasErrors","keys","length","getOnlyFirst","traverse","obj","prefix","entries","forEach","key","push","error","Array","isArray","item","idx","arrayPath","simpleProperties","stopScheduledFormStateUpdate","set","lastTimeoutId","clearTimeout","setTimeout","lazyUpdatesTimer","destroy","abort","props","jsx","LibController","render","renderProps","Observer","children"],"mappings":"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"}
package/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
1
  export * from './components/index.js';
2
- export * from './mobx-form/index.js';
2
+ export * from './form/index.js';
3
3
  export * from './utils/index.js';
4
4
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}
package/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import { Observer } from "mobx-react-lite";
3
- import { Controller as Controller$1, createFormControl, set, get } from "react-hook-form";
3
+ import { Controller as Controller$1, createFormControl } from "react-hook-form";
4
4
  import { LinkedAbortController } from "linked-abort-controller";
5
- import { action, isObservableObject, toJS, observable, computed, makeObservable } from "mobx";
5
+ import { observable, computed, action, makeObservable } from "mobx";
6
6
  import { DeepObservableStruct } from "yummies/mobx";
7
7
  import { typeGuard } from "yummies/type-guard";
8
8
  const Controller = ((props) => /* @__PURE__ */ jsx(
@@ -291,9 +291,13 @@ class Form {
291
291
  _observableStruct;
292
292
  shouldFocusError;
293
293
  config;
294
+ // special hack to apply the same form value changes from the original form
295
+ // using subscription
296
+ forceFormUpdate;
294
297
  constructor(config) {
295
298
  this.abortController = new LinkedAbortController(config.abortSignal);
296
299
  this.shouldFocusError = config.shouldFocusError ?? true;
300
+ this.forceFormUpdate = false;
297
301
  this.config = {
298
302
  ...config,
299
303
  defaultValues: {
@@ -307,35 +311,32 @@ class Form {
307
311
  });
308
312
  this.originalForm = createFormControl(this.config);
309
313
  const defaultValues = config.defaultValues ? { ...config.defaultValues } : {};
310
- this.setError = action((...args) => {
311
- set(this.errors, args[0], args[1]);
314
+ this.setError = (...args) => {
315
+ this.forceFormUpdate = true;
312
316
  return this.originalForm.setError(...args);
313
- });
314
- this.clearErrors = this.originalForm.clearErrors;
317
+ };
318
+ this.clearErrors = (...args) => {
319
+ this.forceFormUpdate = true;
320
+ return this.originalForm.clearErrors(...args);
321
+ };
315
322
  this.trigger = this.originalForm.trigger;
316
- this.resetField = action((...args) => {
317
- set(this.values, args[0], get(this.defaultValues, args[0]));
323
+ this.resetField = (...args) => {
324
+ this.forceFormUpdate = true;
318
325
  return this.originalForm.resetField(...args);
319
- });
326
+ };
320
327
  this.unregister = this.originalForm.unregister;
321
328
  this.control = this.originalForm.control;
322
329
  this.register = this.originalForm.register;
323
330
  this.setFocus = this.originalForm.setFocus;
324
- this.setValue = action((...args) => {
325
- set(this.values, args[0], args[1]);
331
+ this.setValue = (...args) => {
332
+ this.forceFormUpdate = true;
326
333
  return this.originalForm.setValue(...args);
327
- });
334
+ };
328
335
  this.getValues = this.originalForm.getValues;
329
- this.resetForm = action((...args) => {
330
- let defaultValues2 = args[0] ?? this.defaultValues;
331
- if (isObservableObject(defaultValues2)) {
332
- defaultValues2 = toJS(defaultValues2);
333
- } else {
334
- defaultValues2 = structuredClone(defaultValues2);
335
- }
336
- this.values = defaultValues2;
336
+ this.resetForm = (...args) => {
337
+ this.forceFormUpdate = true;
337
338
  return this.originalForm.reset(...args);
338
- });
339
+ };
339
340
  this._observableStruct = new DeepObservableStruct({
340
341
  values: this.originalForm.getValues(),
341
342
  errors: {},
@@ -363,7 +364,8 @@ class Form {
363
364
  validatingFields: true
364
365
  },
365
366
  callback: (rawFormState) => {
366
- if (this.config.lazyUpdates === false) {
367
+ if (this.forceFormUpdate || this.config.lazyUpdates === false) {
368
+ this.forceFormUpdate = false;
367
369
  this.updateFormState(rawFormState);
368
370
  } else {
369
371
  this.scheduleUpdateFormState(rawFormState);
@@ -415,7 +417,7 @@ class Form {
415
417
  * ```
416
418
  */
417
419
  changeField = (name, value, options) => {
418
- this.setValue(name, value, {
420
+ return this.setValue(name, value, {
419
421
  shouldDirty: true,
420
422
  shouldValidate: this.isSubmitted,
421
423
  ...options
@@ -516,6 +518,7 @@ class Form {
516
518
  touchedFields,
517
519
  ...simpleProperties
518
520
  }) {
521
+ this.stopScheduledFormStateUpdate();
519
522
  Object.entries(simpleProperties).forEach(([key, value]) => {
520
523
  if (value != null) {
521
524
  this[key] = value;
@@ -548,12 +551,14 @@ class Form {
548
551
  this.stopScheduledFormStateUpdate();
549
552
  }
550
553
  }
554
+ const createForm = (config) => new Form(config);
551
555
  class MobxForm extends Form {
552
556
  }
553
557
  export {
554
558
  Controller,
555
559
  Form,
556
560
  MobxForm,
561
+ createForm,
557
562
  isFieldError
558
563
  };
559
564
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/controller.tsx","../src/utils/is-field-error.ts","../src/mobx-form/mobx-form.ts"],"sourcesContent":["import { Observer } from 'mobx-react-lite';\nimport { Controller as LibController } from 'react-hook-form';\n\nexport const Controller = ((props: any) => (\n <LibController\n {...props}\n render={(renderProps) => (\n <Observer>{() => props.render(renderProps)}</Observer>\n )}\n />\n)) as unknown as typeof LibController;\n","import type { FieldError } from 'react-hook-form';\nimport { typeGuard } from 'yummies/type-guard';\n\nexport const isFieldError = (value: unknown): value is FieldError => {\n return typeGuard.isObject(value) && 'type' in value;\n};\n","import { LinkedAbortController } from 'linked-abort-controller';\nimport {\n action,\n computed,\n isObservableObject,\n makeObservable,\n observable,\n toJS,\n} from 'mobx';\nimport type { BaseSyntheticEvent } from 'react';\nimport {\n type Control,\n createFormControl,\n type DeepMap,\n type DeepPartial,\n type DefaultValues,\n type FieldErrors,\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type FormState,\n get,\n type SetValueConfig,\n set,\n type UseFormClearErrors,\n type UseFormGetValues,\n type UseFormRegister,\n type UseFormReset,\n type UseFormResetField,\n type UseFormSetError,\n type UseFormSetFocus,\n type UseFormSetValue,\n type UseFormTrigger,\n type UseFormUnregister,\n} from 'react-hook-form';\nimport { DeepObservableStruct } from 'yummies/mobx';\nimport { isFieldError } from '../utils/index.js';\nimport type { ErrorWithPath, FormParams } from './mobx-form.types.js';\n\ntype FormFullState<TFieldValues extends FieldValues> =\n FormState<TFieldValues> & {\n values: TFieldValues;\n };\n\nexport class Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> implements FormFullState<TFieldValues>\n{\n values: TFieldValues;\n isDirty: boolean = false;\n isLoading: boolean = false;\n isSubmitted: boolean = false;\n isSubmitSuccessful: boolean = false;\n isSubmitting: boolean = false;\n isValidating: boolean = false;\n isValid: boolean = false;\n disabled: boolean = false;\n submitCount: number = 0;\n /**\n * If you want to change this property\n * Use {resetForm} method\n */\n defaultValues!: Readonly<DefaultValues<TFieldValues>>;\n dirtyFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n touchedFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n validatingFields: Partial<\n Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>\n >;\n errors: FieldErrors<TFieldValues>;\n isReady: boolean = false;\n\n /**\n * Set an error for the field. When set an error which is not associated to a field then manual `clearErrors` invoke is required.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/seterror) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-seterror-nfxxu) • [Video](https://www.youtube.com/watch?v=raMqvE0YyIY)\n *\n * @param name - the path name to the form field value.\n * @param error - an error object which contains type and optional message\n * @param options - whether or not to focus on the field\n *\n * @example\n * ```tsx\n * // when the error is not associated with any fields, `clearError` will need to invoke to clear the error\n * const onSubmit = () => setError(\"serverError\", { type: \"server\", message: \"Error occurred\"})\n *\n * <button onClick={() => setError(\"name\", { type: \"min\" })} />\n *\n * // focus on the input after setting the error\n * <button onClick={() => setError(\"name\", { type: \"max\" }, { shouldFocus: true })} />\n * ```\n */\n setError: UseFormSetError<TFieldValues>;\n\n /**\n * Clear the entire form errors.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/clearerrors) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-clearerrors-w3ymx)\n *\n * @param name - the path name to the form field value.\n *\n * @example\n * Clear all errors\n * ```tsx\n * clearErrors(); // clear the entire form error\n * clearErrors([\"name\", \"name1\"]) // clear an array of fields' error\n * clearErrors(\"name2\"); // clear a single field error\n * ```\n */\n clearErrors: UseFormClearErrors<TFieldValues>;\n\n /**\n * Trigger field or form validation\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/trigger) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-triggervalidation-forked-xs7hl) • [Video](https://www.youtube.com/watch?v=-bcyJCDjksE)\n *\n * @param name - provide empty argument will trigger the entire form validation, an array of field names will validate an array of fields, and a single field name will only trigger that field's validation.\n * @param options - should focus on the error field\n *\n * @returns validation result\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * trigger();\n * }, [trigger])\n *\n * <button onClick={async () => {\n * const result = await trigger(); // result will be a boolean value\n * }}>\n * trigger\n * </button>\n * ```\n */\n trigger: UseFormTrigger<TFieldValues>;\n\n /**\n * Reset a field state and reference.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/resetfield) • [Demo](https://codesandbox.io/s/priceless-firefly-d0kuv) • [Video](https://www.youtube.com/watch?v=IdLFcNaEFEo)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * <input {...register(\"firstName\", { required: true })} />\n * <button type=\"button\" onClick={() => resetField(\"firstName\"))}>Reset</button>\n * ```\n */\n resetField: UseFormResetField<TFieldValues>;\n\n /**\n * Unregister a field reference and remove its value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/unregister) • [Demo](https://codesandbox.io/s/react-hook-form-unregister-4k2ey) • [Video](https://www.youtube.com/watch?v=TM99g_NW5Gk&feature=emb_imp_woyt)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * register(\"name\", { required: true })\n *\n * <button onClick={() => unregister(\"name\")} />\n * // there are various keep options to retain formState\n * <button onClick={() => unregister(\"name\", { keepErrors: true })} />\n * ```\n */\n unregister: UseFormUnregister<TFieldValues>;\n\n /**\n * Form control\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/control)\n *\n */\n control: Control<TFieldValues, TContext, TTransformedValues>;\n\n /**\n * Register field into hook form with or without the actual DOM ref. You can invoke register anywhere in the component including at `useEffect`.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/register) • [Demo](https://codesandbox.io/s/react-hook-form-register-ts-ip2j3) • [Video](https://www.youtube.com/watch?v=JFIpCoajYkA)\n *\n * @param name - the path name to the form field value, name is required and unique\n * @param options - register options include validation, disabled, unregister, value as and dependent validation\n *\n * @returns onChange, onBlur, name, ref, and native contribute attribute if browser validation is enabled.\n *\n * @example\n * ```tsx\n * // Register HTML native input\n * <input {...register(\"input\")} />\n * <select {...register(\"select\")} />\n *\n * // Register options\n * <textarea {...register(\"textarea\", { required: \"This is required.\", maxLength: 20 })} />\n * <input type=\"number\" {...register(\"name2\", { valueAsNumber: true })} />\n * <input {...register(\"name3\", { deps: [\"name2\"] })} />\n *\n * // Register custom field at useEffect\n * useEffect(() => {\n * register(\"name4\");\n * register(\"name5\", { value: \"hiddenValue\" });\n * }, [register])\n *\n * // Register without ref\n * const { onChange, onBlur, name } = register(\"name6\")\n * <input onChange={onChange} onBlur={onBlur} name={name} />\n * ```\n */\n register: UseFormRegister<TFieldValues>;\n\n /**\n * Set focus on a registered field. You can start to invoke this method after all fields are mounted to the DOM.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setfocus) • [Demo](https://codesandbox.io/s/setfocus-rolus)\n *\n * @param name - the path name to the form field value.\n * @param options - input focus behavior options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * setFocus(\"name\");\n * }, [setFocus])\n * // shouldSelect allows to select input's content on focus\n * <button onClick={() => setFocus(\"name\", { shouldSelect: true })}>Focus</button>\n * ```\n */\n setFocus: UseFormSetFocus<TFieldValues>;\n\n /**\n * Set a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setvalue) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-setvalue-8z9hx) • [Video](https://www.youtube.com/watch?v=qpv51sCH3fI)\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * setValue('name', 'value', {\n * shouldValidate: true, // trigger validation\n * shouldTouch: true, // update touched fields form state\n * shouldDirty: true, // update dirty and dirty fields form state\n * });\n *\n * // Update a group fields\n * setValue('root', {\n * a: 'test', // setValue('root.a', 'data')\n * b: 'test1', // setValue('root.b', 'data')\n * });\n *\n * // Update a nested object field\n * setValue('select', { label: 'test', value: 'Test' });\n * ```\n */\n setValue: UseFormSetValue<TFieldValues>;\n\n /**\n * Get a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/getvalues) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-getvalues-txsfg)\n *\n * @param fieldNames - the path name to the form field value.\n * @param options - returns only dirty fields or return only touchedFields\n *\n * @example\n * ```tsx\n * // Update a single field\n * getValues('name', 'value', {\n * dirtyFields: true, // returns only dirty fields\n * touchedFields: true, // returns only touchedFields\n * });\n *\n * // Get nested values\n * getValues('root.nested.0.value');\n * ```\n */\n getValues: UseFormGetValues<TFieldValues>;\n\n /**\n * Reset at the entire form state.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/reset) • [Demo](https://codesandbox.io/s/react-hook-form-reset-v7-ts-pu901) • [Video](https://www.youtube.com/watch?v=qmCLBjyPwVk)\n *\n * @param values - the entire form values to be reset\n * @param keepStateOptions - keep form state options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * // reset the entire form after component mount or form defaultValues is ready\n * reset({\n * fieldA: \"test\"\n * fieldB: \"test\"\n * });\n * }, [reset])\n *\n * // reset by combine with existing form values\n * reset({\n * ...getValues(),\n * fieldB: \"test\"\n *});\n *\n * // reset and keep form state\n * reset({\n * ...getValues(),\n *}, {\n * keepErrors: true,\n * keepDirty: true\n *});\n * ```\n */\n resetForm: UseFormReset<TFieldValues>;\n\n protected abortController: AbortController;\n\n /**\n * Original react-hook-form form\n */\n originalForm: ReturnType<\n typeof createFormControl<TFieldValues, TContext, TTransformedValues>\n >;\n\n private _observableStruct: DeepObservableStruct<\n Pick<\n FormFullState<TFieldValues>,\n 'dirtyFields' | 'errors' | 'touchedFields' | 'validatingFields' | 'values'\n >\n >;\n\n shouldFocusError: boolean;\n\n private config: FormParams<TFieldValues, TContext, TTransformedValues>;\n\n constructor(config: FormParams<TFieldValues, TContext, TTransformedValues>) {\n this.abortController = new LinkedAbortController(config.abortSignal);\n\n this.shouldFocusError = config.shouldFocusError ?? true;\n\n this.config = {\n ...config,\n defaultValues: {\n ...config.defaultValues,\n } as DefaultValues<TFieldValues>,\n };\n\n Object.defineProperty(this.config, 'shouldFocusError', {\n get() {\n return this.shouldFocusError;\n },\n });\n\n this.originalForm = createFormControl<\n TFieldValues,\n TContext,\n TTransformedValues\n >(this.config as any);\n\n const defaultValues = config.defaultValues\n ? { ...config.defaultValues }\n : ({} as any);\n\n this.setError = action((...args) => {\n set(this.errors, args[0], args[1]);\n return this.originalForm.setError(...args);\n });\n this.clearErrors = this.originalForm.clearErrors;\n this.trigger = this.originalForm.trigger;\n this.resetField = action((...args) => {\n set(this.values, args[0], get(this.defaultValues, args[0]));\n return this.originalForm.resetField(...args);\n });\n this.unregister = this.originalForm.unregister;\n this.control = this.originalForm.control;\n this.register = this.originalForm.register;\n this.setFocus = this.originalForm.setFocus;\n this.setValue = action((...args) => {\n set(this.values, args[0], args[1]);\n return this.originalForm.setValue(...args);\n });\n this.getValues = this.originalForm.getValues;\n this.resetForm = action((...args) => {\n let defaultValues = args[0] ?? this.defaultValues;\n\n if (isObservableObject(defaultValues)) {\n defaultValues = toJS(defaultValues);\n } else {\n defaultValues = structuredClone(defaultValues);\n }\n\n // @ts-expect-error\n this.values = defaultValues;\n return this.originalForm.reset(...args);\n });\n\n this._observableStruct = new DeepObservableStruct({\n values: this.originalForm.getValues(),\n errors: {},\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n });\n\n this.values = this._observableStruct.data.values;\n this.errors = this._observableStruct.data.errors;\n this.validatingFields = this._observableStruct.data.validatingFields;\n this.dirtyFields = this._observableStruct.data.dirtyFields;\n this.touchedFields = this._observableStruct.data.touchedFields;\n\n Object.assign(this, {\n defaultValues,\n });\n\n const subscription = this.originalForm.subscribe({\n formState: {\n values: true,\n errors: true,\n isValid: true,\n isDirty: true,\n isValidating: true,\n dirtyFields: true,\n touchedFields: true,\n validatingFields: true,\n },\n callback: (rawFormState) => {\n if (this.config.lazyUpdates === false) {\n this.updateFormState(rawFormState);\n } else {\n this.scheduleUpdateFormState(rawFormState);\n }\n },\n });\n\n observable.ref(this, 'isDirty');\n observable.ref(this, 'isLoading');\n observable.ref(this, 'isSubmitted');\n observable.ref(this, 'isSubmitSuccessful');\n observable.ref(this, 'isSubmitting');\n observable.ref(this, 'isValidating');\n observable.ref(this, 'isValid');\n observable.ref(this, 'disabled');\n observable.ref(this, 'submitCount');\n observable.ref(this, 'isReady');\n observable.deep(this, 'defaultValues');\n computed(this, 'hasErrors');\n action(this, 'updateFormState');\n\n observable.ref(this, 'originalForm');\n action.bound(this, 'submit');\n action.bound(this, 'reset');\n\n makeObservable(this);\n\n this.abortController.signal.addEventListener('abort', () => {\n subscription();\n // @ts-expect-error\n this.originalForm = null;\n });\n }\n\n /**\n * The same as setValue, but will trigger validation if form was submitted, also marks this field as dirty\n * It should work the same as field.onChange from react-hook-form's Controller\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true });\n *\n * ** form submitted **\n *\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true, shouldValidate: true });\n * ```\n */\n changeField = <\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n >(\n name: TFieldName,\n value: FieldPathValue<TFieldValues, TFieldName> | undefined,\n options?: SetValueConfig,\n ) => {\n this.setValue(name, value as any, {\n shouldDirty: true,\n shouldValidate: this.isSubmitted,\n ...options,\n });\n };\n\n /**\n * Method to manually submit form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onSubmit={form.submit} />\n */\n submit(e?: BaseSyntheticEvent) {\n return new Promise<TTransformedValues>((resolve, reject) => {\n if (this.originalForm) {\n this.originalForm.handleSubmit(\n async (data, event) => {\n if (this.config.strictSubmitChecks) {\n const anyErrorWithPath = this.getErrorsWithPaths(true)[0];\n if (anyErrorWithPath) {\n this.setFocus(anyErrorWithPath.path);\n await this.config.onSubmitFailed?.(this.errors, event);\n reject(this.errors);\n return;\n }\n }\n await this.config.onSubmit?.(data, event);\n resolve(data);\n },\n async (errors, event) => {\n await this.config.onSubmitFailed?.(errors, event);\n reject(errors);\n },\n )(e);\n } else {\n const emptyData = (this.values ?? {}) as unknown as TTransformedValues;\n const result = this.config.onSubmit?.(emptyData);\n if (result instanceof Promise) {\n return result.then(() => resolve(emptyData));\n } else {\n return Promise.resolve(emptyData);\n }\n }\n });\n }\n\n /**\n * Method to manually reset all form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onReset={form.reset} />\n */\n reset(e?: BaseSyntheticEvent) {\n this.resetForm();\n this.config.onReset?.(e);\n }\n\n get hasErrors() {\n return Object.keys(this.errors).length > 0;\n }\n\n getErrorsWithPaths(getOnlyFirst?: boolean): ErrorWithPath<TFieldValues>[] {\n const result: ErrorWithPath<TFieldValues>[] = [];\n\n const traverse = (obj: any, prefix = '') => {\n if (!obj || typeof obj !== 'object') return;\n\n Object.entries(obj).forEach(([key, value]) => {\n const path = (prefix ? `${prefix}.${key}` : key) as any;\n\n if (isFieldError(value)) {\n result.push({ path, error: value });\n if (getOnlyFirst) {\n return;\n }\n } else if (Array.isArray(value)) {\n value.forEach((item, idx) => {\n const arrayPath = `${path}.${idx}` as any;\n\n if (isFieldError(item)) {\n result.push({ path: arrayPath, error: item });\n if (getOnlyFirst) {\n return;\n }\n } else if (typeof item === 'object') {\n traverse(item, arrayPath);\n }\n });\n } else if (typeof value === 'object') {\n traverse(value, path);\n }\n });\n };\n\n traverse(this.errors);\n\n return result;\n }\n\n private updateFormState({\n values,\n errors,\n dirtyFields,\n validatingFields,\n touchedFields,\n ...simpleProperties\n }: Partial<FormFullState<TFieldValues>>) {\n Object.entries(simpleProperties).forEach(([key, value]) => {\n if (value != null) {\n // @ts-expect-error\n this[key] = value;\n }\n });\n\n this._observableStruct.set({\n dirtyFields,\n errors,\n touchedFields,\n validatingFields,\n values,\n });\n }\n\n protected lastTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n private stopScheduledFormStateUpdate = () => {\n if (this.lastTimeoutId !== undefined) {\n clearTimeout(this.lastTimeoutId);\n this.lastTimeoutId = undefined;\n }\n };\n\n private scheduleUpdateFormState = (\n rawFormState: Partial<FormFullState<TFieldValues>>,\n ) => {\n this.stopScheduledFormStateUpdate();\n this.lastTimeoutId = setTimeout(() => {\n this.updateFormState(rawFormState);\n this.lastTimeoutId = undefined;\n }, this.config.lazyUpdatesTimer ?? 0);\n };\n\n destroy(): void {\n this.abortController.abort();\n this.stopScheduledFormStateUpdate();\n }\n}\n\n/**\n * @deprecated ⚠️ use `Form`. This export will be removed in next major release\n */\nexport class MobxForm<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> extends Form<TFieldValues, TContext, TTransformedValues> {}\n"],"names":["LibController","defaultValues"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/controller.tsx","../src/utils/is-field-error.ts","../src/form/form.ts"],"sourcesContent":["import { Observer } from 'mobx-react-lite';\nimport { Controller as LibController } from 'react-hook-form';\n\nexport const Controller = ((props: any) => (\n <LibController\n {...props}\n render={(renderProps) => (\n <Observer>{() => props.render(renderProps)}</Observer>\n )}\n />\n)) as unknown as typeof LibController;\n","import type { FieldError } from 'react-hook-form';\nimport { typeGuard } from 'yummies/type-guard';\n\nexport const isFieldError = (value: unknown): value is FieldError => {\n return typeGuard.isObject(value) && 'type' in value;\n};\n","import { LinkedAbortController } from 'linked-abort-controller';\nimport { action, computed, makeObservable, observable } from 'mobx';\nimport type { BaseSyntheticEvent } from 'react';\nimport {\n type Control,\n createFormControl,\n type DeepMap,\n type DeepPartial,\n type DefaultValues,\n type FieldErrors,\n type FieldPath,\n type FieldPathValue,\n type FieldValues,\n type FormState,\n type SetValueConfig,\n type UseFormClearErrors,\n type UseFormGetValues,\n type UseFormRegister,\n type UseFormReset,\n type UseFormResetField,\n type UseFormSetError,\n type UseFormSetFocus,\n type UseFormSetValue,\n type UseFormTrigger,\n type UseFormUnregister,\n} from 'react-hook-form';\nimport { DeepObservableStruct } from 'yummies/mobx';\nimport { isFieldError } from '../utils/index.js';\nimport type { ErrorWithPath, FormParams } from './form.types.js';\n\ntype FormFullState<TFieldValues extends FieldValues> =\n FormState<TFieldValues> & {\n values: TFieldValues;\n };\n\nexport class Form<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> implements FormFullState<TFieldValues>\n{\n values: TFieldValues;\n isDirty: boolean = false;\n isLoading: boolean = false;\n isSubmitted: boolean = false;\n isSubmitSuccessful: boolean = false;\n isSubmitting: boolean = false;\n isValidating: boolean = false;\n isValid: boolean = false;\n disabled: boolean = false;\n submitCount: number = 0;\n /**\n * If you want to change this property\n * Use {resetForm} method\n */\n defaultValues!: Readonly<DefaultValues<TFieldValues>>;\n dirtyFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n touchedFields: Partial<Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>>;\n validatingFields: Partial<\n Readonly<DeepMap<DeepPartial<TFieldValues>, boolean>>\n >;\n errors: FieldErrors<TFieldValues>;\n isReady: boolean = false;\n\n /**\n * Set an error for the field. When set an error which is not associated to a field then manual `clearErrors` invoke is required.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/seterror) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-seterror-nfxxu) • [Video](https://www.youtube.com/watch?v=raMqvE0YyIY)\n *\n * @param name - the path name to the form field value.\n * @param error - an error object which contains type and optional message\n * @param options - whether or not to focus on the field\n *\n * @example\n * ```tsx\n * // when the error is not associated with any fields, `clearError` will need to invoke to clear the error\n * const onSubmit = () => setError(\"serverError\", { type: \"server\", message: \"Error occurred\"})\n *\n * <button onClick={() => setError(\"name\", { type: \"min\" })} />\n *\n * // focus on the input after setting the error\n * <button onClick={() => setError(\"name\", { type: \"max\" }, { shouldFocus: true })} />\n * ```\n */\n setError: UseFormSetError<TFieldValues>;\n\n /**\n * Clear the entire form errors.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/clearerrors) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-clearerrors-w3ymx)\n *\n * @param name - the path name to the form field value.\n *\n * @example\n * Clear all errors\n * ```tsx\n * clearErrors(); // clear the entire form error\n * clearErrors([\"name\", \"name1\"]) // clear an array of fields' error\n * clearErrors(\"name2\"); // clear a single field error\n * ```\n */\n clearErrors: UseFormClearErrors<TFieldValues>;\n\n /**\n * Trigger field or form validation\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/trigger) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-triggervalidation-forked-xs7hl) • [Video](https://www.youtube.com/watch?v=-bcyJCDjksE)\n *\n * @param name - provide empty argument will trigger the entire form validation, an array of field names will validate an array of fields, and a single field name will only trigger that field's validation.\n * @param options - should focus on the error field\n *\n * @returns validation result\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * trigger();\n * }, [trigger])\n *\n * <button onClick={async () => {\n * const result = await trigger(); // result will be a boolean value\n * }}>\n * trigger\n * </button>\n * ```\n */\n trigger: UseFormTrigger<TFieldValues>;\n\n /**\n * Reset a field state and reference.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/resetfield) • [Demo](https://codesandbox.io/s/priceless-firefly-d0kuv) • [Video](https://www.youtube.com/watch?v=IdLFcNaEFEo)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * <input {...register(\"firstName\", { required: true })} />\n * <button type=\"button\" onClick={() => resetField(\"firstName\"))}>Reset</button>\n * ```\n */\n resetField: UseFormResetField<TFieldValues>;\n\n /**\n * Unregister a field reference and remove its value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/unregister) • [Demo](https://codesandbox.io/s/react-hook-form-unregister-4k2ey) • [Video](https://www.youtube.com/watch?v=TM99g_NW5Gk&feature=emb_imp_woyt)\n *\n * @param name - the path name to the form field value.\n * @param options - keep form state options\n *\n * @example\n * ```tsx\n * register(\"name\", { required: true })\n *\n * <button onClick={() => unregister(\"name\")} />\n * // there are various keep options to retain formState\n * <button onClick={() => unregister(\"name\", { keepErrors: true })} />\n * ```\n */\n unregister: UseFormUnregister<TFieldValues>;\n\n /**\n * Form control\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/control)\n *\n */\n control: Control<TFieldValues, TContext, TTransformedValues>;\n\n /**\n * Register field into hook form with or without the actual DOM ref. You can invoke register anywhere in the component including at `useEffect`.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/register) • [Demo](https://codesandbox.io/s/react-hook-form-register-ts-ip2j3) • [Video](https://www.youtube.com/watch?v=JFIpCoajYkA)\n *\n * @param name - the path name to the form field value, name is required and unique\n * @param options - register options include validation, disabled, unregister, value as and dependent validation\n *\n * @returns onChange, onBlur, name, ref, and native contribute attribute if browser validation is enabled.\n *\n * @example\n * ```tsx\n * // Register HTML native input\n * <input {...register(\"input\")} />\n * <select {...register(\"select\")} />\n *\n * // Register options\n * <textarea {...register(\"textarea\", { required: \"This is required.\", maxLength: 20 })} />\n * <input type=\"number\" {...register(\"name2\", { valueAsNumber: true })} />\n * <input {...register(\"name3\", { deps: [\"name2\"] })} />\n *\n * // Register custom field at useEffect\n * useEffect(() => {\n * register(\"name4\");\n * register(\"name5\", { value: \"hiddenValue\" });\n * }, [register])\n *\n * // Register without ref\n * const { onChange, onBlur, name } = register(\"name6\")\n * <input onChange={onChange} onBlur={onBlur} name={name} />\n * ```\n */\n register: UseFormRegister<TFieldValues>;\n\n /**\n * Set focus on a registered field. You can start to invoke this method after all fields are mounted to the DOM.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setfocus) • [Demo](https://codesandbox.io/s/setfocus-rolus)\n *\n * @param name - the path name to the form field value.\n * @param options - input focus behavior options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * setFocus(\"name\");\n * }, [setFocus])\n * // shouldSelect allows to select input's content on focus\n * <button onClick={() => setFocus(\"name\", { shouldSelect: true })}>Focus</button>\n * ```\n */\n setFocus: UseFormSetFocus<TFieldValues>;\n\n /**\n * Set a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/setvalue) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-setvalue-8z9hx) • [Video](https://www.youtube.com/watch?v=qpv51sCH3fI)\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * setValue('name', 'value', {\n * shouldValidate: true, // trigger validation\n * shouldTouch: true, // update touched fields form state\n * shouldDirty: true, // update dirty and dirty fields form state\n * });\n *\n * // Update a group fields\n * setValue('root', {\n * a: 'test', // setValue('root.a', 'data')\n * b: 'test1', // setValue('root.b', 'data')\n * });\n *\n * // Update a nested object field\n * setValue('select', { label: 'test', value: 'Test' });\n * ```\n */\n setValue: UseFormSetValue<TFieldValues>;\n\n /**\n * Get a single field value, or a group of fields value.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/getvalues) • [Demo](https://codesandbox.io/s/react-hook-form-v7-ts-getvalues-txsfg)\n *\n * @param fieldNames - the path name to the form field value.\n * @param options - returns only dirty fields or return only touchedFields\n *\n * @example\n * ```tsx\n * // Update a single field\n * getValues('name', 'value', {\n * dirtyFields: true, // returns only dirty fields\n * touchedFields: true, // returns only touchedFields\n * });\n *\n * // Get nested values\n * getValues('root.nested.0.value');\n * ```\n */\n getValues: UseFormGetValues<TFieldValues>;\n\n /**\n * Reset at the entire form state.\n *\n * @remarks\n * [API](https://react-hook-form.com/docs/useform/reset) • [Demo](https://codesandbox.io/s/react-hook-form-reset-v7-ts-pu901) • [Video](https://www.youtube.com/watch?v=qmCLBjyPwVk)\n *\n * @param values - the entire form values to be reset\n * @param keepStateOptions - keep form state options\n *\n * @example\n * ```tsx\n * useEffect(() => {\n * // reset the entire form after component mount or form defaultValues is ready\n * reset({\n * fieldA: \"test\"\n * fieldB: \"test\"\n * });\n * }, [reset])\n *\n * // reset by combine with existing form values\n * reset({\n * ...getValues(),\n * fieldB: \"test\"\n *});\n *\n * // reset and keep form state\n * reset({\n * ...getValues(),\n *}, {\n * keepErrors: true,\n * keepDirty: true\n *});\n * ```\n */\n resetForm: UseFormReset<TFieldValues>;\n\n protected abortController: AbortController;\n\n /**\n * Original react-hook-form form\n */\n originalForm: ReturnType<\n typeof createFormControl<TFieldValues, TContext, TTransformedValues>\n >;\n\n private _observableStruct: DeepObservableStruct<\n Pick<\n FormFullState<TFieldValues>,\n 'dirtyFields' | 'errors' | 'touchedFields' | 'validatingFields' | 'values'\n >\n >;\n\n shouldFocusError: boolean;\n\n private config: FormParams<TFieldValues, TContext, TTransformedValues>;\n\n // special hack to apply the same form value changes from the original form\n // using subscription\n private forceFormUpdate: boolean;\n\n constructor(config: FormParams<TFieldValues, TContext, TTransformedValues>) {\n this.abortController = new LinkedAbortController(config.abortSignal);\n\n this.shouldFocusError = config.shouldFocusError ?? true;\n this.forceFormUpdate = false;\n\n this.config = {\n ...config,\n defaultValues: {\n ...config.defaultValues,\n } as DefaultValues<TFieldValues>,\n };\n\n Object.defineProperty(this.config, 'shouldFocusError', {\n get() {\n return this.shouldFocusError;\n },\n });\n\n this.originalForm = createFormControl<\n TFieldValues,\n TContext,\n TTransformedValues\n >(this.config as any);\n\n const defaultValues = config.defaultValues\n ? { ...config.defaultValues }\n : ({} as any);\n\n this.setError = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.setError(...args);\n };\n this.clearErrors = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.clearErrors(...args);\n };\n this.trigger = this.originalForm.trigger;\n this.resetField = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.resetField(...args);\n };\n this.unregister = this.originalForm.unregister;\n this.control = this.originalForm.control;\n this.register = this.originalForm.register;\n this.setFocus = this.originalForm.setFocus;\n this.setValue = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.setValue(...args);\n };\n this.getValues = this.originalForm.getValues;\n this.resetForm = (...args) => {\n this.forceFormUpdate = true;\n return this.originalForm.reset(...args);\n };\n\n this._observableStruct = new DeepObservableStruct({\n values: this.originalForm.getValues(),\n errors: {},\n dirtyFields: {},\n touchedFields: {},\n validatingFields: {},\n });\n\n this.values = this._observableStruct.data.values;\n this.errors = this._observableStruct.data.errors;\n this.validatingFields = this._observableStruct.data.validatingFields;\n this.dirtyFields = this._observableStruct.data.dirtyFields;\n this.touchedFields = this._observableStruct.data.touchedFields;\n\n Object.assign(this, {\n defaultValues,\n });\n\n const subscription = this.originalForm.subscribe({\n formState: {\n values: true,\n errors: true,\n isValid: true,\n isDirty: true,\n isValidating: true,\n dirtyFields: true,\n touchedFields: true,\n validatingFields: true,\n },\n callback: (rawFormState) => {\n if (this.forceFormUpdate || this.config.lazyUpdates === false) {\n this.forceFormUpdate = false;\n this.updateFormState(rawFormState);\n } else {\n this.scheduleUpdateFormState(rawFormState);\n }\n },\n });\n\n observable.ref(this, 'isDirty');\n observable.ref(this, 'isLoading');\n observable.ref(this, 'isSubmitted');\n observable.ref(this, 'isSubmitSuccessful');\n observable.ref(this, 'isSubmitting');\n observable.ref(this, 'isValidating');\n observable.ref(this, 'isValid');\n observable.ref(this, 'disabled');\n observable.ref(this, 'submitCount');\n observable.ref(this, 'isReady');\n observable.deep(this, 'defaultValues');\n computed(this, 'hasErrors');\n action(this, 'updateFormState');\n\n observable.ref(this, 'originalForm');\n action.bound(this, 'submit');\n action.bound(this, 'reset');\n\n makeObservable(this);\n\n this.abortController.signal.addEventListener('abort', () => {\n subscription();\n // @ts-expect-error\n this.originalForm = null;\n });\n }\n\n /**\n * The same as setValue, but will trigger validation if form was submitted, also marks this field as dirty\n * It should work the same as field.onChange from react-hook-form's Controller\n *\n * @param name - the path name to the form field value.\n * @param value - field value\n * @param options - should validate or update form state\n *\n * @example\n * ```tsx\n * // Update a single field\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true });\n *\n * ** form submitted **\n *\n * changeField('name', 'value');\n * ->\n * setValue('name', 'value', { shouldDirty: true, shouldValidate: true });\n * ```\n */\n changeField = <\n TFieldName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,\n >(\n name: TFieldName,\n value: FieldPathValue<TFieldValues, TFieldName> | undefined,\n options?: SetValueConfig,\n ) => {\n return this.setValue(name, value as any, {\n shouldDirty: true,\n shouldValidate: this.isSubmitted,\n ...options,\n });\n };\n\n /**\n * Method to manually submit form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onSubmit={form.submit} />\n */\n submit(e?: BaseSyntheticEvent) {\n return new Promise<TTransformedValues>((resolve, reject) => {\n if (this.originalForm) {\n this.originalForm.handleSubmit(\n async (data, event) => {\n if (this.config.strictSubmitChecks) {\n const anyErrorWithPath = this.getErrorsWithPaths(true)[0];\n if (anyErrorWithPath) {\n this.setFocus(anyErrorWithPath.path);\n await this.config.onSubmitFailed?.(this.errors, event);\n reject(this.errors);\n return;\n }\n }\n await this.config.onSubmit?.(data, event);\n resolve(data);\n },\n async (errors, event) => {\n await this.config.onSubmitFailed?.(errors, event);\n reject(errors);\n },\n )(e);\n } else {\n const emptyData = (this.values ?? {}) as unknown as TTransformedValues;\n const result = this.config.onSubmit?.(emptyData);\n if (result instanceof Promise) {\n return result.then(() => resolve(emptyData));\n } else {\n return Promise.resolve(emptyData);\n }\n }\n });\n }\n\n /**\n * Method to manually reset all form.\n * Used to attach this method to <form /> element\n *\n * @example\n *\n * <form onReset={form.reset} />\n */\n reset(e?: BaseSyntheticEvent) {\n this.resetForm();\n this.config.onReset?.(e);\n }\n\n get hasErrors() {\n return Object.keys(this.errors).length > 0;\n }\n\n getErrorsWithPaths(getOnlyFirst?: boolean): ErrorWithPath<TFieldValues>[] {\n const result: ErrorWithPath<TFieldValues>[] = [];\n\n const traverse = (obj: any, prefix = '') => {\n if (!obj || typeof obj !== 'object') return;\n\n Object.entries(obj).forEach(([key, value]) => {\n const path = (prefix ? `${prefix}.${key}` : key) as any;\n\n if (isFieldError(value)) {\n result.push({ path, error: value });\n if (getOnlyFirst) {\n return;\n }\n } else if (Array.isArray(value)) {\n value.forEach((item, idx) => {\n const arrayPath = `${path}.${idx}` as any;\n\n if (isFieldError(item)) {\n result.push({ path: arrayPath, error: item });\n if (getOnlyFirst) {\n return;\n }\n } else if (typeof item === 'object') {\n traverse(item, arrayPath);\n }\n });\n } else if (typeof value === 'object') {\n traverse(value, path);\n }\n });\n };\n\n traverse(this.errors);\n\n return result;\n }\n\n private updateFormState({\n values,\n errors,\n dirtyFields,\n validatingFields,\n touchedFields,\n ...simpleProperties\n }: Partial<FormFullState<TFieldValues>>) {\n this.stopScheduledFormStateUpdate();\n Object.entries(simpleProperties).forEach(([key, value]) => {\n if (value != null) {\n // @ts-expect-error\n this[key] = value;\n }\n });\n\n this._observableStruct.set({\n dirtyFields,\n errors,\n touchedFields,\n validatingFields,\n values,\n });\n }\n\n protected lastTimeoutId: ReturnType<typeof setTimeout> | undefined;\n\n private stopScheduledFormStateUpdate = () => {\n if (this.lastTimeoutId !== undefined) {\n clearTimeout(this.lastTimeoutId);\n this.lastTimeoutId = undefined;\n }\n };\n\n private scheduleUpdateFormState = (\n rawFormState: Partial<FormFullState<TFieldValues>>,\n ) => {\n this.stopScheduledFormStateUpdate();\n this.lastTimeoutId = setTimeout(() => {\n this.updateFormState(rawFormState);\n this.lastTimeoutId = undefined;\n }, this.config.lazyUpdatesTimer ?? 0);\n };\n\n destroy(): void {\n this.abortController.abort();\n this.stopScheduledFormStateUpdate();\n }\n}\n\nexport const createForm = <\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n>(\n config: FormParams<TFieldValues, TContext, TTransformedValues>,\n) => new Form(config);\n\n/**\n * @deprecated ⚠️ use `Form`. This export will be removed in next major release\n */\nexport class MobxForm<\n TFieldValues extends FieldValues = FieldValues,\n TContext = any,\n TTransformedValues = TFieldValues,\n> extends Form<TFieldValues, TContext, TTransformedValues> {}\n"],"names":["LibController"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mobx-react-hook-form",
3
- "version": "5.10.0",
3
+ "version": "6.0.0",
4
4
  "description": "",
5
5
  "type": "module",
6
6
  "keywords": [],
@@ -1,3 +0,0 @@
1
- export * from './mobx-form.js';
2
- export * from './mobx-form.types.js';
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mobx-form/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,sBAAsB,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mobx-form.d.ts","sourceRoot":"","sources":["../../src/mobx-form/mobx-form.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"mobx-form.types.d.ts","sourceRoot":"","sources":["../../src/mobx-form/mobx-form.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,UAAU,EACV,SAAS,EACT,WAAW,EACX,kBAAkB,EAClB,aAAa,EACb,YAAY,EACb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAC1C;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,UAAU,CACzB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,CACjC,SAAQ,IAAI,CACV,YAAY,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,EACxD,eAAe,CAChB;IACD;;OAEG;IACH,aAAa,CAAC,EAAE,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1C;;OAEG;IACH,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,aAAa,CAAC,kBAAkB,CAAC,CAAC;IAC7C;;OAEG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC,YAAY,CAAC,CAAC;IAClD;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAC/B;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;OAEG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,MAAM,cAAc,CACxB,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,QAAQ,GAAG,GAAG,EACd,kBAAkB,GAAG,YAAY,IAC/B,UAAU,CAAC,YAAY,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC;AAE3D,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,OAAO,IAAI,OAAO,CAC7D,CAAC,CAAC,QAAQ,CAAC,EACX,SAAS,GAAG,IAAI,CACjB,CAAC;AAEF,MAAM,MAAM,4BAA4B,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,SAAS,IAAI,CAC1E,GAAG,EACH,GAAG,EACH,MAAM,kBAAkB,CACzB,GACG,kBAAkB,GAClB,KAAK,CAAC;AAEV,MAAM,WAAW,aAAa,CAC5B,YAAY,SAAS,WAAW,GAAG,WAAW,EAC9C,UAAU,SAAS,SAAS,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC;IAEpE,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,UAAU,CAAC;CACnB"}