diff --git a/.travis.yml b/.travis.yml
index 79130543..b4726ce8 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -17,7 +17,7 @@ gemfile:
- gemfiles/rails_4.2_sprockets_2.gemfile
- gemfiles/rails_4.2_sprockets_3.gemfile
- gemfiles/rails_4.2_sprockets_4.gemfile
- - gemfiles/rails_5.gemfile
+ - gemfiles/rails_5_no_sprockets_webpacker.gemfile
- gemfiles/rails_5_no_sprockets.gemfile
- gemfiles/rails_5_sprockets_4.gemfile
@@ -37,7 +37,7 @@ matrix:
- rvm: 2.1
gemfile: gemfiles/rails_4.2_sprockets_4.gemfile
- rvm: 2.1
- gemfile: gemfiles/rails_5.gemfile
+ gemfile: gemfiles/rails_5_no_sprockets_webpacker.gemfile
- rvm: 2.1
gemfile: gemfiles/rails_5_no_sprockets.gemfile
- rvm: 2.1
@@ -51,7 +51,7 @@ matrix:
- rvm: jruby-9.0.1.0
gemfile: gemfiles/rails_4.2_sprockets_2.gemfile
- rvm: jruby-9.0.1.0
- gemfile: gemfiles/rails_5_mini_racer.gemfile
+ gemfile: gemfiles/rails_5_no_sprockets_webpacker.gemfile
allow_failures:
- rvm: jruby-9.0.1.0
diff --git a/Appraisals b/Appraisals
index 9351e188..9061be42 100644
--- a/Appraisals
+++ b/Appraisals
@@ -49,9 +49,8 @@ appraise "rails-4.2-sprockets_4" do
gem "mini_racer"
end
-appraise "rails-5" do
+appraise "rails-5_no_sprockets_webpacker" do
gem 'rails', '~> 5.0.0'
- gem "turbolinks", "~> 5.0.0"
gem "webpacker", github: "rails/webpacker"
# This ExecJS backend provides stateful context
# which the default nodejs backend does not
diff --git a/README.md b/README.md
index 5c19340e..690859e9 100644
--- a/README.md
+++ b/README.md
@@ -288,7 +288,7 @@ MyApp::Application.configure do
# Settings for the pool of renderers:
config.react.server_renderer_pool_size ||= 1 # ExecJS doesn't allow more than one on MRI
config.react.server_renderer_timeout ||= 20 # seconds
- config.react.server_renderer = React::ServerRendering::SprocketsRenderer
+ config.react.server_renderer = React::ServerRendering::BundleRenderer
config.react.server_renderer_options = {
files: ["server_rendering.js"], # files to load for prerendering
replay_console: true, # if true, console.* will be replayed client-side
@@ -306,14 +306,14 @@ end
- `#initialize(options={})`, which accepts the hash from `config.react.server_renderer_options`
- `#render(component_name, props, prerender_options)` to return a string of HTML
-`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::SprocketsRenderer`.
+`react-rails` provides two renderer classes: `React::ServerRendering::ExecJSRenderer` and `React::ServerRendering::BundleRenderer`.
`ExecJSRenderer` offers two other points for extension:
- `#before_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _before_ calling `React.render`
- `#after_render(component_name, props, prerender_options)` to return a string of JavaScript to execute _after_ calling `React.render`
-Any subclass of `ExecJSRenderer` may use those hooks (for example, `SprocketsRenderer` uses them to handle `console.*` on the server).
+Any subclass of `ExecJSRenderer` may use those hooks (for example, `BundleRenderer` uses them to handle `console.*` on the server).
## Controller Actions
diff --git a/gemfiles/rails_3.2.gemfile b/gemfiles/rails_3.2.gemfile
index f9329613..72db331b 100644
--- a/gemfiles/rails_3.2.gemfile
+++ b/gemfiles/rails_3.2.gemfile
@@ -2,8 +2,8 @@
source "http://rubygems.org"
+gem "turbolinks", "~> 2.0"
gem "rails", "~> 3.2.21"
gem "rack-cache", "~> 1.6.1"
-gem "turbolinks", "~> 2.0"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.0.5.gemfile b/gemfiles/rails_4.0.5.gemfile
index eeb73d95..e9e0ccfc 100644
--- a/gemfiles/rails_4.0.5.gemfile
+++ b/gemfiles/rails_4.0.5.gemfile
@@ -2,7 +2,7 @@
source "http://rubygems.org"
-gem "rails", "4.0.5"
gem "turbolinks"
+gem "rails", "4.0.5"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.0_with_therubyracer.gemfile b/gemfiles/rails_4.0_with_therubyracer.gemfile
index 4c854cc3..de6505b1 100644
--- a/gemfiles/rails_4.0_with_therubyracer.gemfile
+++ b/gemfiles/rails_4.0_with_therubyracer.gemfile
@@ -2,8 +2,8 @@
source "http://rubygems.org"
+gem "turbolinks"
gem "rails", "~> 4.0.13"
gem "therubyracer", "0.12.0", :platform => :mri
-gem "turbolinks"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.1.gemfile b/gemfiles/rails_4.1.gemfile
index 80206ebc..976f20e9 100644
--- a/gemfiles/rails_4.1.gemfile
+++ b/gemfiles/rails_4.1.gemfile
@@ -2,7 +2,7 @@
source "http://rubygems.org"
-gem "rails", "~> 4.1.10"
gem "turbolinks", "~> 2.3.0"
+gem "rails", "~> 4.1.10"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.2_sprockets_2.gemfile b/gemfiles/rails_4.2_sprockets_2.gemfile
index d3112737..02aeb750 100644
--- a/gemfiles/rails_4.2_sprockets_2.gemfile
+++ b/gemfiles/rails_4.2_sprockets_2.gemfile
@@ -2,8 +2,8 @@
source "http://rubygems.org"
+gem "turbolinks"
gem "rails", "~> 4.2.1"
gem "sprockets", "~> 2.12"
-gem "turbolinks"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.2_sprockets_3.gemfile b/gemfiles/rails_4.2_sprockets_3.gemfile
index 7bb53f88..6ac755f7 100644
--- a/gemfiles/rails_4.2_sprockets_3.gemfile
+++ b/gemfiles/rails_4.2_sprockets_3.gemfile
@@ -2,8 +2,8 @@
source "http://rubygems.org"
+gem "turbolinks", "~> 2.5.0"
gem "rails", "~> 4.2.1"
gem "sprockets", "~> 3.5"
-gem "turbolinks", "~> 2.5.0"
gemspec :path => "../"
diff --git a/gemfiles/rails_4.2_sprockets_4.gemfile b/gemfiles/rails_4.2_sprockets_4.gemfile
index c292b1fe..2f661f0c 100644
--- a/gemfiles/rails_4.2_sprockets_4.gemfile
+++ b/gemfiles/rails_4.2_sprockets_4.gemfile
@@ -2,9 +2,9 @@
source "http://rubygems.org"
+gem "turbolinks", "~> 2.5.0"
gem "rails", "~> 4.2.1"
gem "sprockets", "~> 4.0.x"
-gem "turbolinks", "~> 2.5.0"
gem "webpacker", :github => "rails/webpacker"
gem "mini_racer"
diff --git a/gemfiles/rails_5.gemfile b/gemfiles/rails_5_no_sprockets_webpacker.gemfile
similarity index 76%
rename from gemfiles/rails_5.gemfile
rename to gemfiles/rails_5_no_sprockets_webpacker.gemfile
index fc385855..a424771d 100644
--- a/gemfiles/rails_5.gemfile
+++ b/gemfiles/rails_5_no_sprockets_webpacker.gemfile
@@ -1,9 +1,9 @@
# This file was generated by Appraisal
+# This file shouldn't have turbolinks or sprockets in it
source "http://rubygems.org"
gem "rails", "~> 5.0.0"
-gem "turbolinks", "~> 5.0.0"
gem "webpacker", :github => "rails/webpacker"
gem "therubyracer"
diff --git a/gemfiles/rails_5_sprockets_4.gemfile b/gemfiles/rails_5_sprockets_4.gemfile
index 5b8191e1..3f673c7e 100644
--- a/gemfiles/rails_5_sprockets_4.gemfile
+++ b/gemfiles/rails_5_sprockets_4.gemfile
@@ -2,8 +2,8 @@
source "http://rubygems.org"
+gem "turbolinks", "~> 5.0.0"
gem "rails", "~> 5.0.0"
gem "sprockets", "~> 4.0.x"
-gem "turbolinks", "~> 5.0.0"
gemspec :path => "../"
diff --git a/lib/react/rails/railtie.rb b/lib/react/rails/railtie.rb
index bd75eb1f..bdadb89f 100644
--- a/lib/react/rails/railtie.rb
+++ b/lib/react/rails/railtie.rb
@@ -15,8 +15,8 @@ class Railtie < ::Rails::Railtie
# Server rendering:
config.react.server_renderer_pool_size = 1 # increase if you're on JRuby
config.react.server_renderer_timeout = 20 # seconds
- config.react.server_renderer = nil # defaults to SprocketsRenderer
- config.react.server_renderer_options = {} # SprocketsRenderer provides defaults
+ config.react.server_renderer = nil # defaults to BundleRenderer
+ config.react.server_renderer_options = {} # BundleRenderer provides defaults
# Changing files with these extensions in these directories will cause the server renderer to reload:
config.react.server_renderer_directories = ["/app/assets/javascripts/"]
config.react.server_renderer_extensions = ["jsx"]
@@ -96,7 +96,7 @@ class Railtie < ::Rails::Railtie
config.after_initialize do |app|
# The class isn't accessible in the configure block, so assign it here if it wasn't overridden:
- app.config.react.server_renderer ||= React::ServerRendering::SprocketsRenderer
+ app.config.react.server_renderer ||= React::ServerRendering::BundleRenderer
React::ServerRendering.pool_size = app.config.react.server_renderer_pool_size
React::ServerRendering.pool_timeout = app.config.react.server_renderer_timeout
diff --git a/lib/react/server_rendering.rb b/lib/react/server_rendering.rb
index c6953f15..21270c16 100644
--- a/lib/react/server_rendering.rb
+++ b/lib/react/server_rendering.rb
@@ -1,6 +1,6 @@
require 'connection_pool'
require 'react/server_rendering/exec_js_renderer'
-require 'react/server_rendering/sprockets_renderer'
+require 'react/server_rendering/bundle_renderer'
module React
module ServerRendering
diff --git a/lib/react/server_rendering/sprockets_renderer.rb b/lib/react/server_rendering/bundle_renderer.rb
similarity index 91%
rename from lib/react/server_rendering/sprockets_renderer.rb
rename to lib/react/server_rendering/bundle_renderer.rb
index b6d69360..98f7e42b 100644
--- a/lib/react/server_rendering/sprockets_renderer.rb
+++ b/lib/react/server_rendering/bundle_renderer.rb
@@ -6,14 +6,14 @@
module React
module ServerRendering
# Extends ExecJSRenderer for the Rails environment
- # - builds JS code out of the asset pipeline
+ # - fetches JS code from the Rails app (webpacker or sprockets)
# - stringifies props
# - implements console replay
- class SprocketsRenderer < ExecJSRenderer
+ class BundleRenderer < ExecJSRenderer
# Reimplement console methods for replaying on the client
- CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_polyfill.js"))
- CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/console_replay.js"))
- TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), "sprockets_renderer/timeout_polyfill.js"))
+ CONSOLE_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_polyfill.js"))
+ CONSOLE_REPLAY = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/console_replay.js"))
+ TIMEOUT_POLYFILL = File.read(File.join(File.dirname(__FILE__), "bundle_renderer/timeout_polyfill.js"))
def initialize(options={})
@replay_console = options.fetch(:replay_console, true)
@@ -54,7 +54,7 @@ class << self
# default Rails setups.
#
# You can provide a custom asset container
- # with `React::ServerRendering::SprocketsRenderer.asset_container_class = MyAssetContainer`.
+ # with `React::ServerRendering::BundleRenderer.asset_container_class = MyAssetContainer`.
#
# @return [#find_asset(logical_path)] An object that returns asset contents by logical path
def asset_container
diff --git a/lib/react/server_rendering/sprockets_renderer/console_polyfill.js b/lib/react/server_rendering/bundle_renderer/console_polyfill.js
similarity index 100%
rename from lib/react/server_rendering/sprockets_renderer/console_polyfill.js
rename to lib/react/server_rendering/bundle_renderer/console_polyfill.js
diff --git a/lib/react/server_rendering/sprockets_renderer/console_replay.js b/lib/react/server_rendering/bundle_renderer/console_replay.js
similarity index 100%
rename from lib/react/server_rendering/sprockets_renderer/console_replay.js
rename to lib/react/server_rendering/bundle_renderer/console_replay.js
diff --git a/lib/react/server_rendering/sprockets_renderer/timeout_polyfill.js b/lib/react/server_rendering/bundle_renderer/timeout_polyfill.js
similarity index 100%
rename from lib/react/server_rendering/sprockets_renderer/timeout_polyfill.js
rename to lib/react/server_rendering/bundle_renderer/timeout_polyfill.js
diff --git a/react_ujs/src/events/detect.js b/react_ujs/src/events/detect.js
index 3c1f9eb5..97808975 100644
--- a/react_ujs/src/events/detect.js
+++ b/react_ujs/src/events/detect.js
@@ -28,7 +28,7 @@ module.exports = function(ujs) {
} else {
turbolinksClassicDeprecatedEvents.setup(ujs);
}
- } else if ($ && typeof $.pjax === 'function') {
+ } else if (typeof $ !== "undefined" && typeof $.pjax === 'function') {
pjaxEvents.setup(ujs);
} else {
nativeEvents.setup(ujs);
diff --git a/test/dummy/app/controllers/pages_controller.rb b/test/dummy/app/controllers/pages_controller.rb
index 4aa5acdd..4e117a96 100644
--- a/test/dummy/app/controllers/pages_controller.rb
+++ b/test/dummy/app/controllers/pages_controller.rb
@@ -1,5 +1,5 @@
class PagesController < ApplicationController
- if !SKIP_SPROCKETS
+ if WebpackerHelpers.available? || SprocketsHelpers.available?
per_request_react_rails_prerenderer
end
diff --git a/test/dummy/app/javascript/components/named_export_component.js b/test/dummy/app/javascript/components/named_export_component.js
index 0e216b9e..82cc5bc9 100644
--- a/test/dummy/app/javascript/components/named_export_component.js
+++ b/test/dummy/app/javascript/components/named_export_component.js
@@ -1,3 +1,5 @@
+var React = require("react")
+
module.exports = {
Component: function(props) { return
Named Export
}
}
diff --git a/test/dummy/app/javascript/components/subfolder/exports_component.js b/test/dummy/app/javascript/components/subfolder/exports_component.js
index d5a036be..ba841599 100644
--- a/test/dummy/app/javascript/components/subfolder/exports_component.js
+++ b/test/dummy/app/javascript/components/subfolder/exports_component.js
@@ -1,3 +1,5 @@
+var React = require("react")
+
module.exports = function(props) {
return Exports
}
diff --git a/test/dummy/app/views/layouts/application.html.erb b/test/dummy/app/views/layouts/application.html.erb
index 670d1875..143fc1fb 100644
--- a/test/dummy/app/views/layouts/application.html.erb
+++ b/test/dummy/app/views/layouts/application.html.erb
@@ -2,8 +2,9 @@
Dummy
- <%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
- <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
+ <% if SprocketsHelpers.available? %>
+ <%= javascript_include_tag "application", "data-turbolinks-track" => true %>
+ <% end %>
<%= csrf_meta_tags %>
diff --git a/test/dummy/config/application.rb b/test/dummy/config/application.rb
index 14500609..2c814824 100644
--- a/test/dummy/config/application.rb
+++ b/test/dummy/config/application.rb
@@ -6,8 +6,7 @@
require "action_mailer/railtie"
# Test no-sprockets environment by testing the gemfile name
-SKIP_SPROCKETS = ENV["BUNDLE_GEMFILE"] =~ /no_sprockets/
-if !SKIP_SPROCKETS
+if SprocketsHelpers.available?
require "sprockets/railtie"
end
@@ -33,7 +32,7 @@ class Application < Rails::Application
# config.i18n.default_locale = :de
config.react.variant = :production
config.react.addons = false
- if !SKIP_SPROCKETS
+ if SprocketsHelpers.available?
config.assets.enabled = true
end
end
diff --git a/test/dummy/config/environments/test.rb b/test/dummy/config/environments/test.rb
index 8d669620..f90e42d6 100644
--- a/test/dummy/config/environments/test.rb
+++ b/test/dummy/config/environments/test.rb
@@ -9,7 +9,7 @@
# we need this to reload the jsx transformer when different version is dropped in
config.cache_classes = false
config.reload_plugins = true
- if !SKIP_SPROCKETS
+ if SprocketsHelpers.available?
config.assets.cache_store = :null_store
end
diff --git a/test/react/jsx/jsx_prepocessor_test.rb b/test/react/jsx/jsx_prepocessor_test.rb
index 892cf105..321b0848 100644
--- a/test/react/jsx/jsx_prepocessor_test.rb
+++ b/test/react/jsx/jsx_prepocessor_test.rb
@@ -1,13 +1,13 @@
require 'test_helper'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class JSXPreprocessorTest < ActiveSupport::TestCase
REQUIRED_JAVASCRIPT = "var requirePlainJavascript = true;"
REQUIRED_COFFEESCRIPT = "var requireCoffee; requireCoffee = true;"
REQUIRED_JSX = "React.createElement(\"div\", { className: \"require-jsx\" });"
OWN_JSX = "React.createElement(\"div\", { className: \"le-javascript\" });"
test 'executes //= require directives' do
- require_parent = fetch_asset_body("require_test/jsx_preprocessor_test.js")
+ require_parent = SprocketsHelpers.fetch_asset_body("require_test/jsx_preprocessor_test.js")
assert_compiled_javascript_includes(require_parent, REQUIRED_JAVASCRIPT)
assert_compiled_javascript_includes(require_parent, REQUIRED_COFFEESCRIPT)
diff --git a/test/react/jsx/jsx_transformer_test.rb b/test/react/jsx/jsx_transformer_test.rb
index 1b6d8ce7..757454d8 100644
--- a/test/react/jsx/jsx_transformer_test.rb
+++ b/test/react/jsx/jsx_transformer_test.rb
@@ -1,16 +1,16 @@
require 'test_helper'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class JSXTransformerTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
React::JSX.transformer_class = React::JSX::JSXTransformer
- manually_expire_asset('JSXTransformer.js')
+ SprocketsHelpers.manually_expire_asset('JSXTransformer.js')
end
teardown do
reset_transformer
- manually_expire_asset('JSXTransformer.js')
+ SprocketsHelpers.manually_expire_asset('JSXTransformer.js')
end
test 'can use dropped-in version of JSX transformer' do
@@ -18,7 +18,7 @@ class JSXTransformerTest < ActionDispatch::IntegrationTest
replacing_path = Rails.root.join("vendor/assets/react/JSXTransformer.js")
FileUtils.cp hidden_path, replacing_path
- manually_expire_asset('example3.js')
+ SprocketsHelpers.manually_expire_asset('example3.js')
get '/assets/example3.js'
FileUtils.rm replacing_path
@@ -53,7 +53,7 @@ class JSXTransformerTest < ActionDispatch::IntegrationTest
FileUtils.mkdir_p(custom_path)
FileUtils.cp(hidden_path, replacing_path)
- manually_expire_asset('example3.js')
+ SprocketsHelpers.manually_expire_asset('example3.js')
get '/assets/example3.js'
FileUtils.rm_rf custom_path
diff --git a/test/react/jsx_test.rb b/test/react/jsx_test.rb
index 2112ca39..db6270be 100644
--- a/test/react/jsx_test.rb
+++ b/test/react/jsx_test.rb
@@ -26,7 +26,7 @@ def transform(code)
end
end
-when_sprockets_available do
+SprocketsHelpers.when_available do
class JSXTransformTest < ActionDispatch::IntegrationTest
setup do
reset_transformer
@@ -37,14 +37,14 @@ class JSXTransformTest < ActionDispatch::IntegrationTest
end
test 'asset pipeline should transform JSX' do
- manually_expire_asset('example.js')
+ SprocketsHelpers.manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS, @response.body)
end
test 'asset pipeline should transform JSX + Coffeescript' do
- manually_expire_asset('example2.js')
+ SprocketsHelpers.manually_expire_asset('example2.js')
get '/assets/example2.js'
assert_response :success
assert_compiled_javascript_matches(EXPECTED_JS_2, @response.body)
@@ -52,7 +52,7 @@ class JSXTransformTest < ActionDispatch::IntegrationTest
test 'use a custom transformer' do
React::JSX.transformer_class = NullTransformer
- manually_expire_asset('example2.js')
+ SprocketsHelpers.manually_expire_asset('example2.js')
get '/assets/example2.js'
assert_equal "TRANSFORMED CODE!;\n", @response.body
@@ -60,7 +60,7 @@ class JSXTransformTest < ActionDispatch::IntegrationTest
def test_babel_transformer_accepts_babel_transformation_options
React::JSX.transform_options = {blacklist: ['spec.functionName', 'validation.react', "strict"]}
- manually_expire_asset('example.js')
+ SprocketsHelpers.manually_expire_asset('example.js')
get '/assets/example.js'
assert_response :success
diff --git a/test/react/rails/component_mount_test.rb b/test/react/rails/component_mount_test.rb
index 3c14a6c4..e2da6448 100644
--- a/test/react/rails/component_mount_test.rb
+++ b/test/react/rails/component_mount_test.rb
@@ -1,9 +1,13 @@
require 'test_helper'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class ComponentMountTest < ActionDispatch::IntegrationTest
+ compiled_once = false
setup do
- WebpackerHelpers.compile_if_missing
+ if !compiled_once
+ WebpackerHelpers.clear_webpacker_packs
+ WebpackerHelpers.compile
+ end
@helper = React::Rails::ComponentMount.new
end
@@ -72,7 +76,7 @@ class ComponentMountTest < ActionDispatch::IntegrationTest
assert(html.include?('data-reactid'), "it includes React properties")
end
- test '#react_component passes :static to SprocketsRenderer' do
+ test '#react_component passes :static to BundleRenderer' do
html = @helper.react_component('Todo', {todo: 'render on the server'}.to_json, prerender: :static)
assert(html.include?('>render on the server'), "it includes rendered HTML")
assert(!html.include?('data-reactid'), "it DOESNT INCLUDE React properties")
diff --git a/test/react/rails/react_rails_ujs_test.rb b/test/react/rails/react_rails_ujs_test.rb
index 9aefcff9..26a05d7b 100644
--- a/test/react/rails/react_rails_ujs_test.rb
+++ b/test/react/rails/react_rails_ujs_test.rb
@@ -1,6 +1,6 @@
require 'test_helper'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class ReactRailsUJSTest < ActionDispatch::IntegrationTest
include Capybara::DSL
diff --git a/test/react/server_rendering/sprockets_renderer_test.rb b/test/react/server_rendering/bundle_renderer_test.rb
similarity index 87%
rename from test/react/server_rendering/sprockets_renderer_test.rb
rename to test/react/server_rendering/bundle_renderer_test.rb
index f2793255..fdf0c33d 100644
--- a/test/react/server_rendering/sprockets_renderer_test.rb
+++ b/test/react/server_rendering/bundle_renderer_test.rb
@@ -1,7 +1,7 @@
require 'test_helper'
-when_sprockets_available do
- class SprocketsRendererTest < ActiveSupport::TestCase
+if SprocketsHelpers.available? || WebpackerHelpers.available?
+ class BundleRendererTest < ActiveSupport::TestCase
CALLBACKS = [:before_render, :after_render]
webpacker_compiled = false
@@ -10,7 +10,7 @@ class SprocketsRendererTest < ActiveSupport::TestCase
WebpackerHelpers.compile
webpacker_compiled = true
end
- @renderer = React::ServerRendering::SprocketsRenderer.new({})
+ @renderer = React::ServerRendering::BundleRenderer.new({})
end
CALLBACKS.each do |callback_name|
@@ -56,7 +56,7 @@ class SprocketsRendererTest < ActiveSupport::TestCase
end
test '#render console messages can be disabled' do
- no_log_renderer = React::ServerRendering::SprocketsRenderer.new({replay_console: false})
+ no_log_renderer = React::ServerRendering::BundleRenderer.new({replay_console: false})
result = no_log_renderer.render("TodoListWithConsoleLog", {todos: ["log some messages"]}, nil)
assert_no_match(/console.log.apply\(console, \["got initial state"\]\)/, result)
assert_no_match(/console.warn.apply\(console, \["mounted component"\]\)/, result)
@@ -93,14 +93,14 @@ class SprocketsRendererTest < ActiveSupport::TestCase
test '.new accepts additional code to add to the JS context' do
additional_code = File.read(File.expand_path("../../../helper_files/WithoutSprockets.js", __FILE__))
- additional_renderer = React::ServerRendering::SprocketsRenderer.new(code: additional_code)
+ additional_renderer = React::ServerRendering::BundleRenderer.new(code: additional_code)
assert_match(/drink more caffeine<\/span>/, additional_renderer.render("WithoutSprockets", {label: "drink more caffeine"}, nil))
end
# These use cases don't apply to Webpacker since the require.context comes from a pack:
test '.new accepts any filenames' do
- limited_renderer = React::ServerRendering::SprocketsRenderer.new(files: ["react-server.js", "react_ujs.js", "components/Todo.js"])
+ limited_renderer = React::ServerRendering::BundleRenderer.new(files: ["react-server.js", "react_ujs.js", "components/Todo.js"])
assert_match(/get a real job<\/li>/, limited_renderer.render("Todo", {todo: "get a real job"}, nil))
err = assert_raises React::ServerRendering::PrerenderError do
limited_renderer.render("TodoList", {todos: []}, nil)
@@ -113,11 +113,11 @@ class SprocketsRendererTest < ActiveSupport::TestCase
legacy_rendering_files = ["react-server.js", "react_ujs.js", "components.js"]
Rails.application.config.assets.precompile += legacy_rendering_files
- precompile_assets
+ SprocketsHelpers.precompile_assets
Rails.application.config.assets.compile = false
- @renderer = React::ServerRendering::SprocketsRenderer.new(files: legacy_rendering_files)
+ @renderer = React::ServerRendering::BundleRenderer.new(files: legacy_rendering_files)
result = @renderer.render("Todo", {todo: "write tests"}, nil)
assert_match(//, result)
@@ -125,7 +125,7 @@ class SprocketsRendererTest < ActiveSupport::TestCase
ensure
Rails.application.config.assets.compile = true
- clear_precompiled_assets
+ SprocketsHelpers.clear_precompiled_assets
end
end
end
diff --git a/test/react/server_rendering/manifest_container_test.rb b/test/react/server_rendering/manifest_container_test.rb
index cfaee614..776fa396 100644
--- a/test/react/server_rendering/manifest_container_test.rb
+++ b/test/react/server_rendering/manifest_container_test.rb
@@ -9,13 +9,13 @@
class ManifestContainerTest < ActiveSupport::TestCase
def setup
- precompile_assets
+ SprocketsHelpers.precompile_assets
@manifest_container = React::ServerRendering::ManifestContainer.new
end
def teardown
- clear_precompiled_assets
+ SprocketsHelpers.clear_precompiled_assets
end
def test_find_asset_gets_asset_contents
diff --git a/test/react/server_rendering/yaml_manifest_container_test.rb b/test/react/server_rendering/yaml_manifest_container_test.rb
index b1e989b0..380a5900 100644
--- a/test/react/server_rendering/yaml_manifest_container_test.rb
+++ b/test/react/server_rendering/yaml_manifest_container_test.rb
@@ -3,13 +3,13 @@
if Rails::VERSION::MAJOR == 3
class YamlManifestContainerTest < ActiveSupport::TestCase
def setup
- precompile_assets
+ SprocketsHelpers.precompile_assets
@manifest_container = React::ServerRendering::YamlManifestContainer.new
end
def teardown
- clear_precompiled_assets
+ SprocketsHelpers.clear_precompiled_assets
end
def test_find_asset_gets_asset_contents
diff --git a/test/react_asset_test.rb b/test/react_asset_test.rb
index 907cca59..b868bdc4 100644
--- a/test/react_asset_test.rb
+++ b/test/react_asset_test.rb
@@ -1,20 +1,20 @@
require 'test_helper'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class ReactAssetTest < ActionDispatch::IntegrationTest
setup do
- clear_sprockets_cache
+ SprocketsHelpers.clear_sprockets_cache
end
teardown do
- clear_sprockets_cache
+ SprocketsHelpers.clear_sprockets_cache
end
test 'asset pipeline should deliver drop-in react file replacement' do
app_react_file_path = File.expand_path("../dummy/vendor/assets/javascripts/react.js", __FILE__)
react_file_token = "'test_confirmation_token_react_content_non_production';\n"
File.write(app_react_file_path, react_file_token)
- manually_expire_asset("react.js")
+ SprocketsHelpers.manually_expire_asset("react.js")
react_asset = Rails.application.assets['react.js']
get '/assets/react.js'
@@ -28,9 +28,9 @@ class ReactAssetTest < ActionDispatch::IntegrationTest
test 'precompiling assets works' do
begin
- precompile_assets
+ SprocketsHelpers.precompile_assets
ensure
- clear_precompiled_assets
+ SprocketsHelpers.clear_precompiled_assets
end
end
diff --git a/test/server_rendered_html_test.rb b/test/server_rendered_html_test.rb
index 41c4af05..16dfcfb3 100644
--- a/test/server_rendered_html_test.rb
+++ b/test/server_rendered_html_test.rb
@@ -1,7 +1,7 @@
require 'test_helper'
require 'fileutils'
-when_sprockets_available do
+SprocketsHelpers.when_available do
class ServerRenderedHtmlTest < ActionDispatch::IntegrationTest
# Rails' asset pipeline has trouble picking up changes to files if they happen too fast.
# By sleeping for a little bit at certain points, we can make sure that rails notices the
diff --git a/test/support/sprockets_helpers.rb b/test/support/sprockets_helpers.rb
new file mode 100644
index 00000000..d27b652e
--- /dev/null
+++ b/test/support/sprockets_helpers.rb
@@ -0,0 +1,71 @@
+module SprocketsHelpers
+ module_function
+ def available?
+ ENV["BUNDLE_GEMFILE"] !~ /no_sprockets/
+ end
+
+ # The block depends on sprockets, don't run it if sprockets is missing
+ def when_available
+ if available?
+ yield
+ end
+ end
+
+ def clear_sprockets_cache
+ # Remove cached files
+ Rails.root.join('tmp/cache').tap do |tmp|
+ tmp.rmtree if tmp.exist?
+ tmp.mkpath
+ end
+ end
+
+ def fetch_asset_body(asset_logical_path)
+ Rails.application.assets[asset_logical_path].to_s
+ end
+
+ # Sprockets 2 doesn't expire this assets well in
+ # this kind of setting,
+ # so override `fresh?` to mark it as expired.
+ def manually_expire_asset(asset_name)
+ asset = Rails.application.assets[asset_name]
+ def asset.fresh?(env); false; end
+ end
+
+ def precompile_assets
+ capture_io do
+ # Changing directories is required because:
+ # - assets:precompile runs webpacker:compile when availabled
+ # - webpacker:compile depends on `./bin/webpack`, so `.` must be the app root
+ Dir.chdir("./test/dummy") do
+
+ ENV['RAILS_GROUPS'] = 'assets' # required for Rails 3.2
+ Rake::Task['assets:precompile'].reenable
+
+ if Rails::VERSION::MAJOR == 3
+ Rake::Task['assets:precompile:all'].reenable
+ Rake::Task['assets:precompile:primary'].reenable
+ Rake::Task['assets:precompile:nondigest'].reenable
+ end
+
+ Rake::Task['assets:precompile'].invoke
+ end
+ end
+
+ if Rails.application.respond_to?(:assets_manifest)
+ # Make a new manifest since assets weren't compiled before
+ config = Rails.application.config
+ path = File.join(config.paths['public'].first, config.assets.prefix)
+ new_manifest = Sprockets::Manifest.new(Rails.application.assets, path)
+ Rails.application.assets_manifest = new_manifest
+ end
+
+ assets_directory = File.expand_path("../../dummy/public/assets", __FILE__)
+ raise "Asset precompilation failed" unless Dir.exists?(assets_directory)
+ end
+
+ def clear_precompiled_assets
+ assets_directory = File.expand_path("../../dummy/public/assets", __FILE__)
+ FileUtils.rm_r(assets_directory)
+ ENV.delete('RAILS_GROUPS')
+ end
+end
diff --git a/test/test_helper.rb b/test/test_helper.rb
index a1425d8b..3e81a275 100644
--- a/test/test_helper.rb
+++ b/test/test_helper.rb
@@ -3,6 +3,11 @@
SimpleCov.start
end
+support_path = File.expand_path("../support/*.rb", __FILE__)
+Dir.glob(support_path).each do |f|
+ require(f)
+end
+
# Configure Rails Environment
ENV["RAILS_ENV"] = "test"
@@ -15,10 +20,7 @@
require "capybara/poltergeist"
Dummy::Application.load_tasks
-support_path = File.expand_path("../support/*.rb", __FILE__)
-Dir.glob(support_path).each do |f|
- require(f)
-end
+
WebpackerHelpers.clear_webpacker_packs
@@ -41,67 +43,13 @@
Rails.backtrace_cleaner.remove_silencers!
-def clear_sprockets_cache
- # Remove cached files
- Rails.root.join('tmp/cache').tap do |tmp|
- tmp.rmtree if tmp.exist?
- tmp.mkpath
- end
-end
-
def reset_transformer
- clear_sprockets_cache
+ SprocketsHelpers.clear_sprockets_cache
React::JSX.transformer_class = React::JSX::DEFAULT_TRANSFORMER
React::JSX.transform_options = {}
React::JSX.transformer = nil
end
-# Sprockets 2 doesn't expire this assets well in
-# this kind of setting,
-# so override `fresh?` to mark it as expired.
-def manually_expire_asset(asset_name)
- asset = Rails.application.assets[asset_name]
- def asset.fresh?(env); false; end
-end
-
-def precompile_assets
- capture_io do
- # Changing directories is required because:
- # - assets:precompile runs webpacker:compile when availabled
- # - webpacker:compile depends on `./bin/webpack`, so `.` must be the app root
- Dir.chdir("./test/dummy") do
-
- ENV['RAILS_GROUPS'] = 'assets' # required for Rails 3.2
- Rake::Task['assets:precompile'].reenable
-
- if Rails::VERSION::MAJOR == 3
- Rake::Task['assets:precompile:all'].reenable
- Rake::Task['assets:precompile:primary'].reenable
- Rake::Task['assets:precompile:nondigest'].reenable
- end
-
- Rake::Task['assets:precompile'].invoke
- end
- end
-
- if Rails.application.respond_to?(:assets_manifest)
- # Make a new manifest since assets weren't compiled before
- config = Rails.application.config
- path = File.join(config.paths['public'].first, config.assets.prefix)
- new_manifest = Sprockets::Manifest.new(Rails.application.assets, path)
- Rails.application.assets_manifest = new_manifest
- end
-
- assets_directory = File.expand_path("../dummy/public/assets", __FILE__)
- raise "Asset precompilation failed" unless Dir.exists?(assets_directory)
-end
-
-def clear_precompiled_assets
- assets_directory = File.expand_path("../dummy/public/assets", __FILE__)
- FileUtils.rm_r(assets_directory)
- ENV.delete('RAILS_GROUPS')
-end
-
# Rails 3.2's version of MiniTest does not have `capture_io` defined. For
# consistency across multiple versions we've defined that method here.
#
@@ -136,18 +84,6 @@ def wait_for_turbolinks_to_be_available
sleep(1)
end
-
-# The block depends on sprockets, don't run it if sprockets is missing
-def when_sprockets_available
- if !SKIP_SPROCKETS
- yield
- end
-end
-
-def fetch_asset_body(asset_logical_path)
- Rails.application.assets[asset_logical_path].to_s
-end
-
# Different processors may generate slightly different outputs,
# as some version inserts an extra "\n" at the beginning.
# Because appraisal is used, multiple versions of coffee-script are treated