class ViteRuby::Runner

Public: Executes Vite commands, providing conveniences for debugging.

def command_for(args)

Internal: Returns an Array with the command to run.
def command_for(args)
  [config.to_env(env)].tap do |cmd|
    exec_args, vite_args = args.partition { |arg| arg.start_with?("--node-options") }
    cmd.push(*vite_executable(*exec_args))
    cmd.push(*vite_args)
    cmd.push("--mode", config.mode) unless args.include?("--mode") || args.include?("-m")
  end
end

def initialize(vite_ruby)

def initialize(vite_ruby)
  @vite_ruby = vite_ruby
end

def run(argv, exec: false)

Public: Executes Vite with the specified arguments.
def run(argv, exec: false)
  config.within_root {
    cmd = command_for(argv)
    return Kernel.exec(*cmd) if exec
    log_or_noop = ->(line) { logger.info("vite") { line } } unless config.hide_build_console_output
    ViteRuby::IO.capture(*cmd, chdir: config.root, with_output: log_or_noop)
  }
rescue Errno::ENOENT => error
  raise ViteRuby::MissingExecutableError, error
end

def vite_executable(*exec_args)

Internal: Resolves to an executable for Vite.
def vite_executable(*exec_args)
  bin_path = config.vite_bin_path
  return [bin_path] if bin_path && File.exist?(bin_path)
  x = case config.package_manager
  when "npm" then %w[npx]
  when "pnpm" then %w[pnpm exec]
  when "bun" then %w[bun x --bun]
  when "yarn" then %w[yarn]
  else raise ArgumentError, "Unknown package manager #{config.package_manager.inspect}"
  end
  [*x, *exec_args, "vite"]
end