class ReactOnRails::Configuration

Attributes

auto_load_bundle[RW]
build_production_command[RW]
build_test_command[RW]
components_subdirectory[RW]
defer_generated_component_packs[RW]
development_mode[RW]
force_load[RW]
generated_assets_dir[RW]
generated_assets_dirs[RW]
i18n_dir[RW]
i18n_output_format[RW]
i18n_yml_dir[RW]
logging_on_server[RW]
make_generated_server_bundle_the_entrypoint[RW]
node_modules_location[RW]
prerender[RW]
raise_on_prerender_error[RW]
random_dom_id[RW]
rendering_extension[RW]
rendering_props_extension[RW]
replay_console[RW]
same_bundle_for_client_and_server[RW]
server_bundle_js_file[RW]
server_render_method[RW]
server_renderer_pool_size[RW]
server_renderer_timeout[RW]
skip_display_none[RW]
trace[RW]
webpack_generated_files[RW]

Public Class Methods

new(node_modules_location: nil, server_bundle_js_file: nil, prerender: nil, replay_console: nil, make_generated_server_bundle_the_entrypoint: nil, trace: nil, development_mode: nil, logging_on_server: nil, server_renderer_pool_size: nil, server_renderer_timeout: nil, raise_on_prerender_error: true, skip_display_none: nil, generated_assets_dirs: nil, generated_assets_dir: nil, webpack_generated_files: nil, rendering_extension: nil, build_test_command: nil, build_production_command: nil, defer_generated_component_packs: nil, same_bundle_for_client_and_server: nil, i18n_dir: nil, i18n_yml_dir: nil, i18n_output_format: nil, random_dom_id: nil, server_render_method: nil, rendering_props_extension: nil, components_subdirectory: nil, auto_load_bundle: nil, force_load: nil) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/react_on_rails/configuration.rb, line 62
def initialize(node_modules_location: nil, server_bundle_js_file: nil, prerender: nil,
               replay_console: nil, make_generated_server_bundle_the_entrypoint: nil,
               trace: nil, development_mode: nil,
               logging_on_server: nil, server_renderer_pool_size: nil,
               server_renderer_timeout: nil, raise_on_prerender_error: true,
               skip_display_none: nil, generated_assets_dirs: nil,
               generated_assets_dir: nil, webpack_generated_files: nil,
               rendering_extension: nil, build_test_command: nil,
               build_production_command: nil, defer_generated_component_packs: nil,
               same_bundle_for_client_and_server: nil,
               i18n_dir: nil, i18n_yml_dir: nil, i18n_output_format: nil,
               random_dom_id: nil, server_render_method: nil, rendering_props_extension: nil,
               components_subdirectory: nil, auto_load_bundle: nil, force_load: nil)
  self.node_modules_location = node_modules_location.present? ? node_modules_location : Rails.root
  self.generated_assets_dirs = generated_assets_dirs
  self.generated_assets_dir = generated_assets_dir
  self.build_test_command = build_test_command
  self.build_production_command = build_production_command
  self.i18n_dir = i18n_dir
  self.i18n_yml_dir = i18n_yml_dir
  self.i18n_output_format = i18n_output_format

  self.random_dom_id = random_dom_id
  self.prerender = prerender
  self.replay_console = replay_console
  self.logging_on_server = logging_on_server
  self.development_mode = if development_mode.nil?
                            Rails.env.development?
                          else
                            development_mode
                          end
  self.trace = trace.nil? ? Rails.env.development? : trace
  self.raise_on_prerender_error = raise_on_prerender_error
  self.skip_display_none = skip_display_none
  self.rendering_props_extension = rendering_props_extension

  # Server rendering:
  self.server_bundle_js_file = server_bundle_js_file
  self.same_bundle_for_client_and_server = same_bundle_for_client_and_server
  self.server_renderer_pool_size = self.development_mode ? 1 : server_renderer_pool_size
  self.server_renderer_timeout = server_renderer_timeout # seconds

  self.webpack_generated_files = webpack_generated_files
  self.rendering_extension = rendering_extension

  self.server_render_method = server_render_method
  self.components_subdirectory = components_subdirectory
  self.auto_load_bundle = auto_load_bundle
  self.make_generated_server_bundle_the_entrypoint = make_generated_server_bundle_the_entrypoint
  self.defer_generated_component_packs = defer_generated_component_packs
  self.force_load = force_load
