class Opal::CLI

def initialize(options = nil)

def initialize(options = nil)
  options ||= {}
  # Runner
  @runner_type    = options.delete(:runner)         || :nodejs
  @runner_options = options.delete(:runner_options) || {}
  @options     = options
  @sexp        = options.delete(:sexp)
  @repl        = options.delete(:repl)
  @no_exit     = options.delete(:no_exit)
  @lib_only    = options.delete(:lib_only)
  @argv        = options.delete(:argv)       { [] }
  @evals       = options.delete(:evals)      { [] }
  @load_paths  = options.delete(:load_paths) { [] }
  @gems        = options.delete(:gems)       { [] }
  @stubs       = options.delete(:stubs)      { [] }
  @preload     = options.delete(:preload)    { [] }
  @output      = options.delete(:output)     { self.class.stdout || $stdout }
  @verbose     = options.delete(:verbose)    { false }
  @debug       = options.delete(:debug)      { false }
  @requires    = options.delete(:requires)   { [] }
  @rbrequires  = options.delete(:rbrequires) { [] }
  @no_cache    = options.delete(:no_cache)   { false }
  @stdin       = options.delete(:stdin)      { $stdin }
  @debug_source_map = options.delete(:debug_source_map) { false }
  @missing_require_severity = options.delete(:missing_require_severity) { Opal::Config.missing_require_severity }
  @requires.unshift('opal') unless options.delete(:skip_opal_require)
  @compiler_options = compiler_option_names.map do |option|
    key = option.to_sym
    next unless options.key? key
    value = options.delete(key)
    [key, value]
  end.compact.to_h
  if @lib_only
    raise ArgumentError, 'no libraries to compile' if @requires.empty?
    raise ArgumentError, "can't accept evals, file, or extra arguments in `library only` mode" if @argv.any? || @evals.any?
  elsif @evals.any?
    @filename = '-e'
    @file = Evals.new(@evals.join("\n"))
  elsif @argv.first && @argv.first != '-'
    @filename = @argv.shift
    @file = File.open(@filename)
  else
    @filename = @argv.shift || '-'
    @file = @stdin
  end
  raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
end