react_on_rails 2.0.0.beta.1 → 2.0.0.beta.2

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 (119) hide show
  1. checksums.yaml +4 -4
  2. data/.coveralls.yml +1 -0
  3. data/.dockerignore +2 -0
  4. data/.eslintignore +7 -0
  5. data/.eslintrc +19 -0
  6. data/.gitignore +28 -0
  7. data/.jscsrc +27 -0
  8. data/.npmignore +20 -0
  9. data/.rspec +2 -0
  10. data/.rubocop.yml +70 -0
  11. data/.scss-lint.yml +205 -0
  12. data/.travis.yml +43 -0
  13. data/CHANGELOG.md +34 -0
  14. data/Dockerfile_tests +12 -0
  15. data/Gemfile +40 -0
  16. data/README.md +365 -0
  17. data/Rakefile +5 -0
  18. data/app/helpers/react_on_rails_helper.rb +215 -0
  19. data/docker-compose.yml +11 -0
  20. data/docs/LICENSE +21 -0
  21. data/docs/additional_reading/heroku_deployment.md +23 -0
  22. data/docs/additional_reading/manual_installation.md +118 -0
  23. data/docs/additional_reading/node_dependencies_and_npm.md +29 -0
  24. data/docs/additional_reading/optional_configuration.md +33 -0
  25. data/docs/additional_reading/react-and-redux.md +36 -0
  26. data/docs/additional_reading/react_router.md +45 -0
  27. data/docs/additional_reading/server_rendering_tips.md +11 -0
  28. data/docs/additional_reading/tips.md +10 -0
  29. data/docs/additional_reading/webpack.md +46 -0
  30. data/docs/code_of_conduct.md +13 -0
  31. data/docs/coding-style/linters.md +64 -0
  32. data/docs/coding-style/style.md +42 -0
  33. data/docs/contributing.md +157 -0
  34. data/docs/generator_testing.md +20 -0
  35. data/docs/releasing.md +29 -0
  36. data/lib/generators/USAGE +99 -0
  37. data/lib/generators/react_on_rails/base_generator.rb +191 -0
  38. data/lib/generators/react_on_rails/bootstrap_generator.rb +89 -0
  39. data/lib/generators/react_on_rails/dev_tests_generator.rb +39 -0
  40. data/lib/generators/react_on_rails/generator_helper.rb +50 -0
  41. data/lib/generators/react_on_rails/heroku_deployment_generator.rb +30 -0
  42. data/lib/generators/react_on_rails/install_generator.rb +99 -0
  43. data/lib/generators/react_on_rails/js_linters_generator.rb +19 -0
  44. data/lib/generators/react_on_rails/react_no_redux_generator.rb +40 -0
  45. data/lib/generators/react_on_rails/react_with_redux_generator.rb +51 -0
  46. data/lib/generators/react_on_rails/ruby_linters_generator.rb +33 -0
  47. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +4 -0
  48. data/lib/generators/react_on_rails/templates/base/base/REACT_ON_RAILS.md +16 -0
  49. data/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb +5 -0
  50. data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +4 -0
  51. data/lib/generators/react_on_rails/templates/base/base/client/.babelrc +3 -0
  52. data/lib/generators/react_on_rails/templates/base/base/client/REACT_ON_RAILS_CLIENT_README.md +3 -0
  53. data/lib/generators/react_on_rails/templates/base/base/client/app/bundles/HelloWorld/startup/clientRegistration.jsx.tt +5 -0
  54. data/lib/generators/react_on_rails/templates/base/base/client/index.jade +15 -0
  55. data/lib/generators/react_on_rails/templates/base/base/client/package.json.tt +104 -0
  56. data/lib/generators/react_on_rails/templates/base/base/client/server.js +64 -0
  57. data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.base.config.js.tt +62 -0
  58. data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.hot.config.js.tt +69 -0
  59. data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js +42 -0
  60. data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +26 -0
  61. data/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt +26 -0
  62. data/lib/generators/react_on_rails/templates/base/base/lib/tasks/linters.rake.tt +88 -0
  63. data/lib/generators/react_on_rails/templates/base/base/package.json +31 -0
  64. data/lib/generators/react_on_rails/templates/base/server_rendering/client/app/bundles/HelloWorld/startup/serverRegistration.jsx +4 -0
  65. data/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js +39 -0
  66. data/lib/generators/react_on_rails/templates/bootstrap/app/assets/stylesheets/_bootstrap-custom.scss +63 -0
  67. data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_post-bootstrap.scss +10 -0
  68. data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_pre-bootstrap.scss +8 -0
  69. data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_react-on-rails-sass-helper.scss +19 -0
  70. data/lib/generators/react_on_rails/templates/bootstrap/client/bootstrap-sass.config.js +89 -0
  71. data/lib/generators/react_on_rails/templates/dev_tests/.rspec +2 -0
  72. data/lib/generators/react_on_rails/templates/dev_tests/spec/features/hello_world_spec.rb +25 -0
  73. data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +57 -0
  74. data/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +21 -0
  75. data/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb +95 -0
  76. data/lib/generators/react_on_rails/templates/heroku_deployment/.buildpacks +2 -0
  77. data/lib/generators/react_on_rails/templates/heroku_deployment/Procfile +1 -0
  78. data/lib/generators/react_on_rails/templates/heroku_deployment/config/puma.rb +15 -0
  79. data/lib/generators/react_on_rails/templates/js_linters/client/.eslintignore +1 -0
  80. data/lib/generators/react_on_rails/templates/js_linters/client/.eslintrc +48 -0
  81. data/lib/generators/react_on_rails/templates/js_linters/client/.jscsrc +18 -0
  82. data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +39 -0
  83. data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +33 -0
  84. data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +8 -0
  85. data/lib/generators/react_on_rails/templates/no_redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +8 -0
  86. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/actions/helloWorldActionCreators.jsx +8 -0
  87. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +48 -0
  88. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/constants/helloWorldConstants.jsx +8 -0
  89. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +43 -0
  90. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/helloWorldReducer.jsx +19 -0
  91. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/index.jsx +14 -0
  92. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +19 -0
  93. data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/store/helloWorldStore.jsx +35 -0
  94. data/lib/generators/react_on_rails/templates/redux/base/client/app/lib/middlewares/loggerMiddleware.js +20 -0
  95. data/lib/generators/react_on_rails/templates/redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +19 -0
  96. data/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml +26 -0
  97. data/lib/generators/react_on_rails/templates/ruby_linters/.scss-lint.yml +205 -0
  98. data/lib/generators/react_on_rails/templates/ruby_linters/lib/tasks/brakeman.rake +17 -0
  99. data/lib/generators/react_on_rails/templates/ruby_linters/lib/tasks/ci.rake +33 -0
  100. data/lib/generators/react_on_rails/templates/ruby_linters/ruby-lint.yml +20 -0
  101. data/lib/react_on_rails.rb +6 -0
  102. data/lib/react_on_rails/configuration.rb +60 -0
  103. data/lib/react_on_rails/engine.rb +7 -0
  104. data/lib/react_on_rails/prerender_error.rb +31 -0
  105. data/lib/react_on_rails/server_rendering_pool.rb +110 -0
  106. data/lib/react_on_rails/version.rb +3 -0
  107. data/package.json +76 -0
  108. data/rakelib/docker.rake +33 -0
  109. data/rakelib/dummy_apps.rake +20 -0
  110. data/rakelib/example_type.rb +160 -0
  111. data/rakelib/examples.rake +103 -0
  112. data/rakelib/examples_config.yml +19 -0
  113. data/rakelib/lint.rake +37 -0
  114. data/rakelib/node_package.rake +11 -0
  115. data/rakelib/run_rspec.rake +65 -0
  116. data/rakelib/task_helpers.rb +44 -0
  117. data/react_on_rails.gemspec +31 -0
  118. data/ruby-lint.yml +24 -0
  119. metadata +119 -2
