module ExecJS::Runtimes

def self.autodetect

def self.autodetect
  from_environment || best_available ||
    raise(RuntimeUnavailable, "Could not find a JavaScript runtime. " +
      "See https://github.com/rails/execjs for a list of available runtimes.")
end

def self.best_available

def self.best_available
  runtimes.reject(&:deprecated?).find(&:available?)
end

def self.from_environment

def self.from_environment
  env = ENV["EXECJS_RUNTIME"]
  if env && !env.empty?
    name = env
    raise RuntimeUnavailable, "#{name} runtime is not defined" unless const_defined?(name)
    runtime = const_get(name)
    raise RuntimeUnavailable, "#{runtime.name} runtime is not available on this system" unless runtime.available?
    runtime
  end
end

def self.names

def self.names
  @names ||= constants.inject({}) { |h, name| h.merge(const_get(name) => name) }.values
end

def self.runtimes

def self.runtimes
  @runtimes ||= [
    RubyRhino,
    GraalJS,
    Duktape,
    MiniRacer,
    Bun,
    Node,
    JavaScriptCore,
    SpiderMonkey,
    JScript,
    V8
  ]
end