<commit_before># @ts-stack/mod

`@ts-stack/mod` є Node.js веб-фреймворком, в назві якого слово `mod` означає хорошу модульність.
Ця модульність забезпечується, у великій мірі, завдяки системі [Dependency Injection][1].

## Зміст

- [Встановлення](#встановлення)

## Встановлення

Мінімальний базовий набір для роботи застосунку `@ts-stack/mod` має репозиторій [mod-seed][2].
Клонуйте його та встановіть залежності:

```bash
git clone <EMAIL>:ts-stack/mod-seed.git my-app
cd my-app
npm i
```

Окрім цього, можете проглянути більше прикладів у теці [examples][4].

## Запуск

```bash
npm start
```

## Ознайомлення

Рідний Node.js веб-сервер надає мінімальну функціональність для прийому HTTP-запитів та відправки HTTP-відповідей. Він не надає систем роутінгу, парсингу тіла запиту, логування, обробки помилок, тестування. І оскільки в реальних застосунках уся перерахована функціональність є базовою, виникає потреба у додатковому веб-фреймворку. З іншого боку, якщо все-таки певний веб-фреймворк надає перераховані системи, то йому також необхідно забезпечити гнучкий механізм заміни цих систем на інші системи, що будуть більш доречними чи більш зручними для конкретного розробника.

Із коробки, `@ts-stack/mod` надає базовий роутинг та парсинг, але по великому рахунку, головною його особливістю є інтеграція рідного Node.js веб-сервера з модулем [Dependency Injection][1] (скорочено - DI), що і надає той згаданий гнучкий механізм заміни. Завдяки цьому механізму, дуже суттєво спрощується тестування.

Окрім цього, DI забезпечує ієрархічну модульність. Це означає, що ви можете оголошувати сервіси з областю видимості та з періодом життя їхнього сінглтону: або на рівні усього застосунку, або на рівні конкретного модуля, або на рівні конкретного контролера. Причому рівень області видимості конкретного сервісу може і не співпадати із рівнем періоду  синглтону цього сервісу. Наприклад, на рівні застосунку можна оголосити сервіс, синглтони якого будуть створюватись при кожному запиті, тобто при кожному створенні інстанса будь-якого контролера.

## Зауваження

- Провайдери, оголошені на рівні застосунку, не повинні запитувати у своїх конструкторах провайдерів,
оголошених на нижчому рівні (модуля чи запиту), оскільки вони створюються один раз - при ініціалізації застосунку.
- Щоб оголосити провайдери у глобальному просторі на будь-якому рівні (на рівні застосунку, модуля чи запиту),
спочатку потрібно:
  - або оголосити провайдери у кореневому модулі на потрібному рівні
  - або імпортувати модуль із потрібним провайдером у кореневий модуль
Після чого необхідно еспортувати ці провайдери, або модулі із цими провадерами.


[1]: https://github.com/ts-stack/di
[2]: https://github.com/ts-stack/mod-seed
[3]: https://github.com/ts-stack/mod
[4]: https://github.com/ts-stack/mod/tree/master/examples<commit_msg>Simplifying readme<commit_after># @ts-stack/mod

`@ts-stack/mod` є Node.js веб-фреймворком, в назві якого слово `mod` означає хорошу модульність.
Ця модульність забезпечується, у великій мірі, завдяки системі [Dependency Injection][1].

## Зміст

- [Встановлення](#встановлення)

## Встановлення

Мінімальний базовий набір для роботи застосунку `@ts-stack/mod` має репозиторій [mod-seed][2].
Клонуйте його та встановіть залежності:

```bash
git clone <EMAIL>:ts-stack/mod-seed.git my-app
cd my-app
npm i
```

Окрім цього, можете проглянути більше прикладів у теці [examples][4].

## Запуск

```bash
npm start
```

## Ознайомлення

Рідний Node.js веб-сервер надає мінімальну функціональність для прийому HTTP-запитів та відправки HTTP-відповідей. Він не надає систем роутінгу, парсингу тіла запиту, логування, обробки помилок, тестування. І оскільки в реальних застосунках уся перерахована функціональність є базовою, виникає потреба у додатковому веб-фреймворку. З іншого боку, якщо все-таки певний веб-фреймворк надає перераховані системи, то йому також необхідно забезпечити гнучкий механізм заміни цих систем на інші системи, що будуть більш доречними чи більш зручними для конкретного розробника.

Із коробки, `@ts-stack/mod` надає базовий роутинг та парсинг, але по великому рахунку, головною його особливістю є інтеграція рідного Node.js веб-сервера з модулем [Dependency Injection][1] (скорочено - DI), що і надає той згаданий гнучкий механізм заміни. Завдяки цьому механізму, дуже суттєво спрощується тестування.

Окрім цього, DI забезпечує ієрархічну модульність. Це означає, що ви можете оголошувати сервіси з областю видимості: або на рівні усього застосунку, або на рівні конкретного модуля, або на рівні конкретного контролера.
1. Якщо сервіс оголошено на рівні застосунку, то сінглтон цього сервісу буде створено один єдиний раз при старті застосунку.
2. Сервіс на рівні модуля може створюватись декілька разів, якщо його буде імпортовано в декілька різних модулів, і в кожному із цих модулів буде свій окремий сінглтон.
3. Сервіс на рівні конкретного контролера буде створюватись при кожному створенні інстансу цього контролера, тобто при кожному запиті (по відповідному маршруті).

## Зауваження

- Провайдери, оголошені на рівні застосунку, не повинні запитувати у своїх конструкторах провайдерів,
оголошених на нижчому рівні (модуля чи запиту), оскільки вони створюються один раз - при ініціалізації застосунку.
- Щоб оголосити провайдери у глобальному просторі на будь-якому рівні (на рівні застосунку, модуля чи запиту),
спочатку потрібно:
  - або оголосити провайдери у кореневому модулі на потрібному рівні
  - або імпортувати модуль із потрібним провайдером у кореневий модуль
Після чого необхідно еспортувати ці провайдери, або модулі із цими провадерами.


[1]: https://github.com/ts-stack/di
[2]: https://github.com/ts-stack/mod-seed
[3]: https://github.com/ts-stack/mod
[4]: https://github.com/ts-stack/mod/tree/master/examples
{'fraction_non_alphanumeric': 0.06927606511950121, 'fraction_numerical': 0.0032906130931763078, 'mean_word_length': 5.25, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 8, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2674342', 'n_tokens_mistral': 2488, 'n_tokens_neox': 3238, 'n_words': 692}