{"version":3,"file":"getBrowserLocale.cjs","names":["getLocaleFromStorageClient","localeDetector","internationalization","DEFAULT_LOCALE"],"sources":["../../../src/localization/getBrowserLocale.tsx"],"sourcesContent":["import { internationalization } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport { getLocaleFromStorageClient } from '../utils/localeStorage';\nimport { localeDetector } from './localeDetector';\n\nexport enum LanguageDetector {\n  Querystring = 'querystring',\n  Storage = 'storage',\n  Navigator = 'navigator',\n  HtmlTag = 'htmlTag',\n}\n\n// Default settings for the language detector\ntype LanguageDetectorOptions = {\n  order?: LanguageDetector[];\n  lookupQuerystring?: string;\n  htmlTag?: HTMLElement | null;\n};\n\nconst getDefaultsOptions = (): LanguageDetectorOptions => {\n  return {\n    order: [\n      LanguageDetector.Querystring,\n      LanguageDetector.Storage,\n      LanguageDetector.Navigator,\n      LanguageDetector.HtmlTag,\n    ],\n    lookupQuerystring: 'locale',\n    htmlTag: typeof document !== 'undefined' ? document.documentElement : null,\n  };\n};\n\nconst detectLanguage = (\n  order: string[],\n  options: LanguageDetectorOptions\n): Record<LanguageDetector, Locale | undefined> => {\n  const detected: Record<LanguageDetector, Locale | undefined> = {} as Record<\n    LanguageDetector,\n    Locale | undefined\n  >;\n\n  const queryStringDetector = () => {\n    if (typeof window === 'undefined') return;\n    const search = window.location.search || '';\n    const params = new URLSearchParams(search);\n    const value = params.get(options.lookupQuerystring ?? '');\n    if (value) {\n      detected[LanguageDetector.Querystring] = value as Locale;\n    }\n  };\n\n  const storageDetector = () => {\n    if (typeof window === 'undefined') return;\n\n    const locale = getLocaleFromStorageClient({\n      getCookie: (name: string) => {\n        try {\n          const cookies = document.cookie.split(';');\n          const cookieName = `${name}=`;\n\n          const cookie = cookies.find((cookie) =>\n            cookie.trim().startsWith(cookieName)\n          );\n\n          if (cookie) {\n            return cookie.split('=')[1].trim();\n          }\n        } catch {}\n        return undefined;\n      },\n      getSessionStorage: (name: string) => {\n        try {\n          return window.sessionStorage.getItem(name) ?? undefined;\n        } catch {}\n        return undefined;\n      },\n      getLocaleStorage: (name: string) => {\n        try {\n          return window.localStorage.getItem(name) ?? undefined;\n        } catch {}\n        return undefined;\n      },\n    });\n\n    if (locale) {\n      detected[LanguageDetector.Storage] = locale;\n    }\n  };\n\n  const navigatorDetector = () => {\n    if (typeof navigator === 'undefined') return;\n\n    const languages = navigator.languages ?? [navigator.language];\n\n    // Use localeDetector to find the best matching locale\n    const locale = localeDetector(\n      { 'accept-language': languages.join(',') },\n      internationalization.locales,\n      internationalization.defaultLocale\n    );\n\n    if (locale) {\n      detected[LanguageDetector.Navigator] = locale;\n    }\n  };\n\n  const htmlTagDetector = () => {\n    const htmlTag = options.htmlTag;\n    if (htmlTag && typeof htmlTag.getAttribute === 'function') {\n      const lang = htmlTag.getAttribute('lang');\n      if (lang) {\n        // Validate and resolve the locale\n\n        const locale = localeDetector(\n          { 'accept-language': lang },\n          internationalization.locales,\n          internationalization.defaultLocale\n        );\n\n        detected[LanguageDetector.HtmlTag] = locale;\n      }\n    }\n  };\n\n  // Map detector names to their corresponding functions\n  const detectors: Record<string, () => void> = {\n    [LanguageDetector.Querystring]: queryStringDetector,\n    [LanguageDetector.Storage]: storageDetector,\n    [LanguageDetector.Navigator]: navigatorDetector,\n    [LanguageDetector.HtmlTag]: htmlTagDetector,\n  };\n\n  // Use the provided order to run each detector\n  order.forEach((detectorName) => {\n    detectors[detectorName]?.();\n  });\n\n  return detected;\n};\n\nconst getFirstAvailableLocale = (\n  locales: Record<LanguageDetector, Locale | undefined>,\n  order: LanguageDetector[]\n): Locale => {\n  for (const detector of order) {\n    const locale = locales[detector];\n\n    if (locale && internationalization.locales.includes(locale)) {\n      return locale;\n    }\n  }\n\n  return internationalization?.defaultLocale ?? DEFAULT_LOCALE;\n};\n\n/**\n * Core language detector function for browser environments.\n *\n * Detects the user's preferred locale by checking multiple sources in order:\n * 1. Query string parameter\n * 2. Storage (cookies, localStorage, sessionStorage) - uses getLocaleFromStorage\n * 3. Navigator languages - uses localeDetector\n * 4. HTML lang attribute - uses localeDetector\n *\n * @param userOptions - Optional configuration for detection order and lookup keys\n * @returns The detected locale or the default locale\n *\n * @example\n * const locale = getBrowserLocale({ order: [LanguageDetector.Storage, LanguageDetector.Navigator] });\n */\nexport const getBrowserLocale = (\n  userOptions: LanguageDetectorOptions | undefined = {}\n): Locale => {\n  const options = { ...getDefaultsOptions(), ...userOptions };\n\n  const locales = detectLanguage(options.order ?? [], options);\n\n  return getFirstAvailableLocale(locales, options.order ?? []);\n};\n"],"mappings":";;;;;;;;AAMA,IAAY,mBAAL;AACL;AACA;AACA;AACA;;KACD;AASD,MAAM,2BAAoD;AACxD,QAAO;EACL,OAAO;;;;;GAKN;EACD,mBAAmB;EACnB,SAAS,OAAO,aAAa,cAAc,SAAS,kBAAkB;EACvE;;AAGH,MAAM,kBACJ,OACA,YACiD;CACjD,MAAM,WAAyD,EAAE;CAKjE,MAAM,4BAA4B;AAChC,MAAI,OAAO,WAAW,YAAa;EACnC,MAAM,SAAS,OAAO,SAAS,UAAU;EAEzC,MAAM,QAAQ,IADK,gBAAgB,OACf,CAAC,IAAI,QAAQ,qBAAqB,GAAG;AACzD,MAAI,MACF,2BAAyC;;CAI7C,MAAM,wBAAwB;AAC5B,MAAI,OAAO,WAAW,YAAa;EAEnC,MAAM,SAASA,uDAA2B;GACxC,YAAY,SAAiB;AAC3B,QAAI;KACF,MAAM,UAAU,SAAS,OAAO,MAAM,IAAI;KAC1C,MAAM,aAAa,GAAG,KAAK;KAE3B,MAAM,SAAS,QAAQ,MAAM,WAC3B,OAAO,MAAM,CAAC,WAAW,WAAW,CACrC;AAED,SAAI,OACF,QAAO,OAAO,MAAM,IAAI,CAAC,GAAG,MAAM;YAE9B;;GAGV,oBAAoB,SAAiB;AACnC,QAAI;AACF,YAAO,OAAO,eAAe,QAAQ,KAAK,IAAI;YACxC;;GAGV,mBAAmB,SAAiB;AAClC,QAAI;AACF,YAAO,OAAO,aAAa,QAAQ,KAAK,IAAI;YACtC;;GAGX,CAAC;AAEF,MAAI,OACF,uBAAqC;;CAIzC,MAAM,0BAA0B;AAC9B,MAAI,OAAO,cAAc,YAAa;EAKtC,MAAM,SAASC,mDACb,EAAE,oBAJc,UAAU,aAAa,CAAC,UAAU,SAAS,EAI5B,KAAK,IAAI,EAAE,EAC1CC,4CAAqB,SACrBA,4CAAqB,cACtB;AAED,MAAI,OACF,yBAAuC;;CAI3C,MAAM,wBAAwB;EAC5B,MAAM,UAAU,QAAQ;AACxB,MAAI,WAAW,OAAO,QAAQ,iBAAiB,YAAY;GACzD,MAAM,OAAO,QAAQ,aAAa,OAAO;AACzC,OAAI,KASF,uBANeD,mDACb,EAAE,mBAAmB,MAAM,EAC3BC,4CAAqB,SACrBA,4CAAqB,cAGoB;;;CAMjD,MAAM,YAAwC;mBACZ;eACJ;iBACE;eACF;EAC7B;AAGD,OAAM,SAAS,iBAAiB;AAC9B,YAAU,iBAAiB;GAC3B;AAEF,QAAO;;AAGT,MAAM,2BACJ,SACA,UACW;AACX,MAAK,MAAM,YAAY,OAAO;EAC5B,MAAM,SAAS,QAAQ;AAEvB,MAAI,UAAUA,4CAAqB,QAAQ,SAAS,OAAO,CACzD,QAAO;;AAIX,QAAOA,6CAAsB,iBAAiBC;;;;;;;;;;;;;;;;;AAkBhD,MAAa,oBACX,cAAmD,EAAE,KAC1C;CACX,MAAM,UAAU;EAAE,GAAG,oBAAoB;EAAE,GAAG;EAAa;AAI3D,QAAO,wBAFS,eAAe,QAAQ,SAAS,EAAE,EAAE,QAEd,EAAE,QAAQ,SAAS,EAAE,CAAC"}