import {Meta} from '@storybook/addon-docs/blocks'

<Meta title='@dxtmisha/ru/scripts/Classes/PackageInit - Инициализатор пакета'/>

# Класс PackageInit

Класс `PackageInit` отвечает за базовую настройку структуры новых пакетов внутри дизайн-системы. Он управляет сканированием директорий и делегирует инициализацию отдельных файлов классу `PackageInitItem`, обеспечивая согласованную настройку окружения на основе предоставленных шаблонов и типов.

## Ключевые особенности

- **Автоматическое развертывание структуры** — автоматически создает необходимую иерархию папок для новых пакетов.
- **Инициализация на основе шаблонов** — поддерживает различные типы пакетов и наборы шаблонов для гибкой настройки окружения.
- **Рекурсивная работа с директориями** — идентифицирует и обрабатывает пустые или новые директории в корне пакета.
- **Управление жизненным циклом** — предоставляет единую точку входа для запуска всей последовательности инициализации.

## Инициализация

Для инициализации объекта вызовите конструктор `PackageInit(type, templates, dir)`.

**Параметры:**
- `type: string` — идентификатор типа пакета (например, `'functional'`, `'ui'`).
- `templates?: string` — необязательный список шаблонов (через запятую) для применения.
- `dir: string` — базовая директория, где расположены пакеты (по умолчанию `UI_DIR_PACKAGES`).

```typescript
import { PackageInit } from '@dxtmisha/scripts'

// Инициализация для 'functional' пакета с набором шаблонов
const initializer = new PackageInit('functional', 'basic,test')
```

## Методы

### Управление

- `make(): void` — запускает процесс инициализации для всех идентифицированных директорий по целевому пути.

## Операции

### Подробный процесс инициализации

Метод `make()` следует определенной последовательности для обеспечения чистой настройки пакета:

1. **Сканирование**: сканирует целевую директорию `dir` для поиска подпапок, требующих инициализации (обычно пустых).
2. **Делегирование**: для каждой найденной директории создает экземпляр `PackageInitItem`.
3. **Выполнение**: запускает метод `make()` у каждого `PackageInitItem`, который отвечает за фактическое создание файлов и применение шаблонов.

### Поиск целевых директорий

Класс использует внутренний метод `getDirs()` для поиска директорий, которые являются "пустыми" (не содержат подпапок), и которые затем обрабатываются как корни новых компонентов пакета.
```typescript
protected getDirs(): string[] {
  return PropertiesFile.readDir(this.dir)
    .filter(
      path => PropertiesFile.readDir([this.dir, path]).length === 0
    )
}
```
