react-rails 2.7.1 → 3.0.0.rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +53 -41
  4. data/lib/assets/javascripts/react_ujs.js +1 -1
  5. data/lib/assets/react-source/development/react-server.js +333 -10
  6. data/lib/assets/react-source/development/react.js +19 -28
  7. data/lib/assets/react-source/production/react-server.js +1 -1
  8. data/lib/assets/react-source/production/react.js +1 -1
  9. data/lib/generators/react/component_generator.rb +126 -121
  10. data/lib/generators/react/install_generator.rb +50 -72
  11. data/lib/generators/templates/component.es6.jsx +8 -8
  12. data/lib/generators/templates/component.js.jsx +14 -14
  13. data/lib/generators/templates/react_server_rendering.rb +3 -1
  14. data/lib/react/jsx/babel_transformer.rb +12 -6
  15. data/lib/react/jsx/jsx_transformer.rb +7 -5
  16. data/lib/react/jsx/processor.rb +3 -1
  17. data/lib/react/jsx/sprockets_strategy.rb +17 -11
  18. data/lib/react/jsx/template.rb +7 -6
  19. data/lib/react/jsx.rb +9 -7
  20. data/lib/react/rails/asset_variant.rb +7 -6
  21. data/lib/react/rails/component_mount.rb +37 -29
  22. data/lib/react/rails/controller_lifecycle.rb +2 -0
  23. data/lib/react/rails/controller_renderer.rb +3 -1
  24. data/lib/react/rails/railtie.rb +19 -22
  25. data/lib/react/rails/test_helper.rb +3 -1
  26. data/lib/react/rails/version.rb +3 -1
  27. data/lib/react/rails/view_helper.rb +3 -1
  28. data/lib/react/rails.rb +9 -7
  29. data/lib/react/server_rendering/bundle_renderer.rb +34 -39
  30. data/lib/react/server_rendering/environment_container.rb +2 -0
  31. data/lib/react/server_rendering/exec_js_renderer.rb +15 -6
  32. data/lib/react/server_rendering/manifest_container.rb +6 -2
  33. data/lib/react/server_rendering/separate_server_bundle_container.rb +19 -0
  34. data/lib/react/server_rendering/yaml_manifest_container.rb +4 -2
  35. data/lib/react/server_rendering.rb +11 -9
  36. data/lib/react-rails.rb +8 -6
  37. data/lib/react.rb +2 -0
  38. metadata +7 -49
  39. data/lib/react/server_rendering/webpacker_manifest_container.rb +0 -96
@@ -1,26 +1,28 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module JSX
3
5
  # A {React::JSX}-compliant transformer which uses the deprecated `JSXTransformer.js` to transform JSX.
4
6
  class JSXTransformer
5
- DEFAULT_ASSET_PATH = 'JSXTransformer.js'
7
+ DEFAULT_ASSET_PATH = "JSXTransformer.js"
6
8
 
7
9
  def initialize(options)
8
10
  @transform_options = {
9
11
  stripTypes: options.fetch(:strip_types, false),
10
- harmony: options.fetch(:harmony, false)
12
+ harmony: options.fetch(:harmony, false)
11
13
  }
12
14
 
13
15
  @asset_path = options.fetch(:asset_path, DEFAULT_ASSET_PATH)
14
16
 
15
17
  # If execjs uses therubyracer, there is no 'global'. Make sure
16
18
  # we have it so JSX script can work properly.
17
- js_code = 'var global = global || this;' + jsx_transform_code
19
+ js_code = "var global = global || this;#{jsx_transform_code}"
18
20
  @context = ExecJS.compile(js_code)
19
21
  end
20
22
 
21
23
  def transform(code)
22
- result = @context.call('JSXTransformer.transform', code, @transform_options)
23
- result['code']
24
+ result = @context.call("JSXTransformer.transform", code, @transform_options)
25
+ result["code"]
24
26
  end
25
27
 
26
28
  # search for transformer file using sprockets - allows user to override
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module JSX
3
5
  # A Sprockets 3+-compliant processor
4
6
  class Processor
5
7
  def self.call(input)
6
- JSX::transform(input[:data])
8
+ JSX.transform(input[:data])
7
9
  end
8
10
  end
