import type { Component } from 'vue'; /** * Мапа адаптеров вебкам-провайдеров: ключ провайдера → компонент-обёртка. * * Обёртка знает ТОЛЬКО про формат данных своего провайдера и приводит его к * нормализованной модели, которую рисует `WebcamCard`. Блок обращается к * адаптеру через ``, поэтому: * - блок не импортирует обёртки и не содержит условий по провайдеру; * - новый фид подключается двумя шагами: своя обёртка + строка в этой мапе; * - активный провайдер задаётся конфигом (`config/webcams.config.ts`) или env. * * Значения — асинхронные импорты, а не имена компонентов: имя из конфига * вычисляется в рантайме, а `resolveComponent` по вычисленному имени не работает * (Nuxt не видит его статически и выкидывает компонент из бандла). При этом * ленивый импорт сохраняет главное свойство мапы — в бандл попадает только тот * адаптер, который реально понадобился. */ export const WEBCAM_ADAPTERS: Record Promise> = { stripcash: () => import('../../components/webcam/stripcash-card.vue').then(module => module.default), }; /** Фолбэк на первый зарегистрированный адаптер: неизвестный провайдер не должен ронять блок. */ export function resolveWebcamAdapter(provider?: string): () => Promise { if (provider && WEBCAM_ADAPTERS[provider]) { return WEBCAM_ADAPTERS[provider]; } return Object.values(WEBCAM_ADAPTERS)[0]; }