react-f0rm 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * react-f0rm v0.2.0
2
+ * react-f0rm v0.2.1
3
3
  * Copyright (c) 2021-present wmzy <1256573276@qq.com>
4
4
  */
5
5
  !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define("react-f0rm",["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self)["react-f0rm"]={},e.React)}(this,function(e,t){"use strict";function r(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var n=r(t);function u(e,t,r){var n=function(e,t){var r=e.get(t);if(r)return r;var n=new Set;return e.set(t,n),n}(e,t);return n.add(r),function(){return n.delete(r)}}function i(e){return Array.isArray(e)?e:e.split(/\.|\[/).map(e=>e.endsWith("]")?Number.parseInt(e,10):e)}function o(e,t){return t.reduce((e,t)=>{if(null!=e)return e[t]},e)}function a(e,t,r){if(!t.length)return r;const[n,...u]=t;if("number"==typeof n){const t=Array.isArray(e)?e.slice():[];return t[n]=a(t[n],u,r),t}return{...e,[n]:a(e&&e[n],u,r)}}function c(e){const t=i(e);return{value:t,key:JSON.stringify(t)}}const s=function(e,t){for(var r=arguments.length,n=new Array(r>2?r-2:0),u=2;u<r;u++)n[u-2]=arguments[u];(e.get(t)||[]).forEach(function(e){return e.apply(void 0,n)})};function l(e){return{emitter:new Map,revalidateOnChange:!0,...e,initialValues:e?.initialValues??{},values:new Map,errors:new Map,touched:new Set,validators:new Map,validating:new Set,isSubmitting:!1,submitCount:0,isSubmitSuccessful:void 0}}function f(e){return Array.from(e.values.keys()).reduce((t,r)=>a(t,JSON.parse(r),e.values.get(r)),e.initialValues)}function d({initialValues:e,values:t},r){return t.has(r.key)?t.get(r.key):o(e,r.value)}function m({emitter:e,values:t},r,n){t.set(r.key,n),s(e,"change",r)}function h({errors:e},t){return e.get(t.key)}function v({errors:e}){return Array.from(e.values())}function y({errors:e}){return e.values().next().value}function g({emitter:e,validating:t},{key:r}){t.delete(r),s(e,"validating")}function p({emitter:e,validating:t},{key:r}){t.add(r),s(e,"validating")}function b(e,t,r){C(e,c(t),r)}function C({emitter:e,errors:t},r,n){n?t.set(r.key,n):t.delete(r.key),s(e,"errors")}function k({emitter:e,errors:t}){t.clear(),s(e,"errors")}function V({emitter:e,touched:t},{key:r}){t.has(r)||(t.add(r),s(e,"touched"))}function E({touched:e},t){return e.has(t.key)}function w({initialValues:e,values:t}){for(const[r,n]of t){if(o(e,JSON.parse(r))!==n)return!0}return!1}function S(e,{key:t}){const{emitter:r,values:n,touched:u,errors:i,validating:o}=e;n.delete(t),u.delete(t),i.delete(t),o.delete(t),s(r,"change"),s(r,"touched"),s(r,"errors"),s(r,"validating")}function P(e,t){e.initialValues!==t&&(e.initialValues=t,e.values.clear(),s(e.emitter,"change"))}function x({errors:e}){return e.size>0}async function B(e){var t,r,n,i;if(e.validators.forEach(e=>e()),await(t=e.emitter,r="validating",n=()=>!e.validating.size,i=()=>x(e),new Promise((e,o)=>{if(i())return void o();if(n())return void e();const a=u(t,r,()=>{if(i())return a(),void o();n()||(a(),e())})})).catch(()=>{throw new Error(y(e))}),e.validate){const t=await e.validate(f(e)),r=t?Object.entries(t):[];if(r.length)throw r.forEach(([t,r])=>{b(e,t,r)}),new Error(y(e))}}async function O(e){return B(e).catch(e=>e.message)}function F(e,t){e.isSubmitting=t,s(e.emitter,"submitting")}function R(e){e.submitCount++,s(e.emitter,"submitCount")}function T(e,t){e.isSubmitSuccessful=t,s(e.emitter,"submitSuccessful")}const A=t.createContext(null),j=A.Provider;function I(){const e=t.useContext(A);if(!e)throw new Error("no form provided");return e}const M=t.createContext(null),z=M.Provider;function D(e){const r=t.useRef(null),n=r.current=r.current||l(e),u=e&&e.initialValues;return t.useEffect(()=>{P(n,u)},[u]),n}function N(e,r,n){const[i,o]=t.useReducer(n,void 0,n);return t.useEffect(()=>u(e,r,o),[e,r]),i}function G(e,t){return N(e.emitter,"change",d.bind(null,e,t))}function J(e,t){return N(e.emitter,"touched",E.bind(null,e,t))}function W(e,t){return N(e.emitter,"errors",h.bind(null,e,t))}function q(e){const r=t.useMemo(()=>c(i(e)),[e]);return t.useMemo(()=>r,[r.key])}function H(e){const r=function(e){const r=t.useRef(e);return r.current=e,r}(e);return t.useCallback((...e)=>r.current(...e),[])}function U({form:e,name:r,initialValue:n,shouldUnregister:u,validate:i,...o}){const a=I(),c=e||a,s=q(r),l=function(e,r){const n=I(),u=t.useRef(null),i=t.useRef(e);return i.current=e,t.useEffect(()=>(n.validators.set(r.key,()=>{const e=i.current;if(!e)return;const t=e(d(n,r),{form:n,path:r});if(!(o=t)||"function"!=typeof o.then)return void C(n,r,t);var o;const a=u.current={};p(n,r),t.then(e=>{a===u.current&&C(n,r,e)}).finally(()=>{a===u.current&&(g(n,r),u.current=null)})}),()=>{n.validators.delete(r.key)}),[n,r.key]),H(()=>n.validators.get(r.key)?.())}(i,s);t.useMemo(()=>{void 0!==n&&m(c,s,n)},[c,s]);const f=W(c,s),h=G(c,s),v=H(e=>{m(c,s,e),(c.validateOnChange||c.revalidateOnChange&&f&&void 0!==f)&&l()}),y=H(()=>{V(c,s),(c.validateOnBlur||c.revalidateOnBlur&&void 0!==f)&&l()});return t.useEffect(()=>()=>{!1!==u&&S(c,s)},[s,c,u]),{...o,value:h,error:f,onChange:v,onBlur:y,name:s.key}}let _=0;function K(){return"_"+ ++_}const L=Symbol("buildInError");const Q=n.forwardRef(({validate:e,eventToValue:t,initialValue:r,name:u,asProps:i,...o},a)=>{const c=n.useRef(null),s=n.useCallback(e=>{c.current=e,function(e,t){"function"==typeof e?e(t):e&&(e.current=t)}(a,e)},[a]),{as:l,value:f,valueToProps:d,onChange:m,error:h,...v}=U({...o,name:u,initialValue:r,validate:(...t)=>!1===c.current?.checkValidity()?L:e?e(...t):void 0}),y=l||"input";n.useEffect(()=>{if(c.current)return h===L?(c.current.setCustomValidity(""),void c.current.reportValidity()):void("string"==typeof h&&(c.current.setCustomValidity(h),c.current.reportValidity()))},[h]);const g=t??(e=>e.target.value);return n.createElement(y,{...v,...i,...d?d(f):{value:f},onChange:e=>m(g(e)),ref:s})}),X=n.forwardRef(({name:e,...t},r)=>{const{value:u,onChange:i,error:o,...a}=U({...t,name:e});return n.createElement("input",{...a,type:"checkbox",checked:!!u,onChange:e=>i(e.target.checked),ref:r})});e.Checkbox=X,e.CheckboxGroupContext=M,e.CheckboxGroupProvider=z,e.Field=Q,e.Form=function({form:e,initialValues:t,onSubmit:r,onValidSubmit:u,onInvalidSubmit:i,...o}){const a=D({initialValues:t}),c=e||a;return n.createElement(j,{value:c},n.createElement("form",{...o,noValidate:!0,onSubmit:async function(e){e.preventDefault(),F(c,!0),R(c);const t=await O(c),n=f(c);if(t)return F(c,!1),T(c,!1),void(i&&i(v(c),n));try{r&&await r(n,e),u&&u(n,e),T(c,!0)}catch{T(c,!1)}finally{F(c,!1)}}}))},e.FormContext=A,e.FormProvider=j,e.clearErrors=k,e.createForm=l,e.ensureValidate=B,e.getError=function(e,t){return h(e,c(t))},e.getErrorByPath=h,e.getErrors=v,e.getFirstError=y,e.getValue=function(e,t){return d(e,c(t))},e.getValueByPath=d,e.getValues=f,e.hasErrors=x,e.hasTouched=function(e,t){return E(e,c(t))},e.hasTouchedByPath=E,e.incrementSubmitCount=R,e.isDirty=w,e.isTouched=function({touched:e}){return e.size>0},e.removeField=function(e,t){S(e,c(t))},e.removeFieldByPath=S,e.reset=function(e,t){e.initialValues=t,k(e);const{emitter:r,touched:n,values:u}=e;u.clear(),n.clear(),s(r,"change"),s(r,"touched"),s(r,"reset")},e.setError=b,e.setErrorByPath=C,e.setInitialValues=P,e.setIsSubmitting=F,e.setSubmitSuccessful=T,e.setTouched=function(e,t){V(e,c(t))},e.setTouchedByPath=V,e.setValidatingByPath=p,e.setValue=function(e,t,r){m(e,c(t),r)},e.setValueByPath=m,e.trigger=function(e){e.validators.forEach(e=>e())},e.unsetValidatingByPath=g,e.useCheckboxGroupContext=function(){const e=t.useContext(M);if(!e)throw new Error("no group provided");return e},e.useError=function(e,t){return W(e,c(t))},e.useErrorByPath=W,e.useField=U,e.useFieldArray=function(e){const r=I(),n=e.form||r,i=q(e.name),o=t.useRef([]),a=t.useCallback(()=>d(n,i)||[],[n,i]),c=t.useCallback(e=>{m(n,i,e)},[n,i]),s=t.useCallback(()=>{const e=a();for(;o.current.length<e.length;)o.current.push(K());for(;o.current.length>e.length;)o.current.pop();return o.current.map((e,t)=>({id:e,index:t}))},[a]),[l,f]=t.useReducer(s,void 0,s);return t.useEffect(()=>u(n.emitter,"change",f),[n.emitter]),{fields:l,append:H(e=>{const t=a();o.current.push(K()),c([...t,e])}),prepend:H(e=>{const t=a();o.current.unshift(K()),c([e,...t])}),insert:H((e,t)=>{const r=a();o.current.splice(e,0,K());const n=[...r.slice(0,e),t,...r.slice(e)];c(n)}),remove:H(e=>{const t=a();o.current.splice(e,1);const r=t.filter((t,r)=>r!==e);c(r)}),swap:H((e,t)=>{const r=a();[o.current[e],o.current[t]]=[o.current[t],o.current[e]];const n=[...r];[n[e],n[t]]=[n[t],n[e]],c(n)}),move:H((e,t)=>{const r=a(),[n]=o.current.splice(e,1);o.current.splice(t,0,n);const u=[...r],[i]=u.splice(e,1);u.splice(t,0,i),c(u)})}},e.useForm=D,e.useFormContext=I,e.useHasErrors=function(e){return N(e.emitter,"errors",x.bind(null,e))},e.useIsDirty=function(e){return N(e.emitter,"touched",w.bind(null,e))},e.useIsSubmitting=function(e){return N(e.emitter,"submitting",()=>e.isSubmitting)},e.useSubmitCount=function(e){return N(e.emitter,"submitCount",()=>e.submitCount)},e.useTouched=function(e,t){return J(e,c(t))},e.useTouchedByPath=J,e.useValue=function(e,t){return G(e,c(t))},e.useValueByPath=G,e.useWatch=N,e.validate=O});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-f0rm",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "packageManager": "pnpm@11.4.0",
5
5
  "description": "react form",
6
6
  "main": "dist/index.cjs.js",
@@ -29,8 +29,8 @@
29
29
  "test:watch": "vitest",
30
30
  "test:ui": "vitest --ui",
31
31
  "clean": "rimraf dist node_modules/.cache",
32
- "lint:fix": "eslint --fix .",
33
- "lint": "eslint .",
32
+ "lint:fix": "eslint --fix src/ test/",
33
+ "lint": "eslint src/ test/",
34
34
  "storybook": "storybook dev -p 6006",
35
35
  "build-storybook": "storybook build",
36
36
  "size": "size-limit",