9
11
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module JSX
3
5
  # Depending on the Sprockets version,
@@ -17,15 +19,15 @@ module React
17
19
  # @param [Symbol, Nil] A strategy name, or `nil` to detect a strategy
18
20
  def attach_with_strategy(sprockets_env, strategy_or_nil)
19
21
  strategy = strategy_or_nil || detect_strategy
20
- self.public_send(strategy, sprockets_env)
22
+ public_send(strategy, sprockets_env)
21
23
  end
22
24
 
23
25
  # @return [Symbol] based on the environment, return a method name to call with the sprockets environment
24
26
  def detect_strategy
25
27
  sprockets_version = Gem::Version.new(Sprockets::VERSION)
26
- if sprockets_version >= Gem::Version.new('4.a')
28
+ if sprockets_version >= Gem::Version.new("4.a")
27
29
  :register_processors
28
- elsif sprockets_version >= Gem::Version.new('3.0.0')
30
+ elsif sprockets_version >= Gem::Version.new("3.0.0")
29
31
  :register_engine_with_mime_type
30
32
  else
31
33
  :register_engine
@@ -33,20 +35,24 @@ module React
33
35
  end
34
36
 
35
37
  def register_engine(sprockets_env)
36
- sprockets_env.register_engine('.jsx', React::JSX::Template)
38
+ sprockets_env.register_engine(".jsx", React::JSX::Template)
37
39
  end
38
40
 
39
41
  def register_engine_with_mime_type(sprockets_env)
40
- sprockets_env.register_engine('.jsx', React::JSX::Processor, mime_type: 'application/javascript', silence_deprecation: true)
42
+ sprockets_env.register_engine(".jsx", React::JSX::Processor, mime_type: "application/javascript",
43
+ silence_deprecation: true)
41
44
  end
42
45
 
43
46
  def register_processors(sprockets_env)
44
- sprockets_env.register_mime_type('application/jsx', extensions: ['.jsx', '.js.jsx', '.es.jsx', '.es6.jsx'])
45
- sprockets_env.register_mime_type('application/jsx+coffee', extensions: ['.jsx.coffee', '.js.jsx.coffee'])
46
- sprockets_env.register_transformer('application/jsx', 'application/javascript', React::JSX::Processor)
47
- sprockets_env.register_transformer('application/jsx+coffee', 'application/jsx', Sprockets::CoffeeScriptProcessor)
48
- sprockets_env.register_preprocessor('application/jsx', Sprockets::DirectiveProcessor.new(comments: ['//', ['/*', '*/']]))
49
- sprockets_env.register_preprocessor('application/jsx+coffee', Sprockets::DirectiveProcessor.new(comments: ['#', ['###', '###']]))
47
+ sprockets_env.register_mime_type("application/jsx", extensions: [".jsx", ".js.jsx", ".es.jsx", ".es6.jsx"])
48
+ sprockets_env.register_mime_type("application/jsx+coffee", extensions: [".jsx.coffee", ".js.jsx.coffee"])
49
+ sprockets_env.register_transformer("application/jsx", "application/javascript", React::JSX::Processor)
50
+ sprockets_env.register_transformer("application/jsx+coffee", "application/jsx",
51
+ Sprockets::CoffeeScriptProcessor)
52
+ sprockets_env.register_preprocessor("application/jsx",
53
+ Sprockets::DirectiveProcessor.new(comments: ["//", ["/*", "*/"]]))
54
+ sprockets_env.register_preprocessor("application/jsx+coffee",
55
+ Sprockets::DirectiveProcessor.new(comments: ["#", ["###", "###"]]))
50
56
  end
51
57
  end
52
58
  end
@@ -1,16 +1,17 @@
1
- require 'tilt'
1
+ # frozen_string_literal: true
2
+
3
+ require "tilt"
2
4
 
3
5
  module React
4
6
  module JSX
5
7
  # Sprockets 2-compliant processor
6
8
  class Template < Tilt::Template
7
- self.default_mime_type = 'application/javascript'
9
+ self.default_mime_type = "application/javascript"
8
10
 
9
- def prepare
10
- end
11
+ def prepare; end
11
12
 
12
- def evaluate(scope, locals, &block)
13
- @output ||= JSX::transform(data)
13
+ def evaluate(_scope, _locals)
14
+ @evaluate ||= JSX.transform(data)
14
15
  end
