{"version":3,"file":"configManipulation.mjs","names":[],"sources":["../../../../src/init/utils/configManipulation.ts"],"sourcesContent":["import * as recast from 'recast';\n\nconst { builders: b, namedTypes: n } = recast.types;\n\nconst injectImport = (\n  ast: any,\n  isCJS: boolean,\n  importName: string,\n  source: string\n) => {\n  const body = ast.program.body;\n  const hasImport = body.some((stmt: any) => {\n    if (isCJS) {\n      return (\n        n.VariableDeclaration.check(stmt) &&\n        stmt.declarations.some(\n          (decl: any) =>\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.StringLiteral.check(decl.init.arguments[0]) &&\n            decl.init.arguments[0].value === source\n        )\n      );\n    }\n    return (\n      n.ImportDeclaration.check(stmt) &&\n      (stmt.source.value === source ||\n        stmt.specifiers.some(\n          (spec: any) =>\n            (n.ImportSpecifier.check(spec) &&\n              spec.imported.name === importName) ||\n            (n.ImportDefaultSpecifier.check(spec) &&\n              spec.local?.name === importName)\n        ))\n    );\n  });\n\n  if (hasImport) return;\n\n  const declaration = isCJS\n    ? b.variableDeclaration('const', [\n        b.variableDeclarator(\n          b.identifier(`{ ${importName} }`),\n          b.callExpression(b.identifier('require'), [b.stringLiteral(source)])\n        ),\n      ])\n    : b.importDeclaration(\n        [b.importSpecifier(b.identifier(importName))],\n        b.stringLiteral(source)\n      );\n\n  ast.program.body.unshift(declaration);\n};\n\nconst ensureTsCheck = (ast: any, content: string, extension: string) => {\n  if (\n    ['js', 'mjs', 'cjs'].includes(extension) &&\n    !content.includes('@ts-check')\n  ) {\n    ast.program.body.unshift(b.commentLine(' @ts-check', true, false) as any);\n  }\n};\n\nconst updatePluginArray = (\n  objExpr: any,\n  propertyName: string,\n  pluginName: string\n) => {\n  if (\n    !objExpr ||\n    (objExpr.type !== 'ObjectExpression' && !n.ObjectExpression.check(objExpr))\n  )\n    return;\n\n  let prop = objExpr.properties.find((p: any) => {\n    if (!p?.key) return false;\n    const keyName = p.key.name || p.key.value;\n    return keyName === propertyName;\n  }) as any;\n\n  if (!prop) {\n    prop = b.property(\n      'init',\n      b.identifier(propertyName),\n      b.arrayExpression([])\n    );\n    objExpr.properties.push(prop);\n  }\n\n  const arrayValue = prop.value;\n\n  if (\n    arrayValue &&\n    (arrayValue.type === 'ArrayExpression' ||\n      n.ArrayExpression.check(arrayValue))\n  ) {\n    const hasPlugin = arrayValue.elements.some((el: any) => {\n      const callee = el?.callee;\n      if (!callee) return false;\n      const name = callee.name || callee.id?.name;\n      return name === pluginName || name === 'il';\n    });\n\n    if (!hasPlugin) {\n      arrayValue.elements.push(b.callExpression(b.identifier(pluginName), []));\n    }\n  }\n};\n\nconst genericRecastVisit = (\n  ast: any,\n  updateConfigObject: (obj: any) => void,\n  callNames: string[] = ['defineConfig']\n) => {\n  recast.visit(ast, {\n    visitExportDefaultDeclaration(path) {\n      const decl = path.node.declaration;\n\n      if (n.ObjectExpression.check(decl)) {\n        updateConfigObject(decl);\n      } else if (\n        n.CallExpression.check(decl) &&\n        n.Identifier.check(decl.callee) &&\n        callNames.includes(decl.callee.name)\n      ) {\n        if (n.ObjectExpression.check(decl.arguments[0])) {\n          updateConfigObject(decl.arguments[0]);\n        }\n      } else if (n.Identifier.check(decl)) {\n        const name = decl.name;\n        ast.program.body.forEach((stmt: any) => {\n          if (n.VariableDeclaration.check(stmt)) {\n            stmt.declarations.forEach((vdecl: any) => {\n              if (\n                n.VariableDeclarator.check(vdecl) &&\n                n.Identifier.check(vdecl.id) &&\n                vdecl.id.name === name &&\n                n.ObjectExpression.check(vdecl.init)\n              ) {\n                updateConfigObject(vdecl.init);\n              }\n            });\n          }\n        });\n      }\n      return false;\n    },\n    visitAssignmentExpression(path) {\n      const { left, right } = path.node;\n\n      if (\n        n.MemberExpression.check(left) &&\n        recast.print(left).code === 'module.exports'\n      ) {\n        if (n.ObjectExpression.check(right)) {\n          updateConfigObject(right);\n        } else if (\n          n.CallExpression.check(right) &&\n          n.Identifier.check(right.callee) &&\n          callNames.includes(right.callee.name)\n        ) {\n          if (n.ObjectExpression.check(right.arguments[0])) {\n            updateConfigObject(right.arguments[0]);\n          }\n        }\n      }\n      return false;\n    },\n  });\n};\n\nexport const updateViteConfig = (\n  content: string,\n  extension: string\n): string => {\n  const ast = recast.parse(content, {\n    parser: require('recast/parsers/typescript'),\n  });\n\n  ensureTsCheck(ast, content, extension);\n\n  const isCJSFile =\n    extension === 'cjs' ||\n    (content.includes('module.exports') && !content.includes('import '));\n\n  injectImport(ast, isCJSFile, 'intlayer', 'vite-intlayer');\n\n  genericRecastVisit(ast, (obj) =>\n    updatePluginArray(obj, 'plugins', 'intlayer')\n  );\n\n  return recast.print(ast).code;\n};\n\nexport const updateAstroConfig = (\n  content: string,\n  extension: string\n): string => {\n  const ast = recast.parse(content, {\n    parser: require('recast/parsers/typescript'),\n  });\n\n  ensureTsCheck(ast, content, extension);\n\n  const isCJSFile =\n    extension === 'cjs' ||\n    (content.includes('module.exports') && !content.includes('import '));\n\n  injectImport(ast, isCJSFile, 'intlayer', 'astro-intlayer');\n\n  genericRecastVisit(ast, (obj) =>\n    updatePluginArray(obj, 'integrations', 'intlayer')\n  );\n\n  return recast.print(ast).code;\n};\n\nexport const updateNextConfig = (\n  content: string,\n  extension: string\n): string => {\n  const ast = recast.parse(content, {\n    parser: require('recast/parsers/typescript'),\n  });\n\n  ensureTsCheck(ast, content, extension);\n\n  const isCJSFile = extension === 'cjs' || content.includes('module.exports');\n\n  injectImport(ast, isCJSFile, 'withIntlayer', 'next-intlayer/server');\n\n  recast.visit(ast, {\n    visitExportDefaultDeclaration(path) {\n      const declaration = path.node.declaration;\n      if (\n        n.Expression.check(declaration) &&\n        !(\n          n.CallExpression.check(declaration) &&\n          n.Identifier.check(declaration.callee) &&\n          declaration.callee.name === 'withIntlayer'\n        )\n      ) {\n        path\n          .get('declaration')\n          .replace(\n            b.callExpression(b.identifier('withIntlayer'), [declaration as any])\n          );\n      }\n      return false;\n    },\n    visitAssignmentExpression(path) {\n      const { left, right } = path.node;\n\n      if (\n        n.MemberExpression.check(left) &&\n        recast.print(left).code === 'module.exports' &&\n        !(\n          n.CallExpression.check(right) &&\n          n.Identifier.check(right.callee) &&\n          right.callee.name === 'withIntlayer'\n        )\n      ) {\n        path\n          .get('right')\n          .replace(b.callExpression(b.identifier('withIntlayer'), [right]));\n      }\n      return false;\n    },\n  });\n\n  return recast.print(ast).code;\n};\n\nexport const updateNuxtConfig = (\n  content: string,\n  extension: string\n): string => {\n  const ast = recast.parse(content, {\n    parser: require('recast/parsers/typescript'),\n  });\n\n  ensureTsCheck(ast, content, extension);\n\n  const updateConfigObject = (objExpr: any) => {\n    if (\n      !objExpr ||\n      (objExpr.type !== 'ObjectExpression' &&\n        !n.ObjectExpression.check(objExpr))\n    )\n      return;\n\n    let modulesProp = objExpr.properties.find((p: any) => {\n      if (!p?.key) return false;\n      const keyName = p.key.name || p.key.value;\n      return keyName === 'modules';\n    }) as any;\n\n    if (!modulesProp) {\n      modulesProp = b.property(\n        'init',\n        b.identifier('modules'),\n        b.arrayExpression([])\n      );\n      objExpr.properties.push(modulesProp);\n    }\n\n    const modulesValue = modulesProp.value;\n\n    if (\n      modulesValue &&\n      (modulesValue.type === 'ArrayExpression' ||\n        n.ArrayExpression.check(modulesValue))\n    ) {\n      const hasModule = modulesValue.elements.some((el: any) => {\n        if (\n          n.StringLiteral.check(el) ||\n          el.type === 'StringLiteral' ||\n          el.type === 'Literal'\n        ) {\n          return (el.value || el.extra?.rawValue) === 'nuxt-intlayer';\n        }\n        return false;\n      });\n\n      if (!hasModule) {\n        modulesValue.elements.push(b.stringLiteral('nuxt-intlayer'));\n      }\n    }\n  };\n\n  genericRecastVisit(ast, updateConfigObject, ['defineNuxtConfig']);\n\n  return recast.print(ast).code;\n};\n\nexport const updateSvelteConfig = (\n  content: string,\n  extension: string\n): string => {\n  const ast = recast.parse(content, {\n    parser: require('recast/parsers/typescript'),\n  });\n\n  ensureTsCheck(ast, content, extension);\n\n  // Svelte config usually doesn't need Intlayer injection, just typing\n  return recast.print(ast).code;\n};\n"],"mappings":"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"}