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

<Meta title='@dxtmisha/ru/scripts/Classes/DesignCommand - Базовый класс команд дизайна'/>

# Класс DesignCommand

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

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

- **Стандартизированное выполнение** — обеспечивает единую точку входа `make()` для всех задач генерации, связанных с дизайном.
- **Управление шаблонами** — включает встроенные методы для чтения образцов и применения трансформаций с использованием специализированных объектов замены.
- **Соглашения об именовании** — автоматически обрабатывает различные форматы имен (CamelCase, kebab-case и т.д.) как для компонентов, так и для проектов.
- **Структурная целостность** — использует `DesignStructure` для обеспечения соответствия сгенерированных файлов установленной иерархии дизайн-системы.
- **Интеграция с пакетами** — предоставляет утилиты для обновления `package.json` новыми конфигурационными данными.

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

Являясь абстрактным классом, `DesignCommand` не инициализируется напрямую, а наследуется конкретными реализациями команд.

**Параметры (для наследников):**
- `command: string` — идентификатор компонента или действия.
- `options: Record<string, string>` — дополнительные параметры конфигурации.

```typescript
// Пример конструктора наследника
class MyDesignCommand extends DesignCommand {
  constructor(command: string, options: Record<string, string>) {
    super(command, options)
  }
}
```

## Методы

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

- `make(): void` — запускает выполнение команды и основную логику инициализации.

### Защищенный API (для наследников)

- `isFile(name): boolean` — проверяет наличие файла в целевой директории.
- `read(name): string` — читает содержимое файла из целевой директории.
- `readSample(name): string` — читает файл шаблона из директории образцов.
- `readDefinable(name, callback?): DesignReplace` — читает файл, если он существует, в противном случае использует его шаблон.
- `write(name, value): void` — записывает или перезаписывает файл с указанным содержимым.
- `updatePackage(path, value): this` — обновляет конкретный ключ в `package.json` проекта.

## Операции

### Рабочий процесс выполнения команды

Метод `make()` следует строгому паттерну выполнения:
1. **Валидация**: проверяет, предоставлен ли идентификатор команды.
2. **Инициализация**: вызывает абстрактный метод `initMain()` (реализуется дочерними классами) для выполнения специфических файловых операций.
3. **Логирование**: обеспечивает вывод в консоль информации о начале и завершении команды.

### Разрешение имен

`DesignCommand` предоставляет несколько помощников для согласованного именования:
- `getName()`: возвращает имя команды в CamelCase.
- `getCode()`: возвращает имя команды в kebab-case.
- `getFullName()`: комбинирует префикс дизайна с именем команды.
- `getProjectName()`: возвращает стандартизированный идентификатор проекта.
