import { type BaseModuleState } from './types'; /** * Хелпер для удобного описания типов compat модулей * @example (window as WindowWithModule).myAwesomeModule = { ... }; */ export type WindowWithModule = typeof window & { [key: string]: ModuleType; }; export type ModuleMountFunction = (targetNode: HTMLElement, runParams: RunParams, serverState: ServerState) => void; export type ModuleUnmountFunction = (targetNode: HTMLElement) => void; /** * Специальный тип модуля, который можно монтировать на страницу * @template RunParams параметры, которые передаются в модуль с клиента * @template ServerState состояние модуля, которое пришло с сервера */ export type MountableModule = { /** * Метод, с помощью которого модуль может прикрепиться к DOM * @param targetNode DOM-нода, к которой нужно прикрепить модуль * @param runParams параметры, которые передаются в модуль с клиента * @param serverState состояние модуля, которое пришло с сервера */ mount: ModuleMountFunction; /** * Метод, с помощью которого модуль должен открепиться от DOM * @param targetNode DOM-нода, от которой нужно открепить модуль */ unmount: ModuleUnmountFunction; /** * Опциональный метод: модуль должен "оживить" (hydrate) серверную разметку, * находящуюся внутри targetNode, вместо её замены. * Типичная реализация: ReactDOM.hydrateRoot(targetNode, ). * * Если метод отсутствует у серверно-отрендеренного модуля — mounter очищает outlet * и вызывает `mount()` (корректно, но с визуальным миганием). * @param targetNode DOM-нода с серверной разметкой модуля * @param runParams параметры, которые передаются в модуль с клиента * @param serverState состояние модуля, которое пришло с сервера */ hydrate?: ModuleMountFunction; /** * Опциональный метод: обновить уже смонтированный модуль новыми параметрами * без полного перемонтирования (не теряя фокус/состояние DOM). * Типичная реализация: root.render(). * * Если метод отсутствует — mounter сохраняет текущее поведение с перемонтированием * при изменении runParams. * @param targetNode DOM-нода, к которой прикреплён модуль * @param runParams новые параметры, которые передаются в модуль с клиента * @param serverState состояние модуля, которое пришло с сервера */ update?: ModuleMountFunction; }; /** * Хелпер для удобного описания mountable compat модулей */ export type WindowWithMountableModule = WindowWithModule; /** * Специальный тип модуля, который является фабрикой * @template ServerState состояние модуля, которое пришло с сервера * @template RunParams параметры, которые передаются в модуль с клиента * @template ReturnType тип, который возвращает фабрика */ export type FactoryModuleFunction = { (runParams: RunParams, serverState: ServerState): ReturnType; }; export type FactoryModule = FactoryModuleFunction | { factory: FactoryModuleFunction; mount: never; } | { mount: FactoryModuleFunction; factory: never; }; export type WindowWithFactoryModule = WindowWithModule;