mobx-react-form
Version:
Reactive MobX Form State Management
187 lines (178 loc) • 6.51 kB
JavaScript
(function webpackUniversalModuleDefinition(root, factory) {
if(typeof exports === 'object' && typeof module === 'object')
module.exports = factory(require("_"));
else if(typeof define === 'function' && define.amd)
define(["_"], factory);
else if(typeof exports === 'object')
exports["MobxReactFormValidatorSVK"] = factory(require("_"));
else
root["MobxReactFormValidatorSVK"] = factory(root["_"]);
})(self, (__WEBPACK_EXTERNAL_MODULE_lodash__) => {
return /******/ (() => { // webpackBootstrap
/******/ "use strict";
/******/ var __webpack_modules__ = ({
/***/ "./src/validators/SVK.ts":
/*!*******************************!*\
!*** ./src/validators/SVK.ts ***!
\*******************************/
/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", ({ value: true }));
const lodash_1 = __importDefault(__webpack_require__(/*! lodash */ "lodash"));
function isPromise(obj) {
return (!!obj &&
typeof obj.then === "function" &&
(typeof obj === "object" || typeof obj === "function"));
}
class SVK {
constructor({ config, state = null, promises = [], }) {
Object.defineProperty(this, "promises", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "config", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "state", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "extend", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "validator", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
Object.defineProperty(this, "schema", {
enumerable: true,
configurable: true,
writable: true,
value: void 0
});
this.state = state;
this.promises = promises;
this.config = config;
this.extend = config === null || config === void 0 ? void 0 : config.extend;
this.schema = config.schema;
this.initValidator();
}
extendOptions(options = {}) {
return Object.assign(Object.assign({}, options), { errorDataPath: "property", allErrors: true, coerceTypes: true, v5: true });
}
initValidator() {
const AJV = this.config.package;
const validatorInstance = new AJV(this.extendOptions(this.config.options));
if (typeof this.extend === "function") {
this.extend({
form: this.state.form,
validator: validatorInstance,
});
}
this.validator = validatorInstance.compile(this.schema);
}
validate(field) {
const result = this.validator(field.state.form.validatedValues);
if (isPromise(result)) {
const $p = result
.then(() => field.setValidationAsyncData(true))
.catch((err) => err && this.handleAsyncError(field, err.errors))
.then(() => this.executeAsyncValidation(field));
this.promises.push($p);
return;
}
this.handleSyncError(field, this.validator.errors);
}
handleSyncError(field, errors) {
const fieldError = this.findError(field.path, errors);
if (!fieldError)
return;
const message = `${field.label} ${fieldError.message}`;
field.invalidate(message, false);
}
handleAsyncError(field, errors) {
const fieldError = this.findError(field.path, errors);
if (!fieldError)
return;
const message = `${field.label} ${fieldError.message}`;
field.setValidationAsyncData(false, message);
}
findError(path, errors) {
return lodash_1.default.find(errors, ({ dataPath }) => {
let $dataPath;
$dataPath = lodash_1.default.trimStart(dataPath, ".");
$dataPath = lodash_1.default.replace($dataPath, "]", "");
$dataPath = lodash_1.default.replace($dataPath, "[", ".");
return lodash_1.default.includes($dataPath, path);
});
}
executeAsyncValidation(field) {
if (field.validationAsyncData.valid === false) {
field.invalidate(field.validationAsyncData.message, false, true);
}
}
}
exports["default"] = (config) => ({
class: (SVK),
config,
});
/***/ }),
/***/ "lodash":
/*!********************!*\
!*** external "_" ***!
\********************/
/***/ ((module) => {
module.exports = __WEBPACK_EXTERNAL_MODULE_lodash__;
/***/ })
/******/ });
/************************************************************************/
/******/ // The module cache
/******/ var __webpack_module_cache__ = {};
/******/
/******/ // The require function
/******/ function __webpack_require__(moduleId) {
/******/ // Check if module is in cache
/******/ var cachedModule = __webpack_module_cache__[moduleId];
/******/ if (cachedModule !== undefined) {
/******/ return cachedModule.exports;
/******/ }
/******/ // Create a new module (and put it into the cache)
/******/ var module = __webpack_module_cache__[moduleId] = {
/******/ // no module.id needed
/******/ // no module.loaded needed
/******/ exports: {}
/******/ };
/******/
/******/ // Execute the module function
/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ // Return the exports of the module
/******/ return module.exports;
/******/ }
/******/
/************************************************************************/
/******/
/******/ // startup
/******/ // Load entry module and return exports
/******/ // This entry module is referenced by other modules so it can't be inlined
/******/ var __webpack_exports__ = __webpack_require__("./src/validators/SVK.ts");
/******/
/******/ return __webpack_exports__;
/******/ })()
;
});
//# sourceMappingURL=MobxReactFormValidatorSVK.umd.js.map