Пакет с базовыми классами на TS
для упрощения работы со структурами данных.
Какие проблемы поможет решить?
- [x] Реализовать модели данных с реактивными свойствами (
ActiveModel
); - [x] Контролировать целостность структур данных (
fillable
,hidden
,protected
); - [x] Контролировать тип и целостность данных в каждом конкретном свойстве в рантайме;
- [x] подписаться на изменения данных в свойствах модели;
yarn
yarn add @alt-point/active-models
npm
npm install --save @alt-point/active-models
Класс реализован с использованием Proxy
.
Назначение: контроль целостности структуры и типов данных моделей приходящих из внешних источников/подсистем (DTO)
Пример, иллюстрирующий применение
@ActiveField(opts: ActiveFieldDescriptor)
type ActiveFieldDescriptor = object & {
setter?: Setter<any> // ассессор на установку значения
getter?: Getter<any> // ацессор на получение значения
validator?: Validator<any> // валидатор на установку значения
readonly?: boolean // поле модели будет доступно только на чтение
hidden?: boolean // поле скрыто из перечисляемых свойств
fillable?: boolean // поле доступно для установки и изменения
protected?: boolean // запрещено удалять поле из модели
attribute?: any // Значение по умолчанию для поля модели в момент создания объекта
value?: any // алиас для `attribute`
factory?: typeof ActiveModel | [typeof ActiveModel, () => ActiveModel] // Фабрика (extends ActiveModel) для обработки значения. Массивы так же обрабатывает.
on?: // листенеры на события модельки, цепляются на конкретное свойство
beforeSetValue?: ({ target, prop, value, oldValue }) => void // вызовется перед установкой значение
afterSetValue?: ({ target, prop, value, oldValue }) => void // сразу после установки значения
beforeDeletingAttribute?: ({ target, prop }) => void // перед удалением свойства из модели
nulling?: ({ target, prop, value, oldValue }) => void // если у свойства было значение и вместо него установили null
once?: // всё тоже самое, что и в on
}
Базовый класс, реализованный также через Proxy
, чтобы можно было обращаться с объектом как с функцией.
Пример использования:
import { CallableModel } from '@alt-point/active-models'
class Notify extends CallableModel {
// Define
__call (...args) {
return this.success(...args)
}
success (successMessage) {
alert(successMessage)
}
silent (message) {
console.log('Silent message:' + message)
}
}
Дальше можем создать объект класса Notify
как плагин в Nuxt.js/Vue.js
и использовать:
// плагин
export default (ctx, inject) => {
ctx.$notify = new Notify()
inject('notify', new Notify())
}
// в компоненте теперь можно юзать:
this.$notify.silent('Write notice to console!')
this.$notify('Alert!')
- [ ] refactor readonly fields behavior: filling only creating;
- [ ] add more examples;
- [ ] tests;
- [x] TS;
- [ ] add examples for server (
node.js
); - [x] Translate to english and others languages;