class Sprockets::Webpack::WebpackDriver

Public Class Methods

new(config, entry) click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 8
def initialize(config, entry)
  @tempfile = Tempfile.new('bundle.XXXXXXXXX.js')
  @config_guard = FileGuard.new(config)
  cmd = "node #{compiler_js_path} #{config} #{entry} #{path.dirname} #{path.basename} 2>&1"
  @io = IO.popen({ 'NODE_ENV' => env }, cmd, 'r+')
end

Public Instance Methods

compile() click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 15
def compile
  errors = []

  @io.puts(@config_guard.detect_change? ? 'RELOAD' : '') # starts compilation

  bm = Benchmark.measure do
    while (line = read_line.strip) != 'WEBPACK::EOF'
      errors << line
    end
  end

  OpenStruct.new(errors: errors, data: path.read, benchmark: bm)
rescue Errno::EPIPE, IOError
  errors.unshift '----- NODE BACKTRACE -----'
  errors.unshift "#{$ERROR_INFO.message}. Please check webpack.conf.js and restart web server"
  errors.unshift
  OpenStruct.new(
    errors: errors,
    data: 'console.error("Broken pipe. Webpack died.")',
    benchmark: "<#{@io.pid} died>")
end

Private Instance Methods

compiler_js_path() click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 49
def compiler_js_path
  Pathname.new(__FILE__).dirname.join('compiler.js')
end
env() click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 43
def env
  ENV.fetch('NODE_ENV') do
    defined?(::Rails) ? ::Rails.env : (ENV['RACK_ENV'] || 'development')
  end
end
path() click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 53
def path
  @path ||= Pathname.new(@tempfile.path)
end
read_line() click to toggle source
# File lib/sprockets/webpack/webpack_driver.rb, line 39
def read_line
  @io.gets or fail IOError, 'Webpack died'
end