class ESLintWebpacker::Runner

Constants

JAVASCRIPT_EXTENSIONS

Public Class Methods

new(file) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 11
def initialize(file)
  @file = normalize_infile(file)
end

Public Instance Methods

run() click to toggle source
# File lib/eslint-webpacker/runner.rb, line 15
def run
  javascripts = javascript_files

  puts "Inspecting #{javascripts.size} files"

  warnings = javascripts.map do |javascript|
    generate_warnings(javascript).tap { |warns| output_progress(warns) }
  end

  puts

  warnings.flatten
end

Private Instance Methods

descendant?(file_a, file_b) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 31
def descendant?(file_a, file_b)
  a_list = file_a.to_s.split('/')
  b_list = file_b.to_s.split('/')

  b_list[0..a_list.size - 1] == a_list
end
eslint_d_available?() click to toggle source
# File lib/eslint-webpacker/runner.rb, line 38
def eslint_d_available?
  File.exist?(Rails.root.join('node_modules', '.bin', 'eslint_d'))
end
file_severity(warnings) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 103
def file_severity(warnings)
  return :none if warnings.blank?

  warnings.map(&:severity).uniq.min
end
generate_warnings(javascript) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 42
def generate_warnings(javascript)
  relative_path = javascript.relative_path_from(Pathname.new(Dir.pwd))

  warning_hashes(javascript).flat_map do |hash|
    next if hash['errorCount'].zero?

    hash['messages'].map do |message|
      ESLintWebpacker::Warning.new(relative_path, message)
    end
  end.compact
end
javascript_files() click to toggle source
# File lib/eslint-webpacker/runner.rb, line 54
def javascript_files
  all_javascripts = webpacker_files.select do |asset|
    JAVASCRIPT_EXTENSIONS.include?(asset.extname)
  end

  javascript_files = all_javascripts.select { |a| descendant?(@file, a) }

  javascript_files.reject do |path|
    path.to_s =~ /eslint.js|vendor|gems|min.js|editorial/
  end
end
normalize_infile(file) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 66
def normalize_infile(file)
  # Remove beginning of asset path
  file = file.to_s.gsub(%r{^app/javascript/}, '')

  # Ensure path is absolute
  file = Pathname.new("#{Dir.pwd}/app/javascript/#{file}")

  return file if file.directory?
  return file if file.extname.present?

  # Make sure it has an extension
  Pathname.new("#{file}.js")
end
output_progress(warnings) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 80
def output_progress(warnings)
  print case file_severity(warnings)
        when :high
          'H'.red
        when :low
          'L'.yellow
        else
          '.'.green
        end
end
warning_hashes(file_path) click to toggle source
# File lib/eslint-webpacker/runner.rb, line 91
def warning_hashes(file_path)
  command = eslint_d_available? ? 'eslint_d' : 'eslint'

  JSON.parse(`./node_modules/.bin/#{command} --format json #{file_path}`)
end
webpacker_files() click to toggle source
# File lib/eslint-webpacker/runner.rb, line 97
def webpacker_files
  Dir.glob(Rails.root.join('app', 'javascript', '**/*')).map do |path|
    Pathname.new(path)
  end
end