15
16
  end
16
17
  end
data/lib/react/jsx.rb CHANGED
@@ -1,10 +1,12 @@
1
- require 'execjs'
2
- require 'react/jsx/processor'
3
- require 'react/jsx/template'
4
- require 'react/jsx/jsx_transformer'
5
- require 'react/jsx/babel_transformer'
6
- require 'react/jsx/sprockets_strategy'
7
- require 'rails'
1
+ # frozen_string_literal: true
2
+
3
+ require "execjs"
4
+ require "react/jsx/processor"
5
+ require "react/jsx/template"
6
+ require "react/jsx/jsx_transformer"
7
+ require "react/jsx/babel_transformer"
8
+ require "react/jsx/sprockets_strategy"
9
+ require "rails"
8
10
 
9
11
  module React
10
12
  module JSX
@@ -1,9 +1,11 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  # This class accepts some options for which build you want, then exposes where you can find
4
6
  # them. In general, these paths should be added to the sprockets environment.
5
7
  class AssetVariant
6
- GEM_ROOT = Pathname.new('../../../../').expand_path(__FILE__)
8
+ GEM_ROOT = Pathname.new("../../../../").expand_path(__FILE__)
7
9
  # @return [String] "production" or "development"
8
10
  attr_reader :react_build
9
11
 
@@ -15,12 +17,11 @@ module React
15
17
 
16
18
  # @param [Hash] Options for the asset variant
17
19
  # @option variant [Symbol] if `:production`, use the minified React.js build
18
- def initialize(options={})
19
-
20
- @react_build = options[:variant] == :production ? 'production' : 'development'
20
+ def initialize(options = {})
21
+ @react_build = options[:variant] == :production ? "production" : "development"
21
22
 
22
- @react_directory = GEM_ROOT.join('lib/assets/react-source/').join(@react_build).to_s
23
- @jsx_directory = GEM_ROOT.join('lib/assets/javascripts/').to_s
23
+ @react_directory = GEM_ROOT.join("lib/assets/react-source/").join(@react_build).to_s
24
+ @jsx_directory = GEM_ROOT.join("lib/assets/javascripts/").to_s
24
25
  end
25
26
  end
26
27
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  # This is the default view helper implementation.
@@ -9,6 +11,7 @@ module React
9
11
  include ActionView::Helpers::TagHelper
10
12
  include ActionView::Helpers::TextHelper
11
13
  attr_accessor :output_buffer
14
+
12
15
  mattr_accessor :camelize_props_switch
13
16
 
14
17
  def initialize
@@ -21,57 +24,62 @@ module React
21
24
  @controller = controller
22
25
  end
23
26
 
24
- def teardown(controller)
25
- end
27
+ def teardown(controller); end
26
28
 
27
29
  # Render a UJS-type HTML tag annotated with data attributes, which
28
30
  # are used by react_ujs to actually instantiate the React component
29
31
  # on the client.
30
32
  def react_component(name, props = {}, options = {}, &block)
31
- options = { :tag => options } if options.is_a?(Symbol)
32
- if options.fetch(:camelize_props, camelize_props_switch)
33
- props = React.camelize_props(props)
34
- end
33
+ options = { tag: options } if options.is_a?(Symbol)
34
+ props = React.camelize_props(props) if options.fetch(:camelize_props, camelize_props_switch)
35
35
 
36
36
  prerender_options = options[:prerender]
37
- if prerender_options
38
- block = Proc.new{ concat(prerender_component(name, props, prerender_options)) }
39
- end
37
+ block = proc { concat(prerender_component(name, props, prerender_options)) } if prerender_options
38
+
39
+ html_options = generate_html_options(name, options, props, prerender_options)
40
+
41
+ rendered_tag(html_options, &block)
42
+ end
43
+
44
+ private
45
+
46
+ # If this controller has checked out a renderer, use that one.
47
+ # Otherwise, use {React::ServerRendering} directly (which will check one out for this rendering).
48
+ def prerender_component(component_name, props, prerender_options)
49
+ renderer = @controller.try(:react_rails_prerenderer) || React::ServerRendering
50
+ renderer.render(component_name, props, prerender_options)
51
+ end
52
+
53
+ def generate_html_options(name, options, props, prerender_options)
54
+ html_options = options.reverse_merge(data: {})
40
55
 
