{"version":3,"file":"i18next.mjs","names":["insert","enu"],"sources":["../../../src/messageFormat/i18next.ts"],"sourcesContent":["import type { Dictionary } from '@intlayer/types/dictionary';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { deepTransformNode } from '../interpreter';\nimport { enu, gender, html, insert, plural } from '../transpiler';\nimport type { JsonValue } from './ICU';\n\n// Types for our AST\ntype I18NextNode =\n  | string\n  | {\n      type: 'argument';\n      name: string;\n      format?: { type: string; style?: string };\n    }\n  | { type: 'plural'; name: string; options: Record<string, I18NextNode[]> }\n  | { type: 'select'; name: string; options: Record<string, I18NextNode[]> };\n\nconst parseI18Next = (text: string): I18NextNode[] => {\n  let index = 0;\n\n  const parseNodes = (): I18NextNode[] => {\n    const nodes: I18NextNode[] = [];\n    let currentText = '';\n\n    while (index < text.length) {\n      const char = text[index];\n\n      // Standard i18next variable: {{var}}\n      if (char === '{' && text[index + 1] === '{') {\n        if (currentText) {\n          nodes.push(currentText);\n          currentText = '';\n        }\n        index += 2; // skip {{\n        nodes.push(parseStandardArgument());\n      }\n      // ICU syntax: {var} or {var, plural, ...}\n      else if (char === '{') {\n        if (currentText) {\n          nodes.push(currentText);\n          currentText = '';\n        }\n        index++; // skip {\n        nodes.push(parseICUArgument());\n      } else if (char === '}') {\n        // End of current block (likely ICU block end)\n        break;\n      } else {\n        currentText += char;\n        index++;\n      }\n    }\n\n    if (currentText) {\n      nodes.push(currentText);\n    }\n    return nodes;\n  };\n\n  const parseStandardArgument = (): I18NextNode => {\n    // We are past '{{'\n    let name = '';\n    while (index < text.length) {\n      // Check for closing }}\n      if (text[index] === '}' && text[index + 1] === '}') {\n        index += 2; // skip }}\n        return { type: 'argument', name: name.trim() };\n      }\n      name += text[index];\n      index++;\n    }\n    throw new Error('Unclosed i18next variable');\n  };\n\n  const parseICUArgument = (): I18NextNode => {\n    // We are past '{'\n    let name = '';\n    while (index < text.length && /[^,}]/.test(text[index])) {\n      name += text[index];\n      index++;\n    }\n    name = name.trim();\n\n    if (index >= text.length) throw new Error('Unclosed argument');\n\n    if (text[index] === '}') {\n      index++;\n      return { type: 'argument', name };\n    }\n\n    // Must be comma\n    if (text[index] === ',') {\n      index++;\n      // Parse type\n      let type = '';\n      while (index < text.length && /[^,}]/.test(text[index])) {\n        type += text[index];\n        index++;\n      }\n      type = type.trim();\n\n      if (index >= text.length) throw new Error('Unclosed argument');\n\n      if (text[index] === '}') {\n        index++;\n        return { type: 'argument', name, format: { type } };\n      }\n\n      if (text[index] === ',') {\n        index++;\n\n        // If plural or select, parse options\n        if (type === 'plural' || type === 'select') {\n          const options: Record<string, I18NextNode[]> = {};\n\n          while (index < text.length && text[index] !== '}') {\n            while (index < text.length && /\\s/.test(text[index])) index++;\n\n            let key = '';\n            while (index < text.length && /[^{\\s]/.test(text[index])) {\n              key += text[index];\n              index++;\n            }\n\n            while (index < text.length && /\\s/.test(text[index])) index++;\n\n            if (text[index] !== '{')\n              throw new Error('Expected { after option key');\n            index++; // skip {\n\n            const value = parseNodes();\n\n            if (text[index] !== '}')\n              throw new Error('Expected } after option value');\n            index++; // skip }\n\n            options[key] = value;\n\n            while (index < text.length && /\\s/.test(text[index])) index++;\n          }\n\n          index++; // skip closing argument }\n\n          if (type === 'plural') {\n            return { type: 'plural', name, options };\n          } else if (type === 'select') {\n            return { type: 'select', name, options };\n          }\n        } else {\n          // Parse style for number/date/time\n          let style = '';\n          while (index < text.length && text[index] !== '}') {\n            style += text[index];\n            index++;\n          }\n          if (index >= text.length) throw new Error('Unclosed argument');\n\n          style = style.trim();\n          index++; // skip }\n\n          return { type: 'argument', name, format: { type, style } };\n        }\n      }\n    }\n\n    throw new Error('Malformed argument');\n  };\n\n  return parseNodes();\n};\n\nconst i18nextNodesToIntlayer = (nodes: I18NextNode[]): any => {\n  if (nodes.length === 0) return '';\n  if (nodes.length === 1 && typeof nodes[0] === 'string') {\n    const node = nodes[0];\n    if (/<[a-zA-Z0-9-]+[^>]*>/.test(node)) {\n      return html(node);\n    }\n    return node;\n  }\n\n  const canFlatten = nodes.every(\n    (node) => typeof node === 'string' || node.type === 'argument'\n  );\n\n  if (canFlatten) {\n    let str = '';\n    for (const node of nodes) {\n      if (typeof node === 'string') {\n        str += node;\n      } else if (typeof node !== 'string' && node.type === 'argument') {\n        if (node.format) {\n          // For formatted arguments, use ICU syntax: {name, type, style}\n          str += `{${node.name}, ${node.format.type}${\n            node.format.style ? `, ${node.format.style}` : ''\n          }}`;\n        } else {\n          // For simple arguments, use standard i18next: {{name}}\n          str += `{{${node.name}}}`;\n        }\n      }\n    }\n    if (/<[a-zA-Z0-9-]+[^>]*>/.test(str)) {\n      return html(str);\n    }\n    return insert(str);\n  }\n\n  if (nodes.length === 1) {\n    const node = nodes[0];\n    if (typeof node === 'string') {\n      if (/<[a-zA-Z0-9-]+[^>]*>/.test(node)) {\n        return html(node);\n      }\n      return node;\n    }\n\n    if (node.type === 'argument') {\n      if (node.format) {\n        return insert(\n          `{${node.name}, ${node.format.type}${\n            node.format.style ? `, ${node.format.style}` : ''\n          }}`\n        );\n      }\n      return insert(`{{${node.name}}}`);\n    }\n\n    if (node.type === 'plural') {\n      const options: Record<string, any> = {};\n      let hasExactMatch = false;\n\n      for (const key of Object.keys(node.options)) {\n        if (key.startsWith('=')) {\n          hasExactMatch = true;\n          break;\n        }\n      }\n\n      if (hasExactMatch) {\n        for (const [key, val] of Object.entries(node.options)) {\n          let newKey = key;\n          if (key.startsWith('=')) {\n            newKey = key.substring(1);\n          } else if (key === 'one') {\n            newKey = '1';\n          } else if (key === 'two') {\n            newKey = '2';\n          } else if (key === 'few') {\n            newKey = '<=3';\n          } else if (key === 'many') {\n            newKey = '>=4';\n          } else if (key === 'other') {\n            newKey = 'fallback';\n          }\n          // Handle # replacement\n          const replacedVal = val.map((v) => {\n            if (typeof v === 'string') {\n              // In ICU plural, # is replaced by the number\n              // In i18next, if using ICU plugin, it behaves same.\n              // We map it to {{varName}} in Intlayer\n              return v.replace(/#/g, `{{${node.name}}}`);\n            }\n            return v;\n          });\n\n          options[newKey] = i18nextNodesToIntlayer(replacedVal);\n        }\n\n        // Preserve variable name\n        options.__intlayer_icu_var = node.name;\n\n        return enu(options);\n      } else {\n        for (const [key, val] of Object.entries(node.options)) {\n          // Handle # replacement\n          const replacedVal = val.map((v) => {\n            if (typeof v === 'string') {\n              return v.replace(/#/g, `{{${node.name}}}`);\n            }\n            return v;\n          });\n\n          options[key] = i18nextNodesToIntlayer(replacedVal);\n        }\n\n        return plural(options as any);\n      }\n    }\n\n    if (node.type === 'select') {\n      const options: Record<string, any> = {};\n      for (const [key, val] of Object.entries(node.options)) {\n        options[key] = i18nextNodesToIntlayer(val);\n      }\n\n      // Check for gender\n      const optionKeys = Object.keys(options);\n      const isGender =\n        (options.male || options.female) &&\n        optionKeys.every((k) =>\n          ['male', 'female', 'other', 'fallback'].includes(k)\n        );\n\n      if (isGender) {\n        return gender({\n          fallback: options.other,\n          male: options.male,\n          female: options.female,\n        });\n      }\n\n      // Preserve variable name for generic select\n      options.__intlayer_icu_var = node.name;\n\n      return enu(options);\n    }\n  }\n\n  return nodes.map((node) => i18nextNodesToIntlayer([node]));\n};\n\nconst i18nextToIntlayerPlugin = {\n  canHandle: (node: any) =>\n    typeof node === 'string' &&\n    (node.includes('{') ||\n      node.includes('}') ||\n      /<[a-zA-Z0-9-]+[^>]*>/.test(node)),\n  transform: (node: any) => {\n    try {\n      const ast = parseI18Next(node);\n      return i18nextNodesToIntlayer(ast);\n    } catch {\n      return node;\n    }\n  },\n};\n\nconst intlayerToI18nextPlugin = {\n  canHandle: (node: any) => {\n    if (typeof node === 'string') return true;\n\n    if (\n      node &&\n      typeof node === 'object' &&\n      (node.nodeType === NodeTypes.INSERTION ||\n        node.nodeType === NodeTypes.HTML ||\n        node.nodeType === NodeTypes.ENUMERATION ||\n        node.nodeType === NodeTypes.PLURAL ||\n        node.nodeType === NodeTypes.GENDER ||\n        node.nodeType === 'composite')\n    ) {\n      return true;\n    }\n\n    if (Array.isArray(node)) {\n      if (node.length === 0) return false;\n\n      let hasNode = false;\n      let hasPlainObjectOrArray = false;\n\n      for (const item of node) {\n        if (typeof item === 'string') {\n        } else if (\n          item &&\n          typeof item === 'object' &&\n          (item.nodeType === NodeTypes.INSERTION ||\n            item.nodeType === NodeTypes.HTML ||\n            item.nodeType === NodeTypes.ENUMERATION ||\n            item.nodeType === NodeTypes.GENDER ||\n            item.nodeType === 'composite')\n        ) {\n          hasNode = true;\n        } else {\n          hasPlainObjectOrArray = true;\n        }\n      }\n\n      // If it contains plain objects or nested arrays, it's a structural array\n      if (hasPlainObjectOrArray) return false;\n      // If it contains ONLY strings, it's a structural array, not a composite string\n      if (!hasNode) return false;\n\n      return true;\n    }\n\n    return false;\n  },\n  transform: (node: any, props: any, next: any) => {\n    if (typeof node === 'string') {\n      return node;\n    }\n\n    if (node.nodeType === NodeTypes.INSERTION) {\n      if (node[NodeTypes.INSERTION].match(/\\{[^}]*,[^}]*\\}/)) {\n        return node[NodeTypes.INSERTION];\n      }\n      return node[NodeTypes.INSERTION];\n    }\n\n    if (node.nodeType === NodeTypes.HTML) {\n      return node[NodeTypes.HTML];\n    }\n\n    if (node.nodeType === NodeTypes.PLURAL) {\n      const options = node[NodeTypes.PLURAL];\n\n      const transformedOptions: Record<string, string> = {};\n      for (const [key, val] of Object.entries(options)) {\n        const childVal = next(val, props);\n        transformedOptions[key] =\n          typeof childVal === 'string' ? childVal : JSON.stringify(childVal);\n      }\n\n      let varName = 'count';\n\n      const fallbackVal =\n        transformedOptions.other || Object.values(transformedOptions)[0];\n\n      if (fallbackVal) {\n        const match =\n          fallbackVal.match(/\\{\\{([a-zA-Z0-9_]+)\\}\\}/) ||\n          fallbackVal.match(/\\{([a-zA-Z0-9_]+)\\}(?!,)/);\n        if (match) {\n          varName = match[1];\n        }\n      }\n\n      const parts = [];\n\n      for (const [key, val] of Object.entries(transformedOptions)) {\n        const icuKey = key;\n        let strVal = val;\n\n        strVal = strVal.replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\n        strVal = strVal.replace(new RegExp(`\\\\{${varName}\\\\}`, 'g'), '#');\n\n        parts.push(`${icuKey} {${strVal}}`);\n      }\n      return `{${varName}, plural, ${parts.join(' ')}}`;\n    }\n\n    if (node.nodeType === NodeTypes.ENUMERATION) {\n      const options = node[NodeTypes.ENUMERATION];\n\n      const transformedOptions: Record<string, string> = {};\n      for (const [key, val] of Object.entries(options)) {\n        if (key === '__intlayer_icu_var') continue;\n        const childVal = next(val, props);\n        transformedOptions[key] =\n          typeof childVal === 'string' ? childVal : JSON.stringify(childVal);\n      }\n\n      let varName = options.__intlayer_icu_var || 'count';\n\n      if (!options.__intlayer_icu_var) {\n        const fallbackVal =\n          transformedOptions.fallback ||\n          transformedOptions.other ||\n          Object.values(transformedOptions)[0];\n\n        const match =\n          fallbackVal.match(/\\{\\{([a-zA-Z0-9_]+)\\}\\}/) ||\n          fallbackVal.match(/\\{([a-zA-Z0-9_]+)\\}(?!,)/);\n        if (match) {\n          varName = match[1];\n        }\n      }\n\n      const keys = Object.keys(transformedOptions);\n      const pluralKeys = [\n        '1',\n        '2',\n        '<=3',\n        '>=4',\n        'fallback',\n        'other',\n        'zero',\n        'one',\n        'two',\n        'few',\n        'many',\n      ];\n      const isPlural = keys.every(\n        (k) => pluralKeys.includes(k) || /^[<>=]?\\d+(\\.\\d+)?$/.test(k)\n      );\n\n      const parts = [];\n\n      if (isPlural) {\n        for (const [key, val] of Object.entries(transformedOptions)) {\n          let icuKey = key;\n          if (key === 'fallback') icuKey = 'other';\n          else if (key === '<=3') icuKey = 'few';\n          else if (key === '>=4') icuKey = 'many';\n          else if (/^\\d+$/.test(key)) icuKey = `=${key}`;\n\n          let strVal = val;\n\n          strVal = strVal.replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\n          strVal = strVal.replace(new RegExp(`\\\\{${varName}\\\\}`, 'g'), '#');\n\n          parts.push(`${icuKey} {${strVal}}`);\n        }\n        return `{${varName}, plural, ${parts.join(' ')}}`;\n      } else {\n        const entries = Object.entries(transformedOptions).sort(\n          ([keyA], [keyB]) => {\n            if (keyA === 'fallback' || keyA === 'other') return 1;\n            if (keyB === 'fallback' || keyB === 'other') return -1;\n            return 0;\n          }\n        );\n\n        for (const [key, val] of entries) {\n          let icuKey = key;\n          if (key === 'fallback') icuKey = 'other';\n\n          let strVal = val;\n          strVal = strVal.replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\n\n          parts.push(`${icuKey} {${strVal}}`);\n        }\n        return `{${varName}, select, ${parts.join(' ')}}`;\n      }\n    }\n\n    if (node.nodeType === NodeTypes.GENDER) {\n      const options = node[NodeTypes.GENDER];\n      const varName = 'gender';\n      const parts = [];\n\n      const entries = Object.entries(options).sort(([keyA], [keyB]) => {\n        if (keyA === 'fallback') return 1;\n        if (keyB === 'fallback') return -1;\n        return 0;\n      });\n\n      for (const [key, val] of entries) {\n        let icuKey = key;\n        if (key === 'fallback') icuKey = 'other';\n\n        const childVal = next(val, props);\n        let strVal =\n          typeof childVal === 'string' ? childVal : JSON.stringify(childVal);\n\n        strVal = strVal.replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\n        parts.push(`${icuKey} {${strVal}}`);\n      }\n      return `{${varName}, select, ${parts.join(' ')}}`;\n    }\n\n    if (\n      Array.isArray(node) ||\n      (node.nodeType === 'composite' && Array.isArray(node.composite))\n    ) {\n      const arr = Array.isArray(node) ? node : node.composite;\n      const items = arr.map((item: any) => next(item, props));\n      return items.join('');\n    }\n\n    return next(node, props);\n  },\n};\n\nexport const intlayerToI18nextFormatter = (\n  message: Dictionary['content']\n): JsonValue => {\n  return deepTransformNode(message, {\n    dictionaryKey: 'i18next',\n    keyPath: [],\n    plugins: [{ id: 'i18next', ...intlayerToI18nextPlugin }],\n  });\n};\n\nexport const i18nextToIntlayerFormatter = (\n  message: JsonValue\n): Dictionary['content'] => {\n  return deepTransformNode(message, {\n    dictionaryKey: 'i18next',\n    keyPath: [],\n    plugins: [{ id: 'i18next', ...i18nextToIntlayerPlugin }],\n  });\n};\n"],"mappings":"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"}