react_on_rails 13.1.0 → 13.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/.circleci/config.yml +5 -2
  3. data/.github/workflows/lint-js-and-ruby.yml +3 -3
  4. data/.github/workflows/main.yml +19 -13
  5. data/.github/workflows/package-js-tests.yml +2 -2
  6. data/.github/workflows/rspec-package-specs.yml +2 -2
  7. data/.rubocop.yml +4 -0
  8. data/CHANGELOG.md +21 -1
  9. data/Gemfile.development_dependencies +2 -2
  10. data/README.md +7 -5
  11. data/docs/api/javascript-api.md +9 -0
  12. data/docs/getting-started.md +15 -6
  13. data/docs/guides/configuration.md +25 -20
  14. data/docs/guides/file-system-based-automated-bundle-generation.md +16 -13
  15. data/docs/guides/installation-into-an-existing-rails-app.md +18 -20
  16. data/docs/guides/rails-webpacker-react-integration-options.md +8 -8
  17. data/docs/guides/react-server-rendering.md +1 -1
  18. data/docs/guides/tutorial.md +36 -32
  19. data/lib/generators/react_on_rails/base_generator.rb +15 -10
  20. data/lib/generators/react_on_rails/bin/dev +33 -0
  21. data/lib/generators/react_on_rails/bin/dev-static +33 -0
  22. data/lib/generators/react_on_rails/install_generator.rb +5 -0
  23. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +1 -1
  24. data/lib/react_on_rails/configuration.rb +40 -3
  25. data/lib/react_on_rails/helper.rb +21 -23
  26. data/lib/react_on_rails/packs_generator.rb +30 -101
  27. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +1 -1
  28. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +1 -20
  29. data/lib/react_on_rails/utils.rb +26 -0
  30. data/lib/react_on_rails/version.rb +1 -1
  31. data/lib/react_on_rails/webpacker_utils.rb +54 -3
  32. data/lib/tasks/generate_packs.rake +1 -1
  33. data/package.json +29 -28
  34. data/yarn.lock +2856 -3277
  35. metadata +4 -2
@@ -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
@@ -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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ReactOnRails
4
- VERSION = "13.1.0"
4
+ VERSION = "13.3.0"
5
5
  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
@@ -6,6 +6,6 @@ namespace :react_on_rails do
6
6
  DESC
7
7
 
8
8
  task generate_packs: :environment do
9
- ReactOnRails::PacksGenerator.generate
9
+ ReactOnRails::PacksGenerator.instance.generate_packs_if_stale
10
10
  end
11
11
  end
data/package.json CHANGED
@@ -1,48 +1,49 @@
1
1
  {
2
2
  "name": "react-on-rails",
3
- "version": "13.1.0",
3
+ "version": "13.3.0",
4
4
  "description": "react-on-rails JavaScript for react_on_rails Ruby gem",
5
5
  "main": "node_package/lib/ReactOnRails.js",
6
6
  "directories": {
7
7
  "doc": "docs"
8
8
  },
9
9
  "devDependencies": {
10
- "@babel/cli": "^7.12.10",
11
- "@babel/core": "^7.12.10",
12
- "@babel/plugin-transform-runtime": "^7.12.10",
13
- "@babel/plugin-transform-typescript": "^7.12.1",
14
- "@babel/preset-env": "^7.12.10",
15
- "@babel/preset-react": "^7.12.10",
16
- "@babel/types": "^7.12.10",
17
- "@types/jest": "^26.0.18",
18
- "@types/react": "^16.9.23",
19
- "@types/react-dom": "^16.9.5",
10
+ "@babel/cli": "^7.20.7",
11
+ "@babel/core": "^7.20.12",
12
+ "@babel/plugin-transform-runtime": "^7.19.6",
13
+ "@babel/plugin-transform-typescript": "^7.20.13",
14
+ "@babel/preset-env": "^7.20.2",
15
+ "@babel/preset-react": "^7.18.6",
16
+ "@babel/types": "^7.20.7",
17
+ "@types/jest": "^28.1.3",
18
+ "@types/react": "^16.14.35",
19
+ "@types/react-dom": "^16.9.17",
20
20
  "@types/turbolinks": "^5.2.0",
21
- "@types/webpack-env": "^1.17.0",
22
- "@typescript-eslint/eslint-plugin": "^4.10.0",
23
- "@typescript-eslint/parser": "^4.10.0",
21
+ "@types/webpack-env": "^1.18.0",
22
+ "@typescript-eslint/eslint-plugin": "^4.33.0",
23
+ "@typescript-eslint/parser": "^4.33.0",
24
24
  "babelify": "^10.0.0",
25
25
  "blue-tape": "^1.0.0",
26
- "create-react-class": "^15.6.0",
27
- "eslint": "^7.15.0",
26
+ "create-react-class": "^15.7.0",
27
+ "eslint": "^7.32.0",
28
28
  "eslint-config-prettier": "^7.0.0",
29
29
  "eslint-config-shakacode": "^16.0.1",
30
- "eslint-plugin-import": "^2.22.1",
31
- "eslint-plugin-jsx-a11y": "^6.4.1",
32
- "eslint-plugin-prettier": "^3.3.0",
33
- "eslint-plugin-react": "^7.21.5",
34
- "jest": "^26.6.3",
30
+ "eslint-plugin-import": "^2.27.5",
31
+ "eslint-plugin-jsx-a11y": "^6.7.1",
32
+ "eslint-plugin-prettier": "^3.4.1",
33
+ "eslint-plugin-react": "^7.32.1",
34
+ "jest": "^28.1.3",
35
+ "jest-environment-jsdom": "^28.1.3",
35
36
  "jsdom": "^16.4.0",
36
37
  "nps": "^5.9.3",
37
- "prettier": "^2.2.1",
38
+ "prettier": "^2.8.3",
38
39
  "prettier-eslint-cli": "^5.0.0",
39
- "prop-types": "^15.5.10",
40
- "react": "^16.5.2",
41
- "react-dom": "^16.5.2",
40
+ "prop-types": "^15.8.1",
41
+ "react": "^16.14.0",
42
+ "react-dom": "^16.14.0",
42
43
  "react-transform-hmr": "^1.0.4",
43
- "redux": "^4.0.1",
44
- "ts-jest": "^26.4.4",
45
- "typescript": "^4.1.2"
44
+ "redux": "^4.2.0",
45
+ "ts-jest": "^28.0.8",
46
+ "typescript": "^4.9.4"
46
47
  },
47
48
  "dependencies": {
48
49
  "@babel/runtime-corejs3": "^7.12.5",