react_on_rails 13.1.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.
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",