react_on_rails 11.0.0 → 12.0.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 (130) hide show
  1. checksums.yaml +5 -5
  2. data/.circleci/config.yml +320 -0
  3. data/.eslintignore +2 -1
  4. data/.eslintrc +30 -2
  5. data/.github/FUNDING.yml +1 -0
  6. data/.gitignore +3 -1
  7. data/.prettierignore +10 -0
  8. data/.prettierrc +23 -0
  9. data/.release-it.json +3 -0
  10. data/.rubocop.yml +39 -11
  11. data/.travis.yml +11 -22
  12. data/CHANGELOG.md +235 -6
  13. data/CONTRIBUTING.md +64 -84
  14. data/Gemfile +3 -5
  15. data/KUDOS.md +4 -1
  16. data/{docs/LICENSE.md → LICENSE.md} +1 -1
  17. data/PROJECTS.md +7 -1
  18. data/REACT-ON-RAILS-PRO-LICENSE +95 -0
  19. data/README.md +233 -630
  20. data/Rakefile +1 -5
  21. data/SUMMARY.md +42 -29
  22. data/book.json +5 -5
  23. data/docs/additional-reading/asset-pipeline.md +8 -16
  24. data/docs/additional-reading/convert-rails-5-api-only-app.md +19 -0
  25. data/docs/additional-reading/credits.md +10 -0
  26. data/docs/additional-reading/images.md +1 -1
  27. data/docs/additional-reading/rails-engine-integration.md +7 -0
  28. data/docs/additional-reading/rails_view_rendering_from_inline_javascript.md +2 -1
  29. data/docs/additional-reading/react-helmet.md +30 -10
  30. data/docs/additional-reading/react-router.md +52 -75
  31. data/docs/additional-reading/server-rendering-tips.md +14 -11
  32. data/docs/additional-reading/upgrade-webpacker-v3-to-v4.md +10 -0
  33. data/docs/additional-reading/webpack.md +2 -2
  34. data/docs/api/javascript-api.md +24 -4
  35. data/docs/api/redux-store-api.md +102 -0
  36. data/docs/api/view-helpers-api.md +133 -0
  37. data/docs/articles.md +20 -0
  38. data/docs/basics/client-vs-server-rendering.md +23 -0
  39. data/docs/basics/configuration.md +145 -61
  40. data/docs/basics/deployment.md +4 -0
  41. data/docs/basics/{generator.md → generator-details.md} +5 -8
  42. data/docs/basics/heroku-deployment.md +24 -0
  43. data/docs/basics/hmr-and-hot-reloading-with-the-webpack-dev-server.md +49 -0
  44. data/docs/basics/i18n.md +45 -23
  45. data/docs/basics/installation-into-an-existing-rails-app.md +59 -0
  46. data/docs/basics/minitest-configuration.md +31 -0
  47. data/docs/basics/react-server-rendering.md +29 -0
  48. data/docs/{additional-reading → basics}/recommended-project-structure.md +38 -10
  49. data/docs/basics/render-functions-and-railscontext.md +205 -0
  50. data/docs/basics/rspec-configuration.md +73 -0
  51. data/docs/basics/upgrading-react-on-rails.md +75 -4
  52. data/docs/basics/webpack-configuration.md +50 -0
  53. data/docs/contributor-info/errors-with-hooks.md +45 -0
  54. data/docs/contributor-info/pull-requests.md +44 -0
  55. data/docs/misc/doctrine.md +2 -2
  56. data/docs/{additional-reading → outdated}/code-splitting.md +19 -9
  57. data/docs/outdated/how-react-on-rails-works.md +44 -0
  58. data/docs/{basics/installation-overview.md → outdated/manual-installation-overview.md} +8 -13
  59. data/docs/{additional-reading → outdated}/rails-assets-relative-paths.md +3 -3
  60. data/docs/{additional-reading → outdated}/rails-assets.md +5 -13
  61. data/docs/testimonials/hvmn.md +25 -0
  62. data/docs/testimonials/resortpass.md +13 -0
  63. data/docs/testimonials/testimonials.md +28 -0
  64. data/docs/tutorial.md +182 -44
  65. data/jest.config.js +4 -0
  66. data/lib/generators/USAGE +1 -1
  67. data/lib/generators/react_on_rails/base_generator.rb +2 -2
  68. data/lib/generators/react_on_rails/dev_tests_generator.rb +3 -2
  69. data/lib/generators/react_on_rails/generator_helper.rb +4 -6
  70. data/lib/generators/react_on_rails/install_generator.rb +2 -0
  71. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev +3 -1
  72. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-hmr +26 -0
  73. data/lib/generators/react_on_rails/templates/base/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +20 -40
  74. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +4 -1
  75. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/components/HelloWorld.jsx +4 -8
  76. data/lib/generators/react_on_rails/templates/redux/base/app/javascript/bundles/HelloWorld/store/helloWorldStore.js +1 -3
  77. data/lib/react_on_rails/configuration.rb +175 -102
  78. data/lib/react_on_rails/error.rb +2 -0
  79. data/lib/react_on_rails/git_utils.rb +2 -0
  80. data/lib/react_on_rails/{react_on_rails_helper.rb → helper.rb} +201 -225
  81. data/lib/react_on_rails/json_output.rb +1 -1
  82. data/lib/react_on_rails/json_parse_error.rb +28 -0
  83. data/lib/react_on_rails/locales/base.rb +150 -0
  84. data/lib/react_on_rails/locales/to_js.rb +37 -0
  85. data/lib/react_on_rails/locales/to_json.rb +27 -0
  86. data/lib/react_on_rails/prerender_error.rb +56 -18
  87. data/lib/react_on_rails/react_component/render_options.rb +98 -0
  88. data/lib/react_on_rails/server_rendering_js_code.rb +42 -0
  89. data/lib/react_on_rails/server_rendering_pool/ruby_embedded_java_script.rb +139 -106
  90. data/lib/react_on_rails/server_rendering_pool.rb +4 -16
  91. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +7 -8
  92. data/lib/react_on_rails/test_helper/webpack_assets_compiler.rb +17 -0
  93. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +10 -6
  94. data/lib/react_on_rails/test_helper.rb +18 -7
  95. data/lib/react_on_rails/utils.rb +66 -26
  96. data/lib/react_on_rails/version.rb +1 -1
  97. data/lib/react_on_rails/version_checker.rb +5 -1
  98. data/lib/react_on_rails/version_syntax_converter.rb +14 -12
  99. data/lib/react_on_rails/webpacker_utils.rb +44 -10
  100. data/lib/react_on_rails.rb +8 -3
  101. data/lib/tasks/assets.rake +33 -46
  102. data/lib/tasks/locale.rake +4 -2
  103. data/package-scripts.yml +49 -0
  104. data/package.json +49 -40
  105. data/rakelib/dummy_apps.rake +1 -9
  106. data/rakelib/example_type.rb +3 -1
  107. data/rakelib/examples.rake +3 -0
  108. data/rakelib/lint.rake +2 -7
  109. data/rakelib/node_package.rake +2 -2
  110. data/rakelib/release.rake +4 -8
  111. data/rakelib/run_rspec.rake +5 -18
  112. data/react_on_rails.gemspec +5 -6
  113. data/tsconfig.json +14 -0
  114. data/webpackConfigLoader.js +5 -4
  115. data/yarn.lock +7645 -1821
  116. metadata +71 -61
  117. data/Gemfile.rails32 +0 -74
  118. data/docs/additional-reading/babel.md +0 -5
  119. data/docs/additional-reading/caching-and-performance.md +0 -4
  120. data/docs/additional-reading/heroku-deployment.md +0 -92
  121. data/docs/additional-reading/hot-reloading-rails-development.md +0 -57
  122. data/docs/additional-reading/node-server-rendering.md +0 -5
  123. data/docs/additional-reading/rspec-configuration.md +0 -56
  124. data/docs/api/ruby-api-hot-reload-view-helpers.md +0 -44
  125. data/docs/api/ruby-api.md +0 -8
  126. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev-server +0 -12
  127. data/lib/react_on_rails/assets_precompile.rb +0 -150
  128. data/lib/react_on_rails/locales_to_js.rb +0 -134
  129. data/lib/react_on_rails/react_component/options.rb +0 -64
  130. /data/docs/{misc → outdated}/rails3.md +0 -0
