@@ -21,10 +21,10 @@ def compile
2121 return unless available?
2222 clear_webpacker_packs
2323 Dir . chdir ( "./test/#{ DUMMY_LOCATION } " ) do
24- # capture_io do
24+ capture_io do
2525 Rake ::Task [ 'webpacker:compile' ] . reenable
2626 Rake ::Task [ 'webpacker:compile' ] . invoke
27- # end
27+ end
2828 end
2929 # Reload cached JSON manifest:
3030 manifest_refresh
@@ -40,122 +40,107 @@ def clear_webpacker_packs
4040 FileUtils . rm_rf ( PACKS_DIRECTORY )
4141 end
4242
43- if MAJOR < 3
44- def manifest_refresh
45- Webpacker ::Manifest . load
43+ # Start a webpack-dev-server
44+ # Call the block
45+ # Make sure to clean up the server
46+ def with_dev_server
47+
48+ old_env = ENV [ 'NODE_ENV' ]
49+ ENV [ 'NODE_ENV' ] = 'development'
50+
51+ # Start the server in a forked process:
52+ webpack_dev_server = Dir . chdir ( "test/#{ DUMMY_LOCATION } " ) do
53+ spawn 'RAILS_ENV=development ./bin/webpack-dev-server '
4654 end
47- else
48- def manifest_refresh
49- Webpacker . manifest . refresh
55+
56+ stop_time = Time . now + 30 . seconds
57+ detected_dev_server = false
58+ loop do
59+ detected_dev_server = dev_server_running?
60+ break if detected_dev_server || Time . now > stop_time
61+ sleep 0.5
5062 end
63+
64+ # If we didn't hook up with a dev server after waiting, fail loudly.
65+ raise 'Failed to start dev server' unless detected_dev_server
66+ puts 'Detected dev server - Continuing'
67+
68+ # Call the test block:
69+ yield
70+
71+ ensure
72+ # Kill the server process
73+ puts "Killing webpack dev server"
74+ kill_cmd = "kill -9 #{ webpack_dev_server } "
75+
76+ puts kill_cmd
77+ `#{ kill_cmd } `
78+ # Remove the dev-server packs:
79+ WebpackerHelpers . clear_webpacker_packs
80+ ENV [ 'NODE_ENV' ] = old_env
81+ puts "Killed."
5182 end
5283
53- if MAJOR < 3
84+ if MAJOR < 3 # Old webpackers
85+
86+ def dev_server_running?
87+ manifest_refresh
88+ example_asset_path = manifest_data . values . first
89+ begin
90+ file = open ( 'http://localhost:8080/packs/application.js' )
91+ rescue StandardError => e
92+ file = nil
93+ end
94+ if !example_asset_path . start_with? ( 'http://localhost:8080' ) && ! file
95+ puts "Manifest doesn't include absolute path to dev server"
96+ return false
97+ end
98+ true
99+ end
100+
101+ def manifest_refresh
102+ Webpacker ::Manifest . load
103+ end
104+
54105 def manifest_lookup name
55106 Webpacker ::Manifest . load ( name )
56107 end
57- else
58- def manifest_lookup _
59- Webpacker . manifest
60- end
61- end
62108
63- if MAJOR < 3
64109 def manifest_data
65110 Webpacker ::Manifest . instance . data
66111 end
67- else
68- def manifest_data
69- Webpacker . manifest . refresh
70- end
71- end
72112
73- # Start a webpack-dev-server
74- # Call the block
75- # Make sure to clean up the server
76- def with_dev_server
77- # Start the server in a forked process:
78- webpack_dev_server = Dir . chdir ( "test/#{ DUMMY_LOCATION } " ) do
79- spawn 'RAILS_ENV=development ./bin/webpack-dev-server '
80- end
113+ else # New webpackers
81114
82- detected_dev_server = false
115+ def dev_server_running?
116+ Webpacker . instance . instance_variable_set ( :@config , nil )
117+ return false unless Webpacker . dev_server . running?
83118
84- # Wait for it to start up, make sure it's there by connecting to it:
85- 30 . times do | i |
119+ ds = Webpacker . dev_server
120+ example_asset_path = manifest_data . values . first
86121 begin
87- # Make sure that the manifest has been updated:
88- manifest_lookup ( "./test/#{ DUMMY_LOCATION } /public/packs/manifest.json" )
89- example_asset_path = manifest_data . values . first
90- if example_asset_path . nil?
91- # Debug helper
92- # puts "Manifest is blank, all manifests:"
93- # Dir.glob("./test/#{DUMMY_LOCATION}/public/packs/*.json").each do |f|
94- # puts f
95- # puts File.read(f)
96- # end
97- next
98- end
99- # Make sure the dev server is up:
100- if MAJOR < 3
101- file = open ( 'http://localhost:8080/packs/application.js' )
102- if !example_asset_path . start_with? ( 'http://localhost:8080' ) && ! file
103- raise "Manifest doesn't include absolute path to dev server"
104- end
105- else
106- # Webpacker proxies the dev server when Rails is running in Webpacker 3
107- # so the manifest doens't have absolute paths anymore..
108- # Reload webpacker config.
109- old_env = ENV [ 'NODE_ENV' ]
110- ENV [ 'NODE_ENV' ] = 'development'
111- Webpacker . instance . instance_variable_set ( :@config , nil )
112- Webpacker . config
113- running = Webpacker . dev_server . running?
114- ENV [ 'NODE_ENV' ] = old_env
115- raise "Webpack Dev Server hasn't started yet" unless running
116- end
117-
118- detected_dev_server = true
119- break
120- rescue StandardError => err
121- puts err . message
122- ensure
123- sleep 0.5
124- # debug counter
125- # puts i
122+ file = open ( "#{ ds . protocol } ://#{ ds . host } :#{ ds . port } #{ example_asset_path } " )
123+ rescue StandardError => e
124+ file = nil
126125 end
126+ if ! file
127+ puts "Dev server is not serving assets yet"
128+ return false
129+ end
130+ true
127131 end
128132
129- # If we didn't hook up with a dev server after waiting, fail loudly.
130- unless detected_dev_server
131- raise 'Failed to start dev server'
133+ def manifest_refresh
134+ Webpacker . manifest . refresh
132135 end
133136
134- # Call the test block:
135- yield
136- ensure
137- # Kill the server process
138- # puts "Killing webpack dev server"
139- check_cmd = 'lsof -i :8080 -S'
140- 10 . times do
141- # puts check_cmd
142- status = `#{ check_cmd } `
143- # puts status
144- remaining_pid_match = status . match ( /\n [a-z]+\s +(\d +)/ )
145- if remaining_pid_match
146- remaining_pid = remaining_pid_match [ 1 ]
147- # puts "Remaining #{remaining_pid}"
148- kill_cmd = "kill -9 #{ remaining_pid } "
149- # puts kill_cmd
150- `#{ kill_cmd } `
151- sleep 0.5
152- else
153- break
154- end
137+ def manifest_lookup _
138+ Webpacker . manifest
139+ end
140+
141+ def manifest_data
142+ Webpacker . manifest . refresh
155143 end
156144
157- # Remove the dev-server packs:
158- WebpackerHelpers . clear_webpacker_packs
159- # puts "Killed."
160145 end
161146end
0 commit comments