# mvloader

> Base loader for projects

Latest version **1.0.10** (published 2021-06-21) · ISC license · 0 weekly downloads

## Install

```sh
npm install mvloader
pnpm add mvloader
yarn add mvloader
bun add mvloader
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 1.0.10 |
| Published | 2021-06-21 |
| First published | 2020-01-29 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 2 |
| Unpacked size | 20.8 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Author | mvoevodskiy |
| Maintainers | mvoevodskiy |

## Links

- npm: https://www.npmjs.com/package/mvloader
- Repository: https://github.com/mvoevodskiy/mvloader
- Homepage: https://github.com/mvoevodskiy/mvloader#readme
- Issues: https://github.com/mvoevodskiy/mvloader/issues
- npm.io page: https://npm.io/package/mvloader

## Dependencies (2)

- [mvtools](https://npm.io/package/mvtools.md) ^1.1.2
- [js-middleware](https://npm.io/package/js-middleware.md) ^0.3.1

## Recent versions

- 1.0.10 (latest) — 2021-06-21
- 1.0.9 — 2021-03-30
- 1.0.8 — 2021-02-08
- 1.0.7 — 2020-09-24
- 1.0.6 — 2020-08-03
- 1.0.5 — 2020-03-12
- 1.0.4 — 2020-03-09
- 1.0.3 — 2020-03-05
- 1.0.2 — 2020-02-26
- 1.0.1 — 2020-02-24
- 1.0.0 — 2020-02-07
- 0.0.1 — 2020-01-29

## README

# MVLoader
## Описание
Универсальный загрузчик для использования в качестве основы для проектов. Позволяет унифицировать подключение пакетов, 
классов, дополнительных сущностей.

## Тестовый проект
Для более простого понимания назначения данного пакета и начала работы с ним создан тестовый проект, доступный 
по [ссылке](https://github.com/mvoevodskiy/mvl-example-project): [https://github.com/mvoevodskiy/mvl-example-project](https://github.com/mvoevodskiy/mvl-example-project).

## Установка

```npm i mvloader --save```

## Класс MVLoaderBase
Используется в качестве совсем базовой основы.  
Подключает [MVTools](https://www.npmjs.com/package/mvtools) в качестве свойства объекта **MT**, упрощает загрузку 
конфига при создании экземпляра класса.  

Полезен для большинства вспомогательных классов проекта, например, контроллеров.
Большинство пакетов _mvl-*_ экспортируют классы, унаследованные от **MVLoaderBase**.

Подключение в своем классе: 
```
const {MVLoaderBase} = require('mvloader');
```

Свойства класса:
* _static_ **exportConfig** - экспортируемая из класса конфигурация. Используется при загрузке класса через MVLoader. 
Подробнее в разделе **"Класс MVLoader" - "Загрузка конфигурации классов"**;
* **MT** - экземпляр класса [MVTools](https://www.npmjs.com/package/mvtools) (вспомогательные методы);
* **caption** - название объекта (экземпляра класса) при его внедрении в глобальный объект **process**. Подробнее в разделе 
**"Класс MVLoader" - "Загрузка классов"**;
* **config** - объект конфигурации.

Методы класса:
* **loadConfig(config)** - загружает объект конфигурации, объединяет с загруженной ранее конфигурацией;
* **init()** - метод базовой инициализации;
* **initFinish()** - метод завершения инциализации. Вызывается после того, как выполнилась базовая инициализация всех
подключенных в проекте классов.

### Пример использования
```
const {MVLoaderBase} = require('mvloader');

class MvlUsersSemis extends MVLoaderBase{
    static exportConfig = {
        ext: {
            classes: {
                semis: {},
                controllers: {
                    mvlUsers: require('./controllers/mvluserscontroller'),
                },
                handlers: {},
            },
            configs: {
                controllers: {},
                handlers: {
                    DBHandler: {
                        sequelize: {},
                        models: {
                            mvlUser: require('./models/mvlUser'),
                        }
                    }
                },
                semis: {},
            }
        },
    };

    constructor (App, ...config) {
        let localDefaults = {};
        super(localDefaults, ...config);
        this.App = App;
    }

    async init() {
        super.init();
    }

    async initFinish() {
        super.initFinish();
    }

}

module.exports = MvlUsersSemis;

```

## Класс MVLoader
Основной класс загрузчика, который необходимо наследовать в проектах.
Наследует **MVLoaderBase**.

Подключение в проекте: 
```
const {MVLoader} = require('mvloader');
```

Свойства класса:
* **ext** - объект, хранилище для инициализированных экземпляров всех подключенных классов;
* **DB** - активное подключение к базе данных, если применимо;
* **services** - объект для упрощенного доступа к некоторым инициализированным экземплярам подключенных классов;

Методы класса:
* 

### Подключение классов
#### Загрузка классов

Все подключенные классы должны указываться в секции **ext.classes** конфигурации. 
Подключаемые пакеты и классы условно разделяются на следующие типы:
* **semis** - пакеты-"заготовки", экспортирующие сразу несколько сущностей, необязательно только классы. Как правило, 
именно пакеты типа _semis_ наибольшим образом расширяют конфигурацию проекта, влияя, в том числе, на конфигурации 
другие классов;
* **controllers** - пакеты или классы, реализующие определенную логику;
* **handlers** - пакеты или классы, являющиеся обертками над сторонними библиотеками.  

Помимо указанных типов, допустимы любые другие, специфичные для проекта.  

_Рекомендовано придерживаться такого разделения при создании новых публичных пакетов._

Все классы, в соответствии со своим типом, инициализируются последовательно. Перед созданием нового экземпляра из класса 
экспортируется статический объект конфигурации **exportConfig**, который совмещается с основной конфигурацией проекта.

Такой подход позволяет при подключении, к примеру, основного класса пакета, не беспокоиться о подключении остальных 
классов, моделей и иных сущностей, если они указаны в экспортируемой конфигурации.

В примере выше (в разделе **"Класс MVLoaderBase" - "Пример использования"**) показан экспортируемый объект конфигурации
с  подключенными классами и моделями БД.

#### Загрузка конфигурации классов
При создании новых объектов из подключенных классов им передается объект конфигурации, расположенный, аналогично классу, 
в ветке **ext.configs**.

**Пример:** если подключенный класс доступен в конфигурации через **ext.classes.handlers.DBHandler**, то его 
конфигурация должна быть доступна через **ext.configs.handlers.DBHandler**.

Как и в случае непосредственно с классами, экспортироваться может и конфигурация сторонних классов. Таким образом 
становится возможным подготовка пакетов, которые действуют как единое целое.

***Важно:***  порядок указания подключаемых пакетов и классов в конфигурации имеет значение, так как при появлении 
одинаковых ключей они перезаписываются в порядке следования. Это позволяет переопределять, к примеру,
отдельные параметры конфигурации по умолчанию новыми значениями. 

#### "Прикрепление" экземпляров классов к process
Если в классе есть непустое свойство **caption**, то экземпляр данного класса будет доступен через **process[caption]**. 
Такой прием использован для значительного упрощения поиска методов по их строковому пути.

К примеру, в классе **mvlUsersController** свойство **caption** имеет значение _mvlUsers_, а в классе определен метод 
**isRegistered**. Тогда получить данный метод для последующего выполнения будет возможно так:
```
let method = this.MT.extract('mvlUsers.isRegistered');
if (method) {
    return method();
}
```

---
_Source: https://npm.io/package/mvloader · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