@@ -8,6 +8,7 @@ namespace :dummy_apps do
8
8
  task :yarn_install do
9
9
  yarn_install_cmd = "yarn install --mutex network"
10
10
  sh_in_dir(dummy_app_dir, yarn_install_cmd)
11
+ sh_in_dir(dummy_app_dir, "yalc link react-on-rails")
11
12
  end
12
13
 
13
14
  task dummy_app: [:yarn_install] do
@@ -15,15 +16,6 @@ namespace :dummy_apps do
15
16
  bundle_install_in(dummy_app_dir)
16
17
  end
17
18
 
18
- task :dummy_no_webpacker do
19
- npm_install_cmd = "npm install"
20
- install_react_on_rails_cmd = "yarn run install-react-on-rails"
21
- dummy_app_dir = File.join(gem_root, "spec/dummy_no_webpacker")
22
- sh_in_dir(File.join(gem_root, "spec/dummy_no_webpacker/client"), npm_install_cmd)
23
- sh_in_dir(dummy_app_dir, install_react_on_rails_cmd)
24
- sh_in_dir(dummy_app_dir, "BUNDLE_GEMFILE=Gemfile.rails32 bundle install")
25
- end
26
-
27
19
  task dummy_apps: %i[dummy_app node_package] do
28
20
  puts "Prepared all Dummy Apps"
