rx-model
Model powered by RxJs
Библиотека для создания валидируемых моделей, форм и валидаторов.
Install
npm install rx-model --save
Overview
Библиотека представляет из себя 3 основных класса:
- Model - базовый класс для работы с данными, применим на стороне сервера
- Form - унаследован от Model, предназначен для создания форм на клиенте
- Validator - базовый класс для создания валидаторов Также в библиотеку входят валидаторы:
- PresenceValidator
- StringValidator
- NumberValidator
- DateValidator
- EmailValidator
- RangeValidator
- UrlValidator
- CompareValidator
- CustomValidator
- ObjectValidator
- ArrayValidator
- SafeValidator
- UnsafeValidator
Features
- Описание структуры данных любой вложенности
- Контроль доступа к полям модели
- Простое и управляемое валидирование данных
- Динамическое подстраивание бизнес логики модели под внутренние, либо внешние изменения
- Aсинхронная валидция
- Поддержка сценариев, возможность использовать несколько сценариев одновременно
- Встроенные валидаторы
- Inline валидаторы (CustomValidator)
- RxJs трекинг состояния модели (изменение значений и статуса валидации полей)
- Не зависит от окружения, библиотека применима как для фронтенда (реактивные формы) так и бэкенда
Demo
https://gromver.github.io/rx-model
Documentation
Usage
Backend environment
Model - базовый класс для работы с данными, описывает структуру данных и правила валидации.
;; // правила валидации { return // name - обязательное поле name: // email - обязательное поле, с проверкой на правильность емейла email: // password - обязательное поле, длиною не менее 6 символов password: minLength: 6 // открываем доступ к записи в поле profile profile: // так как поле profile типа Object, можно описать его структуру (вложенность бесконечная) 'profile.age': greaterThan: 0 'profile.phone': pattern: /^\d{10}$/ } /** * Создание пользователя * @param data * @returns */ { const model = ; /** * Запись и валидация данных */ model; return model;} /** * Изменяет пользователя * @param {{}} user текущий пользователь * @param {{}} data объект с изменениями * @returns */ { const model = user; /** * Запись новых значений и валидация данных */ model; return model;}
Client side
Для создания форм на клиенте предусмотрен класс Form. Этот класс расширяет Model, довабляя специфический для фронта функционал. Отображать UI формы будем с помощью ReactJS, для связки с Form объектом воспользуемся специальным react компонентом FormConnect. Суть компонента FormConnect - подписка на интересующие изменения формы (поля формы, состояния валидации, стейт формы) и отрисовка элемента формы.
import React from 'react';import Form from 'rx-model';import PresenceValidator EmailValidator StringValidator NumberValidator SafeValidator from 'rx-model/validators';import FormConnect from 'react-rx-form'; // правила валидации { return // name - обязательное поле name: // email - обязательное поле, с проверкой на правильность емейла email: // password - обязательное поле, длиною не менее 6 символов password: minLength: 6 // открываем доступ к записи в поле profile profile: // так как поле profile типа Object, можно описать его структуру (вложенность бесконечная) 'profile.age': greaterThan: 0 'profile.phone': pattern: /^\d{10}$/ } { // здесь можно указать значения по умолчанию, a также нормализовать входные данные при создании модели return name: '' email: '' password: '' ...data } Component { ; thisstate = form: } { const form = thispropsstate; form } { const form = thisstate; return <div> <FormConnect = = > return <div = > <div ="label">Name:</div> <div ="control"> <input ="input" = = = = /> </div> <div ="error">form</div> </div> </FormConnect> <FormConnect = = > return <div = > <div ="label">Email:</div> <div ="control"> <input ="input" = = = = /> </div> <div ="error">form</div> </div> </FormConnect> <FormConnect = = > return <div = > <div ="label">Password:</div> <div ="control"> <input ="input" ="password" = = = = /> </div> <div ="error">form</div> </div> </FormConnect> <FormConnect = = > return <div = > <div ="label">Age:</div> <div ="control"> <input ="input" = = = = /> </div> <div ="error">form</div> </div> </FormConnect> <FormConnect = = > return <div = > <div ="label">Phone:</div> <div ="control"> <input ="input" = = = = /> </div> <div ="error">form</div> </div> </FormConnect> <div> <button =>Submit</button> </div> </div> ; }
Links
License
rx-model is released under the MIT license. See the LICENSE file for license text and copyright information.