/* eslint-disable @typescript-eslint/no-explicit-any */ import type { LanguageTag as LanguageTag_defaultSet, MessageKey as MessageKey_defaultSet, } from 'keycloakify/login/i18n/messages_defaultSet/types'; import { type ReturnTypeOfCreateUseI18n, createUseI18n } from './useI18n'; export type I18nBuilder< ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never, ExcludedMethod extends 'withThemeName' | 'withExtraLanguages' | 'withCustomTranslations' = never, > = Omit< { withThemeName: () => I18nBuilder< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withThemeName' >; withExtraLanguages: (extraLanguageTranslations: { [LanguageTag in LanguageTag_notInDefaultSet]: { label: string; getMessages: () => Promise<{ default: Record; }>; }; }) => I18nBuilder< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withExtraLanguages' >; withCustomTranslations: ( messagesByLanguageTag_themeDefined: Partial<{ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record< MessageKey_themeDefined, string | Record >; }>, ) => I18nBuilder< ThemeName, MessageKey_themeDefined, LanguageTag_notInDefaultSet, ExcludedMethod | 'withCustomTranslations' >; build: () => ReturnTypeOfCreateUseI18n; }, ExcludedMethod >; function createI18nBuilder< ThemeName extends string = never, MessageKey_themeDefined extends string = never, LanguageTag_notInDefaultSet extends string = never, >(params: { extraLanguageTranslations: { [LanguageTag in LanguageTag_notInDefaultSet]: { label: string; getMessages: () => Promise<{ default: Record; }>; }; }; messagesByLanguageTag_themeDefined: Partial<{ [LanguageTag in LanguageTag_defaultSet | LanguageTag_notInDefaultSet]: Record< MessageKey_themeDefined, string | Record >; }>; }): I18nBuilder { const i18nBuilder: I18nBuilder = { withThemeName: () => createI18nBuilder({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any, }), withExtraLanguages: (extraLanguageTranslations) => createI18nBuilder({ extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined as any, }), withCustomTranslations: (messagesByLanguageTag_themeDefined) => createI18nBuilder({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined, }), build: () => createUseI18n({ extraLanguageTranslations: params.extraLanguageTranslations, messagesByLanguageTag_themeDefined: params.messagesByLanguageTag_themeDefined, }), }; return i18nBuilder; } export const i18nBuilder = createI18nBuilder({ extraLanguageTranslations: {}, messagesByLanguageTag_themeDefined: {}, });