@@ -0,0 +1,50 @@
1
+ module GeneratorHelper
2
+ # Takes a relative path from the destination root, such as `.gitignore` or `app/assets/javascripts/application.js`
3
+ def dest_file_exists?(file)
4
+ dest_file = File.join(destination_root, file)
5
+ File.exist?(dest_file) ? dest_file : nil
6
+ end
7
+
8
+ def dest_dir_exists?(dir)
9
+ dest_dir = File.join(destination_root, dir)
10
+ Dir.exist?(dest_dir) ? dest_dir : nil
11
+ end
12
+
13
+ # Takes the missing file and the
14
+ def puts_setup_file_error(file, data)
15
+ puts "** #{file} was not found."
16
+ puts "Please add the following content to your #{file} file:"
17
+ puts "\n#{data}\n"
18
+ end
19
+
20
+ def empty_directory_with_keep_file(destination, config = {})
21
+ empty_directory(destination, config)
22
+ keep_file(destination)
23
+ end
24
+
25
+ def keep_file(destination)
26
+ create_file("#{destination}/.keep") unless options[:skip_keeps]
27
+ end
28
+
29
+ # As opposed to Rails::Generators::Testing.create_link, which creates a link pointing to
30
+ # source_root, this symlinks a file in destination_root to a file also in
31
+ # destination_root.
32
+ def symlink_dest_file_to_dest_file(target, link)
33
+ target_pathname = Pathname.new(File.join(destination_root, target))
34
+ link_pathname = Pathname.new(File.join(destination_root, link))
35
+
36
+ link_directory = link_pathname.dirname
37
+ link_basename = link_pathname.basename
38
+ target_relative_path = target_pathname.relative_path_from(link_directory)
39
+
40
+ `cd #{link_directory} && ln -s #{target_relative_path} #{link_basename}`
41
+ end
42
+
43
+ def copy_file_and_missing_parent_directories(source_file, destination_file = nil)
44
+ destination_file = source_file unless destination_file
45
+ destination_path = Pathname.new(destination_file)
46
+ parent_directories = destination_path.dirname
47
+ empty_directory(parent_directories) unless dest_dir_exists?(parent_directories)
48
+ copy_file source_file, destination_file
49
+ end
50
+ end
@@ -0,0 +1,30 @@
1
+ require "rails/generators"
2
+ require File.expand_path("../generator_helper", __FILE__)
3
+ include GeneratorHelper
4
+
5
+ module ReactOnRails
6
+ module Generators
7
+ class HerokuDeploymentGenerator < Rails::Generators::Base
8
+ hide!
9
+ source_root(File.expand_path("../templates", __FILE__))
10
+
11
+ def copy_heroku_deployment_files
12
+ base_path = "heroku_deployment"
13
+ %w(.buildpacks
14
+ Procfile
15
+ config/puma.rb).each { |file| copy_file("#{base_path}/#{file}", file) }
16
+ end
17
+
18
+ def add_heroku_production_gems
19
+ gem_text = <<-GEMS.strip_heredoc
20
+
21
+ # For Heroku deployment
22
+ gem 'rails_12factor', group: :production
23
+ gem 'puma', group: :production
24
+
25
+ GEMS
26
+ append_to_file("Gemfile", gem_text)
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,99 @@
1
+ require "rails/generators"
2
+
3
+ module ReactOnRails
4
+ module Generators
5
+ class InstallGenerator < Rails::Generators::Base
6
+ # fetch USAGE file for details generator description
7
+ source_root(File.expand_path("../", __FILE__))
8
+
9
+ # --redux
10
+ class_option :redux,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: "Install Redux gems and Redux version of Hello World Example. Default: false",
14
+ aliases: "-R"
15
+ # --server-rendering
16
+ class_option :server_rendering,
17
+ type: :boolean,
18
+ default: false,
19
+ desc: "Add necessary files and configurations for server-side rendering. Default: false",
20
+ aliases: "-S"
21
+ # --skip-js-linters
22
+ class_option :skip_js_linters,
23
+ type: :boolean,
24
+ default: false,
25
+ desc: "Skip installing JavaScript linting files. Default: false",
26
+ aliases: "-j"
27
+ # --ruby-linters
28
+ class_option :ruby_linters,
29
+ type: :boolean,
30
+ default: false,
31
+ desc: "Install ruby linting files, tasks, and configs. Default: false",
32
+ aliases: "-L"
33
+ # --ruby-linters
34
+ class_option :heroku_deployment,
35
+ type: :boolean,
36
+ default: false,
37
+ desc: "Install files necessary for deploying to Heroku. Default: false",
38
+ aliases: "-H"
39
+ # --skip-bootstrap
40
+ class_option :skip_bootstrap,
41
+ type: :boolean,
42
+ default: false,
43
+ desc: "Skip integrating Bootstrap and don't initialize files and regarding configs. Default: false",
44
+ aliases: "-b"
45
+
46
+ def run_generators
47
+ return unless installation_prerequisites_met?
48
+ warn_if_nvm_is_not_installed
49
+ invoke_generators
50
+ end
51
+
52
+ private
53
+
54
+ def invoke_generators # rubocop:disable Metrics/CyclomaticComplexity
55
+ invoke "react_on_rails:base"
56
+ invoke "react_on_rails:react_no_redux" unless options.redux?
57
+ invoke "react_on_rails:react_with_redux" if options.redux?
58
+ invoke "react_on_rails:js_linters" unless options.skip_js_linters?
59
+ invoke "react_on_rails:ruby_linters" if options.ruby_linters?
60
+ invoke "react_on_rails:heroku_deployment" if options.heroku_deployment?
61
+ invoke "react_on_rails:bootstrap" unless options.skip_bootstrap?
62
+ end
63
+
64
+ # NOTE: other requirements for existing files such as .gitignore or application.
65
+ # js(.coffee) are not checked by this method, but instead produce warning messages
66
+ # and allow the build to continue
67
+ def installation_prerequisites_met?
68
+ !(missing_node? || missing_npm? || uncommitted_changes?)
69
+ end
70
+
71
+ def missing_npm?
72
+ return false unless `which npm`.blank?
73
+ error = "** npm is required. Please install it before continuing."
74
+ error << "https://www.npmjs.com/"
75
+ puts error
76
+ end
77
+
78
+ def missing_node?
79
+ return false unless `which node`.blank?
80
+ error = "** nodejs is required. Please install it before continuing."
81
+ error << "https://nodejs.org/en/"
82
+ puts error
83
+ end
84
+
85
+ def uncommitted_changes?
86
+ return false if ENV["COVERAGE"]
87
+ status = `git status`
88
+ return false if status.include?("nothing to commit, working directory clean")
89
+ error = "** You have uncommitted code. Please commit or stash your changes before continuing"
90
+ puts error
91
+ end
92
+
93
+ def warn_if_nvm_is_not_installed
94
+ return true unless `which nvm`.blank?
95
+ puts "** nvm is advised. Please consider installing it. https://github.com/creationix/nvm"
96
+ end
97
+ end
98
+ end
99
+ end
@@ -0,0 +1,19 @@
1
+ require "rails/generators"
2
+
3
+ module ReactOnRails
4
+ module Generators
5
+ class JsLintersGenerator < Rails::Generators::Base
6
+ hide!
7
+ source_root File.expand_path("../templates", __FILE__)
8
+
9
+ # NOTE: linter modules are included via template in base/base/client/package.json.tt
10
+
11
+ def copy_js_linter_config_files
12
+ base_path = "js_linters/"
13
+ %w(client/.eslintrc
14
+ client/.eslintignore
15
+ client/.jscsrc).each { |file| copy_file(base_path + file, file) }
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,40 @@
1
+ require "rails/generators"
2
+ require File.expand_path("../generator_helper", __FILE__)
3
+ include GeneratorHelper
4
+
5
+ module ReactOnRails
6
+ module Generators
7
+ class ReactNoReduxGenerator < Rails::Generators::Base
8
+ hide!
9
+ source_root(File.expand_path("../templates", __FILE__))
10
+
11
+ # --server-rendering
12
+ class_option :server_rendering,
13
+ type: :boolean,
14
+ default: false,
15
+ desc: "Configure for server-side rendering of webpack JavaScript",
16
+ aliases: "-S"
17
+
18
+ def copy_base_files
19
+ base_path = "no_redux/base/"
20
+ %w(client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx
21
+ client/app/bundles/HelloWorld/containers/HelloWorld.jsx).each do |file|
22
+ copy_file(base_path + file, file)
23
+ end
24
+ end
25
+
26
+ def copy_server_rendering_files_if_appropriate
27
+ return unless options.server_rendering?
28
+ base_path = "no_redux/server_rendering/"
29
+ file = "client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx"
30
+ copy_file(base_path + file, file)
31
+ end
32
+
33
+ def template_appropriate_version_of_hello_world_app_client
34
+ filename = "HelloWorldAppClient.jsx"
35
+ location = "client/app/bundles/HelloWorld/startup"
36
+ template("no_redux/base/#{location}/HelloWorldAppClient.jsx.tt", "#{location}/#{filename}")
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,51 @@
1
+ require "rails/generators"
2
+
3
+ module ReactOnRails
4
+ module Generators
5
+ class ReactWithReduxGenerator < Rails::Generators::Base
6
+ hide!
7
+ source_root(File.expand_path("../templates", __FILE__))
8
+
9
+ # --server-rendering
10
+ class_option :server_rendering,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: "Configure for server-side rendering of webpack JavaScript",
14
+ aliases: "-S"
15
+
16
+ def create_redux_directories
17
+ dirs = %w(actions constants reducers store)
18
+ dirs.each { |name| empty_directory("client/app/bundles/HelloWorld/#{name}") }
19
+
20
+ empty_directory("client/app/lib/middlewares")
21
+ end
22
+
23
+ def copy_base_redux_files
24
+ base_path = "redux/base/"
25
+ %w(client/app/bundles/HelloWorld/actions/helloWorldActionCreators.jsx
26
+ client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx
27
+ client/app/bundles/HelloWorld/containers/HelloWorld.jsx
28
+ client/app/bundles/HelloWorld/constants/helloWorldConstants.jsx
29
+ client/app/bundles/HelloWorld/reducers/helloWorldReducer.jsx
30
+ client/app/bundles/HelloWorld/reducers/index.jsx
31
+ client/app/bundles/HelloWorld/store/helloWorldStore.jsx
32
+ client/app/lib/middlewares/loggerMiddleware.js).each do |file|
33
+ copy_file(base_path + file, file)
34
+ end
35
+ end
36
+
37
+ def copy_server_rendering_redux_files
38
+ return unless options.server_rendering?
39
+ base_path = "redux/server_rendering/"
40
+ file = "client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx"
41
+ copy_file(base_path + file, file)
42
+ end
43
+
44
+ def template_appropriate_version_of_hello_world_app_client
45
+ filename = "HelloWorldAppClient.jsx"
46
+ location = "client/app/bundles/HelloWorld/startup"
47
+ template("redux/base/#{location}/HelloWorldAppClient.jsx.tt", "#{location}/#{filename}")
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,33 @@
1
+ require "rails/generators"
2
+
3
+ module ReactOnRails
4
+ module Generators
5
+ class RubyLintersGenerator < Rails::Generators::Base
6
+ hide!
7
+ source_root File.expand_path("../templates", __FILE__)
8
+
9
+ def add_ruby_linter_gems_to_gemfile
10
+ linter_gems = <<-GEMS.strip_heredoc
11
+
12
+ # require: false is necessary for the linters as we only want them loaded
13
+ # when used by the linting rake tasks.
14
+ group :development do
15
+ gem("rubocop", require: false)
16
+ gem("ruby-lint", require: false)
17
+ gem("scss_lint", require: false)
18
+ end
19
+ GEMS
20
+ append_to_file("Gemfile", linter_gems)
21
+ end
22
+
23
+ def copy_ruby_linting_and_auditing_tasks
24
+ base_path = "ruby_linters/"
25
+ %w(lib/tasks/brakeman.rake
26
+ lib/tasks/ci.rake
27
+ .rubocop.yml
28
+ .scss-lint.yml
29
+ ruby-lint.yml).each { |file| copy_file(base_path + file, file) }
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,4 @@
1
+ web: rails s
2
+ hot: sh -c 'cd client && npm start'
3
+ client: sh -c 'rm app/assets/javascripts/generated/* || true && cd client && npm run build:dev:client'
4
+ <%- if options.server_rendering? %>server: sh -c 'cd client && npm run build:dev:server'<%- end %>
@@ -0,0 +1,16 @@
1
+ The `react_on_rails` gem has been installed. You can view the documentation online at
2
+ [React on Rails](https://github.com/shakacode/react_on_rails).
3
+
4
+ Also, check out the [example application](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/client/server.js)
5
+ for a live example and code.
6
+
7
+ The "Hello World" example has been installed.
8
+
9
+ + The view is located at `app/views/hello_world/index.html.erb`
10
+ + The controller is located at `app/controllers/hello_world_controller.rb`
11
+
12
+ See [the documentation](https://github.com/shakacode/react_on_rails) for how to build your bundles and
13
+ install your packages. Then you can view the example as follows:
14
+
15
+ - Rails Server: [localhost:3000/hello_world](http://localhost:3000/hello_world)
16
+ - Webpack Development Server with HMR: [localhost:4000/hello_world](http://localhost:4000/hello_world)
@@ -0,0 +1,5 @@
1
+ class HelloWorldController < ApplicationController
2
+ def index
3
+ @hello_world_props = { name: "Stranger" }
4
+ end
5
+ end
@@ -0,0 +1,4 @@
1
+ <h1 class="alert alert-info this-works"><%= options.server_rendering? ? "Server Rendering" : "Client Rendering" %></h1>
2
+ <%%= react_component("HelloWorldApp",
3
+ @hello_world_props,
4
+ prerender: <%= options.server_rendering? %>) %>
@@ -0,0 +1,3 @@
1
+ {
2
+ "presets": ["es2015", "stage-0", "react"]
3
+ }
@@ -0,0 +1,3 @@
1
+ Client folder generated by React on Rails gem.
2
+
3
+ See documentation [on github](https://github.com/shakacode/react_on_rails) for details on how it is organized.
@@ -0,0 +1,5 @@
1
+ import ReactOnRails from 'react-on-rails';
2
+ import HelloWorldApp from './HelloWorldAppClient';
3
+
4
+ // This is how react_on_rails can see the HelloWorldApp in the browser.
5
+ ReactOnRails.register({ HelloWorldApp });
@@ -0,0 +1,15 @@
1
+ doctype html
2
+ html
3
+
4
+ head
5
+ title Hello, React
6
+
7
+ body
8
+
9
+ h1.alert.alert-info.this-works webpack dev server (with HMR)
10
+ #app
11
+
12
+ script(src="vendor-bundle.js")
13
+ script(src="app-bundle.js")
14
+ script.
15
+ ReactOnRails.render("HelloWorldApp", {name: "Stranger"}, 'app');
@@ -0,0 +1,104 @@
1
+ <%- require 'react_on_rails/version' -%>
2
+ {
3
+ "name": "react-webpack-rails-tutorial",
4
+ "version": "1.1.0",
5
+ "description": "Built using the react_on_rails generator.",
6
+ "main": "server.js",
7
+ "engines": {
8
+ "node": "5.0.0",
9
+ "npm": "3.5.0"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "https://github.com/shakacode/react-webpack-rails-tutorial.git"
14
+ },
15
+ "keywords": [
16
+ "react",
17
+ "tutorial",
18
+ "comment",
19
+ "example"
20
+ ],
21
+ "author": "justin808",
22
+ "license": "MIT",
23
+ "bugs": {
24
+ "url": "https://github.com/shakacode/react-webpack-rails-tutorial/issues"
25
+ },
26
+ "homepage": "https://github.com/shakacode/react-webpack-rails-tutorial",
27
+ "scripts": {
28
+ "test": "echo \"Error: no test specified\" && exit 1",
29
+ "start": "node server.js",
30
+ "build:client": "NODE_ENV=production webpack --config webpack.client.rails.config.js",
31
+ "build:server": "NODE_ENV=production webpack --config webpack.server.rails.config.js",
32
+ "build:dev:client": "webpack -w --config webpack.client.rails.config.js",
33
+ "build:dev:server": "webpack -w --config webpack.server.rails.config.js"<% unless options.skip_js_linters? -%>,
34
+ "lint": "npm run eslint && npm run jscs",
35
+ "eslint": "eslint --ext .js,.jsx .",
36
+ "jscs": "jscs --verbose ."
37
+ <%- end -%>
38
+ },
39
+ "dependencies": {
40
+ "babel": "^6.3.26",
41
+ "babel-cli": "^6.3.17",
42
+ "babel-core": "^6.3.26",
43
+ "babel-loader": "^6.2.0",
44
+ "babel-plugin-syntax-decorators": "^6.3.13",
45
+ "babel-polyfill": "^6.3.14",
46
+ "babel-preset-es2015": "^6.3.13",
47
+ "babel-preset-react": "^6.3.13",
48
+ "babel-preset-stage-0": "^6.3.13",
49
+ "es5-shim": "^4.4.1",
50
+ "expose-loader": "^0.7.1",
51
+ <%- if options.redux? -%>
52
+ "immutable": "^3.7.5",
53
+ <%- end -%>
54
+ "imports-loader": "^0.6.5",
55
+ "jquery": "^2.1.4",
56
+ "jquery-ujs": "^1.1.0-1",
57
+ "loader-utils": "^0.2.11",
58
+ <%- if options.redux? -%>
59
+ "lodash": "^3.10.1",
60
+ "mirror-creator": "0.0.1",
61
+ <%- end -%>
62
+ "react": "^0.14.3",
63
+ <%- unless options.skip_bootstrap? -%>
64
+ "react-bootstrap": "^0.28.1",
65
+ <%- end -%>
66
+ "react-dom": "^0.14.3",
67
+ "react-on-rails": "<%= x = ReactOnRails::VERSION.match(/(\d+\.\d+\.\d+)[.\-](.*)/); "#{x[1]}-#{x[2]}" %>",
68
+ <%- if options.redux? -%>
69
+ "react-redux": "^4.0.5",
70
+ "redux": "^3.0.5",
71
+ "redux-promise": "^0.5.0",
72
+ "redux-thunk": "^1.0.2",
73
+ <%- end -%>
74
+ "webpack": "^1.12.8"
75
+ },
76
+ "devDependencies": {
77
+ <%- unless options.skip_js_linters? -%>
78
+ "babel-eslint": "^5.0.0-beta6",
79
+ <%- end -%>
80
+ "babel-plugin-react-transform": "^2.0.0",
81
+ <%- unless options.skip_bootstrap? -%>
82
+ "bootstrap-sass": "^3.3.5",
83
+ "bootstrap-sass-loader": "^1.0.9",
84
+ <%- end -%>
85
+ "css-loader": "^0.23.0",
86
+ <%- unless options.skip_js_linters? -%>
87
+ "eslint": "^1.10.3",
88
+ "eslint-config-airbnb": "^2.0.0",
89
+ "eslint-plugin-react": "^3.11.3",
90
+ <%- end -%>
91
+ "express": "^4.13.3",
92
+ "file-loader": "^0.8.4",
93
+ "jade": "^1.11.0",
94
+ <%- unless options.skip_js_linters? -%>
95
+ "jscs": "^2.7.0",
96
+ <%- end -%>
97
+ "node-sass": "^3.4.2",
98
+ "react-transform-hmr": "^1.0.1",
99
+ "sass-loader": "^3.1.1",
100
+ "style-loader": "^0.13.0",
101
+ "url-loader": "^0.5.6",
102
+ "webpack-dev-server": "^1.12.1"
103
+ }
104
+ }