class SprocketsUglifierWithSM::Compressor

Constants

DEFAULTS

Public Class Methods

new(options = {}) click to toggle source
Calls superclass method
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 9
def initialize(options = {})
  @options = DEFAULTS.merge(Rails.application.config.assets.uglifier.to_h).merge!(options)
  super @options
end

Public Instance Methods

call(input) click to toggle source
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 14
def call(input)
  data = input.fetch(:data)
  name = input.fetch(:name)

  uglifier = Sprockets::Autoload::Uglifier.new(@options)

  compressed_data, sourcemap_json = uglifier.compile_with_map(data)

  sourcemap = JSON.parse(sourcemap_json)

  if Rails.application.config.assets.sourcemaps_embed_source
    sourcemap['sourcesContent'] = [data]
  else
    uncompressed_filename = File.join(Rails.application.config.assets.prefix, Rails.application.config.assets.uncompressed_prefix, "#{name}-#{digest(data)}.js")
    uncompressed_path     = File.join(Rails.public_path, uncompressed_filename)
    uncompressed_url      = filename_to_url(uncompressed_filename)

    FileUtils.mkdir_p File.dirname(uncompressed_path)
    File.open(uncompressed_path, 'w') { |f| f.write data }
    gzip_file(uncompressed_path) if gzip?

    sourcemap['sources'] = [uncompressed_url]
  end
  sourcemap['file'] = "#{name}.js"

  sourcemap_json     = sourcemap.to_json
  sourcemap_filename = File.join(Rails.application.config.assets.prefix, Rails.application.config.assets.sourcemaps_prefix, "#{name}-#{digest(sourcemap_json)}.js.map")
  sourcemap_path     = File.join(Rails.public_path, sourcemap_filename)
  sourcemap_url      = filename_to_url(sourcemap_filename)

  FileUtils.mkdir_p File.dirname(sourcemap_path)
  File.open(sourcemap_path, 'w') { |f| f.write sourcemap_json }
  gzip_file(sourcemap_path) if gzip?

  compressed_data.concat "\n//# sourceMappingURL=#{sourcemap_url}\n"
end

Private Instance Methods

digest(io) click to toggle source
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 78
def digest(io)
  Sprockets::DigestUtils.pack_hexdigest Sprockets::DigestUtils.digest(io)
end
filename_to_url(filename) click to toggle source
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 66
def filename_to_url(filename)
  url_root = Rails.application.config.assets.sourcemaps_url_root
  case url_root
  when FalseClass
    filename
  when Proc
    url_root.call filename
  else
    File.join url_root.to_s, filename
  end
end
gzip?() click to toggle source
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 53
def gzip?
  config = Rails.application.config.assets
  config.sourcemaps_gzip || (config.sourcemaps_gzip.nil? && config.gzip)
end
gzip_file(path) click to toggle source
# File lib/sprockets_uglifier_with_source_maps/compressor.rb, line 58
def gzip_file(path)
  Zlib::GzipWriter.open("#{path}.gz") do |gz|
    gz.mtime     = File.mtime(path)
    gz.orig_name = path
    gz.write IO.binread(path)
  end
end