Class: Uglifier

Inherits:
Object
  • Object
show all
Defined in:
lib/uglifier.rb,
lib/uglifier/version.rb

Overview

A wrapper around the UglifyJS interface

Constant Summary collapse

Error =

Error class for compilation errors.

ExecJS::Error
SourcePath =

UglifyJS source path

File.expand_path("../uglify.js", __FILE__)
ES5FallbackPath =

ES5 shims source path

File.expand_path("../es5.js", __FILE__)
SplitFallbackPath =

String.split shim source path

File.expand_path("../split.js", __FILE__)
UglifyJSWrapperPath =

UglifyJS wrapper path

File.expand_path("../uglifier.js", __FILE__)
DEFAULTS =

Default options for compilation

{
  # rubocop:disable LineLength
  :output => {
    :ascii_only => true, # Escape non-ASCII characterss
    :comments => :copyright, # Preserve comments (:all, :jsdoc, :copyright, :none)
    :inline_script => false, # Escape occurrences of </script in strings
    :quote_keys => false, # Quote keys in object literals
    :max_line_len => 32 * 1024, # Maximum line length in minified code
    :bracketize => false, # Bracketize if, for, do, while or with statements, even if their body is a single statement
    :semicolons => true, # Separate statements with semicolons
    :preserve_line => false, # Preserve line numbers in outputs
    :beautify => false, # Beautify output
    :indent_level => 4, # Indent level in spaces
    :indent_start => 0, # Starting indent level
    :space_colon => false, # Insert space before colons (only with beautifier)
    :width => 80, # Specify line width when beautifier is used (only with beautifier)
    :preamble => nil # Preamble for the generated JS file. Can be used to insert any code or comment.
  },
  :mangle => {
    :eval => false, # Mangle names when eval of when is used in scope
    :except => ["$super"], # Argument names to be excluded from mangling
    :sort => false, # Assign shorter names to most frequently used variables. Often results in bigger output after gzip.
    :toplevel => false, # Mangle names declared in the toplevel scope
    :properties => false # Mangle property names
  }, # Mangle variable and function names, set to false to skip mangling
  :mangle_properties => false, # Mangle property names
  :compress => {
    :sequences => true, # Allow statements to be joined by commas
    :properties => true, # Rewrite property access using the dot notation
    :dead_code => true, # Remove unreachable code
    :drop_debugger => true, # Remove debugger; statements
    :unsafe => false, # Apply "unsafe" transformations
    :conditionals => true, # Optimize for if-s and conditional expressions
    :comparisons => true, # Apply binary node optimizations for comparisons
    :evaluate => true, # Attempt to evaluate constant expressions
    :booleans => true, # Various optimizations to boolean contexts
    :loops => true, # Optimize loops when condition can be statically determined
    :unused => true, # Drop unreferenced functions and variables
    :hoist_funs => true, # Hoist function declarations
    :hoist_vars => false, # Hoist var declarations
    :if_return => true, # Optimizations for if/return and if/continue
    :join_vars => true, # Join consecutive var statements
    :cascade => true, # Cascade sequences
    :collapse_vars => false, # Collapse single-use var and const definitions when possible.
    :negate_iife => true, # Negate immediately invoked function expressions to avoid extra parens
    :pure_getters => false, # Assume that object property access does not have any side-effects
    :pure_funcs => nil, # List of functions without side-effects. Can safely discard function calls when the result value is not used
    :drop_console => false, # Drop calls to console.* functions
    :angular => false, # Process @ngInject annotations
    :keep_fargs => false, # Preserve unused function arguments
    :keep_fnames => false # Preserve function names
  }, # Apply transformations to code, set to false to skip
  :define => {}, # Define values for symbol replacement
  :enclose => false, # Enclose in output function wrapper, define replacements as key-value pairs
  :screw_ie8 => false, # Don't bother to generate safe code for IE8
  :source_map => false # Generate source map
}
LEGACY_OPTIONS =
[:comments, :squeeze, :copyright, :mangle]
MANGLE_PROPERTIES_DEFAULTS =
{
  :regex => nil # A regular expression to filter property names to be mangled
}
SOURCE_MAP_DEFAULTS =
{
  :map_url => false, # Url for source mapping to be appended in minified source
  :url => false, # Url for original source to be appended in minified source
  :sources_content => false, # Include original source content in map
  :filename => nil, # The filename of the input file
  :root => nil, # The URL of the directory which contains :filename
  :output_filename => nil, # The filename or URL where the minified output can be found
  :input_source_map => nil # The contents of the source map describing the input
}
VERSION =

Current version of Uglifier.

"3.0.0"

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ Uglifier

Initialize new context for Uglifier with given options

Parameters:

  • options (Hash) (defaults to: {})

    optional overrides to Uglifier::DEFAULTS



120
121
122
123
124
125
126
# File 'lib/uglifier.rb', line 120

def initialize(options = {})
  (options.keys - DEFAULTS.keys - LEGACY_OPTIONS)[0..1].each do |missing|
    raise ArgumentError, "Invalid option: #{missing}"
  end
  @options = options
  @context = ExecJS.compile(uglifyjs_source)
end

Class Method Details

.compile(source, options = {}) ⇒ String

Minifies JavaScript code using implicit context.

Parameters:

  • source (IO, String)

    valid JS source code.

  • options (Hash) (defaults to: {})

    optional overrides to Uglifier::DEFAULTS

Returns:

  • (String)

    minified code.



104
105
106
# File 'lib/uglifier.rb', line 104

def self.compile(source, options = {})
  new(options).compile(source)
end

.compile_with_map(source, options = {}) ⇒ Array(String, String)

Minifies JavaScript code and generates a source map using implicit context.

Parameters:

  • source (IO, String)

    valid JS source code.

  • options (Hash) (defaults to: {})

    optional overrides to Uglifier::DEFAULTS

Returns:

  • (Array(String, String))

    minified code and source map.



113
114
115
# File 'lib/uglifier.rb', line 113

def self.compile_with_map(source, options = {})
  new(options).compile_with_map(source)
end

Instance Method Details

#compile(source) ⇒ String Also known as: compress

Minifies JavaScript code

Parameters:

  • source (IO, String)

    valid JS source code.

Returns:

  • (String)

    minified code.



132
133
134
135
136
137
138
139
140
141
# File 'lib/uglifier.rb', line 132

def compile(source)
  if @options[:source_map]
    compiled, source_map = run_uglifyjs(source, true)
    source_map_uri = Base64.strict_encode64(source_map)
    source_map_mime = "application/json;charset=utf-8;base64"
    compiled + "\n//# sourceMappingURL=data:#{source_map_mime},#{source_map_uri}"
  else
    run_uglifyjs(source, false)
  end
end

#compile_with_map(source) ⇒ Array(String, String)

Minifies JavaScript code and generates a source map

Parameters:

  • source (IO, String)

    valid JS source code.

Returns:

  • (Array(String, String))

    minified code and source map.



148
149
150
# File 'lib/uglifier.rb', line 148

def compile_with_map(source)
  run_uglifyjs(source, true)
end