{"version":3,"file":"transformJSFile.cjs","names":["NodeTypes","babelTsParser"],"sources":["../../../src/writeContentDeclaration/transformJSFile.ts"],"sourcesContent":["import { getNodeType } from '@intlayer/core/dictionaryManipulator';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { ContentNode, Dictionary } from '@intlayer/types/dictionary';\nimport * as NodeTypes from '@intlayer/types/nodeType';\nimport * as recast from 'recast';\nimport * as babelTsParser from 'recast/parsers/babel-ts.js';\n\nconst b = recast.types.builders;\nconst n = recast.types.namedTypes;\n\n/**\n * Unwraps TypeScript/Babel expression wrappers (satisfies, as, !, <Type>).\n * Uses string fallbacks to bypass outdated ast-types definitions.\n */\nconst unwrap = (node: any) => {\n  while (\n    node &&\n    (n.TSSatisfiesExpression?.check(node) ||\n      n.TSAsExpression?.check(node) ||\n      n.TSTypeAssertion?.check(node) ||\n      n.TSNonNullExpression?.check(node) ||\n      [\n        'TSSatisfiesExpression',\n        'TSAsExpression',\n        'TSTypeAssertion',\n        'TSNonNullExpression',\n      ].includes(node.type))\n  ) {\n    node = node.expression;\n  }\n  return node;\n};\n\n/**\n * Robustly finds a property in a recast ObjectExpression.\n * Handles quoted (\"key\") or unquoted (key) properties.\n */\nconst getMatchingProperty = (node: any, key: string) => {\n  return node.properties.find((prop: any) => {\n    if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n      if (n.Identifier.check(prop.key) && prop.key.name === key) return true;\n\n      if (n.StringLiteral.check(prop.key) && prop.key.value === key)\n        return true;\n\n      if (n.Literal.check(prop.key) && prop.key.value === key) return true;\n    }\n\n    return false;\n  });\n};\n\n/**\n * Synchronizes numeric suffixes across locales.\n * E.g. \"Hello 1\" -> \"Hello 3\" updates \"Bonjour 1\" to \"Bonjour 3\".\n */\nconst syncNumericSuffixAcrossLocales = (\n  existingNode: any,\n  fallbackLocaleCode: string,\n  newFallbackValue: string\n) => {\n  const trailingNumberMatch = newFallbackValue.match(/\\d+(?!.*\\d)/);\n  if (!trailingNumberMatch) return;\n  const newTrailingNumber = trailingNumberMatch[0];\n\n  if (n.ObjectExpression.check(existingNode)) {\n    for (const prop of existingNode.properties) {\n      if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n        let propName = '';\n\n        if (n.Identifier.check(prop.key)) propName = prop.key.name;\n        else if (\n          n.Literal.check(prop.key) &&\n          typeof prop.key.value === 'string'\n        )\n          propName = prop.key.value;\n        else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n\n        if (propName && propName !== fallbackLocaleCode) {\n          if (\n            n.Literal.check(prop.value) &&\n            typeof prop.value.value === 'string'\n          ) {\n            const currentValue = prop.value.value;\n            const currentTrailingNumberMatch =\n              currentValue.match(/\\d+(?!.*\\d)/);\n\n            if (currentTrailingNumberMatch) {\n              prop.value = b.literal(\n                currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n              );\n            }\n          } else if (n.StringLiteral.check(prop.value)) {\n            const currentValue = prop.value.value;\n            const currentTrailingNumberMatch =\n              currentValue.match(/\\d+(?!.*\\d)/);\n\n            if (currentTrailingNumberMatch) {\n              prop.value = b.stringLiteral(\n                currentValue.replace(/(\\d+)(?!.*\\d)/, newTrailingNumber)\n              );\n            }\n          }\n        }\n      }\n    }\n  }\n};\n\n/**\n * Checks if a value represents a multilingual Intlayer node.\n * A node is multilingual if it is a Translation node, or if it is a specialized node\n * (Markdown, HTML, etc.) that contains a Translation node.\n */\nconst isMultilingualNode = (val: any): boolean => {\n  if (typeof val !== 'object' || val === null || Array.isArray(val)) {\n    return false;\n  }\n\n  const nodeType = getNodeType(val as ContentNode);\n\n  if (nodeType === NodeTypes.TRANSLATION) {\n    return true;\n  }\n\n  if (\n    nodeType === NodeTypes.MARKDOWN ||\n    nodeType === NodeTypes.HTML ||\n    nodeType === NodeTypes.INSERTION\n  ) {\n    return isMultilingualNode((val as any)[nodeType]);\n  }\n\n  if (\n    nodeType === NodeTypes.ENUMERATION ||\n    nodeType === NodeTypes.PLURAL ||\n    nodeType === NodeTypes.CONDITION ||\n    nodeType === NodeTypes.GENDER\n  ) {\n    const data = (val as any)[nodeType];\n\n    if (data && typeof data === 'object') {\n      return Object.values(data).some((v) => isMultilingualNode(v));\n    }\n  }\n\n  return false;\n};\n\n/**\n * Recursively builds or updates an AST node for a given dictionary value.\n */\nconst buildNodeForValue = (\n  val: any,\n  existingNode: any,\n  fallbackLocale: string | undefined, // In per-locale mode, this is the locale of the file\n  requiredImports: Set<string>\n): any => {\n  const unwrappedExisting = unwrap(existingNode);\n\n  // --- CRITICAL GUARD: STRICT AST PRESERVATION ---\n  // If the existing node is code (JSX, Variables, standard functions), leave it alone.\n  // Only allow updates to literals, plain objects, arrays, and Intlayer helpers.\n  if (unwrappedExisting) {\n    const isUpdatableNode =\n      n.Literal.check(unwrappedExisting) ||\n      n.StringLiteral.check(unwrappedExisting) ||\n      n.NumericLiteral.check(unwrappedExisting) ||\n      n.BooleanLiteral.check(unwrappedExisting) ||\n      n.TemplateLiteral.check(unwrappedExisting) ||\n      n.ObjectExpression.check(unwrappedExisting) ||\n      n.ArrayExpression.check(unwrappedExisting) ||\n      (n.CallExpression.check(unwrappedExisting) &&\n        n.Identifier.check(unwrappedExisting.callee) &&\n        [\n          't',\n          'enu',\n          'plural',\n          'cond',\n          'gender',\n          'insert',\n          'md',\n          'html',\n          'file',\n          'nest',\n        ].includes(unwrappedExisting.callee.name));\n\n    if (!isUpdatableNode) {\n      return existingNode;\n    }\n  }\n\n  // If we are in per-locale mode (fallbackLocale is set)\n  // and the value is not already a complex translation node,\n  // we want to store it as a simple literal, NOT wrapped in t().\n  if (fallbackLocale && !existingNode && !isMultilingualNode(val)) {\n    if (val === null) return b.literal(null);\n    if (\n      typeof val === 'string' ||\n      typeof val === 'number' ||\n      typeof val === 'boolean'\n    ) {\n      if (typeof val === 'string' && val.includes('\\n')) {\n        return b.templateLiteral(\n          [b.templateElement({ raw: val, cooked: val }, true)],\n          []\n        );\n      }\n      return b.literal(val);\n    }\n  }\n\n  if (fallbackLocale && existingNode && !isMultilingualNode(val)) {\n    if (\n      n.CallExpression.check(existingNode) &&\n      n.Identifier.check(existingNode.callee) &&\n      existingNode.callee.name === 't'\n    ) {\n      const arg = unwrap(existingNode.arguments[0]);\n\n      if (n.ObjectExpression.check(arg)) {\n        if (typeof val === 'string') {\n          syncNumericSuffixAcrossLocales(arg, fallbackLocale, val);\n        }\n        updateObjectLiteral(\n          arg,\n          { [fallbackLocale]: val },\n          fallbackLocale,\n          requiredImports\n        );\n\n        if (!fallbackLocale) {\n          requiredImports.add('t');\n        }\n\n        return existingNode;\n      }\n    }\n\n    if (\n      (!val || typeof val !== 'object') &&\n      n.CallExpression.check(existingNode) &&\n      n.Identifier.check(existingNode.callee) &&\n      existingNode.callee.name === 'md'\n    ) {\n      const innerArg = existingNode.arguments[0];\n\n      if (\n        n.CallExpression.check(innerArg) &&\n        n.Identifier.check(innerArg.callee) &&\n        innerArg.callee.name === 't'\n      ) {\n        const tArg = unwrap(innerArg.arguments[0]);\n\n        if (n.ObjectExpression.check(tArg)) {\n          if (typeof val === 'string') {\n            syncNumericSuffixAcrossLocales(tArg, fallbackLocale, val);\n          }\n          updateObjectLiteral(\n            tArg,\n            { [fallbackLocale]: val },\n            fallbackLocale,\n            requiredImports\n          );\n          requiredImports.add('md');\n          requiredImports.add('t');\n\n          return existingNode;\n        }\n      }\n    }\n  }\n\n  // 1. Primitives\n  if (val === null) return b.literal(null);\n  if (\n    typeof val === 'string' ||\n    typeof val === 'number' ||\n    typeof val === 'boolean'\n  ) {\n    if (unwrappedExisting) {\n      // Preserve existing template literals (backticks)\n      if (\n        n.TemplateLiteral.check(unwrappedExisting) &&\n        unwrappedExisting.expressions.length === 0\n      ) {\n        unwrappedExisting.quasis[0].value.raw = String(val);\n        unwrappedExisting.quasis[0].value.cooked = String(val);\n        return existingNode;\n      }\n      // Preserve existing standard literals (keeps quote styling)\n      if (\n        n.Literal.check(unwrappedExisting) ||\n        n.StringLiteral.check(unwrappedExisting)\n      ) {\n        unwrappedExisting.value = val;\n        return existingNode;\n      }\n    }\n\n    // Force multiline strings to use Template Literals\n    if (typeof val === 'string' && val.includes('\\n')) {\n      return b.templateLiteral(\n        [b.templateElement({ raw: val, cooked: val }, true)],\n        []\n      );\n    }\n    return b.literal(val);\n  }\n\n  // 2. Arrays\n  if (Array.isArray(val)) {\n    if (unwrappedExisting && n.ArrayExpression.check(unwrappedExisting)) {\n      const elements = [...unwrappedExisting.elements];\n      val.forEach((item, i) => {\n        elements[i] = buildNodeForValue(\n          item,\n          elements[i],\n          fallbackLocale,\n          requiredImports\n        );\n      });\n\n      if (elements.length > val.length) elements.length = val.length;\n      unwrappedExisting.elements = elements as any;\n\n      return existingNode;\n    } else {\n      return b.arrayExpression(\n        val.map((item) =>\n          buildNodeForValue(item, null, fallbackLocale, requiredImports)\n        )\n      );\n    }\n  }\n\n  // 3. Intlayer Specialized Nodes\n  const nodeType =\n    val && typeof val === 'object' && !Array.isArray(val)\n      ? getNodeType(val as ContentNode)\n      : null;\n\n  if (\n    nodeType &&\n    [\n      NodeTypes.TRANSLATION,\n      NodeTypes.ENUMERATION,\n      NodeTypes.PLURAL,\n      NodeTypes.CONDITION,\n      NodeTypes.GENDER,\n      NodeTypes.INSERTION,\n      NodeTypes.MARKDOWN,\n      NodeTypes.HTML,\n      NodeTypes.FILE,\n      NodeTypes.NESTED,\n      NodeTypes.ARRAY,\n      NodeTypes.OBJECT,\n      NodeTypes.REACT_NODE,\n      NodeTypes.NUMBER,\n      NodeTypes.BOOLEAN,\n      NodeTypes.NULL,\n      NodeTypes.UNKNOWN,\n    ].includes(nodeType as any) &&\n    nodeType !== NodeTypes.TEXT\n  ) {\n    const nodeData = (val as any)[nodeType];\n    let calleeName = '';\n\n    if (nodeType === NodeTypes.TRANSLATION) calleeName = 't';\n    else if (nodeType === NodeTypes.ENUMERATION) calleeName = 'enu';\n    else if (nodeType === NodeTypes.PLURAL) calleeName = 'plural';\n    else if (nodeType === NodeTypes.CONDITION) calleeName = 'cond';\n    else if (nodeType === NodeTypes.GENDER) calleeName = 'gender';\n    else if (nodeType === NodeTypes.INSERTION) calleeName = 'insert';\n    else if (nodeType === NodeTypes.MARKDOWN) calleeName = 'md';\n    else if (nodeType === NodeTypes.HTML) calleeName = 'html';\n    else if (nodeType === NodeTypes.FILE) calleeName = 'file';\n    else if (nodeType === NodeTypes.NESTED) calleeName = 'nest';\n\n    if (calleeName) requiredImports.add(calleeName);\n\n    const isMatchingCall =\n      existingNode &&\n      n.CallExpression.check(existingNode) &&\n      n.Identifier.check(existingNode.callee) &&\n      existingNode.callee.name === calleeName;\n\n    if (['t', 'enu', 'plural', 'cond', 'gender'].includes(calleeName)) {\n      let objArg: any = null;\n\n      if (\n        isMatchingCall &&\n        existingNode.arguments.length > 0 &&\n        n.ObjectExpression.check(existingNode.arguments[0])\n      ) {\n        objArg = existingNode.arguments[0];\n      } else {\n        objArg = b.objectExpression([]);\n      }\n      updateObjectLiteral(objArg, nodeData, fallbackLocale, requiredImports);\n\n      return isMatchingCall\n        ? existingNode\n        : b.callExpression(b.identifier(calleeName), [objArg]);\n    }\n\n    if (['md', 'html', 'insert', 'file'].includes(calleeName)) {\n      const argNode = buildNodeForValue(\n        nodeData,\n        isMatchingCall && existingNode.arguments.length > 0\n          ? existingNode.arguments[0]\n          : null,\n        fallbackLocale,\n        requiredImports\n      );\n\n      if (isMatchingCall) {\n        existingNode.arguments[0] = argNode;\n\n        return existingNode;\n      }\n\n      return b.callExpression(b.identifier(calleeName), [argNode]);\n    }\n\n    if (calleeName === 'nest') {\n      const args = [b.literal(nodeData.dictionaryKey)];\n\n      if (nodeData.path) args.push(b.literal(nodeData.path));\n\n      if (isMatchingCall) {\n        existingNode.arguments = args;\n\n        return existingNode;\n      }\n\n      return b.callExpression(b.identifier('nest'), args);\n    }\n  }\n\n  // 4. Plain Object\n  const objNode =\n    unwrappedExisting && n.ObjectExpression.check(unwrappedExisting)\n      ? unwrappedExisting\n      : b.objectExpression([]);\n\n  updateObjectLiteral(objNode, val, fallbackLocale, requiredImports);\n\n  return existingNode && unwrappedExisting === existingNode\n    ? objNode\n    : existingNode || objNode;\n};\n\n/**\n * Recursively updates the AST object literal properties.\n */\nconst updateObjectLiteral = (\n  node: recast.types.namedTypes.ObjectExpression,\n  data: Record<string, any>,\n  fallbackLocale: string | undefined,\n  requiredImports: Set<string>\n) => {\n  for (const [key, val] of Object.entries(data)) {\n    if (val === undefined) continue;\n\n    const existingProp = getMatchingProperty(node, key);\n\n    if (existingProp) {\n      existingProp.value = buildNodeForValue(\n        val,\n        existingProp.value,\n        fallbackLocale,\n        requiredImports\n      );\n    } else {\n      const isValidId = /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(key);\n      const keyNode = isValidId ? b.identifier(key) : b.literal(key);\n      const valueNode = buildNodeForValue(\n        val,\n        null,\n        fallbackLocale,\n        requiredImports\n      );\n      node.properties.push(b.property('init', keyNode, valueNode));\n    }\n  }\n};\n\n/**\n * Modifies the AST's top-level imports to inject dynamically needed helper utilities seamlessly.\n */\nconst addImports = (ast: any, requiredImports: Set<string>, isESM: boolean) => {\n  if (requiredImports.size === 0) return;\n\n  const existingCoreImports = new Set<string>();\n  let coreImportPath: any = null;\n\n  recast.visit(ast, {\n    visitImportDeclaration(path) {\n      const source = path.node.source.value;\n\n      if (source === 'intlayer') {\n        coreImportPath = path;\n        path.node.specifiers?.forEach((spec) => {\n          if (\n            n.ImportSpecifier.check(spec) &&\n            typeof spec.imported.name === 'string'\n          ) {\n            existingCoreImports.add(spec.imported.name);\n          }\n        });\n      }\n\n      return false;\n    },\n    visitVariableDeclaration(path) {\n      path.node.declarations.forEach((decl) => {\n        if (\n          n.VariableDeclarator.check(decl) &&\n          n.CallExpression.check(decl.init) &&\n          n.Identifier.check(decl.init.callee) &&\n          decl.init.callee.name === 'require'\n        ) {\n          const arg = decl.init.arguments[0];\n\n          if (n.Literal.check(arg)) {\n            if (arg.value === 'intlayer') {\n              if (n.ObjectPattern.check(decl.id)) {\n                decl.id.properties.forEach((prop) => {\n                  if (\n                    n.Property.check(prop) &&\n                    (n.Identifier.check(prop.key) ||\n                      n.Identifier.check(prop.value))\n                  ) {\n                    const name = n.Identifier.check(prop.key)\n                      ? prop.key.name\n                      : (prop.value as any).name;\n                    existingCoreImports.add(name);\n                  }\n                });\n              } else if (n.Identifier.check(decl.id)) {\n                // Handle const intlayer = require('intlayer')\n                existingCoreImports.add(decl.id.name);\n              }\n            }\n          }\n        }\n      });\n\n      return false;\n    },\n  });\n\n  const missingCore = Array.from(requiredImports).filter(\n    (imp) => !existingCoreImports.has(imp)\n  );\n\n  if (missingCore.length === 0) return;\n\n  if (isESM) {\n    if (coreImportPath) {\n      missingCore.forEach((imp) => {\n        coreImportPath.node.specifiers.push(\n          b.importSpecifier(b.identifier(imp))\n        );\n      });\n      coreImportPath.node.specifiers.sort((a: any, b: any) =>\n        a.imported.name.localeCompare(b.imported.name)\n      );\n    } else {\n      const specifiers = missingCore\n        .sort()\n        .map((imp) => b.importSpecifier(b.identifier(imp)));\n      const newImport = b.importDeclaration(specifiers, b.literal('intlayer'));\n      ast.program.body.unshift(newImport);\n    }\n  } else {\n    let insertIndex = 0;\n\n    if (\n      ast.program.body.length > 0 &&\n      n.ExpressionStatement.check(ast.program.body[0]) &&\n      n.Literal.check(ast.program.body[0].expression)\n    ) {\n      insertIndex = 1; // Insert after 'use strict'\n    }\n    const cjsLines: any[] = [];\n\n    const properties = missingCore.sort().map((imp) => {\n      const prop = b.property('init', b.identifier(imp), b.identifier(imp));\n      prop.shorthand = true;\n\n      return prop;\n    });\n    cjsLines.push(\n      b.variableDeclaration('const', [\n        b.variableDeclarator(\n          b.objectPattern(properties),\n          b.callExpression(b.identifier('require'), [b.literal('intlayer')])\n        ),\n      ])\n    );\n\n    ast.program.body.splice(insertIndex, 0, ...cjsLines);\n  }\n};\n\n/**\n * Updates a JS/TS file seamlessly to map new localization keys, arrays, complex nodes and nested dictionaries gracefully using AST updates via Recast parser.\n */\nexport const transformJSFile = async (\n  fileContent: string,\n  dictionary: Dictionary,\n  fallbackLocale?: Locale,\n  noMetadata?: boolean\n): Promise<string> => {\n  if (!dictionary || typeof dictionary !== 'object') return fileContent;\n\n  let ast: any;\n  try {\n    ast = recast.parse(fileContent, {\n      parser: babelTsParser,\n    });\n  } catch (error) {\n    console.error({ error });\n    return fileContent;\n  }\n\n  let rootObject: any = null;\n  let isESM = false;\n\n  recast.visit(ast, {\n    visitExportDefaultDeclaration() {\n      isESM = true;\n\n      return false;\n    },\n    visitImportDeclaration() {\n      isESM = true;\n\n      return false;\n    },\n  });\n\n  recast.visit(ast, {\n    visitExportDefaultDeclaration(path) {\n      const decl = path.node.declaration;\n      const unwrappedDecl = unwrap(decl);\n\n      if (n.ObjectExpression.check(unwrappedDecl)) {\n        rootObject = unwrappedDecl;\n      } else if (n.Identifier.check(unwrappedDecl)) {\n        const varName = unwrappedDecl.name;\n        recast.visit(ast, {\n          visitVariableDeclarator(vp) {\n            const unwrappedInit = unwrap(vp.node.init);\n\n            if (\n              n.Identifier.check(vp.node.id) &&\n              vp.node.id.name === varName &&\n              n.ObjectExpression.check(unwrappedInit)\n            ) {\n              rootObject = unwrappedInit;\n            }\n\n            return false;\n          },\n        });\n      }\n\n      return false;\n    },\n    visitAssignmentExpression(path) {\n      const left = path.node.left;\n\n      if (n.MemberExpression.check(left)) {\n        if (\n          n.Identifier.check(left.object) &&\n          left.object.name === 'module' &&\n          n.Identifier.check(left.property) &&\n          left.property.name === 'exports'\n        ) {\n          const unwrappedRight = unwrap(path.node.right);\n\n          if (n.ObjectExpression.check(unwrappedRight)) {\n            rootObject = unwrappedRight;\n          }\n        }\n\n        if (\n          n.Identifier.check(left.object) &&\n          left.object.name === 'exports' &&\n          n.Identifier.check(left.property) &&\n          left.property.name === 'default'\n        ) {\n          const unwrappedRight = unwrap(path.node.right);\n\n          if (n.ObjectExpression.check(unwrappedRight)) {\n            rootObject = unwrappedRight;\n          }\n        }\n      }\n      this.traverse(path);\n    },\n  });\n\n  if (!rootObject) {\n    recast.visit(ast, {\n      visitVariableDeclarator(path) {\n        const unwrappedInit = unwrap(path.node.init);\n\n        if (!rootObject && n.ObjectExpression.check(unwrappedInit)) {\n          rootObject = unwrappedInit;\n        }\n\n        return false;\n      },\n    });\n  }\n\n  if (!rootObject) return fileContent;\n\n  const requiredImports = new Set<string>();\n  const effectiveFallbackLocale = (fallbackLocale as string) ?? 'en';\n\n  const metadataProperties = [\n    'id',\n    'locale',\n    'filled',\n    'fill',\n    'title',\n    'description',\n    'tags',\n    'version',\n    'priority',\n    'contentAutoTransformation',\n  ];\n\n  if (noMetadata) {\n    // Remove key, content and metadata properties if they exist\n    rootObject.properties = rootObject.properties.filter((prop: any) => {\n      if (n.Property.check(prop) || n.ObjectProperty.check(prop)) {\n        let propName = '';\n        if (n.Identifier.check(prop.key)) propName = prop.key.name;\n        else if (n.StringLiteral.check(prop.key)) propName = prop.key.value;\n        else if (n.Literal.check(prop.key)) propName = String(prop.key.value);\n\n        return !['key', 'content', ...metadataProperties].includes(propName);\n      }\n      return true;\n    });\n\n    // Update satisfies type if exists\n    recast.visit(ast, {\n      visitNode(path) {\n        const node = path.node;\n        if (\n          (n.TSSatisfiesExpression?.check(node) ||\n            node.type === 'TSSatisfiesExpression') &&\n          (node as any).typeAnnotation &&\n          n.TSTypeReference.check((node as any).typeAnnotation) &&\n          n.Identifier.check((node as any).typeAnnotation.typeName) &&\n          (node as any).typeAnnotation.typeName.name === 'Dictionary'\n        ) {\n          (node as any).typeAnnotation = b.tsIndexedAccessType(\n            b.tsTypeReference(b.identifier('Dictionary')),\n            b.tsLiteralType(b.stringLiteral('content'))\n          );\n        }\n        this.traverse(path);\n      },\n    });\n  } else {\n    for (const prop of metadataProperties) {\n      if ((dictionary as any)[prop] !== undefined) {\n        updateObjectLiteral(\n          rootObject,\n          { [prop]: (dictionary as any)[prop] },\n          undefined,\n          requiredImports\n        );\n      }\n    }\n  }\n\n  if (dictionary.content !== undefined) {\n    updateObjectLiteral(\n      rootObject,\n      noMetadata\n        ? (dictionary.content as Record<string, any>)\n        : { content: dictionary.content },\n      effectiveFallbackLocale,\n      requiredImports\n    );\n  }\n\n  addImports(ast, requiredImports, isESM);\n\n  return recast.print(ast).code;\n};\n"],"mappings":"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"}