react_on_rails 13.2.0 → 13.3.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.
- checksums.yaml +4 -4
- data/.circleci/config.yml +5 -2
- data/.github/workflows/lint-js-and-ruby.yml +3 -3
- data/.github/workflows/main.yml +15 -13
- data/.github/workflows/package-js-tests.yml +2 -2
- data/.github/workflows/rspec-package-specs.yml +2 -2
- data/.rubocop.yml +4 -0
- data/CHANGELOG.md +11 -1
- data/Gemfile.development_dependencies +1 -1
- data/README.md +5 -5
- data/docs/getting-started.md +11 -5
- data/docs/guides/configuration.md +23 -18
- data/docs/guides/file-system-based-automated-bundle-generation.md +2 -0
- data/docs/guides/installation-into-an-existing-rails-app.md +18 -20
- data/docs/guides/tutorial.md +35 -31
- data/lib/generators/react_on_rails/base_generator.rb +15 -10
- data/lib/generators/react_on_rails/bin/dev +33 -0
- data/lib/generators/react_on_rails/bin/dev-static +33 -0
- data/lib/generators/react_on_rails/install_generator.rb +5 -0
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +1 -1
- data/lib/react_on_rails/configuration.rb +40 -3
- data/lib/react_on_rails/helper.rb +21 -23
- data/lib/react_on_rails/packs_generator.rb +30 -101
- data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +1 -1
- data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +1 -20
- data/lib/react_on_rails/utils.rb +26 -0
- data/lib/react_on_rails/version.rb +1 -1
- data/lib/react_on_rails/webpacker_utils.rb +54 -3
- data/lib/tasks/generate_packs.rake +1 -1
- data/package.json +29 -28
- data/yarn.lock +2856 -3277
- metadata +4 -2
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
def installed?(process)
|
5
|
+
IO.popen "#{process} -v"
|
6
|
+
rescue Errno::ENOENT
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(process)
|
11
|
+
args = [*ARGV]
|
12
|
+
args.shift
|
13
|
+
puts "Using #{process}"
|
14
|
+
exec "#{process} start -f Procfile.dev", args.join(" ")
|
15
|
+
rescue Errno::ENOENT
|
16
|
+
warn <<~MSG
|
17
|
+
ERROR:
|
18
|
+
Please ensure `Procfile.dev` exist in your project!
|
19
|
+
MSG
|
20
|
+
exit!
|
21
|
+
end
|
22
|
+
|
23
|
+
if installed? "overmind"
|
24
|
+
run "overmind"
|
25
|
+
elsif installed? "foreman"
|
26
|
+
run "foreman"
|
27
|
+
else
|
28
|
+
warn <<~MSG
|
29
|
+
NOTICE:
|
30
|
+
For this script to run, you need either 'overmind' or 'foreman' installed on your machine. Please try this script after installing one of them.
|
31
|
+
MSG
|
32
|
+
exit!
|
33
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
def installed?(process)
|
5
|
+
IO.popen "#{process} -v"
|
6
|
+
rescue Errno::ENOENT
|
7
|
+
false
|
8
|
+
end
|
9
|
+
|
10
|
+
def run(process)
|
11
|
+
args = [*ARGV]
|
12
|
+
args.shift
|
13
|
+
puts "Using #{process}"
|
14
|
+
exec "#{process} start -f Procfile.dev-static", args.join(" ")
|
15
|
+
rescue Errno::ENOENT
|
16
|
+
warn <<~MSG
|
17
|
+
ERROR:
|
18
|
+
Please ensure `Procfile.dev-static` exist in your project!
|
19
|
+
MSG
|
20
|
+
exit!
|
21
|
+
end
|
22
|
+
|
23
|
+
if installed? "overmind"
|
24
|
+
run "overmind"
|
25
|
+
elsif installed? "foreman"
|
26
|
+
run "foreman"
|
27
|
+
else
|
28
|
+
warn <<~MSG
|
29
|
+
NOTICE:
|
30
|
+
For this script to run, you need either 'overmind' or 'foreman' installed on your machine. Please try this script after installing one of them.
|
31
|
+
MSG
|
32
|
+
exit!
|
33
|
+
end
|
@@ -28,6 +28,7 @@ module ReactOnRails
|
|
28
28
|
def run_generators
|
29
29
|
if installation_prerequisites_met? || options.ignore_warnings?
|
30
30
|
invoke_generators
|
31
|
+
add_bin_scripts
|
31
32
|
else
|
32
33
|
error = "react_on_rails generator prerequisites not met!"
|
33
34
|
GeneratorMessages.add_error(error)
|
@@ -75,6 +76,10 @@ module ReactOnRails
|
|
75
76
|
GeneratorMessages.add_error(error)
|
76
77
|
true
|
77
78
|
end
|
79
|
+
|
80
|
+
def add_bin_scripts
|
81
|
+
directory "#{__dir__}/bin", "bin"
|
82
|
+
end
|
78
83
|
end
|
79
84
|
end
|
80
85
|
end
|
data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# See https://github.com/shakacode/react_on_rails/blob/master/docs/
|
3
|
+
# See https://github.com/shakacode/react_on_rails/blob/master/docs/guides/configuration.md
|
4
4
|
# for many more options.
|
5
5
|
|
6
6
|
ReactOnRails.configure do |config|
|
@@ -1,5 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# rubocop:disable Metrics/ClassLength
|
4
|
+
|
3
5
|
module ReactOnRails
|
4
6
|
def self.configure
|
5
7
|
yield(configuration)
|
@@ -109,6 +111,7 @@ module ReactOnRails
|
|
109
111
|
|
110
112
|
# on ReactOnRails
|
111
113
|
def setup_config_values
|
114
|
+
check_autobundling_requirements_if_configured
|
112
115
|
ensure_webpack_generated_files_exists
|
113
116
|
configure_generated_assets_dirs_deprecation
|
114
117
|
configure_skip_display_none_deprecation
|
@@ -121,14 +124,37 @@ module ReactOnRails
|
|
121
124
|
|
122
125
|
private
|
123
126
|
|
127
|
+
def check_autobundling_requirements_if_configured
|
128
|
+
raise_missing_components_subdirectory if auto_load_bundle && !components_subdirectory.present?
|
129
|
+
return unless components_subdirectory.present?
|
130
|
+
|
131
|
+
ReactOnRails::WebpackerUtils.raise_shakapacker_not_installed unless ReactOnRails::WebpackerUtils.using_webpacker?
|
132
|
+
ReactOnRails::WebpackerUtils.raise_shakapacker_version_incompatible_for_autobundling unless
|
133
|
+
ReactOnRails::WebpackerUtils.shackapacker_version_requirement_met?(
|
134
|
+
ReactOnRails::PacksGenerator::MINIMUM_SHAKAPACKER_VERSION
|
135
|
+
)
|
136
|
+
ReactOnRails::WebpackerUtils.raise_nested_entries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
|
137
|
+
end
|
138
|
+
|
124
139
|
def adjust_precompile_task
|
125
140
|
skip_react_on_rails_precompile = %w[no false n f].include?(ENV["REACT_ON_RAILS_PRECOMPILE"])
|
126
141
|
|
127
142
|
return if skip_react_on_rails_precompile || build_production_command.blank?
|
128
143
|
|
129
|
-
|
130
|
-
|
131
|
-
|
144
|
+
if Webpacker.config.webpacker_precompile?
|
145
|
+
msg = <<~MSG
|
146
|
+
|
147
|
+
React on Rails and Shakapacker error in configuration!
|
148
|
+
In order to use config/react_on_rails.rb config.build_production_command,
|
149
|
+
you must edit config/webpacker.yml to include this value in the default configuration:
|
150
|
+
'webpacker_precompile: false'
|
151
|
+
|
152
|
+
Alternatively, remove the config/react_on_rails.rb config.build_production_command and the
|
153
|
+
default bin/webpacker script will be used for assets:precompile.
|
154
|
+
|
155
|
+
MSG
|
156
|
+
raise ReactOnRails::Error, msg
|
157
|
+
end
|
132
158
|
|
133
159
|
precompile_tasks = lambda {
|
134
160
|
Rake::Task["react_on_rails:generate_packs"].invoke
|
@@ -230,5 +256,16 @@ module ReactOnRails
|
|
230
256
|
|
231
257
|
Rails.logger.warn "[DEPRECATION] ReactOnRails: remove skip_display_none from configuration."
|
232
258
|
end
|
259
|
+
|
260
|
+
def raise_missing_components_subdirectory
|
261
|
+
msg = <<~MSG
|
262
|
+
**ERROR** ReactOnRails: auto_load_bundle is set to true, yet components_subdirectory is unconfigured.\
|
263
|
+
Please set components_subdirectory to the desired directory. For more information, please see \
|
264
|
+
https://www.shakacode.com/react-on-rails/docs/guides/file-system-based-automated-bundle-generation.md
|
265
|
+
MSG
|
266
|
+
|
267
|
+
raise ReactOnRails::Error, msg
|
268
|
+
end
|
233
269
|
end
|
234
270
|
end
|
271
|
+
# rubocop:enable Metrics/ClassLength
|
@@ -91,26 +91,6 @@ module ReactOnRails
|
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
94
|
-
def load_pack_for_component(component_name)
|
95
|
-
component_pack_file = generated_components_pack(component_name)
|
96
|
-
is_component_pack_present = File.exist?("#{component_pack_file}.jsx")
|
97
|
-
is_development = ENV["RAILS_ENV"] == "development"
|
98
|
-
|
99
|
-
if is_development && !is_component_pack_present
|
100
|
-
ReactOnRails::PacksGenerator.generate
|
101
|
-
raise_generated_missing_pack_warning(component_name)
|
102
|
-
end
|
103
|
-
|
104
|
-
ReactOnRails::PacksGenerator.raise_nested_enteries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
|
105
|
-
|
106
|
-
append_javascript_pack_tag "generated/#{component_name}"
|
107
|
-
append_stylesheet_pack_tag "generated/#{component_name}"
|
108
|
-
end
|
109
|
-
|
110
|
-
def generated_components_pack(component_name)
|
111
|
-
"#{ReactOnRails::WebpackerUtils.webpacker_source_entry_path}/generated/#{component_name}"
|
112
|
-
end
|
113
|
-
|
114
94
|
# react_component_hash is used to return multiple HTML strings for server rendering, such as for
|
115
95
|
# adding meta-tags to a page.
|
116
96
|
# It is exactly like react_component except for the following:
|
@@ -337,6 +317,25 @@ module ReactOnRails
|
|
337
317
|
|
338
318
|
private
|
339
319
|
|
320
|
+
def load_pack_for_component(component_name)
|
321
|
+
is_component_pack_present = File.exist?(generated_components_pack_path(component_name))
|
322
|
+
is_development = ENV["RAILS_ENV"] == "development"
|
323
|
+
|
324
|
+
if is_development && !is_component_pack_present
|
325
|
+
ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
|
326
|
+
raise_missing_pack_error(component_name)
|
327
|
+
end
|
328
|
+
|
329
|
+
ReactOnRails::WebpackerUtils.raise_nested_entries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
|
330
|
+
|
331
|
+
ApplicationController.helpers.append_javascript_pack_tag "generated/#{component_name}"
|
332
|
+
ApplicationController.helpers.append_stylesheet_pack_tag "generated/#{component_name}"
|
333
|
+
end
|
334
|
+
|
335
|
+
def generated_components_pack_path(component_name)
|
336
|
+
"#{ReactOnRails::WebpackerUtils.webpacker_source_entry_path}/generated/#{component_name}.js"
|
337
|
+
end
|
338
|
+
|
340
339
|
def build_react_component_result_for_server_rendered_string(
|
341
340
|
server_rendered_html: required("server_rendered_html"),
|
342
341
|
component_specification_tag: required("component_specification_tag"),
|
@@ -552,10 +551,9 @@ module ReactOnRails
|
|
552
551
|
result
|
553
552
|
end
|
554
553
|
|
555
|
-
def
|
554
|
+
def raise_missing_pack_error(component_name)
|
556
555
|
msg = <<~MSG
|
557
|
-
**ERROR** ReactOnRails: Generated missing pack for Component: #{component_name}. Please
|
558
|
-
once webpack has finished generating the bundles. If the problem persists
|
556
|
+
**ERROR** ReactOnRails: Generated missing pack for Component: #{component_name}. Please restart the webpack dev server or webpack in watch mode, to ensure webpack generates the chunks corresponding to #{component_name} component. If the problem persists
|
559
557
|
1. Verify `components_subdirectory` is configured in `config/initializers/react_on_rails`.
|
560
558
|
2. Component: #{component_name} is placed inside the configured `components_subdirectory`.
|
561
559
|
MSG
|
@@ -6,45 +6,23 @@ module ReactOnRails
|
|
6
6
|
# rubocop:disable Metrics/ClassLength
|
7
7
|
class PacksGenerator
|
8
8
|
CONTAINS_CLIENT_OR_SERVER_REGEX = /\.(server|client)($|\.)/.freeze
|
9
|
-
|
10
|
-
MINIMUM_SHAKAPACKER_MINOR_VERSION = 5
|
11
|
-
MINIMUM_SHAKAPACKER_PATCH_VERSION = 1
|
9
|
+
MINIMUM_SHAKAPACKER_VERSION = [6, 5, 1].freeze
|
12
10
|
|
13
|
-
def self.
|
14
|
-
|
15
|
-
packs_generator.verify_setup_and_generate_packs
|
11
|
+
def self.instance
|
12
|
+
@instance ||= PacksGenerator.new
|
16
13
|
end
|
17
14
|
|
18
|
-
def
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
def verify_setup_and_generate_packs
|
24
|
-
return unless components_subdirectory.present?
|
25
|
-
|
26
|
-
raise_webpacker_not_installed unless ReactOnRails::WebpackerUtils.using_webpacker?
|
27
|
-
raise_shakapacker_version_incompatible unless shackapacker_version_requirement_met?
|
28
|
-
raise_nested_enteries_disabled unless ReactOnRails::WebpackerUtils.nested_entries?
|
15
|
+
def generate_packs_if_stale
|
16
|
+
are_generated_files_present_and_up_to_date = Dir.exist?(generated_packs_directory_path) &&
|
17
|
+
File.exist?(generated_server_bundle_file_path) &&
|
18
|
+
!stale_or_missing_packs?
|
29
19
|
|
30
|
-
|
31
|
-
|
32
|
-
return if is_generated_directory_present && webpack_assets_status_checker.stale_generated_component_packs.empty?
|
20
|
+
return if are_generated_files_present_and_up_to_date
|
33
21
|
|
34
22
|
clean_generated_packs_directory
|
35
23
|
generate_packs
|
36
24
|
end
|
37
25
|
|
38
|
-
def raise_nested_enteries_disabled
|
39
|
-
msg = <<~MSG
|
40
|
-
**ERROR** ReactOnRails: `nested_entries` is configured to be disabled in shakapacker. Please update \
|
41
|
-
webpacker.yml to enable nested enteries. for more information read
|
42
|
-
https://www.shakacode.com/react-on-rails/docs/guides/file-system-based-automated-bundle-generation.md#enable-nested_entries-for-shakapacker
|
43
|
-
MSG
|
44
|
-
|
45
|
-
raise ReactOnRails::Error, msg
|
46
|
-
end
|
47
|
-
|
48
26
|
private
|
49
27
|
|
50
28
|
def generate_packs
|
@@ -100,22 +78,26 @@ module ReactOnRails
|
|
100
78
|
end
|
101
79
|
|
102
80
|
def add_generated_pack_to_server_bundle
|
103
|
-
relative_path_to_generated_server_bundle = relative_path(
|
81
|
+
relative_path_to_generated_server_bundle = relative_path(server_bundle_entrypoint,
|
104
82
|
generated_server_bundle_file_path)
|
105
83
|
content = <<~FILE_CONTENT
|
106
|
-
import
|
84
|
+
// import statement added by react_on_rails:generate_packs rake task
|
85
|
+
import "./#{relative_path_to_generated_server_bundle}"
|
107
86
|
FILE_CONTENT
|
108
87
|
|
109
|
-
|
88
|
+
ReactOnRails::Utils.prepend_to_file_if_text_not_present(
|
89
|
+
file: server_bundle_entrypoint,
|
90
|
+
text_to_prepend: content,
|
91
|
+
regex: %r{import ['"]\./#{relative_path_to_generated_server_bundle}['"]}
|
92
|
+
)
|
110
93
|
end
|
111
94
|
|
112
95
|
def generated_server_bundle_file_path
|
113
|
-
|
114
|
-
generated_server_bundle_file_path = defined_server_bundle_file_path.sub(file_ext, "-generated#{file_ext}")
|
96
|
+
generated_server_bundle_file_path = server_bundle_entrypoint.sub(".js", "-generated.js")
|
115
97
|
generated_server_bundle_file_name = component_name(generated_server_bundle_file_path)
|
116
98
|
source_entry_path = ReactOnRails::WebpackerUtils.webpacker_source_entry_path
|
117
99
|
|
118
|
-
"#{source_entry_path}/#{generated_server_bundle_file_name}
|
100
|
+
"#{source_entry_path}/#{generated_server_bundle_file_name}.js"
|
119
101
|
end
|
120
102
|
|
121
103
|
def clean_generated_packs_directory
|
@@ -123,8 +105,9 @@ module ReactOnRails
|
|
123
105
|
FileUtils.mkdir_p(generated_packs_directory_path)
|
124
106
|
end
|
125
107
|
|
126
|
-
def
|
127
|
-
ReactOnRails::
|
108
|
+
def server_bundle_entrypoint
|
109
|
+
Rails.root.join(ReactOnRails::WebpackerUtils.webpacker_source_entry_path,
|
110
|
+
ReactOnRails.configuration.server_bundle_js_file)
|
128
111
|
end
|
129
112
|
|
130
113
|
def generated_packs_directory_path
|
@@ -150,7 +133,7 @@ module ReactOnRails
|
|
150
133
|
end
|
151
134
|
|
152
135
|
def generated_pack_path(file_path)
|
153
|
-
"#{generated_packs_directory_path}/#{component_name(file_path)}.
|
136
|
+
"#{generated_packs_directory_path}/#{component_name(file_path)}.js"
|
154
137
|
end
|
155
138
|
|
156
139
|
def component_name(file_path)
|
@@ -197,23 +180,7 @@ module ReactOnRails
|
|
197
180
|
def components_search_path
|
198
181
|
source_path = ReactOnRails::WebpackerUtils.webpacker_source_path
|
199
182
|
|
200
|
-
"#{source_path}/**/#{components_subdirectory}"
|
201
|
-
end
|
202
|
-
|
203
|
-
def components_subdirectory
|
204
|
-
ReactOnRails.configuration.components_subdirectory
|
205
|
-
end
|
206
|
-
|
207
|
-
def webpack_assets_status_checker
|
208
|
-
source_path = ReactOnRails::Utils.source_path
|
209
|
-
generated_assets_full_path = ReactOnRails::Utils.generated_assets_full_path
|
210
|
-
webpack_generated_files = ReactOnRails.configuration.webpack_generated_files
|
211
|
-
|
212
|
-
@webpack_assets_status_checker ||= ReactOnRails::TestHelper::WebpackAssetsStatusChecker.new(
|
213
|
-
source_path: source_path,
|
214
|
-
generated_assets_full_path: generated_assets_full_path,
|
215
|
-
webpack_generated_files: webpack_generated_files
|
216
|
-
)
|
183
|
+
"#{source_path}/**/#{ReactOnRails.configuration.components_subdirectory}"
|
217
184
|
end
|
218
185
|
|
219
186
|
def raise_client_component_overrides_common(component_name)
|
@@ -245,53 +212,15 @@ module ReactOnRails
|
|
245
212
|
raise ReactOnRails::Error, msg
|
246
213
|
end
|
247
214
|
|
248
|
-
def
|
249
|
-
|
250
|
-
|
251
|
-
above to use the automated bundle generation feature. The currently installed version is \
|
252
|
-
#{ReactOnRails::WebpackerUtils.shakapacker_version}.
|
253
|
-
MSG
|
254
|
-
|
255
|
-
raise ReactOnRails::Error, msg
|
256
|
-
end
|
257
|
-
|
258
|
-
def raise_webpacker_not_installed
|
259
|
-
msg = <<~MSG
|
260
|
-
**ERROR** ReactOnRails: Missing Shakapacker gem. Please upgrade to use Shakapacker \
|
261
|
-
#{minimum_required_shakapacker_version} or above to use the \
|
262
|
-
automated bundle generation feature.
|
263
|
-
MSG
|
264
|
-
|
265
|
-
raise ReactOnRails::Error, msg
|
266
|
-
end
|
215
|
+
def stale_or_missing_packs?
|
216
|
+
component_files = common_component_to_path.values + client_component_to_path.values
|
217
|
+
most_recent_mtime = Utils.find_most_recent_mtime(component_files)
|
267
218
|
|
268
|
-
|
269
|
-
|
270
|
-
match = shakapacker_version.match(ReactOnRails::VersionChecker::MAJOR_MINOR_PATCH_VERSION_REGEX)
|
219
|
+
component_files.each_with_object([]).any? do |file|
|
220
|
+
path = generated_pack_path(file)
|
271
221
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
def shackapacker_version_requirement_met?
|
276
|
-
major = shakapacker_major_minor_version[0]
|
277
|
-
minor = shakapacker_major_minor_version[1]
|
278
|
-
patch = shakapacker_major_minor_version[2]
|
279
|
-
|
280
|
-
major >= MINIMUM_SHAKAPACKER_MAJOR_VERSION && minor >= MINIMUM_SHAKAPACKER_MINOR_VERSION &&
|
281
|
-
patch >= MINIMUM_SHAKAPACKER_PATCH_VERSION
|
282
|
-
end
|
283
|
-
|
284
|
-
def minimum_required_shakapacker_version
|
285
|
-
"#{MINIMUM_SHAKAPACKER_MAJOR_VERSION}.#{MINIMUM_SHAKAPACKER_MINOR_VERSION}.#{MINIMUM_SHAKAPACKER_PATCH_VERSION}"
|
286
|
-
end
|
287
|
-
|
288
|
-
def prepend_to_file_if_not_present(file, text_to_prepend)
|
289
|
-
file_content = File.read(file)
|
290
|
-
|
291
|
-
return if file_content.include?(text_to_prepend)
|
292
|
-
|
293
|
-
content_with_prepended_text = text_to_prepend + file_content
|
294
|
-
File.write(file, content_with_prepended_text)
|
222
|
+
!File.exist?(path) || File.mtime(path) < most_recent_mtime
|
223
|
+
end
|
295
224
|
end
|
296
225
|
end
|
297
226
|
# rubocop:enable Metrics/ClassLength
|
@@ -37,7 +37,7 @@ module ReactOnRails
|
|
37
37
|
# All done if no stale files!
|
38
38
|
return if stale_gen_files.empty?
|
39
39
|
|
40
|
-
ReactOnRails::PacksGenerator.
|
40
|
+
ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
|
41
41
|
|
42
42
|
# Inform the developer that we're ensuring gen assets are ready.
|
43
43
|
puts_start_compile_check_message(stale_gen_files)
|
@@ -29,17 +29,13 @@ module ReactOnRails
|
|
29
29
|
stale_generated_files(client_files)
|
30
30
|
end
|
31
31
|
|
32
|
-
def stale_generated_component_packs
|
33
|
-
stale_generated_files(component_pack_files)
|
34
|
-
end
|
35
|
-
|
36
32
|
def stale_generated_files(files)
|
37
33
|
manifest_needed = ReactOnRails::WebpackerUtils.using_webpacker? &&
|
38
34
|
!ReactOnRails::WebpackerUtils.manifest_exists?
|
39
35
|
|
40
36
|
return ["manifest.json"] if manifest_needed
|
41
37
|
|
42
|
-
most_recent_mtime = find_most_recent_mtime(files)
|
38
|
+
most_recent_mtime = Utils.find_most_recent_mtime(files)
|
43
39
|
all_compiled_assets.each_with_object([]) do |webpack_generated_file, stale_gen_list|
|
44
40
|
if !File.exist?(webpack_generated_file) ||
|
45
41
|
File.mtime(webpack_generated_file) < most_recent_mtime
|
@@ -51,13 +47,6 @@ module ReactOnRails
|
|
51
47
|
|
52
48
|
private
|
53
49
|
|
54
|
-
def find_most_recent_mtime(files)
|
55
|
-
files.reduce(1.year.ago) do |newest_time, file|
|
56
|
-
mt = File.mtime(file)
|
57
|
-
mt > newest_time ? mt : newest_time
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
50
|
def all_compiled_assets
|
62
51
|
@all_compiled_assets ||= begin
|
63
52
|
webpack_generated_files = @webpack_generated_files.map do |bundle_name|
|
@@ -89,14 +78,6 @@ module ReactOnRails
|
|
89
78
|
@client_files ||= make_file_list(make_globs(source_path)).to_ary
|
90
79
|
end
|
91
80
|
|
92
|
-
def component_pack_files
|
93
|
-
make_file_list(make_globs(components_search_path)).to_ary
|
94
|
-
end
|
95
|
-
|
96
|
-
def components_search_path
|
97
|
-
"#{source_path}/**/#{ReactOnRails.configuration.components_subdirectory}"
|
98
|
-
end
|
99
|
-
|
100
81
|
def make_globs(dirs)
|
101
82
|
Array(dirs).map { |dir| File.join(dir, "**", "*") }
|
102
83
|
end
|
data/lib/react_on_rails/utils.rb
CHANGED
@@ -197,5 +197,31 @@ module ReactOnRails
|
|
197
197
|
rstrip = to_remove - lstrip
|
198
198
|
str[0..(midpoint - lstrip - 1)] + TRUNCATION_FILLER + str[(midpoint + rstrip)..-1]
|
199
199
|
end
|
200
|
+
|
201
|
+
def self.find_most_recent_mtime(files)
|
202
|
+
files.reduce(1.year.ago) do |newest_time, file|
|
203
|
+
mt = File.mtime(file)
|
204
|
+
mt > newest_time ? mt : newest_time
|
205
|
+
end
|
206
|
+
end
|
207
|
+
|
208
|
+
def self.prepend_to_file_if_text_not_present(file:, text_to_prepend:, regex:)
|
209
|
+
if File.exist?(file)
|
210
|
+
file_content = File.read(file)
|
211
|
+
|
212
|
+
return if file_content.match(regex)
|
213
|
+
|
214
|
+
content_with_prepended_text = text_to_prepend + file_content
|
215
|
+
File.write(file, content_with_prepended_text, mode: "w")
|
216
|
+
else
|
217
|
+
File.write(file, text_to_prepend, mode: "w+")
|
218
|
+
end
|
219
|
+
|
220
|
+
puts "Prepended\n#{text_to_prepend}to #{file}."
|
221
|
+
end
|
222
|
+
|
223
|
+
def self.semver_to_string(ary)
|
224
|
+
"#{ary[0]}.#{ary[1]}.#{ary[2]}"
|
225
|
+
end
|
200
226
|
end
|
201
227
|
end
|
@@ -2,8 +2,6 @@
|
|
2
2
|
|
3
3
|
module ReactOnRails
|
4
4
|
module WebpackerUtils
|
5
|
-
# TODO: V13 code should be cleaned up so that the webpacker gem is required.
|
6
|
-
# This check should only be done at startup.
|
7
5
|
def self.using_webpacker?
|
8
6
|
return @using_webpacker if defined?(@using_webpacker)
|
9
7
|
|
@@ -20,7 +18,18 @@ module ReactOnRails
|
|
20
18
|
def self.shakapacker_version
|
21
19
|
return nil unless ReactOnRails::Utils.gem_available?("shakapacker")
|
22
20
|
|
23
|
-
Gem.loaded_specs["shakapacker"].version.to_s
|
21
|
+
@shakapacker_version ||= Gem.loaded_specs["shakapacker"].version.to_s
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.shakapacker_version_as_array
|
25
|
+
match = shakapacker_version.match(ReactOnRails::VersionChecker::MAJOR_MINOR_PATCH_VERSION_REGEX)
|
26
|
+
|
27
|
+
@shakapacker_version_as_array = [match[1].to_i, match[2].to_i, match[3].to_i]
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.shackapacker_version_requirement_met?(ary)
|
31
|
+
ary[0] >= shakapacker_version_as_array[0] && ary[1] >= shakapacker_version_as_array[1] &&
|
32
|
+
ary[2] >= shakapacker_version_as_array[2]
|
24
33
|
end
|
25
34
|
|
26
35
|
# This returns either a URL for the webpack-dev-server, non-server bundle or
|
@@ -85,5 +94,47 @@ module ReactOnRails
|
|
85
94
|
puts wrap_message(msg)
|
86
95
|
exit!
|
87
96
|
end
|
97
|
+
|
98
|
+
def self.webpack_assets_status_checker
|
99
|
+
source_path = ReactOnRails::Utils.source_path
|
100
|
+
generated_assets_full_path = ReactOnRails::Utils.generated_assets_full_path
|
101
|
+
webpack_generated_files = ReactOnRails.configuration.webpack_generated_files
|
102
|
+
|
103
|
+
@webpack_assets_status_checker ||= ReactOnRails::TestHelper::WebpackAssetsStatusChecker.new(
|
104
|
+
source_path: source_path,
|
105
|
+
generated_assets_full_path: generated_assets_full_path,
|
106
|
+
webpack_generated_files: webpack_generated_files
|
107
|
+
)
|
108
|
+
end
|
109
|
+
|
110
|
+
def self.raise_nested_entries_disabled
|
111
|
+
msg = <<~MSG
|
112
|
+
**ERROR** ReactOnRails: `nested_entries` is configured to be disabled in shakapacker. Please update \
|
113
|
+
webpacker.yml to enable nested entries. for more information read
|
114
|
+
https://www.shakacode.com/react-on-rails/docs/guides/file-system-based-automated-bundle-generation.md#enable-nested_entries-for-shakapacker
|
115
|
+
MSG
|
116
|
+
|
117
|
+
raise ReactOnRails::Error, msg
|
118
|
+
end
|
119
|
+
|
120
|
+
def self.raise_shakapacker_version_incompatible_for_autobundling
|
121
|
+
msg = <<~MSG
|
122
|
+
**ERROR** ReactOnRails: Please upgrade Shakapacker to version #{ReactOnRails::WebpackerUtils.semver_to_string(ReactOnRails::PacksGenerator::MINIMUM_SHAKAPACKER_VERSION)} or \
|
123
|
+
above to use the automated bundle generation feature. The currently installed version is \
|
124
|
+
#{ReactOnRails::WebpackerUtils.semver_to_string(ReactOnRails::WebpackerUtils.shakapacker_version_as_array)}.
|
125
|
+
MSG
|
126
|
+
|
127
|
+
raise ReactOnRails::Error, msg
|
128
|
+
end
|
129
|
+
|
130
|
+
def self.raise_shakapacker_not_installed
|
131
|
+
msg = <<~MSG
|
132
|
+
**ERROR** ReactOnRails: Missing Shakapacker gem. Please upgrade to use Shakapacker \
|
133
|
+
#{ReactOnRails::WebpackerUtils.semver_to_string(minimum_required_shakapacker_version)} or above to use the \
|
134
|
+
automated bundle generation feature.
|
135
|
+
MSG
|
136
|
+
|
137
|
+
raise ReactOnRails::Error, msg
|
138
|
+
end
|
88
139
|
end
|
89
140
|
end
|