{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["import { createModuleAugmentation } from '@intlayer/chokidar';\nimport { getConfiguration, type Locales } from '@intlayer/config';\nimport {\n  getDictionary as getDictionaryFunction,\n  getIntlayer as getIntlayerFunction,\n  getTranslation,\n  localeDetector,\n  type LanguageContent,\n} from '@intlayer/core';\nimport { createNamespace } from 'cls-hooked';\nimport type { NextFunction, Request, RequestHandler, Response } from 'express';\n\nconst { middleware, internationalization } = getConfiguration();\nconst { headerName, cookieName } = middleware;\n\nconst appNamespace = createNamespace('app');\n\ncreateModuleAugmentation();\n\nexport const translateFunction =\n  (_req: Request, res: Response, _next?: NextFunction) =>\n  <T extends string>(\n    content: LanguageContent<T> | string,\n    locale?: Locales\n  ): T => {\n    const { locale: currentLocale, defaultLocale } = res.locals as {\n      locale: Locales;\n      defaultLocale: Locales;\n    };\n\n    const targetLocale = locale ?? currentLocale;\n\n    if (typeof content === 'undefined') {\n      return '' as unknown as T;\n    }\n\n    if (typeof content === 'string') {\n      return content as unknown as T;\n    }\n\n    if (\n      typeof content?.[targetLocale as unknown as keyof LanguageContent<T>] ===\n      'undefined'\n    ) {\n      if (\n        typeof content?.[\n          defaultLocale as unknown as keyof LanguageContent<T>\n        ] === 'undefined'\n      ) {\n        return content as unknown as T;\n      } else {\n        return getTranslation(content, defaultLocale);\n      }\n    }\n\n    return getTranslation(content, targetLocale);\n  };\n\n/**\n * Detect locale used by the user and load it into res locale storage\n *\n * @returns\n */\nexport const intlayer = (): RequestHandler => (req, res, next) => {\n  // Detect if locale is set by intlayer frontend lib in the cookies\n  const localeCookie = req.cookies?.[cookieName];\n  // Detect if locale is set by intlayer frontend lib in the headers\n  const localeHeader = req.headers?.[headerName];\n  // Interpret browser locale\n\n  const negotiatorHeaders: Record<string, string> = {};\n\n  // // Check if req.headers exists and is an object\n  if (req && typeof req.headers === 'object') {\n    // Copy all headers from the request to negotiatorHeaders\n    for (const key in req.headers) {\n      if (typeof req.headers[key] === 'string') {\n        negotiatorHeaders[key] = req.headers[key];\n      }\n    }\n  }\n\n  const localeDetected = localeDetector(\n    negotiatorHeaders,\n    internationalization.locales,\n    internationalization.defaultLocale\n  );\n\n  res.locals.locale_header = localeHeader;\n  res.locals.locale_cookie = localeCookie;\n  res.locals.locale_detected = localeDetected;\n  res.locals.locale = localeCookie ?? localeHeader ?? localeDetected;\n  res.locals.defaultLocale = internationalization.defaultLocale;\n\n  const t = translateFunction(req, res, next);\n\n  const getIntlayer: typeof getIntlayerFunction = (\n    key,\n    localeArg = localeDetected as Parameters<typeof getIntlayerFunction>[1],\n    ...props\n  ) => getIntlayerFunction(key, localeArg, ...props);\n\n  const getDictionary: typeof getDictionaryFunction = (\n    key,\n    localeArg = localeDetected as Parameters<typeof getDictionaryFunction>[1],\n    ...props\n  ) => getDictionaryFunction(key, localeArg, ...props);\n\n  res.locals.t = t;\n  res.locals.getIntlayer = getIntlayer;\n  res.locals.getDictionary = getDictionary;\n\n  appNamespace.run(() => {\n    appNamespace.set('t', t);\n    appNamespace.set('getIntlayer', getIntlayer);\n    appNamespace.set('getDictionary', getDictionary);\n\n    next();\n  });\n};\n\nexport const t = <Content = string>(\n  content: LanguageContent<Content>,\n  locale?: Locales\n): Content => appNamespace.get('t')(content, locale);\n\nexport const getIntlayer: typeof getIntlayerFunction = (...args) =>\n  appNamespace.get('getIntlayer')(...args);\nexport const getDictionary: typeof getDictionaryFunction = (...args) =>\n  appNamespace.get('getDictionary')(...args);\n\nexport { LanguageContent };\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sBAAyC;AACzC,oBAA+C;AAC/C,kBAMO;AACP,wBAAgC;AAGhC,MAAM,EAAE,YAAY,qBAAqB,QAAI,gCAAiB;AAC9D,MAAM,EAAE,YAAY,WAAW,IAAI;AAEnC,MAAM,mBAAe,mCAAgB,KAAK;AAAA,IAE1C,0CAAyB;AAElB,MAAM,oBACX,CAAC,MAAe,KAAe,UAC/B,CACE,SACA,WACM;AACN,QAAM,EAAE,QAAQ,eAAe,cAAc,IAAI,IAAI;AAKrD,QAAM,eAAe,UAAU;AAE/B,MAAI,OAAO,YAAY,aAAa;AAClC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,YAAY,UAAU;AAC/B,WAAO;AAAA,EACT;AAEA,MACE,OAAO,UAAU,YAAmD,MACpE,aACA;AACA,QACE,OAAO,UACL,aACF,MAAM,aACN;AACA,aAAO;AAAA,IACT,OAAO;AACL,iBAAO,4BAAe,SAAS,aAAa;AAAA,IAC9C;AAAA,EACF;AAEA,aAAO,4BAAe,SAAS,YAAY;AAC7C;AAOK,MAAM,WAAW,MAAsB,CAAC,KAAK,KAAK,SAAS;AAEhE,QAAM,eAAe,IAAI,UAAU,UAAU;AAE7C,QAAM,eAAe,IAAI,UAAU,UAAU;AAG7C,QAAM,oBAA4C,CAAC;AAGnD,MAAI,OAAO,OAAO,IAAI,YAAY,UAAU;AAE1C,eAAW,OAAO,IAAI,SAAS;AAC7B,UAAI,OAAO,IAAI,QAAQ,GAAG,MAAM,UAAU;AACxC,0BAAkB,GAAG,IAAI,IAAI,QAAQ,GAAG;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAEA,QAAM,qBAAiB;AAAA,IACrB;AAAA,IACA,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,EACvB;AAEA,MAAI,OAAO,gBAAgB;AAC3B,MAAI,OAAO,gBAAgB;AAC3B,MAAI,OAAO,kBAAkB;AAC7B,MAAI,OAAO,SAAS,gBAAgB,gBAAgB;AACpD,MAAI,OAAO,gBAAgB,qBAAqB;AAEhD,QAAMA,KAAI,kBAAkB,KAAK,KAAK,IAAI;AAE1C,QAAMC,eAA0C,CAC9C,KACA,YAAY,mBACT,cACA,YAAAC,aAAoB,KAAK,WAAW,GAAG,KAAK;AAEjD,QAAMC,iBAA8C,CAClD,KACA,YAAY,mBACT,cACA,YAAAC,eAAsB,KAAK,WAAW,GAAG,KAAK;AAEnD,MAAI,OAAO,IAAIJ;AACf,MAAI,OAAO,cAAcC;AACzB,MAAI,OAAO,gBAAgBE;AAE3B,eAAa,IAAI,MAAM;AACrB,iBAAa,IAAI,KAAKH,EAAC;AACvB,iBAAa,IAAI,eAAeC,YAAW;AAC3C,iBAAa,IAAI,iBAAiBE,cAAa;AAE/C,SAAK;AAAA,EACP,CAAC;AACH;AAEO,MAAM,IAAI,CACf,SACA,WACY,aAAa,IAAI,GAAG,EAAE,SAAS,MAAM;AAE5C,MAAM,cAA0C,IAAI,SACzD,aAAa,IAAI,aAAa,EAAE,GAAG,IAAI;AAClC,MAAM,gBAA8C,IAAI,SAC7D,aAAa,IAAI,eAAe,EAAE,GAAG,IAAI;","names":["t","getIntlayer","getIntlayerFunction","getDictionary","getDictionaryFunction"]}