@alt-point/active-models
TypeScript icon, indicating that this package has built-in type declarations

3.2.2 • Public • Published

@alt-point/active-models

Пакет с базовыми классами на TS для упрощения работы со структурами данных.

Какие проблемы поможет решить?

  • [x] Реализовать модели данных с реактивными свойствами (ActiveModel);
  • [x] Контролировать целостность структур данных (fillable, hidden, protected);
  • [x] Контролировать тип и целостность данных в каждом конкретном свойстве в рантайме;
  • [x] подписаться на изменения данных в свойствах модели;

Installation

yarn

yarn add @alt-point/active-models

npm

npm install --save @alt-point/active-models

ActiveModel

Класс реализован с использованием Proxy.

Назначение: контроль целостности структуры и типов данных моделей приходящих из внешних источников/подсистем (DTO)

Пример, иллюстрирующий применение

@Decorators

@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
}

CallableModel

Базовый класс, реализованный также через 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!')

TODO:

  • [ ] 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;

Credits

Alex D. Bubenchikov, surrealistik@alt-point.ru

Dependencies (2)

Dev Dependencies (19)

Package Sidebar

Install

npm i @alt-point/active-models

Weekly Downloads

111

Version

3.2.2

License

MIT

Unpacked Size

5.02 MB

Total Files

20

Last publish

Collaborators

  • evil_dwarf
  • vladismus
  • surrealistik