29
21
  end
@@ -49,8 +49,10 @@ module ReactOnRails
49
49
  end
50
50
 
51
51
  # Options we pass when running `rails new` from the command-line.
52
+ attr_writer :rails_options
53
+
52
54
  def rails_options
53
- "--skip-bundle --skip-spring --skip-git --skip-test-unit --skip-active-record"
55
+ @rails_options ||= "--skip-bundle --skip-spring --skip-git --skip-test-unit --skip-active-record"
54
56
  end
55
57
 
56
58
  %w[gen clobber npm_install build_webpack_bundles].each do |task_type|
@@ -6,6 +6,8 @@
6
6
  # Also see example_type.rb
7
7
 
8
8
  require "yaml"
9
+ require 'rails/version'
10
+
9
11
  require_relative "example_type"
10
12
  require_relative "task_helpers"
11
13
 
@@ -28,6 +30,7 @@ namespace :examples do # rubocop:disable Metrics/BlockLength
28
30
  desc "Generates #{example_type.name_pretty}"
29
31
  task example_type.gen_task_name_short => example_type.clobber_task_name do
30
32
  mkdir_p(example_type.dir)
33
+ example_type.rails_options += " --webpack" if Rails.version >= "5.1" && Rails.version < "6"
31
34
  sh_in_dir(examples_dir, "rails new #{example_type.name} #{example_type.rails_options}")
32
35
  sh_in_dir(example_type.dir, "touch .gitignore")
33
36
  sh_in_dir(example_type.dir, "rake webpacker:install")
data/rakelib/lint.rake CHANGED
@@ -26,13 +26,8 @@ namespace :lint do # rubocop:disable Metrics/BlockLength
26
26
  sh_in_dir(gem_root, "yarn run eslint")
27
27
  end
28
28
 
29
- desc "Run flow from shell"
30
- task :flow do
31
- sh_in_dir(gem_root, "yarn run flow")
32
- end
33
-
34
- desc "Run all eslint, flow, rubocop linters. Skip ruby-lint and scss"
35
- task lint: %i[eslint flow rubocop] do
29
+ desc "Run all eslint & rubocop linters. Skip ruby-lint and scss"
30
+ task lint: %i[eslint rubocop] do
36
31
  puts "Completed all linting"
37
32
  end
38
33
  end
@@ -6,8 +6,8 @@ namespace :node_package do
6
6
  include ReactOnRails::TaskHelpers
7
7
 
8
8
  task :build do
9
- puts "Building Node Package and running 'yarn link'"
10
- sh "yarn run build && yarn link"
9
+ puts "Building Node Package and running 'yalc publish'"
10
+ sh "yarn run build && yalc publish"
11
11
  end
