{"version":3,"sources":["../src/interpolator.ts","../src/plurals.ts","../src/translator.ts","../src/cache.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Interpolates variables within a string.\n *\n * Supports placeholders such as {name}, {count}, etc.\n *\n * @example\n * interpolate('Hello, {name}!', { name: 'Juan' }) // \"Hello, Juan!\"\n * interpolate('You have {n} items', { n: 5 }) // \"You have 5 items\"\n * interpolate('No variables') // \"No variables\"\n * interpolate('Missing {var}') // \"Missing {var}\"\n *\n * @param text - Text containing placeholders to replace\n * @param vars - Object with values to inject into the placeholders\n * @returns Text with interpolated variables\n */\nexport function interpolate(text: string, vars?: Record<string, string | number>): string {\n  // If no variables are provided, return the original text.\n  if (!vars || Object.keys(vars).length === 0) {\n    return text;\n  }\n\n  // Replace every {key} with its corresponding value.\n  return text.replace(/\\{([^}]+)\\}/g, (_match, key: string) => {\n    const value = vars[key];\n\n    // Leave the placeholder untouched when the variable is missing.\n    if (value === undefined) {\n      return `{${key}}`;\n    }\n\n    // Convert numbers to strings.\n    return String(value);\n  });\n}\n","/**\n * Pluralization rules based on CLDR.\n * Maps language codes to functions that determine the plural form index.\n */\n\ntype PluralRule = (n: number) => number;\n\n/**\n * Rule for languages with two forms: singular and plural.\n * Used by: English, Spanish, French, German, Italian, Portuguese.\n * Rule: n != 1\n */\nconst twoForms: PluralRule = (n: number): number => {\n  return n !== 1 ? 1 : 0;\n};\n\n/**\n * Rule for Polish.\n * Three plural forms.\n * Rule: n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n */\nconst polishRule: PluralRule = (n: number): number => {\n  if (n === 1) return 0;\n  if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) return 1;\n  return 2;\n};\n\n/**\n * Rule for Russian, Ukrainian, Serbian, Croatian, Belarusian.\n * Three plural forms.\n * Rule: n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2\n */\nconst russianRule: PluralRule = (n: number): number => {\n  if (n % 10 === 1 && n % 100 !== 11) return 0;\n  if (n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20)) return 1;\n  return 2;\n};\n\n/**\n * Rule for languages without pluralization.\n * Used by: Chinese, Japanese, Korean, Thai, Vietnamese, Indonesian, Malay.\n * Always returns 0.\n */\nconst noPlural: PluralRule = (): number => {\n  return 0;\n};\n\n/**\n * Rule for French.\n * Two forms: n > 1.\n */\nconst frenchRule: PluralRule = (n: number): number => {\n  return n > 1 ? 1 : 0;\n};\n\n/**\n * Rule for Romanian.\n * Three plural forms.\n * Rule: n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2\n */\nconst romanianRule: PluralRule = (n: number): number => {\n  if (n === 1) return 0;\n  if (n === 0 || (n % 100 > 0 && n % 100 < 20)) return 1;\n  return 2;\n};\n\n/**\n * Rule for Czech and Slovak.\n * Three plural forms.\n * Rule: n==1 ? 0 : (n>=2 && n<=4) ? 1 : 2\n */\nconst czechRule: PluralRule = (n: number): number => {\n  if (n === 1) return 0;\n  if (n >= 2 && n <= 4) return 1;\n  return 2;\n};\n\n/**\n * Map of language codes to pluralization rules.\n */\nconst pluralRules: Record<string, PluralRule> = {\n  // Languages with two forms (n != 1)\n  en: twoForms,\n  es: twoForms,\n  de: twoForms,\n  it: twoForms,\n  pt: twoForms,\n  nl: twoForms,\n  sv: twoForms,\n  da: twoForms,\n  no: twoForms,\n  fi: twoForms,\n  el: twoForms,\n  he: twoForms,\n  hu: twoForms,\n  tr: twoForms,\n\n  // French (n > 1)\n  fr: frenchRule,\n\n  // Polish\n  pl: polishRule,\n\n  // Russian, Ukrainian, Serbian, Croatian, Belarusian\n  ru: russianRule,\n  uk: russianRule,\n  sr: russianRule,\n  hr: russianRule,\n  be: russianRule,\n\n  // Czech, Slovak\n  cs: czechRule,\n  sk: czechRule,\n\n  // Romanian\n  ro: romanianRule,\n\n  // Languages without plural forms\n  zh: noPlural,\n  ja: noPlural,\n  ko: noPlural,\n  th: noPlural,\n  vi: noPlural,\n  id: noPlural,\n  ms: noPlural,\n};\n\n/**\n * Determine the plural form index based on locale and count.\n *\n * Based on CLDR (Common Locale Data Repository) rules.\n *\n * @example\n * getPluralIndex(1, 'en') // 0 (singular)\n * getPluralIndex(5, 'en') // 1 (plural)\n * getPluralIndex(1, 'ru') // 0\n * getPluralIndex(2, 'ru') // 1\n * getPluralIndex(5, 'ru') // 2\n * getPluralIndex(100, 'pl') // 2\n *\n * @param count - Number used to determine the plural form\n * @param locale - Locale code (e.g., 'es', 'en', 'ru')\n * @returns Index of the plural form (0, 1, 2, etc.)\n */\nexport function getPluralIndex(count: number, locale: string): number {\n  // Extract base language code (e.g., 'es-MX' -> 'es')\n  const lang = (locale.split('-')[0] ?? locale).toLowerCase();\n\n  // Find rule for the language\n  const rule = pluralRules[lang];\n\n  // If no specific rule, use default rule (2 forms)\n  if (!rule) {\n    return twoForms(count);\n  }\n\n  return rule(count);\n}\n","import type {\n  PolingoConfig,\n  TranslationCache,\n  TranslationCatalog,\n  TranslationLoader,\n  TranslationLookupResult,\n} from './types';\nimport { interpolate } from './interpolator';\nimport { getPluralIndex } from './plurals';\n\n/**\n * Main translation class\n *\n * Provides synchronous translation methods after async catalog loading\n */\nexport class Translator {\n  private locale: string;\n  private fallback: string;\n  private domain: string;\n  private debug: boolean;\n  private loader: TranslationLoader;\n  private cache: TranslationCache;\n  private catalogs: Map<string, TranslationCatalog>;\n\n  /**\n   * Creates a new Translator instance\n   *\n   * @param loader - Translation loader implementation\n   * @param cache - Cache implementation\n   * @param config - Configuration options\n   */\n  constructor(loader: TranslationLoader, cache: TranslationCache, config: PolingoConfig) {\n    this.loader = loader;\n    this.cache = cache;\n    this.locale = config.locale;\n    this.fallback = config.fallback ?? 'en';\n    this.domain = config.domain ?? 'messages';\n    this.debug = config.debug ?? false;\n    this.catalogs = new Map();\n  }\n\n  /**\n   * Load translation catalogs for one or more locales\n   *\n   * This is an async operation that should be called once at startup\n   *\n   * @param locales - Locale code(s) to load\n   * @throws Error if loading fails\n   */\n  async load(locales: string | string[]): Promise<void> {\n    const localeArray = Array.isArray(locales) ? locales : [locales];\n\n    for (const locale of localeArray) {\n      const key = `${locale}:${this.domain}`;\n\n      // Check cache first\n      const cached = this.cache.get(key);\n      if (cached) {\n        this.catalogs.set(key, cached);\n        if (this.debug) {\n          console.log(`[Polingo] Loaded catalog from cache: ${key}`);\n        }\n        continue;\n      }\n\n      // Load from loader\n      try {\n        const catalog = await this.loader.load(locale, this.domain);\n        this.catalogs.set(key, catalog);\n        this.cache.set(key, catalog);\n\n        if (this.debug) {\n          console.log(`[Polingo] Loaded catalog: ${key}`);\n        }\n      } catch (error) {\n        if (this.debug) {\n          console.warn(`[Polingo] Failed to load catalog: ${key}`, error);\n        }\n        throw new Error(\n          `Failed to load catalog for locale \"${locale}\" and domain \"${this.domain}\": ${error instanceof Error ? error.message : String(error)}`\n        );\n      }\n    }\n  }\n\n  /**\n   * Change the current locale\n   *\n   * If the locale is not loaded, it will be loaded automatically\n   *\n   * @param locale - New locale code\n   */\n  async setLocale(locale: string): Promise<void> {\n    if (!this.hasLocale(locale)) {\n      await this.load(locale);\n    }\n    this.locale = locale;\n\n    if (this.debug) {\n      console.log(`[Polingo] Locale changed to: ${locale}`);\n    }\n  }\n\n  /**\n   * Get the current locale\n   *\n   * @returns Current locale code\n   */\n  getLocale(): string {\n    return this.locale;\n  }\n\n  /**\n   * Check if a locale is loaded\n   *\n   * @param locale - Locale code to check\n   * @returns true if loaded, false otherwise\n   */\n  hasLocale(locale: string): boolean {\n    const key = `${locale}:${this.domain}`;\n    return this.catalogs.has(key);\n  }\n\n  /**\n   * Translate a message\n   *\n   * @param msgid - Message ID (original text)\n   * @param vars - Variables to interpolate\n   * @returns Translated text\n   *\n   * @example\n   * t('Hello') // returns the localized string for \"Hello\"\n   * t('Hello, {name}!', { name: 'Jane' }) // injects variables into the localized result\n   */\n  t(msgid: string, vars?: Record<string, string | number>): string {\n    return this.translate(msgid, '', vars);\n  }\n\n  /**\n   * Translate a message with context\n   *\n   * Context helps differentiate between identical strings with different meanings\n   *\n   * @param context - Message context\n   * @param msgid - Message ID (original text)\n   * @param vars - Variables to interpolate\n   * @returns Translated text\n   *\n   * @example\n   * tp('menu', 'File') // selects the translation for a menu label\n   * tp('verb', 'File') // selects the translation for the verb sense\n   */\n  tp(context: string, msgid: string, vars?: Record<string, string | number>): string {\n    return this.translate(msgid, context, vars);\n  }\n\n  /**\n   * Translate a message with pluralization\n   *\n   * @param msgid - Singular form\n   * @param msgidPlural - Plural form\n   * @param count - Number to determine plural form\n   * @param vars - Variables to interpolate (count is auto-added as 'n')\n   * @returns Translated text\n   *\n   * @example\n   * tn('{n} item', '{n} items', 1, { n: 1 }) // returns the singular translation\n   * tn('{n} item', '{n} items', 5, { n: 5 }) // returns the plural translation\n   */\n  tn(\n    msgid: string,\n    msgidPlural: string,\n    count: number,\n    vars?: Record<string, string | number>\n  ): string {\n    // Add count as 'n' variable\n    const fullVars = { ...vars, n: count };\n    return this.translatePlural(msgid, msgidPlural, count, '', fullVars);\n  }\n\n  /**\n   * Translate a message with context and pluralization\n   *\n   * @param context - Message context\n   * @param msgid - Singular form\n   * @param msgidPlural - Plural form\n   * @param count - Number to determine plural form\n   * @param vars - Variables to interpolate (count is auto-added as 'n')\n   * @returns Translated text\n   *\n   * @example\n   * tnp('items', '{n} file', '{n} files', 1, { n: 1 }) // picks the singular form within the given context\n   * tnp('items', '{n} file', '{n} files', 5, { n: 5 }) // picks the plural form within the given context\n   */\n  tnp(\n    context: string,\n    msgid: string,\n    msgidPlural: string,\n    count: number,\n    vars?: Record<string, string | number>\n  ): string {\n    // Add count as 'n' variable\n    const fullVars = { ...vars, n: count };\n    return this.translatePlural(msgid, msgidPlural, count, context, fullVars);\n  }\n\n  /**\n   * Clear the translation cache\n   */\n  clearCache(): void {\n    this.cache.clear();\n    if (this.debug) {\n      console.log('[Polingo] Cache cleared');\n    }\n  }\n\n  /**\n   * Internal method to translate a message\n   */\n  private translate(\n    msgid: string,\n    context: string,\n    vars?: Record<string, string | number>\n  ): string {\n    const result = this.findTranslation(msgid, context);\n\n    if (!result) {\n      if (this.debug) {\n        console.warn(\n          `[Polingo] Translation not found: \"${msgid}\" (context: \"${context}\", locale: \"${this.locale}\")`\n        );\n      }\n      return interpolate(msgid, vars);\n    }\n\n    // Get translated string\n    const { translation } = result;\n    const msgstr = Array.isArray(translation.msgstr) ? translation.msgstr[0] : translation.msgstr;\n\n    // If empty translation, return original\n    if (!msgstr) {\n      return interpolate(msgid, vars);\n    }\n\n    return interpolate(msgstr, vars);\n  }\n\n  /**\n   * Internal method to translate a plural message\n   */\n  private translatePlural(\n    msgid: string,\n    msgidPlural: string,\n    count: number,\n    context: string,\n    vars?: Record<string, string | number>\n  ): string {\n    const result = this.findTranslation(msgid, context);\n\n    if (!result || !Array.isArray(result.translation.msgstr)) {\n      if (this.debug) {\n        console.warn(\n          `[Polingo] Plural translation not found: \"${msgid}\" (context: \"${context}\", locale: \"${this.locale}\")`\n        );\n      }\n      // Fallback to original pluralization\n      const index = getPluralIndex(count, 'en');\n      const original = index === 0 ? msgid : msgidPlural;\n      return interpolate(original, vars);\n    }\n\n    // Get plural index based on locale\n    const { translation, locale } = result;\n    const pluralIndex = getPluralIndex(count, locale);\n    const msgstr = translation.msgstr[pluralIndex] ?? translation.msgstr[0];\n\n    // If empty translation, return original\n    if (!msgstr) {\n      const index = getPluralIndex(count, 'en');\n      const original = index === 0 ? msgid : msgidPlural;\n      return interpolate(original, vars);\n    }\n\n    return interpolate(msgstr, vars);\n  }\n\n  /**\n   * Find a translation in loaded catalogs\n   *\n   * Searches in current locale first, then falls back to fallback locale\n   */\n  private findTranslation(msgid: string, context: string): TranslationLookupResult | null {\n    // Try current locale\n    const currentKey = `${this.locale}:${this.domain}`;\n    const currentCatalog = this.catalogs.get(currentKey);\n\n    if (currentCatalog) {\n      const contextTranslations = currentCatalog.translations[context] ?? {};\n      const translation = contextTranslations[msgid];\n      if (translation) {\n        return { translation, locale: this.locale };\n      }\n    }\n\n    // Try fallback locale\n    if (this.locale !== this.fallback) {\n      const fallbackKey = `${this.fallback}:${this.domain}`;\n      const fallbackCatalog = this.catalogs.get(fallbackKey);\n\n      if (fallbackCatalog) {\n        const contextTranslations = fallbackCatalog.translations[context] ?? {};\n        const translation = contextTranslations[msgid];\n        if (translation) {\n          return { translation, locale: this.fallback };\n        }\n      }\n    }\n\n    return null;\n  }\n}\n","import type { TranslationCache, TranslationCatalog } from './types';\n\n/**\n * Simple in-memory cache backed by a Map.\n *\n * Optionally supports LRU-style eviction when a maximum size is provided.\n */\nexport class MemoryCache implements TranslationCache {\n  private cache: Map<string, TranslationCatalog>;\n  private maxSize: number;\n\n  /**\n   * Create a new MemoryCache instance.\n   *\n   * @param maxSize - Maximum number of entries to keep (0 = unlimited)\n   */\n  constructor(maxSize: number = 0) {\n    this.cache = new Map();\n    this.maxSize = maxSize;\n  }\n\n  /**\n   * Retrieve a catalog from the cache.\n   */\n  get(key: string): TranslationCatalog | undefined {\n    const catalog = this.cache.get(key);\n\n    // When using LRU semantics, move the entry to the end to mark it as most recent.\n    if (catalog && this.maxSize > 0) {\n      this.cache.delete(key);\n      this.cache.set(key, catalog);\n    }\n\n    return catalog;\n  }\n\n  /**\n   * Store a catalog in the cache.\n   *\n   * Evicts the oldest entry when the maximum size is reached.\n   */\n  set(key: string, catalog: TranslationCatalog): void {\n    // Remove existing entry first so iteration order updates.\n    if (this.cache.has(key)) {\n      this.cache.delete(key);\n    }\n\n    // If at capacity, remove the oldest entry (first key in the Map).\n    if (this.maxSize > 0 && this.cache.size >= this.maxSize) {\n      const firstKey = this.cache.keys().next().value;\n      if (firstKey !== undefined) {\n        this.cache.delete(firstKey);\n      }\n    }\n\n    this.cache.set(key, catalog);\n  }\n\n  /**\n   * Determine whether a catalog exists in the cache.\n   */\n  has(key: string): boolean {\n    return this.cache.has(key);\n  }\n\n  /**\n   * Remove all cached catalogs.\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Current number of cached catalogs.\n   */\n  get size(): number {\n    return this.cache.size;\n  }\n}\n\n/**\n * Cache entry with expiration metadata.\n */\ninterface CacheEntry {\n  catalog: TranslationCatalog;\n  expiry: number; // Expiration timestamp in milliseconds\n}\n\n/**\n * Cache implementation with time-based expiration (TTL).\n *\n * Entries are automatically removed after the configured lifetime.\n */\nexport class TtlCache implements TranslationCache {\n  private cache: Map<string, CacheEntry>;\n  private ttlMs: number;\n\n  /**\n   * Create a new TtlCache instance.\n   *\n   * @param ttlMs - Time to live in milliseconds (default: 1 hour)\n   */\n  constructor(ttlMs: number = 3600000) {\n    this.cache = new Map();\n    this.ttlMs = ttlMs;\n  }\n\n  /**\n   * Retrieve a catalog from the cache.\n   *\n   * Returns undefined when the entry has expired.\n   */\n  get(key: string): TranslationCatalog | undefined {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return undefined;\n    }\n\n    // Remove expired entry.\n    if (Date.now() > entry.expiry) {\n      this.cache.delete(key);\n      return undefined;\n    }\n\n    return entry.catalog;\n  }\n\n  /**\n   * Store a catalog with an expiration timestamp.\n   */\n  set(key: string, catalog: TranslationCatalog): void {\n    const entry: CacheEntry = {\n      catalog,\n      expiry: Date.now() + this.ttlMs,\n    };\n\n    this.cache.set(key, entry);\n  }\n\n  /**\n   * Check whether a non-expired catalog exists in the cache.\n   */\n  has(key: string): boolean {\n    const entry = this.cache.get(key);\n\n    if (!entry) {\n      return false;\n    }\n\n    // Remove expired entry.\n    if (Date.now() > entry.expiry) {\n      this.cache.delete(key);\n      return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Remove all cached catalogs.\n   */\n  clear(): void {\n    this.cache.clear();\n  }\n\n  /**\n   * Remove all expired entries from the cache.\n   *\n   * @returns Number of pruned entries\n   */\n  prune(): number {\n    const now = Date.now();\n    let pruned = 0;\n\n    for (const [key, entry] of this.cache.entries()) {\n      if (now > entry.expiry) {\n        this.cache.delete(key);\n        pruned++;\n      }\n    }\n\n    return pruned;\n  }\n\n  /**\n   * Current number of cached catalogs.\n   */\n  get size(): number {\n    return this.cache.size;\n  }\n}\n\n/**\n * Cache implementation that never stores anything.\n *\n * Useful for tests or when caching is disabled.\n */\nexport class NoCache implements TranslationCache {\n  /**\n   * Always returns undefined.\n   */\n  get(_key: string): TranslationCatalog | undefined {\n    return undefined;\n  }\n\n  /**\n   * No-op.\n   */\n  set(_key: string, _catalog: TranslationCatalog): void {\n    // No-op\n  }\n\n  /**\n   * Always returns false.\n   */\n  has(_key: string): boolean {\n    return false;\n  }\n\n  /**\n   * No-op.\n   */\n  clear(): void {\n    // No-op\n  }\n}\n","import { Translator } from './translator';\nimport type { PolingoConfig, TranslationLoader, TranslationCache } from './types';\n\n/**\n * Helper function to create a configured Translator instance\n *\n * @param loader - Translation loader implementation\n * @param cache - Cache implementation\n * @param config - Configuration options\n * @returns Configured Translator instance\n *\n * @example\n * ```typescript\n * import { createTranslator, MemoryCache } from '@polingo/core';\n *\n * const loader = {\n *   async load(locale, domain) {\n *     // Load translation catalog\n *     return catalog;\n *   }\n * };\n *\n * const translator = createTranslator(loader, new MemoryCache(), {\n *   locale: 'es',\n *   fallback: 'en',\n * });\n *\n * await translator.load(['es', 'en']);\n * console.log(translator.t('Hello')); // \"Hola\"\n * ```\n */\nexport function createTranslator(\n  loader: TranslationLoader,\n  cache: TranslationCache,\n  config: PolingoConfig\n): Translator {\n  return new Translator(loader, cache, config);\n}\n\n// Main Translator class (for direct instantiation)\nexport { Translator } from './translator';\n\n// TypeScript interfaces and types\nexport type {\n  Translation,\n  TranslationCatalog,\n  TranslationLoader,\n  TranslationCache,\n  PolingoConfig,\n  TranslateOptions,\n} from './types';\n\n// Built-in cache implementations\nexport { MemoryCache, TtlCache, NoCache } from './cache';\n\n// Utility functions (can be used standalone)\nexport { interpolate } from './interpolator';\nexport { getPluralIndex } from './plurals';\n"]}