{"version":3,"sources":["../../../src/writeContentDeclaration/writeJSFile.ts"],"sourcesContent":["import generator from '@babel/generator';\nimport * as babelParser from '@babel/parser';\nimport traverse, { NodePath } from '@babel/traverse';\nimport * as t from '@babel/types';\nimport { getAppLogger, logger } from '@intlayer/config';\nimport configuration from '@intlayer/config/built';\nimport {\n  Dictionary,\n  NodeType,\n  TranslationContent,\n  TypedNode,\n} from '@intlayer/core';\nimport { existsSync } from 'fs';\nimport { readFile, writeFile } from 'fs/promises';\nimport { extname } from 'path';\nimport { getContentDeclarationFileTemplate } from '../getContentDeclarationFileTemplate/getContentDeclarationFileTemplate';\nimport { formatCode } from './formatCode';\n\n/**\n * Updates a JavaScript/TypeScript file based on the provided JSON instructions.\n * It targets a specific dictionary object within the file (identified by its 'key' property)\n * and updates its 'content' entries. Currently, it focuses on modifying arguments\n * of 't' (translation) function calls.\n */\nexport const writeJSFile = async (\n  filePath: string,\n  dictionary: Dictionary\n): Promise<void> => {\n  const appLogger = getAppLogger(configuration);\n\n  const {\n    key: dictionaryIdentifierKey,\n    content: updatesToApply,\n    locale,\n    autoFilled,\n  } = dictionary;\n  const isPerLocaleDeclarationFile = typeof locale === 'string';\n\n  // Check if the file exist\n  if (!existsSync(filePath)) {\n    const fileExtension = extname(filePath);\n\n    let format = 'ts' as 'ts' | 'cjs' | 'esm';\n\n    if (fileExtension === '.ts' || fileExtension === '.tsx') {\n      format = 'ts';\n    } else if (fileExtension === '.cjs' || fileExtension === '.cjsx') {\n      format = 'cjs';\n    } else {\n      format = 'esm';\n    }\n\n    appLogger('File does not exist, creating it', {\n      isVerbose: true,\n    });\n    const template = await getContentDeclarationFileTemplate(\n      dictionaryIdentifierKey,\n      format,\n      { locale, autoFilled }\n    );\n\n    await writeFile(filePath, template, 'utf-8');\n  }\n\n  let sourceCode: string;\n  try {\n    sourceCode = await readFile(filePath, 'utf-8');\n  } catch (error) {\n    const err = error as Error;\n    appLogger(`Failed to read file: ${filePath}`, {\n      level: 'error',\n    });\n    throw new Error(`Failed to read file ${filePath}: ${err.message}`);\n  }\n\n  const ast = babelParser.parse(sourceCode, {\n    sourceType: 'module',\n    plugins: ['typescript', 'jsx'],\n    tokens: true,\n  });\n\n  let dictionaryObjectPath: NodePath<t.ObjectExpression> | null = null;\n  let dictionaryIdentifier: string | null = null;\n\n  // First look for direct objects with the right key, regardless of variable assignments\n  traverse(ast, {\n    ObjectExpression(path) {\n      if (dictionaryObjectPath) return; // Already found\n\n      // Check if this object has a key property with the right value\n      const keyProp = path.node.properties.find((prop) => {\n        if (!t.isObjectProperty(prop)) return false;\n        if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n          return false;\n\n        const keyName = t.isIdentifier(prop.key)\n          ? prop.key.name\n          : prop.key.value;\n\n        if (keyName !== 'key' || !t.isStringLiteral(prop.value)) return false;\n\n        // Unescape the value for comparison\n        const propValue = prop.value.value;\n        // Compare actual string content, not just raw representation\n        return propValue === dictionaryIdentifierKey;\n      });\n\n      if (keyProp) {\n        dictionaryObjectPath = path;\n        path.stop();\n      }\n    },\n  });\n\n  // If not found directly, look for variable declarations and exports\n  if (!dictionaryObjectPath) {\n    appLogger(`Looking for variable declarations`, {\n      isVerbose: true,\n    });\n\n    // Collect all variable declarations with objects\n    const candidateVars: { id: string; path: NodePath<t.ObjectExpression> }[] =\n      [];\n\n    traverse(ast, {\n      VariableDeclarator(path) {\n        const { node } = path;\n        if (!t.isIdentifier(node.id)) return;\n\n        let objPath: NodePath<t.ObjectExpression> | null = null;\n\n        // Direct object assignment\n        if (node.init && t.isObjectExpression(node.init)) {\n          objPath = path.get('init') as NodePath<t.ObjectExpression>;\n        }\n        // Object with TS type assertion (satisfies/as)\n        else if (\n          node.init &&\n          (t.isTSAsExpression(node.init) || t.isTSTypeAssertion(node.init)) &&\n          t.isObjectExpression(node.init.expression)\n        ) {\n          objPath = path.get('init.expression') as NodePath<t.ObjectExpression>;\n        }\n\n        if (objPath) {\n          candidateVars.push({ id: node.id.name, path: objPath });\n        }\n      },\n    });\n\n    appLogger(`Found ${candidateVars.length} candidate variables`, {\n      isVerbose: true,\n    });\n\n    // Check each candidate for the key property\n    for (const { id, path } of candidateVars) {\n      const keyProp = path.node.properties.find((prop) => {\n        if (!t.isObjectProperty(prop)) return false;\n        if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n          return false;\n\n        const keyName = t.isIdentifier(prop.key)\n          ? prop.key.name\n          : prop.key.value;\n        return (\n          keyName === 'key' &&\n          t.isStringLiteral(prop.value) &&\n          prop.value.value === dictionaryIdentifierKey\n        );\n      });\n\n      if (keyProp) {\n        appLogger(`Found match in variable: ${id}`);\n        dictionaryObjectPath = path;\n        dictionaryIdentifier = id;\n        break;\n      }\n    }\n\n    // If still not found, dump all object expressions for debugging\n    if (!dictionaryObjectPath) {\n      appLogger('Could not find dictionary object. Dumping all objects:', {\n        isVerbose: true,\n      });\n      traverse(ast, {\n        ObjectExpression(path) {\n          const props = path.node.properties\n            .map((prop) => {\n              if (!t.isObjectProperty(prop)) return 'non-object-property';\n              if (!t.isIdentifier(prop.key) && !t.isStringLiteral(prop.key))\n                return 'complex-key';\n\n              const keyName = t.isIdentifier(prop.key)\n                ? prop.key.name\n                : prop.key.value;\n              let valueDesc = 'unknown-value';\n\n              if (t.isStringLiteral(prop.value)) {\n                valueDesc = `\"${prop.value.value}\"`;\n              }\n\n              return `${keyName}: ${valueDesc}`;\n            })\n            .join(', ');\n\n          appLogger(`Object: { ${props} }`);\n        },\n      });\n    }\n  }\n\n  if (!dictionaryObjectPath) {\n    throw new Error(\n      `Could not find dictionary object with key '${dictionaryIdentifierKey}' in ${filePath}`\n    );\n  }\n\n  // Find the 'content' property within the identified dictionary object\n  const contentPropertyPath = (\n    (dictionaryObjectPath as any).get('properties') as NodePath<\n      t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n    >[]\n  ).find((propPath) => {\n    if (!propPath.isObjectProperty()) return false;\n    const propNode = propPath.node;\n    const keyName = t.isIdentifier(propNode.key)\n      ? propNode.key.name\n      : t.isStringLiteral(propNode.key)\n        ? propNode.key.value\n        : null;\n    return keyName === 'content';\n  });\n\n  if (\n    !contentPropertyPath ||\n    !contentPropertyPath.isObjectProperty() ||\n    !(contentPropertyPath.get('value') as NodePath).isObjectExpression()\n  ) {\n    throw new Error(\n      `Could not find 'content' object property, or it's not an object, in dictionary in ${filePath}`\n    );\n  }\n\n  const contentObjectPath = contentPropertyPath.get(\n    'value'\n  ) as NodePath<t.ObjectExpression>;\n\n  /**\n   * Build a Babel Expression for any JSON-serializable value or TypedNode.\n   * - Translation nodes become t({...}) or string literal in per-locale files\n   * - Objects recurse to ObjectExpression\n   * - Arrays recurse to ArrayExpression\n   * - Strings/numbers/booleans/null to corresponding literals\n   */\n  const buildValueNodeFromData = (data: any): t.Expression => {\n    // Translation typed node\n    if ((data as TypedNode)?.nodeType === NodeType.Translation) {\n      const translationContent = data as TranslationContent;\n      if (\n        isPerLocaleDeclarationFile &&\n        typeof locale === 'string' &&\n        translationContent?.[NodeType.Translation]?.[locale] !== undefined\n      ) {\n        return buildValueNodeFromData(\n          translationContent[NodeType.Translation][locale]\n        );\n      }\n      const translationsObj = t.objectExpression(\n        Object.entries(translationContent?.[NodeType.Translation] ?? {}).map(\n          ([langKey, langValue]) => {\n            const keyNode = t.isValidIdentifier(langKey)\n              ? t.identifier(langKey)\n              : t.stringLiteral(langKey);\n            return t.objectProperty(keyNode, buildValueNodeFromData(langValue));\n          }\n        )\n      );\n      return t.callExpression(t.identifier('t'), [translationsObj]);\n    }\n\n    // Arrays\n    if (Array.isArray(data)) {\n      return t.arrayExpression(data.map((el) => buildValueNodeFromData(el)));\n    }\n\n    // Objects (plain)\n    if (data && typeof data === 'object') {\n      const props = Object.entries(data).map(([k, v]) => {\n        const key = t.isValidIdentifier(k)\n          ? t.identifier(k)\n          : t.stringLiteral(k);\n        return t.objectProperty(key, buildValueNodeFromData(v));\n      });\n      return t.objectExpression(props);\n    }\n\n    // Primitives\n    switch (typeof data) {\n      case 'string':\n        return t.stringLiteral(data);\n      case 'number':\n        return t.numericLiteral(data);\n      case 'boolean':\n        return t.booleanLiteral(data);\n      default:\n        return t.nullLiteral();\n    }\n  };\n\n  /** Ensure an object property exists on a given object expression path. */\n  const ensureObjectProperty = (\n    objPath: NodePath<t.ObjectExpression>,\n    key: string\n  ): NodePath<t.ObjectProperty> => {\n    const existing = (\n      objPath.get('properties') as NodePath<\n        t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n      >[]\n    ).find((propPath) => {\n      if (!propPath.isObjectProperty()) return false;\n      const propNode = propPath.node;\n      const keyName = t.isIdentifier(propNode.key)\n        ? propNode.key.name\n        : t.isStringLiteral(propNode.key)\n          ? propNode.key.value\n          : null;\n      return keyName === key;\n    }) as NodePath<t.ObjectProperty> | undefined;\n\n    if (existing) return existing;\n\n    const keyNode = t.isValidIdentifier(key)\n      ? t.identifier(key)\n      : t.stringLiteral(key);\n    const newProp = t.objectProperty(keyNode, t.objectExpression([]));\n    objPath.node.properties.push(newProp);\n\n    // Return a fresh path for the newly pushed property\n    const props = objPath.get('properties') as NodePath<\n      t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n    >[];\n    return props[props.length - 1] as NodePath<t.ObjectProperty>;\n  };\n\n  /** Recursively merge a JSON-like value into an ObjectExpression property path. */\n  const mergeValueIntoProperty = (\n    propPath: NodePath<t.ObjectProperty>,\n    value: any,\n    propKeyForLogs: string\n  ) => {\n    const valuePath = propPath.get('value') as NodePath;\n\n    // Translation typed node → either update t() args or replace value\n    if ((value as TypedNode)?.nodeType === NodeType.Translation) {\n      const translationContent = value as TranslationContent;\n      if (\n        valuePath.isCallExpression() &&\n        t.isIdentifier(valuePath.node.callee) &&\n        valuePath.node.callee.name === 't'\n      ) {\n        // Replace argument with the full translations object (simpler and robust)\n        const translationsObj = t.objectExpression(\n          Object.entries(translationContent?.[NodeType.Translation] ?? {}).map(\n            ([langKey, langValue]) =>\n              t.objectProperty(\n                t.isValidIdentifier(langKey)\n                  ? t.identifier(langKey)\n                  : t.stringLiteral(langKey),\n                buildValueNodeFromData(langValue)\n              )\n          )\n        );\n\n        if (isPerLocaleDeclarationFile && typeof locale === 'string') {\n          const localized =\n            translationContent?.[NodeType.Translation]?.[locale];\n          if (localized !== undefined) {\n            valuePath.replaceWith(buildValueNodeFromData(localized));\n            return;\n          }\n        }\n\n        (valuePath.node as t.CallExpression).arguments = [translationsObj];\n        return;\n      }\n\n      // Otherwise, replace with a fresh node\n      valuePath.replaceWith(buildValueNodeFromData(value));\n      return;\n    }\n\n    // Arrays → replace entirely\n    if (Array.isArray(value)) {\n      valuePath.replaceWith(buildValueNodeFromData(value));\n      return;\n    }\n\n    // Objects → ensure object expression and recurse into each key\n    if (value && typeof value === 'object') {\n      if (!valuePath.isObjectExpression()) {\n        valuePath.replaceWith(t.objectExpression([]));\n      }\n      const objPath = valuePath as NodePath<t.ObjectExpression>;\n      for (const [k, v] of Object.entries(value)) {\n        const childProp = ensureObjectProperty(objPath, k);\n        mergeValueIntoProperty(childProp, v, `${propKeyForLogs}.${k}`);\n      }\n      return;\n    }\n\n    // Primitives → replace\n    valuePath.replaceWith(buildValueNodeFromData(value));\n    return;\n  };\n\n  // Apply updates to each entry specified in the JSON (now supports deep nesting)\n  for (const [entryKeyToUpdate, newEntryData] of Object.entries(\n    updatesToApply\n  )) {\n    let targetPropertyPath = (\n      contentObjectPath.get('properties') as NodePath<\n        t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n      >[]\n    ).find((propPath) => {\n      if (!propPath.isObjectProperty()) return false;\n      const propNode = propPath.node;\n      const keyName = t.isIdentifier(propNode.key)\n        ? propNode.key.name\n        : t.isStringLiteral(propNode.key)\n          ? propNode.key.value\n          : null;\n      return keyName === entryKeyToUpdate;\n    }) as NodePath<t.ObjectProperty> | undefined;\n\n    if (!targetPropertyPath) {\n      const keyNode = t.isValidIdentifier(entryKeyToUpdate)\n        ? t.identifier(entryKeyToUpdate)\n        : t.stringLiteral(entryKeyToUpdate);\n      // By default create an empty object; merge will replace if needed\n      const newProperty = t.objectProperty(keyNode, t.objectExpression([]));\n      contentObjectPath.node.properties.push(newProperty);\n      const props = contentObjectPath.get('properties') as NodePath<\n        t.ObjectProperty | t.SpreadElement | t.ObjectMethod\n      >[];\n      targetPropertyPath = props[\n        props.length - 1\n      ] as NodePath<t.ObjectProperty>;\n    }\n\n    mergeValueIntoProperty(targetPropertyPath, newEntryData, entryKeyToUpdate);\n  }\n\n  // Generate JavaScript/TypeScript code from the modified AST\n  const generatedCode = generator(ast, {\n    retainLines: true,\n    comments: true,\n    jsescOption: {\n      minimal: true, // This ensures Unicode characters are not escaped\n    },\n  }).code;\n\n  let finalCode = generatedCode;\n\n  finalCode = await formatCode(filePath, finalCode);\n\n  // Write the modified code back to the file\n  try {\n    await writeFile(filePath, finalCode, 'utf-8');\n    logger(`Successfully updated ${filePath}`, {\n      level: 'info',\n      isVerbose: true,\n    });\n  } catch (error) {\n    const err = error as Error;\n    logger(`Failed to write updated file: ${filePath}`, {\n      level: 'error',\n    });\n    throw new Error(`Failed to write updated file ${filePath}: ${err.message}`);\n  }\n};\n"],"mappings":"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","names":[]}