12
12
  end
13
13
 
data/rakelib/release.rake CHANGED
@@ -41,7 +41,7 @@ task :release, %i[gem_version dry_run tools_install] do |_t, args|
41
41
  npm_version = if gem_version.strip.empty?
42
42
  ""
43
43
  else
44
- VersionSyntaxConverter.new.rubygem_to_npm(gem_version)
44
+ ReactOnRails::VersionSyntaxConverter.new.rubygem_to_npm(gem_version)
45
45
  end
46
46
 
47
47
  # Having the examples prevents publishing
@@ -60,19 +60,15 @@ task :release, %i[gem_version dry_run tools_install] do |_t, args|
60
60
  sh_in_dir(gem_root, "git add .")
61
61
 
62
62
  # Will bump the yarn version, commit, tag the commit, push to repo, and release on yarn
63
- release_it_command = "$(yarn bin)/release-it --non-interactive --npm.publish".dup
64
- release_it_command << " --dry-run --verbose" if is_dry_run
63
+ release_it_command = "$(yarn bin)/release-it".dup
65
64
  release_it_command << " #{npm_version}" unless npm_version.strip.empty?
65
+ release_it_command << " --non-interactive --npm.publish"
66
+ release_it_command << " --dry-run --verbose" if is_dry_run
66
67
  sh_in_dir(gem_root, release_it_command)
67
68
 
68
69
  # Release the new gem version
69
70
  unless is_dry_run
70
71
  sh_in_dir(gem_root, "gem release")
71
-
72
- # Update master with new npm version
73
- sh_in_dir(File.join(gem_root, "spec", "dummy", "client"), "yarn add react-on-rails@#{npm_version} --exact")
74
- sh_in_dir(gem_root, "git commit -am 'Updated spec/dummy/client/package.json latest version'")
75
- sh_in_dir(gem_root, "git push")
76
72
  end
77
73
  end
78
74
  # rubocop:enable Metrics/BlockLength
@@ -18,16 +18,6 @@ namespace :run_rspec do
18
18
  run_tests_in("", rspec_args: File.join("spec", "react_on_rails"))
19
19
  end
20
20
 
21
- desc "Run RSpec with rails32 gemfile"
22
- task :gem_rails32 do
23
- rspec_args = "spec/react_on_rails --tag ~webpacker --exclude-pattern "\
24
- "\"**/generators/*_spec.rb,"\
25
- "**/test_helper/webpack_*_spec.rb\""
26
- run_tests_in("",
27
- rspec_args: rspec_args,
28
- env_vars: "BUNDLE_GEMFILE=spec/dummy_no_webpacker/Gemfile.rails32")
29
- end
30
-
31
21
  desc "Runs dummy rspec with turbolinks"
32
22
  task dummy: ["dummy_apps:dummy_app"] do
33
23
  clean_gen_assets(spec_dummy_dir)
@@ -44,14 +34,6 @@ namespace :run_rspec do
44
34
  command_name: "dummy_no_turbolinks")
45
35
  end
46
36
 
47
- desc "Runs dummy_no_webpacker rspec"
48
- task :dummy_no_webpacker do
49
- dummy_app_dir = File.join(gem_root, "spec/dummy_no_webpacker")
50
- clean_gen_assets(dummy_app_dir)
51
- run_tests_in(dummy_app_dir,
52
- env_vars: "BUNDLE_GEMFILE=Gemfile.rails32")
53
- end
54
-
55
37
  # Dynamically define Rake tasks for each example app found in the examples directory
56
38
  ExampleType.all.each do |example_type|
57
39
  desc "Runs RSpec for #{example_type.name_pretty} only"
@@ -77,6 +59,11 @@ namespace :run_rspec do
77
59
  puts "Completed all RSpec tests"
78
60
  end
79
61
 
62
+ desc "run all dummy tests"
63
+ task all_dummy: %i[dummy_no_turbolinks dummy] do
64
+ puts "Completed all RSpec tests"
65
+ end
66
+
80
67
  desc "run all tests"
81
68
  task run_rspec: %i[all_but_examples examples] do
82
69
  puts "Completed all RSpec tests"
