lib/opal/cli_options.rb



require 'optparse'

module Opal
  class CLIOptions < OptionParser
    def initialize
      super
      @options = {}

      self.banner = 'Usage: opal [options] -- [programfile]'

      separator ''

      on('-v', '--verbose', 'print version number, then turn on verbose mode') do
        print_version
        exit if ARGV.empty?
        options[:verbose] = true
      end

      on('--verbose', 'turn on verbose mode (set $VERBOSE to true)') do
        options[:verbose] = true
      end

      on('-d', '--debug', 'turn on debug mode (set $DEBUG to true)') do
        options[:debug] = true
      end

      on('--version', 'Print the version') do
        print_version
        exit
      end

      on("-h", "--help", "Show this message") do
        puts self
        exit
      end


      section 'Basic Options:'

      on('-I', '--include DIR',
              'Append a load path (may be used more than once)') do |i|
        options[:load_paths] ||= []
        options[:load_paths] << i
      end

      on('-e', '--eval SOURCE', String,
              'One line of script. Several -e\'s allowed. Omit [programfile]') do |source|
        options[:evals] ||= []
        options[:evals] << source
      end

      on('-r', '--require LIBRARY', String,
              'Require the library before executing your script') do |library|
        options[:requires] ||= []
        options[:requires] << library
      end

      on('-s', '--stub FILE', String, 'Stubbed files will be compiled as empty files') do |stub|
        options[:stubs] ||= []
        options[:stubs] << stub
      end

      on('-p', '--preload FILE', String, 'Preloaded files will be prepared for dynamic requires') do |stub|
        options[:preload] ||= []
        options[:preload] << stub
      end

      on('-g', '--gem GEM_NAME', String, 'Adds the specified GEM_NAME to Opal\'s load path.') do |g|
        options[:gems] ||= []
        options[:gems] << g
      end

      section 'Running Options:'

      on('--sexp', 'Show Sexps') do
        options[:sexp] = true
      end

      on('-m', '--map', 'Show sourcemap') do
        options[:map] = true
      end

      on('-c', '--compile', 'Compile to JavaScript') do
        options[:compile] = true
      end

      on('-R', '--runner RUNNER', %w[nodejs server phantomjs applescript nashorn], 'Choose the runner: nodejs (default), server') do |runner|
        options[:runner] = runner.to_sym
      end

      on('--server-port PORT', 'Set the port for the server runner (default port: 3000)') do |port|
        options[:runner] = :server
        options[:port] = port.to_i
      end

      on('-E', '--no-exit', 'Do not append a Kernel#exit at the end of file') do |no_exit|
        options[:no_exit] = true
      end

      on('-L', '--library', 'Generate only the code of the library. Omit [programfile] and [-e]') do |no_exit|
        options[:lib_only] = true
      end

      section 'Compilation Options:'

      on('-M', '--no-method-missing', 'Enable/Disable method missing') do
        options[:method_missing] = false
      end

      on('-O', '--no-opal', 'Enable/Disable implicit `require "opal"`') do
        options[:skip_opal_require] = true
      end

      on('-A', '--arity-check', 'Enable arity check') do
        options[:arity_check] = true
      end

      on('-V', 'Enable inline Operators') do
        options[:inline_operators] = true
      end

      dynamic_require_levels = %w[error warning ignore]
      on('-D', '--dynamic-require LEVEL', dynamic_require_levels,
                    'Set level of dynamic require severity.',
                    "(default: error, values: #{dynamic_require_levels.join(', ')})") do |level|
        options[:dynamic_require_severity] = level.to_sym
      end

      on('-P', '--source-map [FILE]', 'Enable/Disable source map') do |file|
        options[:source_map_enabled] = true
        options[:source_map_file] = file if file
      end

      on('-F', '--file FILE', 'Set filename for compiled code') do |file|
        options[:file] = file
      end

      on("--irb", "Enable IRB var mode") do
        options[:irb] = true
      end

      separator ''
    end

    attr_reader :options


    private

    def print_version
      require 'opal/version'
      puts "Opal v#{Opal::VERSION}"
    end

    def section title
      separator ''
      separator title
      separator ''
    end
  end
end