Структура файлов библиотеки

Исходный пакет Tom Select организован вокруг нескольких ключевых каталогов и файлов, каждый из которых отвечает за отдельный слой функциональности: ядро, стили, плагины, сборку и типизацию. Такая структура обеспечивает модульность, упрощает поддержку и позволяет подключать библиотеку как в минимальной конфигурации, так и в расширенных сценариях.

На верхнем уровне располагаются служебные файлы, определяющие поведение пакета в экосистеме npm и инструментов сборки.

package.json содержит метаданные библиотеки, список зависимостей, точки входа и скрипты сборки. Через него определяется, какие файлы считаются основными экспортами, а также какие версии среды JavaScript поддерживаются.

README и лицензия фиксируют базовую документацию и юридические условия использования. Несмотря на то что эти файлы не участвуют в исполнении кода, они формируют контекст распространения библиотеки.

Конфигурации сборки (например, настройки для Rollup, Vite или аналогичных инструментов) описывают процесс трансформации исходного кода в производственные бандлы.

Каталог исходного кода (src)

Основная логика Tom Select сосредоточена в каталоге исходников. Он построен по принципу разделения ядра и расширений.

Ядро компонента

Ядро отвечает за базовую функциональность: создание кастомного select-элемента, управление состоянием, обработку событий и взаимодействие с DOM.

Внутри ядра обычно выделяются следующие слои:

  • инициализация инстанса и парсинг входных данных;
  • управление списком опций;
  • механизм выбора и снятия выбора;
  • обработка пользовательского ввода;
  • синхронизация состояния с оригинальным HTML-элементом.

Логика ядра стремится оставаться независимой от визуального представления, что позволяет переиспользовать её в разных UI-реализациях.

Система событий

Отдельный модуль внутри src отвечает за события. Он реализует паттерн pub/sub, обеспечивая реактивность интерфейса.

События включают:

  • изменение выбора;
  • открытие и закрытие списка;
  • ввод текста;
  • добавление и удаление элементов.

Разделение событийной модели позволяет подключать внешние расширения без модификации ядра.

Управление данными

Модуль данных отвечает за нормализацию входных источников: массивов, объектов и удалённых API-ответов. Внутри реализуются:

  • преобразование структур данных в унифицированные опции;
  • фильтрация и сортировка;
  • кеширование результатов.

Этот слой изолирует логику работы с данными от пользовательского интерфейса.

Плагины (plugins)

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

Типичные категории плагинов:

  • управление тегами и множественным выбором;
  • автодополнение и поиск;
  • создание новых опций пользователем;
  • ограничения выбора (лимиты, уникальность);
  • визуальные модификации поведения списка.

Плагины внедряются через систему расширения прототипа или композицию функций. Такая модель позволяет комбинировать несколько расширений одновременно без конфликтов при корректной реализации зависимостей.

Стили (css)

Каталог стилей содержит базовое оформление интерфейса компонента.

Основные особенности структуры CSS:

  • разделение на базовые стили контейнера;
  • оформление выпадающего списка;
  • стилизация выбранных элементов (тегов);
  • состояния фокуса, hover и disabled;
  • адаптация под различные размеры компонентов.

CSS построен таким образом, чтобы не навязывать жесткую визуальную систему. Основная цель — обеспечить нейтральный слой, который может быть переопределён в пользовательских темах.

Отдельное внимание уделяется классовой структуре, где каждый функциональный элемент имеет стабильный класс, используемый как точка расширения стилизации.

Сборочные файлы (dist)

Каталог dist содержит готовые к использованию версии библиотеки.

Обычно присутствуют несколько вариантов сборки:

  • полный бандл с включёнными зависимостями;
  • минимизированная production-версия;
  • модульные сборки (ESM, CommonJS);
  • версии без стилей или с внешним подключением CSS.

Такая организация позволяет использовать библиотеку как в современных сборщиках, так и в классических сценариях подключения через CDN.

Минифицированные файлы оптимизированы для уменьшения размера и ускорения загрузки, тогда как неминифицированные используются для отладки.

Типизация (types)

Для TypeScript-среды предоставляются декларационные файлы.

Основные элементы типизации:

  • интерфейсы конфигурации инстанса;
  • описание структуры опций;
  • типы событий и их payload;
  • расширения для плагинов.

Наличие типизации позволяет интегрировать библиотеку в строго типизированные проекты без дополнительных адаптеров.

Внутренние утилиты

Внутри исходного кода присутствует набор вспомогательных функций, вынесенных в отдельные модули.

К таким утилитам относятся:

  • работа с DOM (создание, удаление, поиск элементов);
  • функции для обработки строк и нормализации текста;
  • вспомогательные методы для сравнения значений;
  • инструменты управления массивами и коллекциями.

Выделение утилит в отдельный слой снижает связанность кода и упрощает тестирование.

Архитектурные зависимости между файлами

Структура файлов построена по принципу направленных зависимостей:

  • ядро не зависит от UI-слоя;
  • плагины зависят от ядра, но не изменяют его напрямую;
  • стили не влияют на бизнес-логику;
  • сборочные файлы формируются поверх исходной структуры без её изменения.

Такое разделение обеспечивает предсказуемость поведения и облегчает сопровождение кода при масштабировании проекта.