- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
 
- 
                keyboard_arrow_right keyboard_arrow_down
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
- 
                keyboard_arrow_right keyboard_arrow_down
 
 
- 
                
- 
                keyboard_arrow_right keyboard_arrow_down
- YCLIENTS
- Маркетплейс интеграций
- Плагинизация
- Руководство по созданию Frontend плагина
- Подготовка окружения
- Структура репозитория плагина
Структура репозитория плагина
Этот документ описывает структуру репозитория плагина для YCLIENTS.
Общая структура
Корневой директорией репозитория является директория с названием плагина. В зависимости от типа плагина, корневая директория может содержать:
- Только директорию frontend/(для плагинов, работающих только на стороне клиента).
- Только директорию backend/(для плагинов, работающих только на стороне сервера).
- Обе директории frontend/иbackend/(для плагинов, требующих работу как на клиенте, так и на сервере).
Пример структуры для плагина с фронтендом:
plugin-name/              # Корневая директория плагина
├── frontend/             # Директория фронтенд части плагина
│   ├── apps/             # Приложения плагина
│   ├── docs/             # Документация проекта
│   ├── dist/             # Собранные артефакты
│   ├── node_modules/     # Зависимости npm
│   ├── packages/         # Локальные пакеты
│   ├── tools/            # Инструменты разработки
│   ├── .eslintrc.js      # Конфигурация ESLint
│   ├── .gitignore        # Игнорируемые git файлы
│   ├── .prettierrc       # Конфигурация Prettier
│   ├── contract.json     # Контракт плагина
│   ├── package.json      # Зависимости и скрипты npm
│   ├── package-lock.json # Фиксированные версии зависимостей
│   └── README.md         # Основная документация
└── backend/              # Директория бэкенд части плагина (если требуется)
    └── ...               # Структура бэкенд части
Описание директорий и файлов
Директории
apps/
Основная директория с приложениями плагина. Каждое приложение представляет собой отдельный пакет плагина, который может быть встроен в различные части системы YCLIENTS. Каждое приложение имеет свою собственную структуру:
- package.json— зависимости и конфигурация приложения.
- src/— исходный код приложения.
- index.html— точка входа для приложения.
- tsconfig.json— конфигурация TypeScript для приложения.
- vite.config.mts— конфигурация сборки Vite.
Примеры приложений:
- color-picker-erp-settings— настройки плагина в ERP.
- color-picker-erp-timetable— интеграция с расписанием в ERP.
- color-picker-widget-timetable— интеграция с расписанием в виджетах.
docs/
Содержит всю документацию проекта, включая:
- Описание процесса CI/CD.
- Руководства по разработке.
- API документацию.
- Документацию по развертыванию.
dist/
Директория для собранных артефактов плагина. Содержит оптимизированные и минифицированные файлы, готовые к публикации.
packages/
Содержит локальные пакеты, используемые в проекте. Каждый пакет может иметь свою собственную конфигурацию и зависимости.
Доступные пакеты:
- api/— HTTP клиент и API утилиты.
- utils/— общие утилиты и системы событий.
tools/
Содержит инструменты и скрипты для разработки, сборки и тестирования плагина.
Доступные инструменты:
- vite/— конфигурация сборки Vite.
- typescript/— конфигурация TypeScript.
Конфигурационные файлы
.eslintrc.js
Конфигурация ESLint для статического анализа кода. Определяет правила линтинга и форматирования.
.prettierrc
Конфигурация Prettier для автоматического форматирования кода. Обеспечивает единообразный стиль кода.
contract.json
Определяет контракт плагина, который заполняется разработчиком плагина. Контракт содержит список пакетов (packages), которые представляют собой отдельные приложения плагина, и метаданные плагина.
Структура контракта:
- packages— объект, содержащий конфигурацию для каждого пакета плагина.- package-name— уникальное имя пакета, соответствующее директории в- apps/
- application— тип приложения, в которое встраивается пакет:- "erp"— для встраивания в ERP систему YCLIENTS.
- "widget"— для встраивания в виджеты YCLIENTS.
 
