class Uglifier

Constants

DEFAULTS

Default options for compilation

ES5FallbackPath
Error
SourcePath

Public Class Methods

compile(source, options = {}) click to toggle source

Minifies JavaScript code using implicit context.

source should be a String or IO object containing valid JavaScript. options contain optional overrides to Uglifier::DEFAULTS

Returns minified code as String

# File lib/uglifier.rb, line 42
def self.compile(source, options = {})
  self.new(options).compile(source)
end
new(options = {}) click to toggle source

Initialize new context for Uglifier with given options

options - Hash of options to override Uglifier::DEFAULTS

# File lib/uglifier.rb, line 49
def initialize(options = {})
  @options = DEFAULTS.merge(options)
  @context = ExecJS.compile(File.open(ES5FallbackPath, "r:UTF-8").read + File.open(SourcePath, "r:UTF-8").read)
end

Public Instance Methods

compile(source) click to toggle source

Minifies JavaScript code

source should be a String or IO object containing valid JavaScript.

Returns minified code as String

# File lib/uglifier.rb, line 59
def compile(source)
  source = source.respond_to?(:read) ? source.read : source.to_s

  js = []
  js << "var result = '';"
  js << "var source = #{json_encode(source)};"
  js << "var ast = UglifyJS.parser.parse(source);"

  if @options[:lift_vars]
    js << "ast = UglifyJS.uglify.ast_lift_variables(ast);"
  end

  if @options[:copyright]
    js << <<-JS
    var comments = UglifyJS.parser.tokenizer(source)().comments_before;
    for (var i = 0; i < comments.length; i++) {
      var c = comments[i];
      result += (c.type == "comment1") ? "//"+c.value+"\\n" : "/*"+c.value+"*/\\n";
    }
    JS
  end

  js << "ast = UglifyJS.uglify.ast_mangle(ast, #{json_encode(mangle_options)});"

  if @options[:squeeze]
    js << "ast = UglifyJS.uglify.ast_squeeze(ast, #{json_encode(squeeze_options)});"
  end

  if @options[:unsafe]
    js << "ast = UglifyJS.uglify.ast_squeeze_more(ast);"
  end

  js << "result += UglifyJS.uglify.gen_code(ast, #{json_encode(gen_code_options)});"

  if !@options[:beautify] && @options[:max_line_length]
    js << "result = UglifyJS.uglify.split_lines(result, #{@options[:max_line_length].to_i})"
  end

  js << "return result + ';';"

  @context.exec js.join("\n")
end
Also aliased as: compress
compress(source)
Alias for: compile

Private Instance Methods

defines() click to toggle source
# File lib/uglifier.rb, line 123
def defines
  Hash[(@options[:define] || {}).map do |k, v|
    token = if v.is_a? Numeric
      ['num', v]
    elsif [true, false].include?(v)
      ['name', v.to_s]
    elsif v == nil
      ['name', 'null']
    else
      ['string', v.to_s]
    end
    [k, token]
  end]
end
gen_code_options() click to toggle source
# File lib/uglifier.rb, line 138
def gen_code_options
  options = {
    :ascii_only => @options[:ascii_only],
    :inline_script => @options[:inline_script],
    :quote_keys => @options[:quote_keys]
  }

  if @options[:beautify]
    options.merge(:beautify => true).merge(@options[:beautify_options])
  else
    options
  end
end
json_encode(obj) click to toggle source
# File lib/uglifier.rb, line 154
def json_encode(obj)
  MultiJson.dump(obj)
end
mangle_options() click to toggle source
# File lib/uglifier.rb, line 105
def mangle_options
  {
    "mangle" => @options[:mangle],
    "toplevel" => @options[:toplevel],
    "defines" => defines,
    "except" => @options[:except],
    "no_functions" => @options[:mangle] == :vars
  }
end
squeeze_options() click to toggle source
# File lib/uglifier.rb, line 115
def squeeze_options
  {
    "make_seqs" => @options[:seqs],
    "dead_code" => @options[:dead_code],
    "keep_comps" => !@options[:unsafe]
  }
end