From 7367f2be975a4f881a04a441f4c72dd813b7caae Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Fri, 7 Apr 2017 17:13:54 -0400 Subject: [PATCH 01/11] Support server-rendering from webpack-dev-server --- .../webpacker_manifest_container.rb | 6 +- .../javascript/components/GreetingMessage.js | 2 +- test/react/rails/pages_controller_test.rb | 11 ++++ test/react/rails/webpacker_test.rb | 2 +- .../webpacker_manifest_container_test.rb | 55 +++-------------- test/support/webpacker_helpers.rb | 59 +++++++++++++++++++ 6 files changed, 84 insertions(+), 51 deletions(-) diff --git a/lib/react/server_rendering/webpacker_manifest_container.rb b/lib/react/server_rendering/webpacker_manifest_container.rb index 5cac670eb..57fbad26f 100644 --- a/lib/react/server_rendering/webpacker_manifest_container.rb +++ b/lib/react/server_rendering/webpacker_manifest_container.rb @@ -2,13 +2,17 @@ module React module ServerRendering + CLIENT_REQUIRE = %r{__webpack_require__\(.*webpack-dev-server\/client\/index\.js.*\n} + # Get a compiled file from Webpacker class WebpackerManifestContainer def find_asset(logical_path) asset_path = Webpacker::Manifest.lookup(logical_path) # raises if not found if asset_path.start_with?("http") - # TODO: this includes webpack-dev-server code which causes ExecJS to 💥 + # this includes `webpack-dev-server/client/index.js` code which causes ExecJS to 💥 dev_server_asset = open(asset_path).read + dev_server_asset.sub!(CLIENT_REQUIRE, '//\0') + dev_server_asset else full_path = File.join( # TODO: using `.parent` here won't work for nonstandard configurations diff --git a/test/dummy/app/javascript/components/GreetingMessage.js b/test/dummy/app/javascript/components/GreetingMessage.js index 387550df0..02a0c123b 100644 --- a/test/dummy/app/javascript/components/GreetingMessage.js +++ b/test/dummy/app/javascript/components/GreetingMessage.js @@ -16,7 +16,7 @@ module.exports = React.createClass({ }, render: function() { return React.DOM.div({}, - React.DOM.div({}, this.state.greeting, ' ', this.props.name), + React.DOM.div({}, this.state.greeting, ' from Webpacker ', this.props.name ), React.DOM.button({onClick: this.goodbye}, 'Goodbye') ); } diff --git a/test/react/rails/pages_controller_test.rb b/test/react/rails/pages_controller_test.rb index 45faf15ae..34d96d1e2 100644 --- a/test/react/rails/pages_controller_test.rb +++ b/test/react/rails/pages_controller_test.rb @@ -25,4 +25,15 @@ class PagesControllerTest < ActionController::TestCase assert_includes(response.body, "Hello") end end + + WebpackerHelpers.when_webpacker_available do + test "it mounts components from the dev server" do + WebpackerHelpers.with_dev_server do + get :show, id: 1, prerender: true + assert_match /Hello from Webpacker/, response.body + get :show, id: 1, prerender: true, greeting: "Howdy" + assert_match /Howdy from Webpacker/, response.body + end + end + end end diff --git a/test/react/rails/webpacker_test.rb b/test/react/rails/webpacker_test.rb index 1bc9b13d8..0d0a3cc62 100644 --- a/test/react/rails/webpacker_test.rb +++ b/test/react/rails/webpacker_test.rb @@ -13,7 +13,7 @@ class ReactRailsWebpackerTest < ActionDispatch::IntegrationTest WebpackerHelpers.clear_webpacker_packs end - test 'it mounts pages from the pack' do + test 'it mounts components from the pack' do visit '/pack_component' assert page.has_content?('Export Default') assert page.has_content?('Named Export') diff --git a/test/react/server_rendering/webpacker_manifest_container_test.rb b/test/react/server_rendering/webpacker_manifest_container_test.rb index 585ce4d25..d4aec6403 100644 --- a/test/react/server_rendering/webpacker_manifest_container_test.rb +++ b/test/react/server_rendering/webpacker_manifest_container_test.rb @@ -18,55 +18,14 @@ class WebpackerManifestContainerTest < ActiveSupport::TestCase end def test_it_loads_from_webpack_dev_server - webpack_dev_server = fork do - Dir.chdir("test/dummy") do - exec "RAILS_ENV=development ./bin/webpack-dev-server " - end + WebpackerHelpers.with_dev_server do + container = React::ServerRendering::WebpackerManifestContainer.new + js_file = container.find_asset("application.js") + # Main file: + assert_includes js_file, "ReactRailsUJS.loadContext(ctx)" + # Bundled dependencies: + assert_includes js_file, "ExportDefaultComponent" end - - detected_dev_server = false - 60.times do |i| - begin - # Make sure that the manifest has been updated: - Webpacker::Manifest.load("./test/dummy/public/packs/manifest.json") - webpack_manifest = Webpacker::Manifest.instance.data - example_asset_path = webpack_manifest.values.first - if example_asset_path.nil? - puts "Manifest is blank, all manifests:" - Dir.glob("./test/dummy/public/packs/*.json").each do |f| - puts f - puts File.read(f) - end - next - end - assert_includes example_asset_path, "http://localhost:8080" - # Make sure the dev server is up: - open("http://localhost:8080/application.js") - detected_dev_server = true - break - rescue StandardError => err - puts err.message - ensure - sleep 0.5 - puts i - end - end - - # If we didn't hook up with a dev server after 10s, - # fail loudly. - assert detected_dev_server - - container = React::ServerRendering::WebpackerManifestContainer.new - js_file = container.find_asset("application.js") - # Main file: - assert_includes js_file, "ReactRailsUJS.loadContext(ctx)" - # Bundled dependencies: - assert_includes js_file, "ExportDefaultComponent" - ensure - Process.kill(9, webpack_dev_server) - Process.wait - # Remove the dev-server packs: - WebpackerHelpers.clear_webpacker_packs end end end diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index b95f48171..39dff0cd4 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -34,4 +34,63 @@ def compile_if_missing def clear_webpacker_packs FileUtils.rm_rf(PACKS_DIRECTORY) end + + # Start a webpack-dev-server + # Call the block + # Make sure to clean up the server + def with_dev_server + # Start the server in a forked process: + webpack_dev_server = Dir.chdir("test/dummy") do + spawn "RAILS_ENV=development ./bin/webpack-dev-server " + end + + detected_dev_server = false + + # Wait for it to start up, make sure it's there by connecting to it: + 30.times do |i| + begin + # Make sure that the manifest has been updated: + Webpacker::Manifest.load("./test/dummy/public/packs/manifest.json") + webpack_manifest = Webpacker::Manifest.instance.data + example_asset_path = webpack_manifest.values.first + if example_asset_path.nil? + # Debug helper + # puts "Manifest is blank, all manifests:" + # Dir.glob("./test/dummy/public/packs/*.json").each do |f| + # puts f + # puts File.read(f) + # end + next + end + # Make sure the dev server is up: + open("http://localhost:8080/application.js") + if !example_asset_path.start_with?("http://localhost:8080") + raise "Manifest doesn't include absolute path to dev server" + end + + detected_dev_server = true + break + rescue StandardError => err + puts err.message + ensure + sleep 0.5 + # debug counter + # puts i + end + end + + # If we didn't hook up with a dev server after waiting, fail loudly. + if !detected_dev_server + raise "Failed to start dev server" + end + + # Call the test block: + yield + ensure + # Kill the server process + Process.kill(9, webpack_dev_server) + Process.wait + # Remove the dev-server packs: + WebpackerHelpers.clear_webpacker_packs + end end From e2a2e33eeb129105aa0748799d93c467b0d43d59 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Fri, 7 Apr 2017 17:37:17 -0400 Subject: [PATCH 02/11] Debug kill --- test/support/webpacker_helpers.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 39dff0cd4..34529e17c 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -88,9 +88,11 @@ def with_dev_server yield ensure # Kill the server process - Process.kill(9, webpack_dev_server) + puts "Killing webpack dev server" + puts Process.kill("KILL", webpack_dev_server) Process.wait # Remove the dev-server packs: WebpackerHelpers.clear_webpacker_packs + puts "Killed." end end From f70e7e9ee1e231c51873dbdc54128f1ce02b38d6 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 09:18:01 -0400 Subject: [PATCH 03/11] try hup, test webpacker first --- .travis.yml | 6 ++++-- test/support/webpacker_helpers.rb | 5 ++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index b4726ce8e..8ef2c7056 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,14 +10,16 @@ rvm: - jruby-9.0.1.0 gemfile: + # These have webpacker: + - gemfiles/rails_4.2_sprockets_4.gemfile + - gemfiles/rails_5_no_sprockets_webpacker.gemfile + # These don't have webpacker: - gemfiles/rails_3.2.gemfile - gemfiles/rails_4.0.5.gemfile - gemfiles/rails_4.0_with_therubyracer.gemfile - gemfiles/rails_4.1.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_no_sprockets_webpacker.gemfile - gemfiles/rails_5_no_sprockets.gemfile - gemfiles/rails_5_sprockets_4.gemfile diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 34529e17c..d324abd0c 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -89,8 +89,11 @@ def with_dev_server ensure # Kill the server process puts "Killing webpack dev server" - puts Process.kill("KILL", webpack_dev_server) + puts Process.kill("HUP", webpack_dev_server) Process.wait + check_cmd = "lsof -i :8080 -S" + puts check_cmd + puts `#{check_cmd}` # Remove the dev-server packs: WebpackerHelpers.clear_webpacker_packs puts "Killed." From 16e6bf0915554393b4e6e7422f195a585c827173 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 09:34:52 -0400 Subject: [PATCH 04/11] Wait for specific pid --- test/support/webpacker_helpers.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index d324abd0c..9076a765e 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -90,7 +90,8 @@ def with_dev_server # Kill the server process puts "Killing webpack dev server" puts Process.kill("HUP", webpack_dev_server) - Process.wait + Process.wait(webpack_dev_server) + puts $? check_cmd = "lsof -i :8080 -S" puts check_cmd puts `#{check_cmd}` From 13c57dbc71d902ff9707e41a98f26972eeb7eb45 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 09:41:53 -0400 Subject: [PATCH 05/11] try a system kill -9 --- test/support/webpacker_helpers.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 9076a765e..34b15e5d7 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -95,6 +95,7 @@ def with_dev_server check_cmd = "lsof -i :8080 -S" puts check_cmd puts `#{check_cmd}` + puts `kill -9 #{webpack_dev_server}` # Remove the dev-server packs: WebpackerHelpers.clear_webpacker_packs puts "Killed." From e7fb25a5f8b4f37aed86c1a7642839974ec82f19 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 09:50:49 -0400 Subject: [PATCH 06/11] try repeatedly killing??? --- test/support/webpacker_helpers.rb | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 34b15e5d7..62fa862b6 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -93,9 +93,20 @@ def with_dev_server Process.wait(webpack_dev_server) puts $? check_cmd = "lsof -i :8080 -S" - puts check_cmd - puts `#{check_cmd}` - puts `kill -9 #{webpack_dev_server}` + kill_cmd = "kill -9 #{webpack_dev_server}" + 30.times do + puts check_cmd + status = `#{check_cmd}` + puts status + if status.include?(webpack_dev_server.to_s) + puts kill_cmd + puts `#{kill_cmd}` + sleep 0.5 + else + break + end + end + # Remove the dev-server packs: WebpackerHelpers.clear_webpacker_packs puts "Killed." From 2bae39a3cd649dc5e373d410f04ff21f522dd9e8 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 10:11:07 -0400 Subject: [PATCH 07/11] More debug --- test/support/webpacker_helpers.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 62fa862b6..be57b79dc 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -98,11 +98,14 @@ def with_dev_server puts check_cmd status = `#{check_cmd}` puts status - if status.include?(webpack_dev_server.to_s) + still_alive = status.include?(webpack_dev_server.to_s) + puts "Still alive? #{still_alive} (#{webpack_dev_server.to_s})" + if still_alive puts kill_cmd puts `#{kill_cmd}` sleep 0.5 else + puts "Break" break end end From e55dd832eeb156747ba0e38b5555d9f0ed385977 Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 10:40:30 -0400 Subject: [PATCH 08/11] Try sigint --- test/support/webpacker_helpers.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index be57b79dc..7261c8623 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -89,7 +89,7 @@ def with_dev_server ensure # Kill the server process puts "Killing webpack dev server" - puts Process.kill("HUP", webpack_dev_server) + puts Process.kill("INT", webpack_dev_server) Process.wait(webpack_dev_server) puts $? check_cmd = "lsof -i :8080 -S" From 435d3c5e30e3f1dcbb9a0f74c7401362bd46753e Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 12:46:09 -0400 Subject: [PATCH 09/11] find and kill the pid on 8080 --- test/support/webpacker_helpers.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 7261c8623..bd205bea2 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -89,11 +89,9 @@ def with_dev_server ensure # Kill the server process puts "Killing webpack dev server" - puts Process.kill("INT", webpack_dev_server) - Process.wait(webpack_dev_server) - puts $? check_cmd = "lsof -i :8080 -S" kill_cmd = "kill -9 #{webpack_dev_server}" + `#{kill_cmd}` 30.times do puts check_cmd status = `#{check_cmd}` @@ -101,6 +99,8 @@ def with_dev_server still_alive = status.include?(webpack_dev_server.to_s) puts "Still alive? #{still_alive} (#{webpack_dev_server.to_s})" if still_alive + remaining_pid = status.match(/\n[a-z]+\s+(\d+)/)[1] + kill_cmd = "kill -9 #{remaining_pid}" puts kill_cmd puts `#{kill_cmd}` sleep 0.5 From 7dd8c5b1df7b5ecca32b5f8d5d1f06c2acc7fb3e Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 12:55:10 -0400 Subject: [PATCH 10/11] check the right pid --- test/support/webpacker_helpers.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index bd205bea2..8683d78ab 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -96,10 +96,10 @@ def with_dev_server puts check_cmd status = `#{check_cmd}` puts status - still_alive = status.include?(webpack_dev_server.to_s) - puts "Still alive? #{still_alive} (#{webpack_dev_server.to_s})" - if still_alive - remaining_pid = status.match(/\n[a-z]+\s+(\d+)/)[1] + remaining_pid_match = status.match(/\n[a-z]+\s+(\d+)/) + if remaining_pid_match + remaining_pid = remaining_pid_match[1] + puts "Remaining #{remaining_pid}" kill_cmd = "kill -9 #{remaining_pid}" puts kill_cmd puts `#{kill_cmd}` From 3532fc5f9007fe32782645f8f13066fcfe6e8bec Mon Sep 17 00:00:00 2001 From: Robert Mosolgo Date: Mon, 10 Apr 2017 13:16:46 -0400 Subject: [PATCH 11/11] Remove putses --- test/support/webpacker_helpers.rb | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/test/support/webpacker_helpers.rb b/test/support/webpacker_helpers.rb index 8683d78ab..b0a82e6aa 100644 --- a/test/support/webpacker_helpers.rb +++ b/test/support/webpacker_helpers.rb @@ -88,30 +88,27 @@ def with_dev_server yield ensure # Kill the server process - puts "Killing webpack dev server" + # puts "Killing webpack dev server" check_cmd = "lsof -i :8080 -S" - kill_cmd = "kill -9 #{webpack_dev_server}" - `#{kill_cmd}` - 30.times do - puts check_cmd + 10.times do + # puts check_cmd status = `#{check_cmd}` - puts status + # puts status remaining_pid_match = status.match(/\n[a-z]+\s+(\d+)/) if remaining_pid_match remaining_pid = remaining_pid_match[1] - puts "Remaining #{remaining_pid}" + # puts "Remaining #{remaining_pid}" kill_cmd = "kill -9 #{remaining_pid}" - puts kill_cmd - puts `#{kill_cmd}` + # puts kill_cmd + `#{kill_cmd}` sleep 0.5 else - puts "Break" break end end # Remove the dev-server packs: WebpackerHelpers.clear_webpacker_packs - puts "Killed." + # puts "Killed." end end