- areas— список зон интеграции в интерфейсе (массив строк):- ["root"]— основная область приложения.
- ["plugin-settings"]— область настроек плагина.
- ["erp-visit-modal-client-details"]— область деталей клиента в модальном окне посещения ERP.
 
 
- plugin-slug— уникальный идентификатор плагина в системе YCLIENTS.
Пример реального контракта:
{
  "packages": {
    "color-picker-erp-settings": {
      "application": "erp",
      "areas": ["plugin-settings"]
    },
    "color-picker-erp-timetable": {
      "application": "erp",
      "areas": ["root"]
    },
    "widget-masters-promo": {
      "application": "widget",
      "areas": ["root"]
    },
    "client-loyalty-card": {
      "application": "erp",
      "areas": ["erp-visit-modal-client-details"]
    },
    "timetable-record-client-name": {
      "application": "erp",
      "areas": ["erp-timetable-controls", "erp-timetable-record-client-name"]
    }
  },
  "plugin-slug": "color-picker-slug"
}
Важные замечания:
- Каждый пакет в packagesдолжен соответствовать директории вapps/
- Имена пакетов должны быть уникальными в рамках плагина.
- Типы приложений (application) определяют, где будет работать пакет.
- Зоны (areas) определяют одну или несколько точек интеграции в интерфейсе YCLIENTS для каждого пакета.
- plugin-slugдолжен быть уникальным среди всех плагинов в системе.
- Контракт является обязательным документом для публикации плагина.
package.json
Основной файл конфигурации npm, содержащий:
- Зависимости проекта.
- Скрипты для разработки и сборки.
- Метаданные проекта.
- Версионирование.
Структура приложения в apps/
Каждое приложение в директории apps/ имеет следующую структуру:
app-name/ ├── src/ │ ├── components/ # Vue компоненты │ ├── types/ # TypeScript типы │ ├── app.vue # Корневой компонент приложения │ ├── host.ts # Точка входа для хоста │ ├── index.ts # Основная точка входа │ └── plugin.ts # Конфигурация плагина ├── index.html # HTML шаблон ├── package.json # Зависимости приложения ├── tsconfig.json # Конфигурация TypeScript └── vite.config.mts # Конфигурация сборки
Правила работы с репозиторием
- Структура кода- Соблюдать модульную структуру.
- Следовать принципам чистой архитектуры.
- Использовать типизацию TypeScript.
- Поддерживать документацию в актуальном состоянии.
- Разделять код на frontend и backend части в соответствующих директориях.
- Создавать только необходимые директории (frontend и/или backend) в зависимости от типа плагина.
- Каждое приложение в apps/должно быть самодостаточным.
 
- Версионирование- Следовать семантическому версионированию.
- Обновлять версию в package.json
- Создавать теги для релизов.
 
- Зависимости- Фиксировать версии зависимостей в package-lock.json
- Регулярно обновлять зависимости.
- Проверять совместимость при обновлении.
 
- Фиксировать версии зависимостей в 
- Документация- Поддерживать актуальность README.md.
- Документировать все значимые изменения.
- Следовать стандартам документации.
 
- Сборка и тестирование- Использовать скрипты из package.json
- Следовать процессу CI/CD.
- Поддерживать тестовое покрытие.
 
- Использовать скрипты из 
Рекомендации по разработке
- Начало работы
npm install # Установка зависимостей npm run dev # Запуск в режиме разработки npm run build # Сборка проекта npm run test # Запуск тестов
- Добавление новых зависимостей
npm install <package> --save # Для production зависимостей npm install <package> --save-dev # Для development зависимостей 
- Создание нового приложения- Создать новую директорию в apps/
- Добавить конфигурацию в contract.json
- Настроить package.json,tsconfig.jsonиvite.config.mts
- Создать базовую структуру src/
 
- Создать новую директорию в 
- Обновление документации- Обновлять соответствующие файлы в docs/
- Следовать формату Markdown.
- Проверять корректность ссылок.
 
- Обновлять соответствующие файлы в 
- Работа с TypeScript- Использовать строгую типизацию.
- Следовать рекомендациям из tsconfig.json
- Документировать типы и интерфейсы.
 
Безопасность
- Конфиденциальные данные- Не хранить секреты в репозитории.
- Использовать переменные окружения.
- Следовать политике безопасности.
 
- Зависимости- Регулярно проверять уязвимости.
- Использовать только проверенные пакеты.
- Следить за обновлениями безопасности.
 
Поддержка
При возникновении вопросов или проблем:
- Проверить документацию в docs/
- Обратиться к команде разработки.
- Создать issue в репозитории.
- Следовать процессу code review.