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