@@ -23,16 +23,17 @@ Gem::Specification.new do |s|
23
23
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  s.require_paths = ["lib"]
25
25
 
26
- s.required_ruby_version = ">= 2.1.0"
26
+ s.required_ruby_version = ">= 2.5.0"
27
27
 
28
28
  s.add_dependency "addressable"
29
29
  s.add_dependency "connection_pool"
30
30
  s.add_dependency "execjs", "~> 2.5"
31
31
  s.add_dependency "rails", ">= 3.2"
32
- s.add_dependency "rainbow", "~> 2.2"
32
+ s.add_dependency "rainbow", "~> 3.0"
33
+ s.add_dependency "webpacker", ">= 4.0"
33
34
 
34
35
  s.add_development_dependency "awesome_print"
35
- s.add_development_dependency "bundler", "~> 1"
36
+ s.add_development_dependency "bundler", "~> 2"
36
37
  s.add_development_dependency "coveralls"
37
38
  s.add_development_dependency "gem-release"
38
39
  s.add_development_dependency "generator_spec"
@@ -41,14 +42,12 @@ Gem::Specification.new do |s|
41
42
  s.add_development_dependency "pry-byebug"
42
43
  s.add_development_dependency "pry-doc"
43
44
  s.add_development_dependency "pry-rescue"
44
- s.add_development_dependency "pry-stack_explorer"
45
45
  s.add_development_dependency "pry-state"
46
- s.add_development_dependency "pry-toys"
47
46
  s.add_development_dependency "rails", "~> 5.2"
48
47
 
49
48
  s.add_development_dependency "rake", "~> 10.0"
50
49
  s.add_development_dependency "rspec"
51
- s.add_development_dependency "rubocop", "0.55.0"
50
+ s.add_development_dependency "rubocop", "0.85.0"
52
51
 
53
52
  s.post_install_message = '
54
53
  --------------------------------------------------------------------------------
data/tsconfig.json ADDED
@@ -0,0 +1,14 @@
1
+ {
2
+ "compilerOptions": {
3
+ "allowJs": true,
4
+ "esModuleInterop": true,
5
+ "jsx": "react",
6
+ "lib": ["dom", "es2015"],
7
+ "module": "CommonJS",
8
+ "noImplicitAny": true,
9
+ "outDir": "node_package/lib",
10
+ "strict": true,
11
+ "target": "es5"
12
+ },
13
+ "include": ["node_package/src/**/*"]
14
+ }
@@ -1,4 +1,6 @@
1
1
  /**
2
+ * TODO: THIS SHOULD BE REMOVED
3
+ *
2
4
  * Allow defaults for the config/webpacker.yml. Thee values in this file MUST match values
3
5
  * in https://github.com/rails/webpacker/blob/master/lib/install/config/webpacker.yml
4
6
  *
@@ -11,15 +13,14 @@ const { env } = require('process');
11
13
  const { safeLoad } = require('js-yaml');
12
14
  const { readFileSync } = require('fs');
13
15
 
14
-
15
16
  function removeOuterSlashes(string) {
16
17
  return string.replace(/^\/*/, '').replace(/\/*$/, '');
17
18
  }
18
19
 
19
20
  function formatPublicPath(settings) {
20
21
  if (settings.dev_server) {
21
- const host = settings.dev_server.host;
22
- const port = settings.dev_server.port;
22
+ const { host } = settings.dev_server;
23
+ const { port } = settings.dev_server;
23
24
  const path = settings.public_output_path;
24
25
  const hostWithHttp = `http://${host}:${port}`;
25
26
 
@@ -48,7 +49,7 @@ function formatPublicPath(settings) {
48
49
  */
49
50
  const configLoader = (configPath) => {
50
51
  // Some test environments might not have the NODE_ENV set, so we'll have fallbacks.
51
- const configEnv = (env.NODE_ENV || env.RAILS_ENV || 'development');
52
+ const configEnv = env.NODE_ENV || env.RAILS_ENV || 'development';
52
53
  const ymlConfigPath = join(configPath, 'webpacker.yml');
53
54
  const settings = safeLoad(readFileSync(ymlConfigPath, 'utf8'))[configEnv];
54
55