{"version":3,"file":"localeMapper.mjs","names":[],"sources":["../../../src/localization/localeMapper.ts"],"sourcesContent":["import { internationalization, routing } from '@intlayer/config/built';\nimport { DEFAULT_LOCALE } from '@intlayer/config/defaultValues';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { LocalesValues } from '@intlayer/types/module_augmentation';\nimport { getPrefix } from './getPrefix';\n\nexport type LocaleData = {\n  locale: Locale;\n  defaultLocale: Locale;\n  isDefault: boolean;\n  locales: Locale[];\n  urlPrefix: string;\n};\n\n/**\n * Map the locale data to an array of objects\n *\n * @example\n * ```ts\n * const routes = localeMap((localizedData) =>\n * ({\n *    path: localizedData.urlPrefix,\n *    name: localizedData.locale,\n *    isDefault: localizedData.isDefault,\n *    locales: localizedData.locales,\n *    defaultLocale: localizedData.defaultLocale,\n *  }),\n * );\n *\n * // Result\n * [\n *   { path: '/', name: 'en', isDefault: true, locales: ['en'], defaultLocale: 'en', urlPrefix: '' },\n *   { path: '/fr', name: 'fr', isDefault: false, locales: ['fr'], defaultLocale: 'en', urlPrefix: '/fr' },\n *   { path: '/es', name: 'es', isDefault: false, locales: ['es'], defaultLocale: 'en', urlPrefix: '/es' },\n * ]\n * ```\n *\n * @param mapper - The mapper function that returns an object\n * @returns An array of objects\n */\nexport const localeMap = <T>(\n  mapper: (locale: LocaleData) => T,\n  locales: LocalesValues[] = internationalization.locales ?? [],\n  defaultLocale: LocalesValues = internationalization.defaultLocale ??\n    DEFAULT_LOCALE,\n  mode:\n    | 'prefix-no-default'\n    | 'prefix-all'\n    | 'no-prefix'\n    | 'search-params' = routing?.mode ?? 'prefix-no-default'\n): T[] =>\n  (locales ?? []).map((locale) =>\n    mapper({\n      locale,\n      defaultLocale,\n      locales,\n      isDefault: locale === defaultLocale,\n      urlPrefix: getPrefix(locale, { defaultLocale, mode, locales })\n        .localePrefix\n        ? `/${locale}`\n        : '',\n    } as LocaleData)\n  );\n\n/**\n * Flatten the locale map into a single array of objects\n *\n * @example\n * ```ts\n * const routes = localeMap((localizedData) =>\n * [{\n *    path: localizedData.urlPrefix,\n *    name: localizedData.locale,\n *    isDefault: localizedData.isDefault,\n *    locales: localizedData.locales,\n *    defaultLocale: localizedData.defaultLocale,\n *  }],\n * );\n *\n * // Result\n * [\n *   path: '/', name: 'en', isDefault: true, locales: ['en'], defaultLocale: 'en', urlPrefix: '' ,\n *   path: '/fr', name: 'fr', isDefault: false, locales: ['fr'], defaultLocale: 'en', urlPrefix: '/fr' ,\n *   path: '/es', name: 'es', isDefault: false, locales: ['es'], defaultLocale: 'en', urlPrefix: '/es' ,\n * ]\n * ```\n *\n * @param mapper - The mapper function that returns an array of objects\n * @returns An array of objects\n */\nexport const localeFlatMap = <T>(\n  mapper: (locale: LocaleData) => T[],\n  locales: LocalesValues[] = internationalization.locales ?? [],\n  defaultLocale: LocalesValues = internationalization.defaultLocale ??\n    DEFAULT_LOCALE,\n  mode:\n    | 'prefix-no-default'\n    | 'prefix-all'\n    | 'no-prefix'\n    | 'search-params' = routing?.mode ?? 'prefix-no-default'\n): T[] =>\n  locales.flatMap((locale) =>\n    mapper({\n      locale,\n      defaultLocale,\n      locales,\n      isDefault: locale === defaultLocale,\n      urlPrefix: getPrefix(locale, { defaultLocale, mode, locales })\n        .localePrefix\n        ? `/${locale}`\n        : '',\n    } as LocaleData)\n  );\n\n/**\n * Creates a record object mapping locales to values transformed by the mapper function\n *\n * @example\n * ```ts\n * const translations = localeRecord(({ locale }) =>\n *   require(`./translations/${locale}.json`)\n * );\n *\n * // Result\n *\n *   en: ... , // Content of translations/en.json\n *   fr: ... , // Content of translations/fr.json\n *   es: ...\n *\n * ```\n *\n * @param mapper - Function that takes locale data and returns a value for that locale\n * @param locales - Array of locale codes to map over (defaults to configured locales)\n * @param defaultLocale - The default locale (defaults to configured default)\n * @param mode - URL routing mode for locale handling (defaults to configured value)\n * @returns Record mapping locale codes to mapped values\n */\nexport const localeRecord = <T>(\n  mapper: (locale: LocaleData) => T,\n  locales: LocalesValues[] = internationalization.locales ?? [],\n  defaultLocale: LocalesValues = internationalization.defaultLocale ??\n    DEFAULT_LOCALE,\n  mode:\n    | 'prefix-no-default'\n    | 'prefix-all'\n    | 'no-prefix'\n    | 'search-params' = routing?.mode ?? 'prefix-no-default'\n): Record<LocalesValues, T> =>\n  (locales ?? []).reduce(\n    (acc, locale) => {\n      acc[locale] = mapper({\n        locale,\n        defaultLocale,\n        locales,\n        isDefault: locale === defaultLocale,\n        urlPrefix: getPrefix(locale, { defaultLocale, mode, locales })\n          .localePrefix\n          ? `/${locale}`\n          : '',\n      } as LocaleData);\n      return acc;\n    },\n    {} as Record<LocalesValues, T>\n  );\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwCA,MAAa,aACX,QACA,UAA2B,qBAAqB,WAAW,EAAE,EAC7D,gBAA+B,qBAAqB,iBAClD,gBACF,OAIsB,SAAS,QAAQ,yBAEtC,WAAW,EAAE,EAAE,KAAK,WACnB,OAAO;CACL;CACA;CACA;CACA,WAAW,WAAW;CACtB,WAAW,UAAU,QAAQ;EAAE;EAAe;EAAM;EAAS,CAAC,CAC3D,eACC,IAAI,WACJ;CACL,CAAe,CACjB;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BH,MAAa,iBACX,QACA,UAA2B,qBAAqB,WAAW,EAAE,EAC7D,gBAA+B,qBAAqB,iBAClD,gBACF,OAIsB,SAAS,QAAQ,wBAEvC,QAAQ,SAAS,WACf,OAAO;CACL;CACA;CACA;CACA,WAAW,WAAW;CACtB,WAAW,UAAU,QAAQ;EAAE;EAAe;EAAM;EAAS,CAAC,CAC3D,eACC,IAAI,WACJ;CACL,CAAe,CACjB;;;;;;;;;;;;;;;;;;;;;;;;AAyBH,MAAa,gBACX,QACA,UAA2B,qBAAqB,WAAW,EAAE,EAC7D,gBAA+B,qBAAqB,iBAClD,gBACF,OAIsB,SAAS,QAAQ,yBAEtC,WAAW,EAAE,EAAE,QACb,KAAK,WAAW;AACf,KAAI,UAAU,OAAO;EACnB;EACA;EACA;EACA,WAAW,WAAW;EACtB,WAAW,UAAU,QAAQ;GAAE;GAAe;GAAM;GAAS,CAAC,CAC3D,eACC,IAAI,WACJ;EACL,CAAe;AAChB,QAAO;GAET,EAAE,CACH"}