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

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

# Класс PackageInitItem

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

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

- **Генерация файлов** — автоматически создает файлы на основе базовых образцов и специализированных шаблонов.
- **Динамическая замена контента** — автоматически разрешает такие плейсхолдеры, как `[name]` и `@packages/library` внутри сгенерированных файлов.
- **Интеграция с библиотекой** — автоматически генерирует точки входа и регистрирует компонент в глобальной библиотеке.
- **Управление зависимостями** — обновляет корневой `package.json`, включая новый пакет в зависимости (dependencies), экспорты (exports) и список файлов (files).
- **Автоматизация Storybook** — автоматически добавляет новые истории в конфигурацию Storybook.

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

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

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

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

const item = new PackageInitItem(
  'button',
  ['path', 'to', 'button'],
  'ui'
)
```

## Методы

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

- `make(): void` — выполняет полный цикл инициализации: создание файлов, обновление библиотеки, `package.json` и Storybook.

## Операции

### Рабочий процесс инициализации

При вызове `make()` класс выполняет следующие шаги по порядку:

1. **Создание структуры файлов**: получает файлы-образцы из директории media/templates на основе типа пакета `type`.
2. **Применение шаблонов**: если указаны конкретные `templates`, он загружает и применяет их.
3. **Запись файлов**: записывает обработанные файлы в целевую директорию, выполняя необходимые замены контента.
4. **Интеграция (Библиотека)**: если создается файл `library.ts`, он запускает автоматическую генерацию файлов экспорта в корне библиотеки.
5. **Интеграция (Пакет)**: обновляет корневой `package.json` для регистрации зависимости воркспейса и экспортов нового пакета.
6. **Интеграция (Storybook)**: сканирует конфигурацию Storybook и добавляет шаблоны для включения историй нового компонента.

### Внутренняя логика разрешения имен

Класс использует несколько внутренних помощников для разрешения имен:
- **`getName()`**: нормализует имя компонента для использования в контенте файлов.
- **`getCode()`**: преобразует имя в код через дефис для идентификаторов пакетов.
- **`getProjectName()`**: разрешает полное имя NPM-пакета, включая префикс дизайна.
