soeasy / meta-validate Goto Github PK
View Code? Open in Web Editor NEWValidation utils for ES6 and TS
License: MIT License
Validation utils for ES6 and TS
License: MIT License
function ClassDecoratorImpl(...decoratorArgs: Array): ClassDecorator {
console.log('injectable works fine');
return function(target) {
// common code для переопределения конструктора
const originalConstructor = target;
function construct(constructor: any, args: Array<any>): any {
// tslint:disable-next-line
const c: any = function () {
// tslint:disable-next-line
return constructor.apply(this, args);
};
c.prototype = constructor.prototype;
return new c();
}
// tslint:disable-next-line
const newConstructor = function (...args) {
const newInstance = construct(originalConstructor, args);
for (let key of Object.keys(newInstance)) {
let keyValue = newInstance[key];
Object.defineProperty(newInstance, key, {
enumerable: true,
configurable: true,
get() {
return keyValue;
},
set(value) {
keyValue = value;
}
});
}
return newInstance;
};
newConstructor.prototype = originalConstructor.prototype;
return newConstructor;
}
}
@ClassDecoratorImpl()
class A {
foo: number = 1;
}
const a = new A();
console.log(a);
Возможно стоит добавить pristine/dirty для полей
Add it to run validators synchronously or asynchronously with setter.
async: true
set value
return eventloop
run validators
async: false
set value
run validators
return eventloop
Сейчас проверка isFullValid в качестве условия входа вглубь использует "instanceof boolean" - изменить, потому что иногда невнимательно написанные валидаторы могут вернуть не boolean
Nested(nestedName: string)
Пусть можно передать имя, которое будет ключем в ошибках
When we decorate some property - them drop from Object.keys.
Actually here exists in prototype, not in instance. This is interrupt to copy objects
Как-нибудь реализовать добавление частичных валидностей.
Зачем и как это будет использоваться?
Пусть некая форма содержит пофдормы и в пользовательстком интерфейсе реализована шагами. Например первый шаг - ФИО, второй - данные паспорта, третий шаг - данные банковского счета. Интерфейс не должен допускать переход к следующему шагу, если на текущем шаге есть ошибки. В этом случае можно добавлять частичные валидности, включающие в себя только определенные поля.
Другой пример: в форме в определенных условиях значимым является телефон, а в других - email. Соответственно, видно всегда только одно поле из двух, и полная валидность формы зависит от того, какое поле сейчас значимо.
Сейчас это решается путем передачи в метод .isFullValid
аргументов исключаемых полей:
// if email is required
const submitAvailable = validity.isFullValid(['phone']);
// if phone is required
const submitAvailable = validity.isFullValid(['email'])
Предлагаемое решение - добавить две частичных валидности, исключающие определенные поля.
Какой интерфейс будет у этого решения?
В validity$ помимо полей errors
и .isFullValid()
добавляется partialValidity, которое в сущности должно заменить isFullValid.
Для его конфигурации должно быть реализовано что-то типа такого:
PartialValidity('validityOne').fromFull().exclude('f1').exclude('f2')...make()
PartialValidity('validityTwo').fromNull().include('f1').include('f2')...make()
fromFull(validityName: string) - метод, создающий частичную валидность validityName, включающую все поля формы. Возвращает объект с методом exclude(fieldName)
, который будет исключать некоторые поля из формы.
fromNull(validityName: string) - метод, создающий частичную валидность validityName, изначально совсем пустую. Возвращает объект с методом include(fieldName)
, который будет включать некоторые поля формы.
Для приведенных выше примеров форм это будет работать так:
// Форма с шагами
PartialValidity('fioValidity').fromNull().include('firstName').include('lastName').include('middleName').make();
PartialValidity('documentValidity').fromNull().include('docType').include('series').include('number').make();
PartialValidity('bankValidity').fromNull().inclide('bic').include('account').make();
// Форма с меняющимся значимым полем
PartialValidity('whenEmailValidity').fromFull().exclude('phone').make();
PartialValidity('whenPhoneValidity').fromFull().exclude('email').make();
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.