41
- html_options = options.reverse_merge(:data => {})
42
56
  unless prerender_options == :static
43
57
  html_options[:data].tap do |data|
44
58
  data[:react_class] = name
45
59
  data[:react_props] = (props.is_a?(String) ? props : props.to_json)
46
- data[:hydrate] = 't' if prerender_options
60
+ data[:hydrate] = "t" if prerender_options
47
61
 
48
62
  num_components = @cache_ids.count { |c| c.start_with? name }
49
63
  data[:react_cache_id] = "#{name}-#{num_components}"
50
64
  end
51
65
  end
66
+
67
+ html_options
68
+ end
69
+
70
+ def rendered_tag(html_options, &block)
52
71
  html_tag = html_options[:tag] || :div
53
72
 
54
73
  # remove internally used properties so they aren't rendered to DOM
55
- html_options.except!(:tag, :prerender, :camelize_props)
56
-
57
- rendered_tag = content_tag(html_tag, '', html_options, &block)
58
- if React::ServerRendering.renderer_options[:replay_console]
59
- # Grab the server-rendered console replay script
60
- # and move it _outside_ the container div
61
- rendered_tag.sub!(/\n(<script class="react-rails-console-replay">.*<\/script>)<\/(\w+)>$/m,'</\2>\1')
62
- rendered_tag.html_safe
63
- else
64
- rendered_tag
65
- end
66
- end
74
+ html_option_to_use = html_options.except(:tag, :prerender, :camelize_props)
67
75
 
68
- private
76
+ tag = content_tag(html_tag, "", html_option_to_use, &block)
77
+ return tag unless React::ServerRendering.renderer_options[:replay_console]
69
78
 
70
- # If this controller has checked out a renderer, use that one.
71
- # Otherwise, use {React::ServerRendering} directly (which will check one out for this rendering).
72
- def prerender_component(component_name, props, prerender_options)
73
- renderer = @controller.try(:react_rails_prerenderer) || React::ServerRendering
74
- renderer.render(component_name, props, prerender_options)
79
+ # Grab the server-rendered console replay script
80
+ # and move it _outside_ the container div
81
+ tag.sub!(%r{\n(<script class="react-rails-console-replay">.*</script>)</(\w+)>$}m, '</\2>\1')
82
+ tag.html_safe
75
83
  end
76
84
  end
77
85
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  # This module is included into ActionController so that
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  # A renderer class suitable for `ActionController::Renderers`.
@@ -20,7 +22,7 @@ module React
20
22
 
21
23
  attr_accessor :output_buffer
22
24
 
23
- def initialize(options={})
25
+ def initialize(options = {})
24
26
  controller = options[:controller]
25
27
  @__react_component_helper = controller.__react_component_helper
26
28
  end
@@ -1,4 +1,6 @@
1
- require 'rails'
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
2
4
 
3
5
  module React
4
6
  module Rails
@@ -17,18 +19,17 @@ module React
17
19
  config.react.server_renderer = nil # defaults to BundleRenderer
18
20
  config.react.server_renderer_options = {} # BundleRenderer provides defaults
19
21
  # Changing files with these extensions in these directories will cause the server renderer to reload:
20
- config.react.server_renderer_directories = ['/app/assets/javascripts/', 'app/javascript']
21
- config.react.server_renderer_extensions = ['jsx', 'js']
22
+ config.react.server_renderer_directories = ["/app/assets/javascripts/", "app/javascript"]
23
+ config.react.server_renderer_extensions = %w[jsx js]
22
24
  # View helper implementation:
23
25
  config.react.view_helper_implementation = nil # Defaults to ComponentMount
24
26
 
25
27
  # Watch .jsx files for changes in dev, so we can reload the JS VMs with the new JS code.
26
- initializer 'react_rails.add_watchable_files', after: :load_config_initializers, group: :all do |app|
28
+ initializer "react_rails.add_watchable_files", after: :load_config_initializers, group: :all do |app|
27
29
  # Watch files ending in `server_renderer_extensions` in each of `server_renderer_directories`
