lib/webpack_driver/process.rb in webpack_driver-0.2.1 vs lib/webpack_driver/process.rb in webpack_driver-0.3.0

- old
+ new

@@ -10,24 +10,27 @@ extend Forwardable def_delegators :@proc, :alive?, :environment, :wait - attr_reader :assets, :messages - attr_reader :config + attr_reader :config, :assets, :messages, :progress, :error, + :last_compilation_message, :last_status def initialize(script, config) self.reset! @config = config args = ["./node_modules/.bin/#{script}"] + config.flags - + config.logger.info("Starting webpack using command:\n#{args.join(' ')}") @proc = ::ChildProcess.build(*args) @proc.environment.merge!( config.environment ) - @proc.cwd = config.directory + if config.directory + config.logger.info("In directory: #{config.directory}") + @proc.cwd = config.directory + end end def start self.reset! @output, w = IO.pipe @@ -41,54 +44,66 @@ @proc.stop @output.close unless @output.closed? @listener.join end - def valid? - last_compilation_message['operation'] == 'emit' + def in_progress? + !@error && @progress && @progress != 1 end protected def reset! @assets = Concurrent::Map.new @messages = Concurrent::Array.new + @last_compilation_message = {} end - def last_compilation_message - msg = @messages.reverse_each.detect{ |l| l['type'] == 'compile' } - msg ? msg['value'] : {} - end - def record_error(error) + @error = error config.logger.error( "#{error['name']}: #{error['resource']}\n#{error['message']}" ) end + def record_progress(progress, msg) + @progress = progress + @last_compilation_message = msg['value'] + end + def record_message(msg) + @messages << msg unless msg['type'] == 'progress' case msg['type'] + when 'status' + @last_status = msg['value'] when 'asset' - name = msg['value']['name'] - @assets[name] = Asset.new(name, msg['value']['size']) + Asset.record(@assets, msg['value']) + when 'compile' + record_progress msg['value']['progress'], msg when 'error' record_error(msg['value']) + when 'config' + config.output_path = Pathname.new(msg['value']['output_path']) else config.logger.debug(msg) end - @messages << msg end def listen_for_status_updates Thread.new do @output.each_line do | l | - match = l.match(/^STATUS: (.*)/) - if match - record_message(JSON.parse(match[1])) - config.logger.debug(l.chomp) - else - config.logger.info(l.chomp) + puts l + begin + match = l.match(/^STATUS: (.*)/) + if match + record_message(JSON.parse(match[1])) + config.logger.debug(l.chomp) + else + config.logger.info(l.chomp) + end + rescue => e + config.logger.error "Exception #{e} encountered while processing line #{l}" end end end end