mobx-react-form
Version:
Reactive MobX Form State Management
3 lines (2 loc) • 2.27 kB
JavaScript
!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e(require("lodash")):"function"==typeof define&&define.amd?define(["lodash"],e):(t="undefined"!=typeof globalThis?globalThis:t||self).MobxReactFormValidatorDVR=e(t._)}(this,function(t){"use strict";class e{promises;config;state;extend;validator;schema;constructor({config:t,state:e=null,promises:s=[]}){this.state=e,this.promises=s,this.config=t,this.extend=t?.extend,this.validator=t.package,this.extendValidator()}extendValidator(){"function"==typeof this.extend&&this.extend({validator:this.validator,form:this.state.form})}validate(t){const e=this.state.form.flatMapValues;this.validateFieldAsync(t,e),this.validateFieldSync(t,e)}makeLabels(e,s){const a={[s.path??""]:s.label};t.forIn(e.rules[s.path??""],e=>{if("string"==typeof e.value&&e.name.match(/^(required_|same|different)/))t.forIn(e.value.split(","),(t,s)=>{if(!e.name.match(/^required_(if|unless)/)||s%2==0){const e=this.state.form.$(t);e&&e.path&&e.label&&(a[e.path]=e.label)}});else if("string"==typeof e.value&&e.name.match(/^(before|after)/)){const t=this.state.form.$(e.value);t&&t.path&&t.label&&(a[t.path]=t.label)}}),e.setAttributeNames(a)}validateFieldSync(e,s){const a=this.rules(e.rules,"sync");if(t.isEmpty(a[0]))return;const i={[e.path??""]:a},n=new this.validator(s,i);this.makeLabels(n,e),n.passes()||e.invalidate(n.errors.get(e.path)[0],!1)}validateFieldAsync(e,s){const a=this.rules(e.rules,"async");if(t.isEmpty(a[0]))return;const i={[e.path??""]:a},n=new this.validator(s,i);this.makeLabels(n,e);const l=new Promise(t=>n.checkAsync(()=>this.handleAsyncPasses(e,t),()=>this.handleAsyncFails(e,n,t)));this.promises.push(l)}handleAsyncPasses(t,e){t.setValidationAsyncData(!0),e()}handleAsyncFails(t,e,s){t.setValidationAsyncData(!1,e.errors.get(t.path)[0]),this.executeAsyncValidation(t),s()}executeAsyncValidation(t){!1===t.validationAsyncData.valid&&t.invalidate(t.validationAsyncData.message??void 0,!1,!0)}rules(t,e){const s=Array.isArray(t)?t:"string"==typeof t?t.split("|"):[],a=new this.validator;return s.filter(t=>"async"===e?a.getRule(t.split(":")[0])?.async:!a.getRule(t.split(":")[0])?.async)}}return t=>({class:e,config:t})});
//# sourceMappingURL=MobxReactFormValidatorDVR.umd.min.js.map