{"version":3,"sources":["../src/index.ts","../src/mergeDicts.ts","../src/helpers.ts","../src/intlHelpers.ts","../src/resolveProvidedArgs.ts","../src/store.ts","../src/cache.ts","../src/flattenDict.ts","../src/translate.ts","../src/mapPotentialArray.ts","../src/translator.ts"],"sourcesContent":["export { mergeDicts } from './mergeDicts';\nexport { createTranslator } from './translator';\nexport type {\n  CreateTranslatorOptions,\n  CreateTranslatorResult,\n  DeepValue,\n  Dict,\n  FlatDict,\n  FlatKeys,\n  FlattenDict,\n  GetTranslatorOptions,\n  MaybePromise,\n  Merge,\n  Translator,\n  TranslatorFn,\n  Values,\n} from './types';\n","import { Dict, Merge } from './types';\n\nfunction mergeImpl(a: any, b: any) {\n  const result = { ...a };\n\n  for (const key in b) {\n    if (!(key in result) || typeof b[key] !== 'object' || typeof result[key] !== 'object') {\n      result[key] = b[key];\n    } else {\n      result[key] = mergeImpl(result[key], b[key]);\n    }\n  }\n\n  return result;\n}\n\nexport function mergeDicts<Parts extends Dict[]>(...parts: Parts): Merge<Parts> {\n  return parts.reduce(mergeImpl, {}) as Merge<Parts>;\n}\n","import { TemporalLike } from './temporal-polyfill';\n\nexport function toDate(\n  date: Date | number | string | TemporalLike | undefined,\n  options: Intl.DateTimeFormatOptions | undefined = {},\n): {\n  date: Date;\n  options: Intl.DateTimeFormatOptions;\n  type: 'instant' | 'plainDateTime' | 'plainDate' | 'plainTime';\n} {\n  if (date instanceof Date) {\n    return { date, options, type: 'instant' };\n  }\n\n  if (!(date instanceof Object)) {\n    return { date: date ? new Date(date) : new Date(), options, type: 'instant' };\n  }\n\n  if ('epochMilliseconds' in date) {\n    return { date: new Date(date.epochMilliseconds), options, type: 'instant' };\n  } else {\n    const isPlain = !date.timeZone;\n    let iso = date.toString().replace(/\\[.*\\]/, '') + (isPlain ? 'Z' : '');\n    let type: 'instant' | 'plainDateTime' | 'plainDate' | 'plainTime' = 'instant';\n\n    if (isPlain) {\n      // Ignore timeZones, time is relative\n      options = { ...options, timeZone: 'UTC' };\n      type = 'plainDateTime';\n    }\n\n    if (date.hour === undefined) {\n      // Plain date\n      options = { ...options, timeStyle: undefined, hour: undefined, minute: undefined, second: undefined };\n      type = 'plainDate';\n    }\n\n    if (date.month === undefined) {\n      // Plain time\n      iso = `1970-01-01T${iso}`;\n      options = { ...options, dateStyle: undefined, year: undefined, month: undefined, day: undefined };\n      type = 'plainTime';\n    }\n\n    return {\n      date: new Date(iso),\n      options,\n      type,\n    };\n  }\n}\n\nexport function arrEquals(a?: any[], b?: any[]): boolean {\n  if (!a || !b) return a === b;\n  if (a.length !== b.length) return false;\n  return a.every((value, index) => value === b[index]) ?? false;\n}\n\nexport function castArray<T>(x: T | readonly T[] = []): readonly T[] {\n  if (x instanceof Array) return x;\n  return [x];\n}\n\nexport function calcLocales(\n  locale: string,\n  fallbackToLessSpecific: boolean,\n  fallback?: string | readonly string[] | ((locale: string) => string | readonly string[]),\n): readonly string[] {\n  const requestedLocales = [locale];\n\n  if (fallbackToLessSpecific) {\n    let prefix = locale;\n\n    while (prefix.includes('-')) {\n      const index = prefix.lastIndexOf('-');\n      prefix = prefix.slice(0, index);\n      requestedLocales.push(prefix);\n    }\n  }\n\n  if (fallback instanceof Function) {\n    requestedLocales.push(...castArray(fallback(locale)));\n  } else if (fallback) {\n    requestedLocales.push(...castArray(fallback));\n  }\n\n  return requestedLocales;\n}\n\nexport function isPromise(x: unknown): x is Promise<unknown> {\n  return typeof x === 'object' && x !== null && 'then' in x && typeof x.then === 'function';\n}\n","import { Cache } from './cache';\nimport { toDate } from './helpers';\nimport { TemporalLike } from './temporal-polyfill';\nimport { DurationFormatOptions, IntlHelpers } from './types';\n\nexport function intlHelpers<Output>({\n  cache,\n  transform,\n  dateTimeFormatOptions,\n  listFormatOptions,\n  numberFormatOptions,\n  pluralRulesOptions,\n  relativeTimeFormatOptions,\n}: {\n  cache: Cache;\n  transform: (fn: (locale: string) => string) => Output;\n  dateTimeFormatOptions?: Intl.DateTimeFormatOptions;\n  listFormatOptions?: Intl.ListFormatOptions;\n  numberFormatOptions?: Intl.NumberFormatOptions;\n  pluralRulesOptions?: Intl.PluralRulesOptions;\n  relativeTimeFormatOptions?: Intl.RelativeTimeFormatOptions;\n  durationFormatOptions?: DurationFormatOptions;\n}): IntlHelpers<Output> {\n  return {\n    dateTimeFormat(date, options = dateTimeFormatOptions) {\n      return transform((locale) => customDateTimeFormat(cache, locale, options, date));\n    },\n\n    dateTimeFormatRange(startDate, endDate, options = dateTimeFormatOptions) {\n      return transform((locale) => customDateTimeFormatRange(cache, locale, options, startDate, endDate));\n    },\n\n    displayNames(code, options) {\n      return transform((locale) => cache.get(Intl.DisplayNames, locale, options).of(code) ?? '');\n    },\n\n    listFormat(list, options = listFormatOptions) {\n      return transform((locale) => cache.get(Intl.ListFormat, locale, options).format(list));\n    },\n\n    numberFormat(number, options = numberFormatOptions) {\n      return transform((locale) => cache.get(Intl.NumberFormat, locale, options).format(number));\n    },\n\n    // numberFormatRange(start, end, options = numberFormatOptions) {\n    //   return transform((locale) => cache.get(Intl.NumberFormat, locale, options).formatRange(start, end));\n    // },\n\n    pluralRules(number, options = pluralRulesOptions) {\n      return transform((locale) => cache.get(Intl.PluralRules, locale, options).select(number));\n    },\n\n    relativeTimeFormat(value, unit, options = relativeTimeFormatOptions) {\n      return transform((locale) => cache.get(Intl.RelativeTimeFormat, locale, options).format(value, unit));\n    },\n\n    durationFormat(duration, options) {\n      const intl = Intl as { DurationFormat?: any };\n      if (!intl.DurationFormat) {\n        throw new Error('Intl.DurationFormat is not available in this environment. Try using the polyfill');\n      }\n      return transform((locale) => cache.get(intl.DurationFormat, locale, options).format(duration));\n    },\n  };\n}\n\nexport function customDateTimeFormat(\n  cache: Cache,\n  locale: string | undefined,\n  options_: Intl.DateTimeFormatOptions | undefined,\n  date_: Date | number | string | TemporalLike | undefined,\n) {\n  const { date, options } = toDate(date_, options_) ?? {};\n  return cache.get(Intl.DateTimeFormat, locale, options).format(date);\n}\n\nexport function customDateTimeFormatRange(\n  cache: Cache,\n  locale: string | undefined,\n  options_: Intl.DateTimeFormatOptions | undefined,\n  startDate_: Date | number | string | TemporalLike,\n  endDate_: Date | number | string | TemporalLike,\n) {\n  const start = toDate(startDate_, options_);\n  const end = toDate(endDate_);\n\n  if (start.type !== end.type) {\n    throw new Error('Intl.DateTimeFormat.formatRange accepts two values of the same type');\n  }\n\n  return cache.get(Intl.DateTimeFormat, locale, start.options).formatRange(start.date, end.date);\n}\n","import { ICUArgument, ICUDateArgument } from './types';\n\nexport function resolveProvidedArgs(providedArgs?: Record<string, any>) {\n  return Object.fromEntries(\n    Object.entries(providedArgs ?? {}).map(([id, value]) => {\n      if (typeof value === 'object' && value !== null && 'get' in value) {\n        return [id, value.get() as ICUArgument | ICUDateArgument];\n      }\n\n      return [id, value as ICUArgument | ICUDateArgument];\n    }),\n  );\n}\n","import { match } from '@formatjs/intl-localematcher';\nimport { Cache } from './cache';\nimport { flattenDict } from './flattenDict';\nimport { arrEquals, isPromise } from './helpers';\nimport { CreateTranslatorOptions, Dict, FlatDict, MaybePromise } from './types';\n\nexport class Store<D extends Dict = any, ProvidedArgs extends string = never> {\n  dicts = new Map<string, MaybePromise<FlatDict | null>>();\n  cache = new Cache(this.options.cacheOptions);\n  subs = new Set<() => void>();\n\n  constructor(public options: CreateTranslatorOptions<D, ProvidedArgs>) {}\n\n  load(locale: string): MaybePromise<FlatDict | null> {\n    let entry = this.dicts.get(locale);\n    if (entry !== undefined) return entry;\n\n    let dict = null;\n    if (match([locale], [this.options.sourceLocale], '') && this.options.sourceDictionary) {\n      dict = this.options.sourceDictionary;\n    } else if (this.options.dicts instanceof Function) {\n      try {\n        dict = this.options.dicts(locale);\n\n        if (isPromise(dict)) {\n          dict = dict.catch(() => {\n            console.warn(`Failed to load dictionary for locale \"${locale}\"`);\n            return null;\n          });\n        }\n      } catch {\n        console.warn(`Failed to load dictionary for locale \"${locale}\"`);\n        dict = null;\n      }\n    } else if (this.options.dicts) {\n      const availableLocales = Object.keys(this.options.dicts);\n      const matching = match([locale], availableLocales, locale);\n      dict = this.options.dicts[matching] ?? null;\n      if (dict instanceof Function) dict = dict();\n    }\n\n    if (isPromise(dict)) {\n      entry = dict.then((resolvedDict) => {\n        const flatDict = resolvedDict && flattenDict(resolvedDict);\n        if (this.dicts.get(locale) === entry) {\n          this.dicts.set(locale, flatDict);\n        }\n        return flatDict;\n      });\n    } else {\n      entry = dict && flattenDict(dict);\n    }\n\n    this.dicts.set(locale, entry);\n\n    if (isPromise(entry)) {\n      entry.then(() => this.notify());\n    } else {\n      this.notify();\n    }\n\n    return entry;\n  }\n\n  loadAll(...locales: string[]): MaybePromise<FlatDict[]> {\n    const dicts = locales.map((locale) => this.load(locale));\n\n    if (dicts.some(isPromise)) {\n      return Promise.all(dicts).then((dicts) => dicts.filter(Boolean) as FlatDict[]);\n    }\n\n    return dicts.filter(Boolean) as unknown as FlatDict[];\n  }\n\n  getAll(...locales: string[]): MaybePromise<FlatDict>[] {\n    const dicts = locales.map((locale) => this.load(locale));\n    return dicts.filter(Boolean) as MaybePromise<FlatDict>[];\n  }\n\n  subscribe(locales: string[], callback: (dicts?: MaybePromise<FlatDict>[]) => void): () => void {\n    let last: MaybePromise<FlatDict>[] | undefined;\n\n    const sub = () => {\n      const dicts = this.getAll(...locales);\n      if (!arrEquals(dicts, last)) {\n        last = dicts;\n        callback(dicts);\n      }\n    };\n    sub();\n\n    this.subs.add(callback);\n    return () => {\n      this.subs.delete(callback);\n    };\n  }\n\n  clear(): void {\n    this.dicts.clear();\n    this.cache.clear();\n    this.notify();\n  }\n\n  private notify() {\n    setTimeout(() => {\n      for (const sub of this.subs) sub();\n    });\n  }\n}\n","export function hash(obj: unknown): string {\n  return JSON.stringify(obj, (_key, value) => {\n    if (value instanceof Array || !(value instanceof Object)) return value;\n\n    const result: Record<string, unknown> = {};\n\n    for (const key of Object.keys(value).sort()) {\n      result[key] = value[key];\n    }\n\n    return result;\n  });\n}\n\nexport type CacheOptions = { maxEntries?: number; ttl?: number };\n\nexport class Cache {\n  private cache = new Map<any, Map<string, any>>();\n  private delQueue = new Map<any, [t: number, k1: any, k2: string]>();\n\n  constructor(private readonly options?: CacheOptions) {}\n\n  get<C extends new (...args: any[]) => any>(C: C, ...args: ConstructorParameters<C>): InstanceType<C> {\n    if (this.options?.maxEntries === 0) return new C(...args);\n\n    const key = hash(args);\n\n    let innerCache = this.cache.get(C);\n    if (!innerCache) {\n      innerCache = new Map();\n      this.cache.set(C, innerCache);\n    }\n\n    let value = innerCache.get(key);\n    if (!value) {\n      this.clean();\n      value = new C(...args);\n      innerCache.set(key, value);\n    }\n\n    this.delQueue.delete(value);\n    this.delQueue.set(value, [Date.now(), C, key]);\n\n    return value;\n  }\n\n  private clean(): void {\n    const { maxEntries, ttl } = this.options ?? {};\n    const now = Date.now();\n\n    for (const [k, [t, k1, k2]] of this.delQueue.entries()) {\n      if ((maxEntries && maxEntries <= this.delQueue.size) || (ttl && t + ttl > now)) {\n        const innerCache = this.cache.get(k1);\n        this.delQueue.delete(k);\n        innerCache?.delete(k2);\n        if (innerCache?.size === 0) {\n          this.cache.delete(k1);\n        }\n      }\n    }\n  }\n\n  clear(): void {\n    this.cache.clear();\n  }\n}\n","import { Dict, FlattenDict } from './types';\n\nexport function flattenDict<D extends Dict>(dict: D, path = ''): FlattenDict<D> {\n  const flat: any = {};\n\n  for (const [key, value] of Object.entries(dict)) {\n    const newPath = path ? `${path}.${key}` : key;\n    if (value === undefined) continue;\n    if (value instanceof Object && !(value instanceof Array)) Object.assign(flat, flattenDict(value, newPath));\n    else flat[newPath] = value;\n  }\n\n  return flat;\n}\n","import { MessageFormatElement, parse, TYPE } from '@formatjs/icu-messageformat-parser';\nimport { IntlMessageFormat } from 'intl-messageformat';\nimport { MaybePromise } from '.';\nimport { Cache } from './cache';\nimport { customDateTimeFormat, customDateTimeFormatRange } from './intlHelpers';\nimport { mapPotentialArray } from './mapPotentialArray';\nimport { FlatDict, ICUArgument, ICUDateArgument } from './types';\nimport { isPromise } from './helpers';\n\nexport function translate<F = never>({\n  dicts,\n  sourceDict,\n  id,\n  values,\n  fallback,\n  fallbackIgnoresFallbackLocales,\n  placeholder,\n  locale,\n  warn,\n  cache,\n  ignoreMissingArgs,\n  providedArgs,\n}: {\n  dicts: MaybePromise<FlatDict>[];\n  sourceDict?: MaybePromise<FlatDict> | null;\n  id: string;\n  values?: any;\n  fallback?: F | ((id: string, sourceTranslation?: string | readonly string[]) => F);\n  fallbackIgnoresFallbackLocales?: boolean;\n  placeholder?: F | ((id: string, sourceTranslation?: string | readonly string[]) => F);\n  locale: string;\n  warn?: (locale: string, id: string) => void;\n  cache: Cache;\n  ignoreMissingArgs: boolean | string | ((id: string, template: string) => string) | undefined;\n  providedArgs: Record<string, ICUArgument | ICUDateArgument> | undefined;\n}): string | F | (string | F)[] | F {\n  if (fallback !== undefined && fallbackIgnoresFallbackLocales) {\n    dicts = dicts.slice(0, 1);\n  }\n\n  const dict = dicts.find((dict) => isPromise(dict) || id in dict);\n\n  if (isPromise(dict)) {\n    return mapPotentialArray(\n      sourceDict && !isPromise(sourceDict)\n        ? translate<string>({\n            dicts: [sourceDict],\n            sourceDict,\n            id,\n            values,\n            locale,\n            cache,\n            ignoreMissingArgs,\n            providedArgs,\n          })\n        : undefined,\n      (sourceTranslation) => {\n        if (placeholder instanceof Function) {\n          return placeholder(id, sourceTranslation);\n        }\n        return placeholder ?? '';\n      },\n    );\n  }\n\n  const template = dict?.[id];\n  if (!template) {\n    if (fallback instanceof Function) {\n      const sourceTranslation =\n        sourceDict && !isPromise(sourceDict)\n          ? translate<string>({\n              dicts: [sourceDict],\n              sourceDict,\n              id,\n              values,\n              locale,\n              cache,\n              ignoreMissingArgs,\n              providedArgs,\n            })\n          : undefined;\n      return fallback(id, sourceTranslation);\n    }\n    if (fallback !== undefined) return fallback;\n\n    warn?.(locale, id);\n    return id;\n  }\n\n  return mapPotentialArray(template, (template) => format({ template, values, locale, cache, ignoreMissingArgs, providedArgs }));\n}\n\nexport function format({\n  template,\n  values,\n  locale,\n  cache,\n  ignoreMissingArgs,\n  providedArgs,\n}: {\n  template: string;\n  values?: Record<string, unknown>;\n  locale?: string;\n  cache: Cache;\n  ignoreMissingArgs: boolean | string | ((id: string, template: string) => string) | undefined;\n  providedArgs: Record<string, ICUArgument | ICUDateArgument> | undefined;\n}): string {\n  values = { ...providedArgs, ...values };\n\n  try {\n    const ast = parse(template, { requiresOtherClause: false });\n\n    const f = new IntlMessageFormat(ast, locale, undefined, {\n      formatters: {\n        getDateTimeFormat(locals, options) {\n          const instance = cache.get(Intl.DateTimeFormat, locals, options);\n\n          return {\n            ...instance,\n            format: (date) => customDateTimeFormat(cache, locale, options, date),\n            formatRange: (startDate, endDate) =>\n              typeof startDate === 'bigint' || typeof endDate === 'bigint'\n                ? instance.formatRange(startDate, endDate)\n                : customDateTimeFormatRange(cache, locale, options, startDate, endDate),\n          };\n        },\n        getNumberFormat(locals, options) {\n          return cache.get(Intl.NumberFormat, locals, options as Intl.NumberFormatOptions | undefined);\n        },\n        getPluralRules(locals, options) {\n          return cache.get(Intl.PluralRules, locals, options);\n        },\n      },\n    });\n\n    if (ignoreMissingArgs) {\n      values = { ...values };\n      for (const arg of new Set(findArgs(ast))) {\n        if (!(arg in values)) {\n          if (ignoreMissingArgs === true) {\n            values[arg] = '';\n          } else if (typeof ignoreMissingArgs === 'string') {\n            values[arg] = ignoreMissingArgs;\n          } else {\n            values[arg] = ignoreMissingArgs(arg, template);\n          }\n        }\n      }\n    }\n\n    const msg = f.format(values);\n    if (msg instanceof Array) return msg.join(' ');\n    return String(msg);\n  } catch (e) {\n    return `Wrong format: ${String(e)}`;\n  }\n}\n\nfunction findArgs(ast: MessageFormatElement[]): string[] {\n  return ast.flatMap((el) => {\n    if (el.type === TYPE.argument || el.type === TYPE.number || el.type === TYPE.date || el.type === TYPE.time) {\n      return [el.value];\n    }\n\n    if (el.type === TYPE.select || el.type === TYPE.plural) {\n      return [el.value, ...findArgs(Object.values(el.options).flatMap((option) => option.value))];\n    }\n\n    return [];\n  });\n}\n","export function mapPotentialArray<T, S>(value: T | readonly T[], fn: (value: T) => S): S | S[] {\n  if (value instanceof Array) return value.map(fn);\n  return fn(value);\n}\n","import { TranslatorFn } from '.';\nimport { calcLocales } from './helpers';\nimport { intlHelpers } from './intlHelpers';\nimport { resolveProvidedArgs } from './resolveProvidedArgs';\nimport { Store } from './store';\nimport { format, translate } from './translate';\nimport { CreateTranslatorOptions, CreateTranslatorResult, Dict, FlattenDict, Translator } from './types';\n\nexport const createGetTranslator =\n  <D extends Dict, ProvidedArgs extends string = never>(\n    store: Store<D>,\n    {\n      fallbackLocale,\n      fallbackToLessSpecific = true,\n      fallback: globalFallback,\n      fallbackIgnoresFallbackLocales = false,\n      warn,\n      sourceLocale,\n      dateTimeFormatOptions,\n      listFormatOptions,\n      numberFormatOptions,\n      pluralRulesOptions,\n      relativeTimeFormatOptions,\n      durationFormatOptions,\n      ignoreMissingArgs,\n      provideArgs,\n    }: CreateTranslatorOptions<D, ProvidedArgs>,\n  ): ((locale: string) => Promise<Translator<FlattenDict<D>, ProvidedArgs>>) =>\n  async (locale: string) => {\n    type FD = FlattenDict<D>;\n\n    const dicts = await store.loadAll(locale, ...calcLocales(locale, fallbackToLessSpecific, fallbackLocale));\n    const sourceDict = await store.load(sourceLocale);\n\n    const t: TranslatorFn<FD, ProvidedArgs> = (id, ...[values, options]) => {\n      const fallback = options?.fallback ?? globalFallback;\n      return translate({\n        dicts,\n        sourceDict,\n        id,\n        values,\n        fallback,\n        fallbackIgnoresFallbackLocales,\n        locale,\n        warn,\n        cache: store.cache,\n        ignoreMissingArgs,\n        providedArgs: resolveProvidedArgs(provideArgs),\n      }) as any;\n    };\n\n    return Object.assign<TranslatorFn<FD, ProvidedArgs>, Omit<Translator<FD, ProvidedArgs>, keyof TranslatorFn<FD, ProvidedArgs>>>(t, {\n      locale,\n\n      unknown: t as Translator<FD, ProvidedArgs>['unknown'],\n      dynamic: t as Translator<FD, ProvidedArgs>['dynamic'],\n\n      format(template, ...[values]) {\n        return format({\n          template,\n          values: values as any,\n          locale,\n          cache: store.cache,\n          ignoreMissingArgs,\n          providedArgs: resolveProvidedArgs(provideArgs),\n        });\n      },\n\n      ...intlHelpers({\n        cache: store.cache,\n        transform: (fn) => fn(locale),\n        dateTimeFormatOptions,\n        listFormatOptions,\n        numberFormatOptions,\n        pluralRulesOptions,\n        relativeTimeFormatOptions,\n        durationFormatOptions,\n      }),\n    });\n  };\n\nexport function createTranslator<D extends Dict, ProvidedArgs extends string = never>(\n  options: CreateTranslatorOptions<D, ProvidedArgs>,\n): CreateTranslatorResult<FlattenDict<D>, ProvidedArgs> {\n  const store = new Store(options);\n\n  return {\n    getTranslator: createGetTranslator(store, options),\n\n    clearDicts() {\n      store.clear();\n    },\n  };\n}\n"],"mappings":"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","names":["dicts","dict","template"]}