28
- reload_paths = config.react.server_renderer_directories.reduce({}) do |memo, dir|
30
+ reload_paths = config.react.server_renderer_directories.each_with_object({}) do |dir, memo|
29
31
  app_dir = File.join(app.root, dir)
30
32
  memo[app_dir] = config.react.server_renderer_extensions
31
- memo
32
33
  end
33
34
 
34
35
  # Rails checks these objects for changes:
@@ -42,8 +43,7 @@ module React
42
43
  end
43
44
 
44
45
  # Include the react-rails view helper lazily
45
- initializer 'react_rails.setup_view_helpers', after: :load_config_initializers, group: :all do |app|
46
-
46
+ initializer "react_rails.setup_view_helpers", after: :load_config_initializers, group: :all do |app|
47
47
  app.config.react.jsx_transformer_class ||= React::JSX::DEFAULT_TRANSFORMER
48
48
  React::JSX.transformer_class = app.config.react.jsx_transformer_class
49
49
  React::JSX.transform_options = app.config.react.jsx_transform_options
@@ -58,11 +58,11 @@ module React
58
58
 
59
59
  ActiveSupport.on_load(:action_view) do
60
60
  include ::React::Rails::ViewHelper
61
- ActionDispatch::IntegrationTest.send(:include, React::Rails::TestHelper) if ::Rails.env.test?
61
+ ActionDispatch::IntegrationTest.include React::Rails::TestHelper if ::Rails.env.test?
62
62
  end
63
63
  end
64
64
 
65
- initializer 'react_rails.add_component_renderer', group: :all do |app|
65
+ initializer "react_rails.add_component_renderer", group: :all do |_app|
66
66
  ActionController::Renderers.add :component do |component_name, options|
67
67
  renderer = ::React::Rails::ControllerRenderer.new(controller: self)
68
68
  html = renderer.call(component_name, options)
@@ -71,22 +71,21 @@ module React
71
71
  end
72
72
  end
73
73
 
74
- initializer 'react_rails.bust_cache', after: :load_config_initializers, group: :all do |app|
74
+ initializer "react_rails.bust_cache", after: :load_config_initializers, group: :all do |app|
75
75
  asset_variant = React::Rails::AssetVariant.new({
76
- variant: app.config.react.variant,
77
- })
76
+ variant: app.config.react.variant
77
+ })
78
78
 
79
79
  sprockets_env = app.assets || app.config.try(:assets) # sprockets-rails 3.x attaches this at a different config
80
80
  unless sprockets_env.nil?
81
- sprockets_env.version = [sprockets_env.version, "react-#{asset_variant.react_build}"].compact.join('-')
81
+ sprockets_env.version = [sprockets_env.version, "react-#{asset_variant.react_build}"].compact.join("-")
82
82
  end
83
-
84
83
  end
85
84
 
86
- initializer 'react_rails.set_variant', after: :engines_blank_point, group: :all do |app|
85
+ initializer "react_rails.set_variant", after: :engines_blank_point, group: :all do |app|
87
86
  asset_variant = React::Rails::AssetVariant.new({
88
- variant: app.config.react.variant,
89
- })
87
+ variant: app.config.react.variant
88
+ })
90
89
 
91
90
  if app.config.respond_to?(:assets)
92
91
  app.config.assets.paths << asset_variant.react_directory
@@ -105,16 +104,14 @@ module React
105
104
  React::ServerRendering.reset_pool
106
105
  end
107
106
 
108
- initializer 'react_rails.setup_engine', :group => :all do |app|
107
+ initializer "react_rails.setup_engine", group: :all do |app|
109
108
  # Sprockets 3.x expects this in a different place
110
- sprockets_env = app.assets || defined?(Sprockets) && Sprockets
109
+ sprockets_env = app.assets || (defined?(Sprockets) && Sprockets)
111
110
 
112
111
  if app.config.react.sprockets_strategy == false
113
112
  # pass, Sprockets opt-out
114
113
  elsif sprockets_env.present?
115
114
  React::JSX::SprocketsStrategy.attach_with_strategy(sprockets_env, app.config.react.sprockets_strategy)
116
- else
117
- # pass, Sprockets is not preset
118
115
  end
119
116
  end
120
117
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  module TestHelper
@@ -20,4 +22,4 @@ module React
20
22
  end
