{"version":3,"file":"vue-i18n.cjs","names":["insert","plural","enu","NodeTypes","deepTransformNode"],"sources":["../../../src/messageFormat/vue-i18n.ts"],"sourcesContent":["import type { Dictionary } from '@intlayer/types/dictionary';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport { deepTransformNode } from '../interpreter';\nimport { enu, insert, plural } from '../transpiler';\nimport type { JsonValue } from './ICU';\n\n// Types for our AST\ntype VueI18nNode =\n  | string\n  | {\n      type: 'argument';\n      name: string;\n    };\n\nconst parseVueI18nPart = (text: string): VueI18nNode[] => {\n  let index = 0;\n  const nodes: VueI18nNode[] = [];\n  let currentText = '';\n\n  while (index < text.length) {\n    const char = text[index];\n\n    if (char === '{') {\n      if (currentText) {\n        nodes.push(currentText);\n        currentText = '';\n      }\n      index++; // skip {\n      let name = '';\n      while (index < text.length && text[index] !== '}') {\n        name += text[index];\n        index++;\n      }\n      if (index < text.length) {\n        index++; // skip }\n      }\n      nodes.push({ type: 'argument', name: name.trim() });\n    } else {\n      currentText += char;\n      index++;\n    }\n  }\n\n  if (currentText) {\n    nodes.push(currentText);\n  }\n\n  return nodes;\n};\n\nconst parseVueI18n = (text: string): VueI18nNode[][] => {\n  // Split by | but handle escaped \\|\n  const parts: string[] = [];\n  let currentPart = '';\n  let index = 0;\n\n  while (index < text.length) {\n    const char = text[index];\n    if (char === '\\\\' && index + 1 < text.length && text[index + 1] === '|') {\n      currentPart += '|';\n      index += 2;\n    } else if (char === '|') {\n      parts.push(currentPart.trim()); // Trim to remove surrounding spaces\n      currentPart = '';\n      index++;\n    } else {\n      currentPart += char;\n      index++;\n    }\n  }\n  parts.push(currentPart.trim()); // Trim last part too\n\n  return parts.map(parseVueI18nPart);\n};\n\nconst vueI18nPartToIntlayer = (nodes: VueI18nNode[]): any => {\n  if (nodes.length === 0) return '';\n  if (nodes.length === 1 && typeof nodes[0] === 'string') return nodes[0];\n\n  let str = '';\n  for (const node of nodes) {\n    if (typeof node === 'string') {\n      str += node;\n    } else {\n      str += `{{${node.name}}}`;\n    }\n  }\n  return insert(str);\n};\n\nconst vueI18nNodesToIntlayer = (parts: VueI18nNode[][]): any => {\n  if (parts.length === 1) {\n    return vueI18nPartToIntlayer(parts[0]);\n  }\n\n  // Handle pluralization (choice)\n  const options: Record<string, any> = {};\n  const varName = 'count'; // Default variable for vue-i18n choices\n\n  if (parts.length === 2) {\n    // 2 choices: 1 | other\n    return plural({\n      one: vueI18nPartToIntlayer(parts[0]),\n      other: vueI18nPartToIntlayer(parts[1]),\n    });\n  }\n\n  if (parts.length === 3) {\n    // 3 choices: 0 | 1 | other\n    return plural({\n      zero: vueI18nPartToIntlayer(parts[0]),\n      one: vueI18nPartToIntlayer(parts[1]),\n      other: vueI18nPartToIntlayer(parts[2]),\n    });\n  }\n\n  // > 3 choices: 0 | 1 | 2 | ... | other\n  parts.forEach((part, index) => {\n    if (index === parts.length - 1) {\n      options.fallback = vueI18nPartToIntlayer(part);\n    } else {\n      options[index.toString()] = vueI18nPartToIntlayer(part);\n    }\n  });\n\n  // Preserve variable name\n  options.__intlayer_vue_i18n_var = varName;\n\n  return enu(options);\n};\n\nconst vueI18nToIntlayerPlugin = {\n  canHandle: (node: any) =>\n    typeof node === 'string' && (node.includes('{') || node.includes('|')),\n  transform: (node: any) => {\n    try {\n      const ast = parseVueI18n(node);\n      return vueI18nNodesToIntlayer(ast);\n    } catch {\n      return node;\n    }\n  },\n};\n\nconst intlayerToVueI18nPlugin = {\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.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.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      // replace {{...}} with {...} even in strings\n      return node.replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\n    }\n\n    if (node.nodeType === NodeTypes.INSERTION) {\n      // {{name}} -> {name}\n      return node[NodeTypes.INSERTION].replace(/\\{\\{([^}]+)\\}\\}/g, '{$1}');\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      if (\n        transformedOptions.zero &&\n        transformedOptions.one &&\n        transformedOptions.other\n      ) {\n        return `${transformedOptions.zero} | ${transformedOptions.one} | ${transformedOptions.other}`;\n      }\n\n      if (transformedOptions.one && transformedOptions.other) {\n        return `${transformedOptions.one} | ${transformedOptions.other}`;\n      }\n\n      return transformedOptions.other || Object.values(transformedOptions)[0];\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_vue_i18n_var') continue;\n        const childVal = next(val, props);\n        transformedOptions[key] =\n          typeof childVal === 'string' ? childVal : JSON.stringify(childVal);\n      }\n\n      const keys = Object.keys(transformedOptions);\n\n      if (keys.includes('0')) {\n        const indices = keys.filter((key) => /^\\d+$/.test(key)).map(Number);\n        const maxIndex = Math.max(...indices);\n\n        const fallback =\n          transformedOptions.fallback || transformedOptions.other;\n        const resultParts = [];\n\n        if (maxIndex <= 1 && !keys.includes('2')) {\n          const zero = transformedOptions['0'] || '';\n          const one = transformedOptions['1'] || '';\n          return `${zero} | ${one} | ${fallback}`;\n        }\n\n        const limit = Math.max(1, maxIndex);\n\n        for (let i = 0; i <= limit; i++) {\n          const key = i.toString();\n          if (transformedOptions[key]) {\n            resultParts.push(transformedOptions[key]);\n          } else {\n            resultParts.push('');\n          }\n        }\n        resultParts.push(fallback);\n        return resultParts.join(' | ').replace(/ \\| {2}\\| /g, ' | | ');\n      }\n\n      if (\n        keys.includes('1') &&\n        (keys.includes('fallback') || keys.includes('other'))\n      ) {\n        return `${transformedOptions['1']} | ${transformedOptions.fallback || transformedOptions.other}`;\n      }\n\n      if (\n        keys.length === 1 &&\n        (keys.includes('fallback') || keys.includes('other'))\n      ) {\n        return transformedOptions.fallback || transformedOptions.other;\n      }\n\n      return (\n        transformedOptions.fallback || Object.values(transformedOptions)[0]\n      );\n    }\n\n    if (node.nodeType === NodeTypes.GENDER) {\n      const options = node[NodeTypes.GENDER];\n      const transformedOptions: Record<string, any> = {};\n\n      for (const [key, val] of Object.entries(options)) {\n        let newKey = key;\n        if (key === 'fallback') newKey = 'other';\n\n        const childVal = next(val, props);\n        transformedOptions[newKey] = childVal;\n      }\n      return transformedOptions;\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 intlayerToVueI18nFormatter = (\n  message: Dictionary['content']\n): JsonValue => {\n  return deepTransformNode(message, {\n    dictionaryKey: 'vue-i18n',\n    keyPath: [],\n    plugins: [{ id: 'vue-i18n', ...intlayerToVueI18nPlugin }],\n  });\n};\n\nexport const vueI18nToIntlayerFormatter = (\n  message: JsonValue\n): Dictionary['content'] => {\n  return deepTransformNode(message, {\n    dictionaryKey: 'vue-i18n',\n    keyPath: [],\n    plugins: [{ id: 'vue-i18n', ...vueI18nToIntlayerPlugin }],\n  });\n};\n"],"mappings":"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"}