end

Public Instance Methods

setup_config_values() click to toggle source

on ReactOnRails

# File lib/react_on_rails/configuration.rb, line 117
def setup_config_values
  check_autobundling_requirements if auto_load_bundle
  ensure_webpack_generated_files_exists
  configure_generated_assets_dirs_deprecation
  configure_skip_display_none_deprecation
  ensure_generated_assets_dir_present
  check_server_render_method_is_only_execjs
  error_if_using_packer_and_generated_assets_dir_not_match_public_output_path
  # check_deprecated_settings
  adjust_precompile_task
end

Private Instance Methods

adjust_precompile_task() click to toggle source
# File lib/react_on_rails/configuration.rb, line 143
def adjust_precompile_task
  skip_react_on_rails_precompile = %w[no false n f].include?(ENV.fetch("REACT_ON_RAILS_PRECOMPILE", nil))

  return if skip_react_on_rails_precompile || build_production_command.blank?

  raise(ReactOnRails::Error, compile_command_conflict_message) if ReactOnRails::PackerUtils.precompile?

  precompile_tasks = lambda {
    Rake::Task["react_on_rails:generate_packs"].invoke
    Rake::Task["react_on_rails:assets:webpack"].invoke

    # VERSIONS is per the shakacode/shakapacker clean method definition.
    # We set it very big so that it is not used, and then clean just
    # removes files older than 1 hour.
    versions = 100_000
    puts "Invoking task #{ReactOnRails::PackerUtils.packer_type}:clean from React on Rails"
    Rake::Task["#{ReactOnRails::PackerUtils.packer_type}:clean"].invoke(versions)
  }

  if Rake::Task.task_defined?("assets:precompile")
    Rake::Task["assets:precompile"].enhance do
      precompile_tasks.call
    end
  else
    Rake::Task.define_task("assets:precompile") do
      precompile_tasks.call
    end
  end
end
check_autobundling_requirements() click to toggle source
# File lib/react_on_rails/configuration.rb, line 131
def check_autobundling_requirements
  raise_missing_components_subdirectory if auto_load_bundle && !components_subdirectory.present?
  return unless components_subdirectory.present?

  ReactOnRails::PackerUtils.raise_shakapacker_not_installed unless ReactOnRails::PackerUtils.using_packer?
  ReactOnRails::PackerUtils.raise_shakapacker_version_incompatible_for_autobundling unless
    ReactOnRails::PackerUtils.shakapacker_version_requirement_met?(
      ReactOnRails::PacksGenerator::MINIMUM_SHAKAPACKER_VERSION
    )
  ReactOnRails::PackerUtils.raise_nested_entries_disabled unless ReactOnRails::PackerUtils.nested_entries?
end
check_server_render_method_is_only_execjs() click to toggle source
# File lib/react_on_rails/configuration.rb, line 196
    def check_server_render_method_is_only_execjs
      return if server_render_method.blank? ||
                server_render_method == "ExecJS"

      msg = <<-MSG.strip_heredoc
      Error configuring /config/initializers/react_on_rails.rb: invalid value for `config.server_render_method`.
      If you wish to use a server render method other than ExecJS, contact justin@shakacode.com
      for details.
      MSG
      raise ReactOnRails::Error, msg
    end
compile_command_conflict_message() click to toggle source
# File lib/react_on_rails/configuration.rb, line 264
    def compile_command_conflict_message
      <<~MSG

        React on Rails and #{ReactOnRails::PackerUtils.packer_type.upcase_first} error in configuration!
        In order to use config/react_on_rails.rb config.build_production_command,
        you must edit config/#{ReactOnRails::PackerUtils.packer_type}.yml to include this value in the default configuration:
        '#{ReactOnRails::PackerUtils.packer_type}_precompile: false'

        Alternatively, remove the config/react_on_rails.rb config.build_production_command and the
        default bin/#{ReactOnRails::PackerUtils.packer_type} script will be used for assets:precompile.

      MSG
    end
