{"version":3,"file":"update-build-config.cjs","sources":["../../../src/cli/utils/update-build-config.ts"],"sourcesContent":["import MagicString from \"magic-string\";\nimport type { ArrayExpression, Expression, IdentifierReference, ObjectExpression } from \"oxc-parser\";\nimport { parseSync, Visitor } from \"oxc-parser\";\nimport { addImport } from \"./add-import\";\n\ninterface PluginsArrayInfo {\n  arrayStart: number;\n  arrayEnd: number;\n  hasElements: boolean;\n  lastElementEnd?: number;\n  pluginExists: boolean;\n}\n\ninterface BuildOptionsInfo {\n  objectStart: number;\n  objectEnd: number;\n  lastPropertyEnd?: number;\n  hasProperties: boolean;\n}\n\nfunction isIdentifier(node: Expression): node is IdentifierReference {\n  return node.type === \"Identifier\";\n}\n\nfunction isMemberExpression(\n  node: Expression,\n): node is Expression & { type: \"MemberExpression\"; object: Expression; property: { name?: string } } {\n  return node.type === \"MemberExpression\";\n}\n\nfunction isObjectExpression(node: Expression | ObjectExpression): node is ObjectExpression {\n  return node.type === \"ObjectExpression\";\n}\n\nfunction isArrayExpression(node: Expression | ArrayExpression): node is ArrayExpression {\n  return node.type === \"ArrayExpression\";\n}\n\n/**\n * Updates the build configuration by adding a plugin to the build options.\n *\n * @param {Object} options - The options for updating the build config.\n * @param {string} options.content - The source code content to modify.\n * @param {string} options.pluginName - The name to use for the imported plugin.\n * @param {string} options.pluginImportPath - The import path for the plugin.\n * @returns {string} The modified source code with the plugin added.\n */\nexport function updateBuildConfig({\n  content,\n  pluginName,\n  pluginImportPath,\n}: {\n  content: string;\n  pluginName: string;\n  pluginImportPath: string;\n}): string {\n  const result = parseSync(\"config.ts\", content);\n\n  if (result.errors.length > 0) {\n    return content;\n  }\n\n  let pluginsArrayInfo: PluginsArrayInfo | null = null;\n  let buildOptionsInfo: BuildOptionsInfo | null = null;\n\n  const visitor = new Visitor({\n    CallExpression(node) {\n      const { callee } = node;\n\n      let isBuildCall = false;\n\n      if (isIdentifier(callee) && callee.name === \"build\") {\n        isBuildCall = true;\n      } else if (\n        isMemberExpression(callee) &&\n        isIdentifier(callee.object) &&\n        callee.object.name === \"Bun\" &&\n        callee.property.name === \"build\"\n      ) {\n        isBuildCall = true;\n      }\n\n      if (!isBuildCall || node.arguments.length === 0) return;\n\n      const firstArg = node.arguments[0] as Expression;\n      if (!isObjectExpression(firstArg)) return;\n\n      const properties = firstArg.properties;\n\n      buildOptionsInfo = {\n        objectStart: firstArg.start,\n        objectEnd: firstArg.end,\n        hasProperties: properties.length > 0,\n      };\n\n      if (properties.length > 0) {\n        const lastProp = properties[properties.length - 1];\n        buildOptionsInfo.lastPropertyEnd = lastProp.end;\n      }\n\n      for (const prop of properties) {\n        if (prop.type === \"SpreadElement\") continue;\n\n        let isPluginsKey = false;\n        if (prop.key.type === \"Identifier\" && prop.key.name === \"plugins\") {\n          isPluginsKey = true;\n        } else if (prop.key.type === \"Literal\" && prop.key.value === \"plugins\") {\n          isPluginsKey = true;\n        }\n\n        if (!isPluginsKey) continue;\n\n        const propValue = prop.value;\n        if (isArrayExpression(propValue)) {\n          const elements = propValue.elements;\n          const pluginExists = elements.some((el) => el !== null && el.type === \"Identifier\" && el.name === pluginName);\n\n          let lastElementEnd: number | undefined;\n          if (elements.length > 0) {\n            const lastElement = elements[elements.length - 1];\n            if (lastElement) {\n              lastElementEnd = lastElement.end;\n            }\n          }\n\n          pluginsArrayInfo = {\n            arrayStart: propValue.start,\n            arrayEnd: propValue.end,\n            hasElements: elements.length > 0,\n            lastElementEnd,\n            pluginExists,\n          };\n        }\n        break;\n      }\n    },\n  });\n\n  visitor.visit(result.program);\n\n  const finalBuildOptions = buildOptionsInfo as BuildOptionsInfo | null;\n  const finalPluginsArray = pluginsArrayInfo as PluginsArrayInfo | null;\n\n  if (!finalBuildOptions) {\n    return addImport({\n      content,\n      importName: pluginName,\n      importPath: pluginImportPath,\n    });\n  }\n\n  const s = new MagicString(content);\n\n  if (finalPluginsArray) {\n    if (!finalPluginsArray.pluginExists) {\n      if (finalPluginsArray.hasElements && finalPluginsArray.lastElementEnd) {\n        s.appendLeft(finalPluginsArray.lastElementEnd, `, ${pluginName}`);\n      } else {\n        s.appendLeft(finalPluginsArray.arrayStart + 1, pluginName);\n      }\n    }\n  } else {\n    if (finalBuildOptions.hasProperties && finalBuildOptions.lastPropertyEnd) {\n      s.appendLeft(finalBuildOptions.lastPropertyEnd, `,\\n        plugins: [${pluginName}]`);\n    } else {\n      s.appendLeft(finalBuildOptions.objectStart + 1, ` plugins: [${pluginName}] `);\n    }\n  }\n\n  let modifiedCode = s.toString();\n\n  modifiedCode = addImport({\n    content: modifiedCode,\n    importName: pluginName,\n    importPath: pluginImportPath,\n  });\n\n  return modifiedCode;\n}\n"],"names":["parseSync","Visitor","addImport"],"mappings":"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"}