21
23
  end
22
24
  end
23
- end
25
+ end
@@ -1,7 +1,9 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  # If you change this, make sure to update VERSIONS.md
4
6
  # and republish the UJS by updating package.json and `bundle exec rake ujs:publish`
5
- VERSION = '2.7.1'
7
+ VERSION = "3.0.0.rc.0"
6
8
  end
7
9
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module Rails
3
5
  module ViewHelper
@@ -18,7 +20,7 @@ module React
18
20
  # Otherwise, make a new instance.
19
21
  def react_component(*args, &block)
20
22
  helper_obj = @__react_component_helper ||= helper_implementation_class.new
21
- helper_obj.react_component(*args) { capture &block if block_given? }
23
+ helper_obj.react_component(*args) { capture(&block) if block }
22
24
  end
23
25
  end
24
26
  end
data/lib/react/rails.rb CHANGED
@@ -1,7 +1,9 @@
1
- require 'react/rails/asset_variant'
2
- require 'react/rails/railtie'
3
- require 'react/rails/controller_lifecycle'
4
- require 'react/rails/version'
5
- require 'react/rails/component_mount'
6
- require 'react/rails/view_helper'
7
- require 'react/rails/controller_renderer'
1
+ # frozen_string_literal: true
2
+
3
+ require "react/rails/asset_variant"
4
+ require "react/rails/railtie"
5
+ require "react/rails/controller_lifecycle"
6
+ require "react/rails/version"
7
+ require "react/rails/component_mount"
8
+ require "react/rails/view_helper"
9
+ require "react/rails/controller_renderer"
@@ -1,27 +1,29 @@
1
- require 'react/server_rendering/environment_container'
2
- require 'react/server_rendering/manifest_container'
3
- require 'react/server_rendering/webpacker_manifest_container'
4
- require 'react/server_rendering/yaml_manifest_container'
1
+ # frozen_string_literal: true
2
+
3
+ require "react/server_rendering/environment_container"
4
+ require "react/server_rendering/manifest_container"
5
+ require "react/server_rendering/yaml_manifest_container"
6
+ require "react/server_rendering/separate_server_bundle_container"
5
7
 
6
8
  module React
7
9
  module ServerRendering
8
10
  # Extends ExecJSRenderer for the Rails environment
9
- # - fetches JS code from the Rails app (webpacker or sprockets)
11
+ # - fetches JS code from the Rails app (Shakapacker or Sprockets)
10
12
  # - stringifies props
11
13
  # - implements console replay
12
14
  class BundleRenderer < ExecJSRenderer
13
15
  # Reimplement console methods for replaying on the client
14
- CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_polyfill.js'))
15
- CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_replay.js'))
16
- CONSOLE_RESET = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/console_reset.js'))
17
- TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), 'bundle_renderer/timeout_polyfill.js'))
16
+ CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_polyfill.js"))
17
+ CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_replay.js"))
18
+ CONSOLE_RESET = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_reset.js"))
19
+ TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/timeout_polyfill.js"))
18
20
 
19
- def initialize(options={})
21
+ def initialize(options = {})
20
22
  @replay_console = options.fetch(:replay_console, true)
21
- filenames = options.fetch(:files, ['server_rendering.js'])
23
+ filenames = options.fetch(:files, ["server_rendering.js"])
22
24
  js_code = CONSOLE_POLYFILL.dup
23
25
  js_code << TIMEOUT_POLYFILL.dup
24
- js_code << options.fetch(:code, '')
26
+ js_code << options.fetch(:code, "")
25
27
 
26
28
  filenames.each do |filename|
27
29
  js_code << asset_container.find_asset(filename)
@@ -40,12 +42,12 @@ module React
40
42
  super(component_name, t_props, t_options)
41
43
  end
42
44
 
43
- def before_render(component_name, props, prerender_options)
44
- @replay_console ? CONSOLE_RESET : ''
45
+ def before_render(_component_name, _props, _prerender_options)
46
+ @replay_console ? CONSOLE_RESET : ""
45
47
  end
46
48
 
47
- def after_render(component_name, props, prerender_options)
48
- @replay_console ? CONSOLE_REPLAY : ''
49
+ def after_render(_component_name, _props, _prerender_options)
50
+ @replay_console ? CONSOLE_REPLAY : ""
49
51
  end