configure_generated_assets_dirs_deprecation() click to toggle source
# File lib/react_on_rails/configuration.rb, line 215
def configure_generated_assets_dirs_deprecation
  return if generated_assets_dirs.blank?

  if ReactOnRails::PackerUtils.using_packer?
    packer_public_output_path = ReactOnRails::PackerUtils.packer_public_output_path
    # rubocop:disable Layout/LineLength
    Rails.logger.warn "Error configuring config/initializers/react_on_rails. Define neither the generated_assets_dirs nor " \
                      "the generated_assets_dir when using #{ReactOnRails::PackerUtils.packer_type.upcase_first}. This is defined by " \
                      "public_output_path specified in #{ReactOnRails::PackerUtils.packer_type}.yml = #{packer_public_output_path}."
    # rubocop:enable Layout/LineLength
    return
  end

  Rails.logger.warn "[DEPRECATION] ReactOnRails: Use config.generated_assets_dir rather than " \
                    "generated_assets_dirs"
  if generated_assets_dir.blank?
    self.generated_assets_dir = generated_assets_dirs
  else
    Rails.logger.warn "[DEPRECATION] ReactOnRails. You have both generated_assets_dirs and " \
                      "generated_assets_dir defined. Define ONLY generated_assets_dir if NOT using Shakapacker " \
                      "and define neither if using Webpacker"
  end
end
configure_skip_display_none_deprecation() click to toggle source
# File lib/react_on_rails/configuration.rb, line 248
def configure_skip_display_none_deprecation
  return if skip_display_none.nil?

  Rails.logger.warn "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
end
ensure_generated_assets_dir_present() click to toggle source
# File lib/react_on_rails/configuration.rb, line 208
def ensure_generated_assets_dir_present
  return if generated_assets_dir.present? || ReactOnRails::PackerUtils.using_packer?

  self.generated_assets_dir = DEFAULT_GENERATED_ASSETS_DIR
  Rails.logger.warn "ReactOnRails: Set generated_assets_dir to default: #{DEFAULT_GENERATED_ASSETS_DIR}"
end
ensure_webpack_generated_files_exists() click to toggle source
# File lib/react_on_rails/configuration.rb, line 239
def ensure_webpack_generated_files_exists
  return unless webpack_generated_files.empty?

  files = ["manifest.json"]
  files << server_bundle_js_file if server_bundle_js_file.present?

  self.webpack_generated_files = files
end
error_if_using_packer_and_generated_assets_dir_not_match_public_output_path() click to toggle source
# File lib/react_on_rails/configuration.rb, line 173
    def error_if_using_packer_and_generated_assets_dir_not_match_public_output_path
      return unless ReactOnRails::PackerUtils.using_packer?

      return if generated_assets_dir.blank?

      packer_public_output_path = ReactOnRails::PackerUtils.packer_public_output_path

      if File.expand_path(generated_assets_dir) == packer_public_output_path.to_s
        Rails.logger.warn("You specified generated_assets_dir in `config/initializers/react_on_rails.rb` " \
                          "with #{ReactOnRails::PackerUtils.packer_type}. " \
                          "Remove this line from your configuration file.")
      else
        msg = <<~MSG
          Error configuring /config/initializers/react_on_rails.rb: You are using #{ReactOnRails::PackerUtils.packer_type}
          and your specified value for generated_assets_dir = #{generated_assets_dir}
          that does not match the value for public_output_path specified in
          #{ReactOnRails::PackerUtils.packer_type}.yml = #{packer_public_output_path}. You should remove the configuration
          value for "generated_assets_dir" from your config/initializers/react_on_rails.rb file.
        MSG
        raise ReactOnRails::Error, msg
      end
    end
raise_missing_components_subdirectory() click to toggle source
# File lib/react_on_rails/configuration.rb, line 254
    def raise_missing_components_subdirectory
      msg = <<~MSG
        **ERROR** ReactOnRails: auto_load_bundle is set to true, yet components_subdirectory is not configured.\
        Please set components_subdirectory to the desired directory.  For more information, please see \
        https://www.shakacode.com/react-on-rails/docs/guides/file-system-based-automated-bundle-generation.md
      MSG

      raise ReactOnRails::Error, msg
    end