class Sprockets::BumbleD::Transformer

Attributes

cache_key[R]

Public Class Methods

new(options) click to toggle source

rubocop:disable Metrics/MethodLength

# File lib/sprockets/bumble_d/transformer.rb, line 21
def initialize(options)
  @options = options.dup
  @root_dir = @options.delete(:root_dir)
  babel_config_version = @options.delete(:babel_config_version)

  unless @root_dir && File.directory?(@root_dir)
    error_message =
      'You must provide the `root_dir` directory from which ' \
      'node modules are to be resolved'
    raise RootDirectoryDoesNotExistError, error_message
  end

  @resolution_complete = false
  @cache_key = [
    self.class.name,
    VERSION,
    babel_config_version,
    @options
  ].freeze
end

Public Instance Methods

babel() click to toggle source
# File lib/sprockets/bumble_d/transformer.rb, line 78
def babel
  @babel ||= BabelBridge.new(@root_dir)
end
cache_key_from_input(input) click to toggle source

rubocop:enable Metrics/AbcSize, Metrics/MethodLength

# File lib/sprockets/bumble_d/transformer.rb, line 74
def cache_key_from_input(input)
  @cache_key + [input[:filename]] + [input[:data]]
end
call(input) click to toggle source

rubocop:disable Metrics/AbcSize, Metrics/MethodLength

# File lib/sprockets/bumble_d/transformer.rb, line 44
def call(input)
  data = input[:data]

  result = input[:cache].fetch(cache_key_from_input(input)) do
    filename_relative = Sprockets::PathUtils.split_subpath(
      input[:load_path],
      input[:filename]
    )

    options = {
      moduleIds: true,
      sourceRoot: input[:load_path],
      filename: input[:filename],
      filenameRelative: filename_relative,
      ast: false
    }.merge(options_with_resolved_plugins_and_presets)

    if options[:moduleIds] && options[:moduleRoot]
      options[:moduleId] ||= File.join(options[:moduleRoot], input[:name])
    elsif options[:moduleIds] && input[:name] && !input[:name].empty?
      options[:moduleId] ||= input[:name]
    end

    babel.transform(data, options)
  end

  { data: result['code'] }
end

Private Instance Methods

options_with_resolved_plugins_and_presets() click to toggle source
# File lib/sprockets/bumble_d/transformer.rb, line 84
def options_with_resolved_plugins_and_presets
  unless @resolution_complete
    resolver = Resolver.new(babel)
    plugins = @options[:plugins]
    presets = @options[:presets]
    @options[:plugins] = resolver.resolve_plugins(plugins) if plugins.is_a?(Array)
    @options[:presets] = resolver.resolve_presets(presets) if presets.is_a?(Array)
    @resolution_complete = true
  end
  @options
end