50
52
 
51
53
  class << self
@@ -71,20 +73,19 @@ module React
71
73
  def prepare_options(options)
72
74
  r_func = render_function(options)
73
75
  opts = case options
74
- when Hash then options
75
- when TrueClass then {}
76
- else
77
- {}
78
- end
76
+ when Hash then options
77
+ else
78
+ {}
79
+ end
79
80
  # This seems redundant to pass
80
81
  opts.merge(render_function: r_func)
81
82
  end
82
83
 
83
84
  def render_function(opts)
84
85
  if opts == :static
85
- 'renderToStaticMarkup'.freeze
86
+ "renderToStaticMarkup"
86
87
  else
87
- 'renderToString'.freeze
88
+ "renderToString"
88
89
  end
89
90
  end
90
91
 
@@ -100,22 +101,16 @@ module React
100
101
  # Or, if the user has provided {.asset_container_class}, use that.
101
102
  # @return [Class] suitable for {#asset_container}
102
103
  def asset_container_class
103
- if self.class.asset_container_class.present?
104
- self.class.asset_container_class
105
- elsif WebpackerManifestContainer.compatible?
106
- WebpackerManifestContainer
107
- elsif assets_precompiled?
108
- if ManifestContainer.compatible?
109
- ManifestContainer
110
- elsif YamlManifestContainer.compatible?
111
- YamlManifestContainer
112
- else
113
- # Even though they are precompiled, we can't find them :S
114
- EnvironmentContainer
115
- end
116
- else
117
- EnvironmentContainer
118
- end
104
+ return self.class.asset_container_class if self.class.asset_container_class.present?
105
+ return SeparateServerBundleContainer if SeparateServerBundleContainer.compatible?
106
+
107
+ return EnvironmentContainer unless assets_precompiled?
108
+
109
+ return ManifestContainer if ManifestContainer.compatible?
110
+ return YamlManifestContainer if YamlManifestContainer.compatible?
111
+
112
+ # Even though they are precompiled, we can't find them :S
113
+ EnvironmentContainer
119
114
  end
120
115
  end
121
116
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module ServerRendering
3
5
  # Return asset contents by getting them from a Sprockets::Environment instance.
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module React
2
4
  module ServerRendering
3
5
  # A bare-bones renderer for React.js + Exec.js
@@ -8,9 +10,11 @@ module React
8
10
  # @return [ExecJS::Runtime::Context] The JS context for this renderer
9
11
  attr_reader :context
10
12
 
11
- def initialize(options={})
12
- js_code = options[:code] || raise('Pass `code:` option to instantiate a JS context!')
13
- @context = ExecJS.compile(GLOBAL_WRAPPER + js_code)
13
+ def initialize(options = {})
14
+ js_code = options[:code] || raise("Pass `code:` option to instantiate a JS context!")
15
+ full_code = GLOBAL_WRAPPER + js_code
16
+ # File.write("./test/dummy/tmp/latest_js_context.js", full_code)
17
+ @context = ExecJS.compile(full_code)
14
18
  end
15
19
 
16
20
  def render(component_name, props, prerender_options)
@@ -23,8 +27,13 @@ module React
23
27
  end
24
28
 
25
29
  # Hooks for inserting JS before/after rendering
26
- def before_render(component_name, props, prerender_options); ''; end
27
- def after_render(component_name, props, prerender_options); ''; end
30
+ def before_render(_component_name, _props, _prerender_options)
31
+ ""
32
+ end
33
+
34
+ def after_render(_component_name, _props, _prerender_options)
35
+ ""
36
+ end
28
37
 
29
38
  # Handle Node.js & other ExecJS contexts
30
39
  GLOBAL_WRAPPER = <<-JS
@@ -40,7 +49,7 @@ module React
40
49
  end
41
50
 
42
51
  def main_render(component_name, props, prerender_options)
43
- render_function = prerender_options.fetch(:render_function, 'renderToString')
52
+ render_function = prerender_options.fetch(:render_function, "renderToString")
44
53
  "this.ReactRailsUJS.serverRender('#{render_function}', '#{component_name}', #{props})"
45
54
  end
46
55