zent
Version:
一套前端设计语言和基于React的实现
125 lines (124 loc) • 4.52 kB
JavaScript
import { from, of, defer, EMPTY } from 'rxjs';
import { catchError, map, concatAll, filter, takeWhile } from 'rxjs/operators';
import { isFieldSetModel } from './models';
import { finalizeWithLast } from './finalize-with-last';
import isNil from '../../utils/isNil';
export var ASYNC_VALIDATOR = Symbol('AsyncValidator');
export function isAsyncValidator(validator) {
if (validator[ASYNC_VALIDATOR]) {
return true;
}
return false;
}
export function createAsyncValidator(validator) {
var _a;
return _a = {},
_a[ASYNC_VALIDATOR] = true,
_a.validator = validator,
_a;
}
export var ValidateOption;
(function (ValidateOption) {
ValidateOption[ValidateOption["Empty"] = 0] = "Empty";
ValidateOption[ValidateOption["IncludeAsync"] = 2] = "IncludeAsync";
ValidateOption[ValidateOption["IncludeUntouched"] = 4] = "IncludeUntouched";
ValidateOption[ValidateOption["IncludeChildrenRecursively"] = 8] = "IncludeChildrenRecursively";
ValidateOption[ValidateOption["ExcludePristine"] = 16] = "ExcludePristine";
ValidateOption[ValidateOption["StopPropagation"] = 32] = "StopPropagation";
ValidateOption[ValidateOption["Default"] = 0] = "Default";
})(ValidateOption || (ValidateOption = {}));
var ErrorSubscriber = (function () {
function ErrorSubscriber(model) {
this.model = model;
}
ErrorSubscriber.prototype.next = function (error) {
this.model.error = error;
};
return ErrorSubscriber;
}());
export { ErrorSubscriber };
var ValidatorContext = (function () {
function ValidatorContext(model) {
this.model = model;
}
ValidatorContext.prototype.getSection = function () {
return this.model.owner;
};
ValidatorContext.prototype.getSectionValue = function () {
var names = [];
for (var _i = 0; _i < arguments.length; _i++) {
names[_i] = arguments[_i];
}
if (!this.model.owner || !isFieldSetModel(this.model.owner)) {
return null;
}
if (names.length === 0) {
return this.model.owner.getRawValue();
}
var data = {};
for (var i = 0; i < names.length; i += 1) {
var name_1 = names[i];
var model = this.model.owner.get(name_1);
if (model) {
data[name_1] = model.getRawValue();
}
}
return data;
};
ValidatorContext.prototype.getFormValue = function () {
var _a;
return (_a = this.model.form) === null || _a === void 0 ? void 0 : _a.getRawValue();
};
return ValidatorContext;
}());
export { ValidatorContext };
function runValidator(validator, _a, value, ctx) {
var reject = _a.reject;
try {
if (isAsyncValidator(validator)) {
var ret = validator.validator(value, ctx);
if (ret === null) {
return of(null);
}
return from(ret);
}
else {
return of(validator(value, ctx));
}
}
catch (error) {
reject(error);
return EMPTY;
}
}
var ValidatorExecutor = (function () {
function ValidatorExecutor(model) {
this.model = model;
this.ctx = new ValidatorContext(model);
}
ValidatorExecutor.prototype.call = function (validation) {
var _this = this;
var option = validation.option, reject = validation.reject, resolve = validation.resolve;
if (!this.model.touched() && !(option & ValidateOption.IncludeUntouched)) {
resolve();
return of(null);
}
if (option & ValidateOption.ExcludePristine && this.model.pristine()) {
resolve();
return of(null);
}
var value = this.model.getRawValue();
var skipAsync = (option & ValidateOption.IncludeAsync) === 0;
return from(this.model.validators).pipe(filter(function (validator) { return (skipAsync ? !isAsyncValidator(validator) : true); }), map(function (validator) {
return defer(function () { return runValidator(validator, validation, value, _this.ctx); });
}), concatAll(), takeWhile(isNil, true), catchError(function (error) {
reject(error);
return EMPTY;
}), finalizeWithLast(resolve, null));
};
return ValidatorExecutor;
}());
export function validate(model) {
var executor = new ValidatorExecutor(model);
return function (validation) { return executor.call(validation); };
}