# frozen_string_literal: true

class Plugin::JsCompiler
  def initialize(
    plugin_name,
    minify: true,
    tree: {},
    entrypoints: {},
    filename_prefix: nil,
    filename_suffix: nil,
    frontend_config: nil
  )
    @plugin_name = plugin_name
    @tree = tree
    @entrypoints = entrypoints
    @minify = minify
    @filename_prefix = filename_prefix
    @filename_suffix = filename_suffix
    @frontend_config = frontend_config
  end

  def compile!
    AssetProcessor.new.rollup(
      @tree,
      {
        pluginName: @plugin_name,
        minify: @minify,
        entrypoints: @entrypoints,
        filenamePrefix: @filename_prefix,
        filenameSuffix: @filename_suffix,
        frontendConfig: @frontend_config,
      },
    )
  rescue AssetProcessor::TimeoutError => e
    raise AssetProcessor::TimeoutError, "[PLUGIN #{@plugin_name}] #{e.message}"
  rescue AssetProcessor::TranspileError => e
    message = "[PLUGIN #{@plugin_name}] Compile error: #{e.message}"
    {
      "#{@filename_prefix}main#{@filename_suffix}.js" => {
        "name" => "main",
        "imports" => [],
        "isEntry" => true,
        "code" => "throw new Error(#{message.to_json});\n",
        "map" => nil,
      },
    }
  end
end
