Skip to main content
@xnlc/types: единый источник типов для всего монорепозитория Xneon Launcher. Все остальные пакеты (@xnlc/core, @xnlc/mods, @xnlc/servers, @xnlc/skins, @xnlc/nbt) и Electron main/renderer импортируют типы отсюда. Это исключает дублирование определений и обеспечивает согласованность между процессами. Пакет чисто типовой: не содержит runtime-кода, только TypeScript-интерфейсы и type-алиасы. Используется как devDependency или dependency во всех ESM-пакетах проекта.

Установка

Добавьте в проект .npmrc (если еще не добавлен):

Структура типов

Типы организованы по доменам. Основной файл src/index.ts реэкспортирует все группы:

Доменные типы (domain-types.ts)

Типы скинов (laby.ts)

Типы модов (mod-types.ts)

Типы запуска (launch-types.ts)

Типы воркера (worker-types.ts)

Воркер запуска находится в electron/main/minecraft-launch-worker.ts. Он изолирует длительные операции (скачивание, установка) от main-процесса Electron.

Типы серверов (server-types.ts)

IPC-контракты (ipc-contracts.ts)

Самая важная часть @xnlc/types для разработки лаунчера. IpcInvokeMap и IpcEventMap являются единственным источником правды для всех каналов IPC между Electron main и renderer.

IpcInvokeMap

Каждый invoke-канал описывает кортеж аргументов и возвращаемый тип:
Ключевые группы каналов:

IpcEventMap

Event-каналы для подписки (ipcRenderer.on):

ElectronAPIExplicit и ElectronAPIExtra

ElectronAPIExplicit содержит типизированные обертки всех invoke-каналов в формате camelCase (launchMinecraft, getMinecraftVersions, modsModrinthSearch и т.д.). ElectronAPIExtra добавляет специфичные для лаунчера методы, которые исторически жили в src/electron.d.ts. Полный ElectronAPI объединяет explicit + extra + window control (minimize, maximize, close, restore).

Как добавить новый IPC-канал

Чтобы добавить новый канал связи между main и renderer:
1

Добавить тип в IpcInvokeMap или IpcEventMap

Откройте packages/xnlc-types/src/ipc-contracts.ts и добавьте запись в соответствующий интерфейс:
2

Обновить ElectronAPIExplicit

Добавьте camelCase метод в ElectronAPIExplicit:
3

Реализовать обработчик в main

Создайте (или дополните) файл в electron/main/my-domain/:
4

Добавить мост в preload

В electron/preload.ts зарегистрируйте метод:
5

Добавить тип в electron.d.ts

В src/electron.d.ts (или где объявлен window.electronAPI) добавьте:
6

Использовать в renderer

Теперь канал доступен через window.electronAPI:
Все 5 мест (ipc-contracts.ts, ElectronAPIExplicit, preload.ts, обработчик в electron/main/, electron.d.ts) должны быть синхронизированы. @xnlc/types гарантирует консистентность типов, но runtime-регистрацию нужно обновлять вручную.
Каналы с префиксом minecraft: (запуск, остановка, прогресс) обрабатываются воркером electron/main/minecraft-launch-worker.ts. Они изолированы от основного main-процесса для предотвращения блокировки UI при длительных операциях.

BuildLoaderRequirementIssue

Специальные типы для проверки совместимости модов с версией загрузчика:
Эти типы используются каналом mods:check-loader-requirements, который читает declared dependencies прямо из JAR-файлов модов и сравнивает их с установленной версией загрузчика.

Пример: типобезопасный IPC