npm package: @spirex/js-boot
Description: Efficient JavaScript app initialization library with staged execution and dependency management
Author: Artem Sobolenkov
Latest version: 1.1.1

# Инициализатор JavaScript приложений
[![GitHub License](https://img.shields.io/github/license/spirex64/spirex-js?style=for-the-badge)](https://github.com/SpireX64/spirex-js/blob/main/packages/boot/LICENSE)
[![npm version](https://img.shields.io/npm/v/@spirex/js-boot.svg?style=for-the-badge)](https://www.npmjs.com/package/@spirex/js-boot)
[![TypeScript](https://img.shields.io/badge/ТайпСкрипт-007ACC?style=for-the-badge&logo=typescript&logoColor=white)](https://www.typescriptlang.org)

[**ИСТОРИЯ ИЗМЕНЕНИЙ**](https://github.com/SpireX64/spirex-js/blob/main/packages/boot/CHANGELOG.ru.md) ●
[**ДОКУМЕНТАЦИЯ**](https://github.com/SpireX64/spirex-js/blob/main/packages/boot/docs/ru/README.md) ●
[**ENG**](https://github.com/SpireX64/spirex-js/blob/main/packages/boot/README.md)

## Описание

Эта небольшая библиотека помогает решить проблему
инициализации приложений на JavaScript. 
Она может использоваться в любом JS проекте.

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

Если какой-либо этап инициализации приостановлен
на асинхронной задаче, инициализатор не ждет его завершения,
а берется за выполнение следующего этапа, при условии,
что связанные задачи этого этапа уже выполнены.

## Установка 

Последнюю версию библиотеки можно установить с помощью любого менеджера пакетов:
```shell
$ npm install @spirex/js-boot
# OR
$ yarn add @spirex/js-boot
# OR
$ bun i @spirex/js-boot
```

## Быстрый старт
### 1. Импорт класса инициализатора
Почти все операции выполняются с помощью класса `Boot`.
Поэтому его необходимо импортировать во все файлы,
где определяются задачи инициализации.
```ts
import { Boot } from '@spirex/js-boot';
```

### 2. Создание задач инициализации
Для создания задач инициализации используется метод `Boot.task()`.
В него передается функция, которая содержит исполняемый код задачи.
Функция может быть синхронной или асинхронной.
Имя задачи опционально, но поможет с логированием задач в консоль.

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

```ts
const taskA = Boot.task(async () => {
    console.log('Run task A');
    await someAsyncFunction();
});

const taskB = Boot.task(() => {
    console.log('Run task B');
}, [ taskA ]); // Зависит от 'A'
```

### 3. Создание инициализатора и добавление задач
В созданный инициализатор добавляются задачи с помощью метода `add(..)`.
Задачи можно добавлять по одной или сразу несколько в виде массива.
```ts
const boot = new Boot()
    .add([ taskA, taskB ])
```

### 4. Выполнение инициализации
После того как инициализатор создан и в него добавлены все необходимые
задачи для работы приложения, можно запустить процесс инициализации.
Метод `runAsync()` вернет Promise, который завершится когда все задачи будут выполнены.
```ts
await boot.runAsync();
console.log('Done!');
```
По умолчанию все задачи обязательны к выполнению.
Поэтому если одна из задач завершится с ошибок, процесс инициализации будет прерван
и будет брошено исключение об ошибке.