react_on_rails 8.0.0.beta.2 → 8.0.0.beta.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -1
  3. data/Gemfile +15 -5
  4. data/KUDOS.md +12 -4
  5. data/PROJECTS.md +1 -0
  6. data/README.md +4 -3
  7. data/app/helpers/react_on_rails_helper.rb +15 -18
  8. data/docs/additional-reading/heroku-deployment.md +0 -1
  9. data/docs/additional-reading/images.md +46 -23
  10. data/docs/additional-reading/server-rendering-tips.md +3 -3
  11. data/docs/tutorial.md +12 -11
  12. data/lib/generators/react_on_rails/base_generator.rb +60 -3
  13. data/lib/generators/react_on_rails/dev_tests_generator.rb +14 -3
  14. data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +1 -1
  15. data/lib/generators/react_on_rails/templates/base/base/app/views/layouts/hello_world.html.erb.tt +1 -1
  16. data/lib/generators/react_on_rails/templates/base/base/client/package.json.tt +1 -6
  17. data/lib/generators/react_on_rails/templates/base/base/client/webpack.config.js +27 -19
  18. data/lib/generators/react_on_rails/templates/base/base/config/webpacker_lite.yml +27 -0
  19. data/lib/generators/react_on_rails/templates/base/base/package.json.tt +3 -9
  20. data/lib/react_on_rails/engine.rb +2 -0
  21. data/lib/react_on_rails/server_rendering_pool/exec.rb +27 -28
  22. data/lib/react_on_rails/test_helper.rb +1 -2
  23. data/lib/react_on_rails/test_helper/ensure_assets_compiled.rb +2 -2
  24. data/lib/react_on_rails/test_helper/webpack_assets_status_checker.rb +7 -2
  25. data/lib/react_on_rails/utils.rb +20 -3
  26. data/lib/react_on_rails/version.rb +1 -1
  27. data/package.json +1 -1
  28. data/rakelib/dummy_apps.rake +1 -1
  29. data/rakelib/examples.rake +1 -1
  30. data/rakelib/lint.rake +1 -1
  31. data/rakelib/release.rake +2 -2
  32. data/rakelib/run_rspec.rake +11 -14
  33. data/react_on_rails.gemspec +6 -5
  34. data/webpackConfigLoader.js +84 -15
  35. metadata +3 -4
  36. data/lib/generators/react_on_rails/templates/base/base/config/webpack/development.server.yml +0 -9
  37. data/lib/generators/react_on_rails/templates/base/base/config/webpack/paths.yml +0 -17
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 18f4e023c45073712f8efae77877dd57bf843ff7
4
- data.tar.gz: 5c5accb68c77ec94cb11ac51544cb44d25934b02
3
+ metadata.gz: 8ac36fba9ba57940b308785f01d5a5033f0494cb
4
+ data.tar.gz: 05b6edf7d7a0f99b493d3a115479cd76ba4d6780
5
5
  SHA512:
6
- metadata.gz: fe80f430794068964be7d9ffd63038358746a509306395ad2c8033237a682099f33ec3717b603f3f23a56cdf813db0fc7d8ea35a21c2a405e67cdd3f509c6158
7
- data.tar.gz: e7e128a3fc33a0f3c3f190fb4c67763d8ec60de45741f3c14f4d6cef5daa3d4ee9c2b85b96b2a35b0f38e7a3ee7744b049e21272494e4ef4334e57b1e4ae6ad5
6
+ metadata.gz: 190817a80ba2194d7bca71ef73f53d9d241bb442cd3e26c001301bf92790a3a50abe83155cbc78b6e649e0a76a39b8501a9c049805ce67db9c657ca4a7e88b17
7
+ data.tar.gz: 6b3cf199fb90fac4d9484c20774e10e52e2ea76c2702b2e269e569d5bd19ef92064fe94baf40055cbdd89a1a18a7bec5b01f99dc8efde03984f7ff9151b8653e
@@ -6,6 +6,14 @@ Contributors: please follow the recommendations outlined at [keepachangelog.com]
6
6
  ## [Unreleased]
7
7
  *Please add entries here for your pull requests.*
8
8
 
9
+ ## Changed
10
+ - Logging no longer occurs when trace is turned to false. [#845](https://github.com/shakacode/react_on_rails/pull/845) by [conturbo](https://github.com/Conturbo)
11
+
12
+ ## [8.0.0-beta.2] - 2017-05-08
13
+
14
+ ### Changed
15
+ Removed unnecessary values in default paths.yml files for generators. [#834](https://github.com/shakacode/react_on_rails/pull/834) by [justin808](https://github.com/justin808).
16
+
9
17
  ## [8.0.0-beta.1] - 2017-05-03
10
18
 
11
19
  ### Added
@@ -575,7 +583,8 @@ Best done with Object destructing:
575
583
  ##### Fixed
576
584
  - Fix several generator related issues.
577
585
 
578
- [Unreleased]: https://github.com/shakacode/react_on_rails/compare/8.0.0-beta.1...master
586
+ [Unreleased]: https://github.com/shakacode/react_on_rails/compare/8.0.0-beta.2...master
587
+ [8.0.0-beta.2]: https://github.com/shakacode/react_on_rails/compare/8.0.0-beta.1...8.0.0-beta.2
579
588
  [8.0.0-beta.1]: https://github.com/shakacode/react_on_rails/compare/7.0.4...8.0.0-beta.1
580
589
  [7.0.4]: https://github.com/shakacode/react_on_rails/compare/7.0.3...7.0.4
581
590
  [7.0.3]: https://github.com/shakacode/react_on_rails/compare/7.0.1...7.0.3
data/Gemfile CHANGED
@@ -8,11 +8,11 @@ gemspec
8
8
  # bundle install from a single Gemfile. Therefore, all gems that we will need for any dummy/example
9
9
  # app have to be manually added to this file.
10
10
  gem "bootstrap-sass"
11
- gem "coffee-rails", "~> 4.1.0"
12
11
  gem "jbuilder", "~> 2.0"
13
12
  gem "jquery-rails"
13
+ gem "mini_racer"
14
14
  gem "puma"
15
- gem "rails", "4.2.8"
15
+ gem "rails", "5.1.1"
16
16
  gem "rails_12factor"
17
17
  gem "rubocop", "0.47.1", require: false
18
18
  gem "ruby-lint", require: false
@@ -21,7 +21,6 @@ gem "scss_lint", require: false
21
21
  gem "sdoc", "~> 0.4.0", group: :doc
22
22
  gem "spring"
23
23
  gem "sqlite3"
24
- gem "mini_racer"
25
24
  if ENV["ENABLE_TURBOLINKS_2"].nil? || ENV["ENABLE_TURBOLINKS_2"].strip.empty?
26
25
  gem "turbolinks", "~> 5.0"
27
26
  else
@@ -31,13 +30,24 @@ gem "uglifier", ">= 2.7.2"
31
30
  gem "web-console", "~> 2.0", group: :development
32
31
 
33
32
  # below are copied from spec/dummy/Gemfile
34
- gem "rspec-rails"
35
- gem "rspec-retry"
36
33
  gem "capybara"
37
34
  gem "capybara-screenshot"
35
+ gem "rspec-rails"
36
+ gem "rspec-retry"
38
37
  # Trouble installing on Sierra
39
38
  # gem "capybara-webkit"
40
39
  gem "chromedriver-helper"
41
40
  gem "launchy"
42
41
  gem "poltergeist"
43
42
  gem "selenium-webdriver"
43
+ gem "webpacker_lite"
44
+
45
+ ################################################################################
46
+ # Favorite debugging gems
47
+ gem "pry"
48
+ gem "pry-byebug"
49
+ gem "pry-doc"
50
+ gem "pry-rails"
51
+ gem "pry-rescue"
52
+ gem "pry-stack_explorer"
53
+ ################################################################################
data/KUDOS.md CHANGED
@@ -2,17 +2,24 @@ This is a sibling file to [PROJECTS.md](./PROJECTS.md).
2
2
 
3
3
  I'm looking for quotes on why you like using React on Rails. You might mention any benefits you particularly like and if you've migrated from react-rails. Just click to edit and github will automatically open up a PR. Thanks to everybody that contributes!
4
4
 
5
- ## April 6, 2017 on Medium
6
- [Adding react to your node app](https://medium.com/@Tswaynee/adding-react-to-your-node-app-8707c5464b3)
5
+ ### May 6, 2017
6
+ By Email
7
+
8
+ ![image](https://cloud.githubusercontent.com/assets/1118459/25869348/b1bd27ce-349b-11e7-912c-11d05ab2bf4d.png)
9
+
10
+ ### April 6, 2017
11
+ Tyler Swayne on Medium: [Adding react to your node app](https://medium.com/@Tswaynee/adding-react-to-your-node-app-8707c5464b3)
7
12
 
8
13
  ![2017-04-06_16-11-51](https://cloud.githubusercontent.com/assets/1118459/24786595/75bb2b9c-1afe-11e7-8051-8c9046c4e007.png)
9
14
 
10
15
  ### March 23, 2017
11
16
  Github issue [#766](https://github.com/shakacode/react_on_rails/issues/766).
17
+
12
18
  ![2017-03-23_17-43-17](https://cloud.githubusercontent.com/assets/1118459/24279884/badab166-0ff0-11e7-87ab-94253f55a3d9.png)
13
19
 
14
- ## March 21, 2017
20
+ ### March 21, 2017
15
21
  Twitter from [@rfc2616](https://twitter.com/rfc2616)
22
+
16
23
  ![2017-03-24_20-20-20](https://cloud.githubusercontent.com/assets/1118459/24319983/7adfd57a-10cf-11e7-9a50-5c23d5d5bcab.png)
17
24
 
18
25
  ### March 2, 2017
@@ -38,7 +45,8 @@ Twitter from [@rfc2616](https://twitter.com/rfc2616)
38
45
  https://github.com/shakacode/react_on_rails/pull/591#issuecomment-258685925
39
46
  ![2016-11-15_08-36-29](https://cloud.githubusercontent.com/assets/1118459/20318599/ec4882b0-ab0e-11e6-83e2-7f398e2cdf5b.png)
40
47
 
41
- ### October 29, 2016 by Email
48
+ ### October 29, 2016
49
+ by Email
42
50
  ![2016-10-29_17-10-25](https://cloud.githubusercontent.com/assets/1118459/20163712/72307a82-a6b3-11e6-9c46-aee526192b23.png)
43
51
 
44
52
  ### September 11, 2016
@@ -41,3 +41,4 @@
41
41
  * [github.com/Limenius/symfony-react-sandbox](https://github.com/Limenius/symfony-react-sandbox)
42
42
  * [github.com/tswayne/react-helper](https://github.com/tswayne/react-helper)
43
43
  * [github.com/KissKissBankBank/kitten](https://github.com/KissKissBankBank/kitten)
44
+ * [github.com/sharetribe/sharetribe](https://github.com/sharetribe/sharetribe): Open source marketplace platform.
data/README.md CHANGED
@@ -1,7 +1,8 @@
1
1
  [![Build Status](https://travis-ci.org/shakacode/react_on_rails.svg?branch=master)](https://travis-ci.org/shakacode/react_on_rails) [![Codeship Status for shakacode/react_on_rails](https://app.codeship.com/projects/cec6c040-971f-0134-488f-0a5146246bd8/status?branch=master)](https://app.codeship.com/projects/187011) [![Dependency Status](https://gemnasium.com/shakacode/react_on_rails.svg)](https://gemnasium.com/shakacode/react_on_rails) [![Gem Version](https://badge.fury.io/rb/react_on_rails.svg)](https://badge.fury.io/rb/react_on_rails) [![npm version](https://badge.fury.io/js/react-on-rails.svg)](https://badge.fury.io/js/react-on-rails) [![Code Climate](https://codeclimate.com/github/shakacode/react_on_rails/badges/gpa.svg)](https://codeclimate.com/github/shakacode/react_on_rails) [![Coverage Status](https://coveralls.io/repos/shakacode/react_on_rails/badge.svg?branch=master&service=github)](https://coveralls.io/github/shakacode/react_on_rails?branch=master)
2
2
 
3
- #### The Docs here on `master` refer to 8.0.0-beta.1 including support for Webpacker! 7.0.4 docs are [here](https://github.com/shakacode/react_on_rails/tree/7.0.4).
4
- **[VERSION 8.0.0-beta.1](https://rubygems.org/gems/react_on_rails/versions/8.0.0.beta.1)** has shipped with [webpacker_lite](https://github.com/shakacode/webpacker_lite) support! Please try [the 8.0.0-beta.1 beta](https://rubygems.org/gems/react_on_rails/versions/8.0.0.beta.1) and please report issues!
3
+ #### The Docs here on `master` refer to 8.0.0-beta.2 including support for Webpacker! 7.0.4 docs are [here](https://github.com/shakacode/react_on_rails/tree/7.0.4).
4
+ * **[VERSION 8.0.0-beta.2](https://rubygems.org/gems/react_on_rails/versions/8.0.0.beta.2)** has shipped with [webpacker_lite](https://github.com/shakacode/webpacker_lite) support! Please try [the 8.0.0-beta.2 beta](https://rubygems.org/gems/react_on_rails/versions/8.0.0.beta.2) and please report issues!
5
+ * Why did we fork webpacker to make webpacker_lite? Please provide feedback on my draft article: [Webpacker Lite: Why Did We Fork Webpacker?](https://medium.com/@railsonmaui/webpacker-lite-why-did-we-fork-webpacker-ee3305688d66)
5
6
 
6
7
  **For a complete example of this gem, see our live demo at [www.reactrails.com](http://www.reactrails.com). ([Source Code](https://github.com/shakacode/react-webpack-rails-tutorial))**
7
8
 
@@ -15,7 +16,7 @@ Whether you have a new project or need help on an existing project, feel free to
15
16
 
16
17
  Your support keeps this project going!
17
18
 
18
- (Want to become a contributor? [Contact us](mailto:contact@shakacode.com) for a Slack room invite and let us know that you want to contribute.)
19
+ (Want to become a contributor? We're hiring! Want to join a 100% remote-first team? [Contact us](mailto:contact@shakacode.com) for a Slack room invite and let us know that you want to contribute.)
19
20
 
20
21
  # Community
21
22
  Please [Subscribe](https://app.mailerlite.com/webforms/landing/l1d9x5) to keep in touch with Justin Gordon and [ShakaCode](http://www.shakacode.com/). I intend to send a monthly summary including announcements of new releases of React on Rails and of our latest [blog articles](https://blog.shakacode.com) and tutorials. Subscribers will also have access to **exclusive content**, including tips and examples.
@@ -111,7 +111,7 @@ module ReactOnRailsHelper
111
111
  type: "application/json",
112
112
  class: "js-react-on-rails-component",
113
113
  "data-component-name" => options.name,
114
- "data-trace" => options.trace,
114
+ "data-trace" => (options.trace ? true : nil),
115
115
  "data-dom-id" => options.dom_id)
116
116
 
117
117
  # Create the HTML rendering part
@@ -223,10 +223,9 @@ module ReactOnRailsHelper
223
223
  console_log_script = result["consoleLogScript"]
224
224
  raw("#{html}#{replay_console_option(options[:replay_console_option]) ? console_log_script : ''}")
225
225
  rescue ExecJS::ProgramError => err
226
- # rubocop:disable Style/RaiseArgs
227
- raise ReactOnRails::PrerenderError.new(component_name: "N/A (server_render_js called)",
228
- err: err,
229
- js_code: wrapper_js)
226
+ raise ReactOnRails::PrerenderError, component_name: "N/A (server_render_js called)",
227
+ err: err,
228
+ js_code: wrapper_js
230
229
  # rubocop:enable Style/RaiseArgs
231
230
  end
232
231
 
@@ -387,24 +386,22 @@ module ReactOnRailsHelper
387
386
 
388
387
  if result["hasErrors"] && raise_on_prerender_error
389
388
  # We caught this exception on our backtrace handler
390
- # rubocop:disable Style/RaiseArgs
391
- raise ReactOnRails::PrerenderError.new(component_name: react_component_name,
392
- # Sanitize as this might be browser logged
393
- props: sanitized_props_string(props),
394
- err: nil,
395
- js_code: wrapper_js,
396
- console_messages: result["consoleReplayScript"])
389
+ raise ReactOnRails::PrerenderError, component_name: react_component_name,
390
+ # Sanitize as this might be browser logged
391
+ props: sanitized_props_string(props),
392
+ err: nil,
393
+ js_code: wrapper_js,
394
+ console_messages: result["consoleReplayScript"]
397
395
  # rubocop:enable Style/RaiseArgs
398
396
  end
399
397
  result
400
398
  rescue ExecJS::ProgramError => err
401
399
  # This error came from execJs
402
- # rubocop:disable Style/RaiseArgs
403
- raise ReactOnRails::PrerenderError.new(component_name: react_component_name,
404
- # Sanitize as this might be browser logged
405
- props: sanitized_props_string(props),
406
- err: err,
407
- js_code: wrapper_js)
400
+ raise ReactOnRails::PrerenderError, component_name: react_component_name,
401
+ # Sanitize as this might be browser logged
402
+ props: sanitized_props_string(props),
403
+ err: err,
404
+ js_code: wrapper_js
408
405
  # rubocop:enable Style/RaiseArgs
409
406
  end
410
407
 
@@ -31,7 +31,6 @@ By default Heroku will cache the root `node_modules` directory between deploys b
31
31
  "node_modules",
32
32
  "client/node_modules"
33
33
  ],
34
-
35
34
  ```
36
35
 
37
36
  ## How to Deploy
@@ -1,5 +1,44 @@
1
1
  # Images
2
2
 
3
+ 1. leading slash necessary on the
4
+ a. Option name for the file-loader and url-loader (todo reference)
5
+ b. Option publicPath for the output (todo reference)
6
+
7
+
8
+
9
+
10
+
11
+ ```
12
+ const assetLoaderRules = [
13
+ {
14
+ test: /\.(jpe?g|png|gif|ico|woff)$/,
15
+ use: {
16
+ loader: 'url-loader',
17
+ options: {
18
+ limit: urlFileSizeCutover,
19
+ // Leading slash is 100% needed
20
+ name: 'images/[hash].[ext]',
21
+ },
22
+ },
23
+ },
24
+ {
25
+ test: /\.(ttf|eot|svg)$/,
26
+ use: {
27
+ loader: 'file-loader',
28
+ options: {
29
+ // Leading slash is 100% needed
30
+ name: '/images/[hash].[ext]',
31
+ }
32
+ },
33
+ },
34
+ ];
35
+
36
+ ```
37
+
38
+
39
+
40
+
41
+
3
42
  A full example can be found at [spec/dummy/client/app/components/ImageExample/ImageExample.js](../../spec/dummy/client/app/components/ImageExample/ImageExample.js)
4
43
 
5
44
  You are free to use images either in image tags or as background images in SCSS files. You can
@@ -9,27 +48,11 @@ is done with CSS modules.
9
48
  **images** is a defined alias, so "images/foobar.jpg" would point to the file at
10
49
  `/client/app/assets/images/foobar.jpg.`
11
50
 
12
- # Usage as Background Images or for `img` Tags
13
-
14
- Background images for CSS/SCSS need slightly different handling than images used with `img` tags,
15
- and thus we need to configure the webpack loaders slightly differently.
16
-
17
- The example shows you how to put either `bg-` or `bg_` in any file to be used as a background image. A regexp match
18
- will ensure the appropriate version of the url-loader to be used depending on if the image is used
19
- as a background image or within an `img` tag.
20
-
21
- The reason why this is done is that the sass-loader assumes that images will be relative to the
22
- deployed sass file, which will already be `/assets/some-file.css`. Thus, the sass-loader is already
23
- going to prepend `/assets` to all images. The file-loader needs an option to specify that the
24
- public path is `/assets` and that will get prepended to any image path. Consequently, if we didn't
25
- distinguish background images from images for `img` tags, then the background image tags will get
26
- an image path like `/assets/assets/some-file.svg` because the sass-loader thinks the path should be
27
- `/assets/some-file.svg` and that gets added to what the file-loader will be doing.
28
-
29
- We solve this by requiring a naming convention of `bg-` or `bg_` in the image names. Be warned that
30
- the regexp does not check that these three characters are the beginning of a name or path. They can
31
- be anywhere in the string. Of course, you can create your convention.
32
-
33
- You can see this configured: [spec/dummy/client/webpack.common.js](../../spec/dummy/client/webpack.common.js)
51
+ ```
52
+ resolve: {
53
+ alias: {
54
+ images: join(process.cwd(), 'app', 'assets', 'images'),
55
+ },
56
+ },
57
+ ```
34
58
 
35
- _Note, all of this may change when we skip the asset pipeline for processing files in the near future._
@@ -17,15 +17,15 @@ The point is that you have separate files for top level client or server side, a
17
17
  ## Troubleshooting Server Rendering
18
18
 
19
19
  1. First be sure your code works with server rendering disabled (`prerender: false`)
20
- 2. `export TRACE_REACT_ON_RAILS=YES` Turn this on to get both the invocation code for you component, as well as the whole file used to setup the JavaScript context.
20
+ 2. `export TRACE_REACT_ON_RAILS=TRUE` Turn this on to get both the invocation code for you component, as well as the whole file used to setup the JavaScript context.
21
21
 
22
22
  ## setTimeout and setInterval
23
23
 
24
- These methods are polyfilled for server rendering to be no-ops. We don't log calls to these by default as some libraries, namely babel-polyfill, will call setTimout. If you wish to log calls to setTimeout and setInterval, set the ENV value: `export TRACE_REACT_ON_RAILS=YES`.
24
+ These methods are polyfilled for server rendering to be no-ops. We don't log calls to these by default as some libraries, namely babel-polyfill, will call setTimout. If you wish to log calls to setTimeout and setInterval, set the ENV value: `export TRACE_REACT_ON_RAILS=TRUE`.
25
25
 
26
26
  Here's an example of this which shows the line numbers that end up calling setTimeout:
27
27
  ```
28
- ➜ ~/shakacode/react_on_rails/gen-examples/examples/basic-server-rendering (add-rails-helper-to-generator u=) ✗ export TRACE_REACT_ON_RAILS=YES
28
+ ➜ ~/shakacode/react_on_rails/gen-examples/examples/basic-server-rendering (add-rails-helper-to-generator u=) ✗ export TRACE_REACT_ON_RAILS=TRUE
29
29
  ➜ ~/shakacode/react_on_rails/gen-examples/examples/basic-server-rendering (add-rails-helper-to-generator u=) ✗ rspec
30
30
  Hello World
31
31
  Building Webpack client-rendering assets...
@@ -1,14 +1,14 @@
1
1
  # React on Rails Basic Tutorial
2
2
 
3
- This tutorial setups up a new Rails app with **React on Rails**, demonstrating Rails + React + Redux + Server Rendering. It is updated to 6.7.1.
3
+ This tutorial setups up a new Rails app with **React on Rails**, demonstrating Rails + React + Redux + Server Rendering. It is updated to 8.0.0.
4
4
 
5
- After finishing this tutorial you will get application that can do the following (live on Heroku):
5
+ After finishing this tutorial you will get an application that can do the following (live on Heroku):
6
6
 
7
7
  ![example](https://cloud.githubusercontent.com/assets/371302/17368567/111cc722-596b-11e6-9b72-ac5967a60e42.gif)
8
8
 
9
9
  You can find here:
10
- * [Source code for this app in PR, using the --redux option](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/15) and [for Heroku](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/16).
11
- * [Live on Heroku](https://react-on-rails-redux-generator.herokuapp.com/)
10
+ * [Source code for this app in PR, using the --redux option](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/17) and [for Heroku](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/18).
11
+ * [Live on Heroku](https://react-on-rails-redux-gen-8-0-0.herokuapp.com/)
12
12
 
13
13
  By the time you read this, the latest may have changed. Be sure to check the versions here:
14
14
 
@@ -17,9 +17,9 @@ By the time you read this, the latest may have changed. Be sure to check the ver
17
17
 
18
18
  _Note: some of the screen images below show the "npm" command. react_on_rails 6.6.0 and greater uses `yarn`._
19
19
 
20
- ##Setting up the environment
20
+ ## Setting up the environment
21
21
 
22
- Trying out **React on Rails** is super easy, so long as you have the basic prerequisites. This includes the basics for Rails 4.x and node version 6+. I recommend `rvm` and `nvm` to install Ruby and Node, and [brew](https://brew.sh/) to install [yarn](https://yarnpkg.com/en/docs/install#mac-tab). Rails can be installed as ordinary gem.
22
+ Trying out **React on Rails** is super easy, so long as you have the basic prerequisites. This includes the basics for Rails 4.x and node version 6+. I recommend `rvm` and `nvm` to install Ruby and Node, and [brew](https://brew.sh/) to install [yarn](https://yarnpkg.com/en/docs/install#mac-tab). Rails can be installed as an ordinary gem.
23
23
 
24
24
  ```
25
25
  nvm install node # download and install latest stable Node
@@ -98,11 +98,12 @@ web: rails s -p 8080 -b 0.0.0.0
98
98
 
99
99
  Then visit https://your-shared-addr.c9users.io:8080/hello_world
100
100
 
101
+
101
102
  ## RubyMine
102
103
 
103
104
  It's super important to exclude certain directories from RubyMine or else it will slow to a crawl as it tries to parse all the npm files.
104
105
 
105
- * `app/assets/webpack`
106
+ * `public/webpack` (or `app/assets/webpack` on older versions of react_on_rails)
106
107
  * `client/node_modules`
107
108
 
108
109
  ## Deploying to Heroku
@@ -215,10 +216,10 @@ git push heroku master
215
216
  ![10](https://cloud.githubusercontent.com/assets/20628911/17465017/1f38fbaa-5cf4-11e6-8d86-a3d91e3878e0.png)
216
217
 
217
218
  ## Links
218
- These are updated for 6.7.1:
219
+ These are updated for 8.0.0:
219
220
 
220
- * [PR for using the generator with the Redux option](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/15)
221
- * [PR showing the changes to deploy to Heroku](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/16)
222
- * [Live on Heroku](https://hello-react-on-rails.herokuapp.com/)
221
+ * [PR for using the generator with the Redux option](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/17)
222
+ * [PR showing the changes to deploy to Heroku](https://github.com/shakacode/react_on_rails-test-new-redux-generation/pull/18)
223
+ * [Live on Heroku](https://hello-react-on-rails-8-0-0.herokuapp.com/)
223
224
 
224
225
  Feedback is greatly appreciated! As are stars on github! If you want personalized help, don't hesitate to get in touch with us at [contact@shakacode.com](mailto:contact@shakacode.com).
@@ -1,3 +1,5 @@
1
+ # rubocop:disable Metrics/ClassLength
2
+
1
3
  require "rails/generators"
2
4
  require_relative "generator_messages"
3
5
  require_relative "generator_helper"
@@ -45,8 +47,7 @@ module ReactOnRails
45
47
  def copy_base_files
46
48
  base_path = "base/base/"
47
49
  base_files = %w(app/controllers/hello_world_controller.rb
48
- config/webpack/paths.yml
49
- config/webpack/development.server.yml
50
+ config/webpacker_lite.yml
50
51
  client/.babelrc
51
52
  client/webpack.config.js
52
53
  client/REACT_ON_RAILS_CLIENT_README.md)
@@ -58,10 +59,17 @@ module ReactOnRails
58
59
  %w(app/views/layouts/hello_world.html.erb
59
60
  config/initializers/react_on_rails.rb
60
61
  Procfile.dev
61
- package.json
62
62
  client/package.json).each { |file| template("#{base_path}#{file}.tt", file) }
63
63
  end
64
64
 
65
+ def template_package_json
66
+ if dest_file_exists?("package.json")
67
+ add_yarn_postinstall_script_in_package_json
68
+ else
69
+ template("base/base/package.json", "package.json")
70
+ end
71
+ end
72
+
65
73
  def add_base_gems_to_gemfile
66
74
  append_to_file("Gemfile", "\ngem 'mini_racer', platforms: :ruby\ngem 'webpacker_lite'\n")
67
75
  end
@@ -140,6 +148,55 @@ Rails.application.config.assets.paths << Rails.root.join("public", "webpack", Ra
140
148
 
141
149
  private
142
150
 
151
+ def add_yarn_postinstall_script_in_package_json
152
+ client_package_json = File.join(destination_root, "package.json")
153
+ contents = File.read(client_package_json)
154
+ postinstall = %("postinstall": "cd client && yarn install")
155
+ if contents =~ /"scripts" *:/
156
+ replacement = <<-STRING
157
+ "scripts": {
158
+ #{postinstall},
159
+ STRING
160
+ regexp = / {2}"scripts": {/
161
+ else
162
+ regexp = /^{/
163
+ replacement = <<-STRING
164
+ {
165
+ "scripts": {
166
+ #{postinstall}
167
+ },
168
+ STRING
169
+ end
170
+
171
+ contents.gsub!(regexp, replacement)
172
+ File.open(client_package_json, "w+") { |f| f.puts contents }
173
+ end
174
+
175
+ # From https://github.com/rails/rails/blob/4c940b2dbfb457f67c6250b720f63501d74a45fd/railties/lib/rails/generators/rails/app/app_generator.rb
176
+ def app_name
177
+ @app_name ||= (defined_app_const_base? ? defined_app_name : File.basename(destination_root))
178
+ .tr('\\', "").tr(". ", "_")
179
+ end
180
+
181
+ def defined_app_name
182
+ defined_app_const_base.underscore
183
+ end
184
+
185
+ def defined_app_const_base
186
+ Rails.respond_to?(:application) && defined?(Rails::Application) &&
187
+ Rails.application.is_a?(Rails::Application) && Rails.application.class.name.sub(/::Application$/, "")
188
+ end
189
+
190
+ alias defined_app_const_base? defined_app_const_base
191
+
192
+ def app_const_base
193
+ @app_const_base ||= defined_app_const_base || app_name.gsub(/\W/, "_").squeeze("_").camelize
194
+ end
195
+
196
+ def app_const
197
+ @app_const ||= "#{app_const_base}::Application"
198
+ end
199
+
143
200
  def add_configure_rspec_to_compile_assets(helper_file)
144
201
  search_str = "RSpec.configure do |config|"
145
202
  gsub_file(helper_file, search_str, CONFIGURE_RSPEC_TO_COMPILE_ASSETS)
@@ -47,13 +47,11 @@ module ReactOnRails
47
47
 
48
48
  def add_test_related_gems_to_gemfile
49
49
  gem("rspec-rails", group: :test)
50
- gem("capybara", group: :test)
51
- gem("selenium-webdriver", group: :test)
52
50
  gem("coveralls", require: false)
53
51
  gem("poltergeist")
54
52
  end
55
53
 
56
- def gsub_prerender_if_server_rendering
54
+ def replace_prerender_if_server_rendering
57
55
  return unless options.example_server_rendering
58
56
  hello_world_index = File.join(destination_root, "app", "views", "hello_world", "index.html.erb")
59
57
  hello_world_contents = File.read(hello_world_index)
@@ -62,6 +60,19 @@ module ReactOnRails
62
60
 
63
61
  File.open(hello_world_index, "w+") { |f| f.puts new_hello_world_contents }
64
62
  end
63
+
64
+ def add_yarn_relative_install_script_in_client_package_json
65
+ client_package_json = File.join(destination_root, "client", "package.json")
66
+ contents = File.read(client_package_json)
67
+ replacement_value = <<-STRING
68
+ "scripts": {
69
+ "postinstall": "yarn run install-react-on-rails",
70
+ "install-react-on-rails": "rm -rf node_modules/react-on-rails && npm i 'file:../../../..'",
71
+ STRING
72
+ new_client_package_json_contents = contents.gsub(/ {2}"scripts": {/,
73
+ replacement_value)
74
+ File.open(client_package_json, "w+") { |f| f.puts new_client_package_json_contents }
75
+ end
65
76
  end
66
77
  end
67
78
  end
@@ -1,2 +1,2 @@
1
1
  web: rails s -p 3000
2
- client: sh -c 'rm -rf public/webpack/* || true && cd client && bundle exec rake react_on_rails:locale && yarn run build:development'
2
+ client: sh -c 'rm -rf public/webpack/development/* || true && cd client && bundle exec rake react_on_rails:locale && yarn run build:development'
@@ -6,7 +6,7 @@
6
6
 
7
7
  <%%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
8
8
  <%%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %>
9
- <%%= javascript_pack_tag 'main' %>
9
+ <%%= javascript_pack_tag 'webpack-bundle' %>
10
10
  </head>
11
11
 
12
12
  <body>
@@ -1,12 +1,7 @@
1
1
  <%- require "react_on_rails/version_syntax_converter" -%>
2
2
  {
3
- "name": "react-webpack-rails-tutorial",
4
- "version": "0.0.1",
3
+ "name": "<%= app_name %>",
5
4
  "private": true,
6
- "engines": {
7
- "node": "6.9.0",
8
- "npm": "4.1.1"
9
- },
10
5
  "scripts": {
11
6
  "build:test": "NODE_ENV=test webpack --config webpack.config.js",
12
7
  "build:production": "NODE_ENV=production webpack --config webpack.config.js",
@@ -1,41 +1,49 @@
1
- /* eslint comma-dangle: ["error",
2
- {"functions": "never", "arrays": "only-multiline", "objects":
3
- "only-multiline"} ] */
1
+ // For inspiration on your webpack configuration, see:
2
+ // https://github.com/shakacode/react_on_rails/tree/master/spec/dummy/client
3
+ // https://github.com/shakacode/react-webpack-rails-tutorial/tree/master/client
4
4
 
5
5
  const webpack = require('webpack');
6
6
  const { resolve } = require('path');
7
+
7
8
  const ManifestPlugin = require('webpack-manifest-plugin');
8
9
  const webpackConfigLoader = require('react-on-rails/webpackConfigLoader');
9
10
 
10
- const configPath = resolve('..', 'config', 'webpack');
11
- const { env, paths, publicPath } = webpackConfigLoader(configPath);
12
-
13
- const devBuild = env !== 'production';
11
+ const configPath = resolve('..', 'config');
12
+ const { devBuild, manifest, webpackOutputPath, webpackPublicOutputDir } =
13
+ webpackConfigLoader(configPath);
14
14
 
15
15
  const config = {
16
16
 
17
17
  context: resolve(__dirname),
18
18
 
19
- entry: [
20
- 'es5-shim/es5-shim',
21
- 'es5-shim/es5-sham',
22
- 'babel-polyfill',
23
- './app/bundles/HelloWorld/startup/registration',
24
- ],
19
+ entry: {
20
+ 'webpack-bundle': [
21
+ 'es5-shim/es5-shim',
22
+ 'es5-shim/es5-sham',
23
+ 'babel-polyfill',
24
+ './app/bundles/HelloWorld/startup/registration',
25
+ ],
26
+ },
25
27
 
26
28
  output: {
27
- filename: 'webpack-bundle.js',
28
- path: resolve('..', paths.output, paths.assets),
29
+ // Name comes from the entry section.
30
+ filename: '[name]-[hash].js',
31
+
32
+ // Leading slash is necessary
33
+ publicPath: `/${webpackPublicOutputDir}`,
34
+ path: webpackOutputPath,
29
35
  },
30
36
 
31
37
  resolve: {
32
38
  extensions: ['.js', '.jsx'],
33
39
  },
34
40
 
35
-
36
41
  plugins: [
37
- new webpack.EnvironmentPlugin(JSON.parse(JSON.stringify(env))),
38
- new ManifestPlugin({ fileName: paths.manifest, publicPath, writeToFileEmit: true }),
42
+ new webpack.EnvironmentPlugin({
43
+ NODE_ENV: 'development', // use 'development' unless process.env.NODE_ENV is defined
44
+ DEBUG: false,
45
+ }),
46
+ new ManifestPlugin({ fileName: manifest, writeToFileEmit: true }),
39
47
  ],
40
48
 
41
49
  module: {
@@ -47,7 +55,7 @@ const config = {
47
55
  options: {
48
56
  shim: 'es5-shim/es5-shim',
49
57
  sham: 'es5-shim/es5-sham',
50
- }
58
+ },
51
59
  },
52
60
  },
53
61
  {
@@ -0,0 +1,27 @@
1
+ # Note: Base output directory of /public is assumed for static files
2
+ default: &default
3
+ manifest: manifest.json
4
+ # Used in your webpack configuration. Must be created in the
5
+ # webpack_public_output_dir folder
6
+
7
+ development:
8
+ <<: *default
9
+ # generated files for development, in /public/webpack/development
10
+ webpack_public_output_dir: webpack/development
11
+
12
+ # Default is localhost:3500
13
+ hot_reloading_host: localhost:3500
14
+
15
+ # Developer note: considering removing this option so it can ONLY be turned by using an ENV value.
16
+ # Default is false, ENV 'HOT_RELOAD' will always override
17
+ hot_reloading_enabled_by_default: false
18
+
19
+ test:
20
+ <<: *default
21
+ # generated files for tests, in /public/webpack/test
22
+ webpack_public_output_dir: webpack/test
23
+
24
+ production:
25
+ <<: *default
26
+ # generated files for tests, in /public/webpack/production
27
+ webpack_public_output_dir: webpack/production
@@ -1,14 +1,8 @@
1
1
  {
2
- "name": "react-webpack-rails-tutorial",
3
- "version": "0.0.1",
2
+ "name": "<%= app_name %>",
4
3
  "private": true,
5
- "engines": {
6
- "node": "6.9.0",
7
- "npm": "4.1.1"
8
- },
4
+ "dependencies": {},
9
5
  "scripts": {
10
- "postinstall": "cd client && yarn install",
11
- "rails-server": "echo 'visit http://localhost:3000/hello_world' && foreman start -f Procfile.dev",
12
- "test": "rspec"
6
+ "postinstall": "cd client && yarn install"
13
7
  }
14
8
  }
@@ -1,3 +1,5 @@
1
+ require "rails/railtie"
2
+
1
3
  module ReactOnRails
2
4
  class Engine < ::Rails::Engine
3
5
  config.to_prepare do
@@ -12,7 +12,7 @@ module ReactOnRails
12
12
 
13
13
  def self.reset_pool_if_server_bundle_was_modified
14
14
  return unless ReactOnRails.configuration.development_mode
15
- file_mtime = File.mtime(ReactOnRails::Utils.default_server_bundle_js_file_path)
15
+ file_mtime = File.mtime(ReactOnRails::Utils.server_bundle_js_file_path)
16
16
  @server_bundle_timestamp ||= file_mtime
17
17
  return if @server_bundle_timestamp == file_mtime
18
18
  ReactOnRails::ServerRenderingPool.reset_pool
@@ -77,37 +77,36 @@ module ReactOnRails
77
77
  end
78
78
 
79
79
  def create_js_context
80
- server_js_file = ReactOnRails::Utils.default_server_bundle_js_file_path
81
- if server_js_file.present? && File.exist?(server_js_file)
82
- bundle_js_code = File.read(server_js_file)
83
- base_js_code = <<-JS
80
+ return if ReactOnRails.configuration.server_bundle_js_file.blank?
81
+
82
+ server_js_file = ReactOnRails::Utils.server_bundle_js_file_path
83
+
84
+ unless File.exist?(server_js_file)
85
+ msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be "\
86
+ "read. You may set the server_bundle_js_file in your configuration to be \"\" to "\
87
+ "avoid this warning"
88
+ raise msg
89
+ end
90
+
91
+ bundle_js_code = File.read(server_js_file)
92
+ base_js_code = <<-JS
84
93
  #{console_polyfill}
85
- #{execjs_timer_polyfills}
86
- #{bundle_js_code};
87
- JS
88
- file_name = "tmp/base_js_code.js"
89
- begin
90
- trace_messsage(base_js_code, file_name)
91
- ExecJS.compile(base_js_code)
92
- rescue => e
93
- msg = "ERROR when compiling base_js_code! "\
94
+ #{execjs_timer_polyfills}
95
+ #{bundle_js_code};
96
+ JS
97
+ file_name = "tmp/base_js_code.js"
98
+ begin
99
+ trace_messsage(base_js_code, file_name)
100
+ ExecJS.compile(base_js_code)
101
+ rescue => e
102
+ msg = "ERROR when compiling base_js_code! "\
94
103
  "See file #{file_name} to "\
95
104
  "correlate line numbers of error. Error is\n\n#{e.message}"\
96
105
  "\n\n#{e.backtrace.join("\n")}"
97
- puts msg
98
- Rails.logger.error(msg)
99
- trace_messsage(base_js_code, file_name, true)
100
- raise e
101
- end
102
- else
103
- if server_js_file.present?
104
- msg = "You specified server rendering JS file: #{server_js_file}, but it cannot be "\
105
- "read. You may set the server_bundle_js_file in your configuration to be \"\" to "\
106
- "avoid this warning"
107
- Rails.logger.warn msg
108
- puts msg
109
- end
110
- ExecJS.compile("")
106
+ puts msg
107
+ Rails.logger.error(msg)
108
+ trace_messsage(base_js_code, file_name, true)
109
+ raise e
111
110
  end
112
111
  end
113
112
 
@@ -31,7 +31,7 @@ module ReactOnRails
31
31
  # metatags - metatags to add the ensure_assets_compiled check.
32
32
  # Default is :js, :server_rendering
33
33
  def self.configure_rspec_to_compile_assets(config, *metatags)
34
- metatags = [:js, :server_rendering] if metatags.empty?
34
+ metatags = %i(js server_rendering controller) if metatags.empty?
35
35
 
36
36
  metatags.each do |metatag|
37
37
  config.before(:example, metatag) { ReactOnRails::TestHelper.ensure_assets_compiled }
@@ -55,7 +55,6 @@ module ReactOnRails
55
55
  client_dir: nil,
56
56
  generated_assets_dir: nil,
57
57
  webpack_generated_files: nil)
58
-
59
58
  if webpack_assets_status_checker.nil?
60
59
  client_dir ||= Rails.root.join("client")
61
60
  generated_assets_dir ||= ReactOnRails.configuration.generated_assets_dir
@@ -43,8 +43,8 @@ module ReactOnRails
43
43
  def puts_start_compile_check_message(stale_files)
44
44
  puts <<-MSG
45
45
 
46
- Detected are the following stale generated files:
47
- #{stale_files.join("\n")}
46
+ Detected the following stale generated files:
47
+ #{stale_files.join("\n ")}
48
48
 
49
49
  React on Rails will ensure your JavaScript generated files are up to date, using your
50
50
  /client level package.json `#{ReactOnRails.configuration.npm_build_test_command}` command.
@@ -22,6 +22,11 @@ module ReactOnRails
22
22
  end
23
23
 
24
24
  def stale_generated_webpack_files
25
+ manifest_needed = ReactOnRails::Utils.using_webpacker_lite? &&
26
+ !WebpackerLite::Manifest.exist?
27
+
28
+ return ["manifest.json"] if manifest_needed
29
+
25
30
  most_recent_mtime = find_most_recent_mtime
26
31
  all_compiled_assets.each_with_object([]) do |webpack_generated_file, stale_gen_list|
27
32
  if !File.exist?(webpack_generated_file) ||
@@ -43,8 +48,8 @@ module ReactOnRails
43
48
 
44
49
  def all_compiled_assets
45
50
  @all_compiled_assets ||= begin
46
- webpack_generated_files = @webpack_generated_files.map do |file|
47
- File.join(@generated_assets_dir, file)
51
+ webpack_generated_files = @webpack_generated_files.map do |bundle_name|
52
+ ReactOnRails::Utils.bundle_js_file_path(bundle_name)
48
53
  end
49
54
  if webpack_generated_files.present?
50
55
  webpack_generated_files
@@ -15,9 +15,26 @@ module ReactOnRails
15
15
  $CHILD_STATUS.exitstatus == 0
16
16
  end
17
17
 
18
- def self.default_server_bundle_js_file_path
19
- File.join(ReactOnRails.configuration.generated_assets_dir,
20
- ReactOnRails.configuration.server_bundle_js_file)
18
+ def self.server_bundle_js_file_path
19
+ bundle_js_file_path(ReactOnRails.configuration.server_bundle_js_file)
20
+ end
21
+
22
+ # TODO: conturbo Write Test for this, with BOTH webpacker_lite installed and not, and
23
+ # with case for webpacker_lite, but server file is not in the file
24
+ def self.bundle_js_file_path(bundle_name)
25
+ # For testing outside of Rails app
26
+
27
+ if using_webpacker_lite? && WebpackerLite::Manifest.lookup(bundle_name)
28
+ # If using webpacker_lite gem
29
+ public_subdir_hashed_file_name = ActionController::Base.helpers.asset_pack_path(bundle_name)
30
+ return File.join("public", public_subdir_hashed_file_name)
31
+ end
32
+
33
+ File.join(ReactOnRails.configuration.generated_assets_dir, bundle_name)
34
+ end
35
+
36
+ def self.using_webpacker_lite?
37
+ ActionController::Base.helpers.respond_to?(:asset_pack_path)
21
38
  end
22
39
 
23
40
  def self.running_on_windows?
@@ -1,3 +1,3 @@
1
1
  module ReactOnRails
2
- VERSION = "8.0.0.beta.2".freeze
2
+ VERSION = "8.0.0.beta.3".freeze
3
3
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-on-rails",
3
- "version": "8.0.0-beta.2",
3
+ "version": "8.0.0-beta.3",
4
4
  "description": "react-on-rails JavaScript for react_on_rails Ruby gem",
5
5
  "main": "node_package/lib/ReactOnRails.js",
6
6
  "directories": {
@@ -17,7 +17,7 @@ namespace :dummy_apps do
17
17
  bundle_install_with_turbolinks_2_in(dummy_app_dir)
18
18
  end
19
19
 
20
- task dummy_apps: [:dummy_app, :node_package] do
20
+ task dummy_apps: %i[dummy_app node_package] do
21
21
  puts "Prepared all Dummy Apps"
22
22
  end
23
23
  end
@@ -11,7 +11,7 @@ include ReactOnRails::TaskHelpers
11
11
  namespace :examples do
12
12
  # Loads data from examples_config.yml and instantiates corresponding ExampleType objects
13
13
  examples_config_file = File.expand_path("../examples_config.yml", __FILE__)
14
- examples_config = symbolize_keys(YAML.load(File.read(examples_config_file)))
14
+ examples_config = symbolize_keys(YAML.safe_load(File.read(examples_config_file)))
15
15
  examples_config[:example_type_data].each { |example_type_data| ExampleType.new(symbolize_keys(example_type_data)) }
16
16
 
17
17
  # Define tasks for each example type
@@ -29,7 +29,7 @@ namespace :lint do
29
29
  end
30
30
 
31
31
  desc "Run all eslint, flow, rubocop linters. Skip ruby-lint and scss"
32
- task lint: [:eslint, :flow, :rubocop] do
32
+ task lint: %i[eslint flow rubocop] do
33
33
  puts "Completed all linting"
34
34
  end
35
35
  end
@@ -20,10 +20,10 @@ which are installed via `bundle install` and `yarn`
20
20
 
21
21
  Example: `rake release[2.1.0,false]`")
22
22
 
23
- task :release, [:gem_version, :dry_run, :tools_install] do |_t, args|
23
+ task :release, %i[gem_version dry_run tools_install] do |_t, args|
24
24
  class MessageHandler
25
25
  def add_error(error)
26
- fail error
26
+ raise error
27
27
  end
28
28
  end
29
29
 
@@ -1,6 +1,4 @@
1
- if ENV["USE_COVERALLS"] == "TRUE"
2
- require "coveralls/rake/task"
3
- end
1
+ require "coveralls/rake/task" if ENV["USE_COVERALLS"] == "TRUE"
4
2
 
5
3
  require "pathname"
6
4
 
@@ -57,17 +55,15 @@ namespace :run_rspec do
57
55
  sh %(COVERAGE=true rspec spec/empty_spec.rb)
58
56
  end
59
57
 
60
- if ENV["USE_COVERALLS"] == "TRUE"
61
- Coveralls::RakeTask.new
62
- end
58
+ Coveralls::RakeTask.new if ENV["USE_COVERALLS"] == "TRUE"
63
59
 
64
60
  desc "run all tests no examples"
65
- task all_but_examples: [:gem, :dummy_no_turbolinks, :dummy_turbolinks_2, :dummy, :empty, :js_tests] do
61
+ task all_but_examples: %i[gem dummy_no_turbolinks dummy_turbolinks_2 dummy empty js_tests] do
66
62
  puts "Completed all RSpec tests"
67
63
  end
68
64
 
69
65
  desc "run all tests"
70
- task run_rspec: [:all_but_examples, :examples] do
66
+ task run_rspec: %i[all_but_examples examples] do
71
67
  puts "Completed all RSpec tests"
72
68
  end
73
69
  end
@@ -85,16 +81,17 @@ desc msg
85
81
  task run_rspec: ["run_rspec:run_rspec"]
86
82
 
87
83
  private
84
+
88
85
  def calc_path(dir)
89
- if dir.is_a?(String)
90
- path = if dir.start_with?(File::SEPARATOR)
86
+ path = if dir.is_a?(String)
87
+ if dir.start_with?(File::SEPARATOR)
91
88
  Pathname.new(dir)
92
89
  else
93
90
  Pathname.new(File.join(gem_root, dir))
94
- end
95
- else
96
- path = dir
97
- end
91
+ end
92
+ else
93
+ dir
94
+ end
98
95
  path
99
96
  end
100
97
 
@@ -1,7 +1,8 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+
3
+ lib = File.expand_path("../lib", __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'react_on_rails/version'
5
+ require "react_on_rails/version"
5
6
 
6
7
  Gem::Specification.new do |s|
7
8
  s.name = "react_on_rails"
@@ -9,8 +10,8 @@ Gem::Specification.new do |s|
9
10
  s.authors = ["Justin Gordon"]
10
11
  s.email = ["justin@shakacode.com"]
11
12
 
12
- s.summary = %q{Rails with react server rendering with webpack. }
13
- s.description = %q{See README.md}
13
+ s.summary = "Rails with react server rendering with webpack. "
14
+ s.description = "See README.md"
14
15
  s.homepage = "https://github.com/shakacode/react_on_rails"
15
16
  s.license = "MIT"
16
17
 
@@ -19,7 +20,7 @@ Gem::Specification.new do |s|
19
20
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
20
21
  s.require_paths = ["lib"]
21
22
 
22
- s.required_ruby_version = '>= 2.0.0'
23
+ s.required_ruby_version = ">= 2.0.0"
23
24
 
24
25
  s.add_dependency "connection_pool"
25
26
  s.add_dependency "execjs", "~> 2.5"
@@ -1,27 +1,96 @@
1
- const { join } = require('path');
2
- const { env } = require('process');
1
+ /**
2
+ * Allow defaults for the config/webpacker_lite.yml. Thee values in this file MUST match values
3
+ * in README for https://github.com/shakacode/webpacker_lite
4
+ *
5
+ * webpack_public_output_dir: 'webpack'
6
+ * manifest: 'manifest.json'
7
+ *
8
+ * hot_reloading_enabled_by_default: false
9
+ * hot_reloading_host: localhost:3500
10
+ *
11
+ * NOTE: for hot reloading, env.HOT_RELOADING value will override any config value. This env value
12
+ * should be set to TRUE to turn this on.
13
+ */
14
+ const { join, resolve } = require('path');
3
15
  const { safeLoad } = require('js-yaml');
4
16
  const { readFileSync } = require('fs');
5
17
 
18
+ const DEFAULT_WEBPACK_PUBLIC_OUTPUT_DIR = 'webpack';
19
+ const DEFAULT_MANIFEST = 'manifest.json';
20
+ const DEFAULT_HOT_RELOADING_HOST = 'localhost:3500';
21
+ const HOT_RELOADING_ENABLED_BY_DEFAULT = false;
22
+
23
+ function getLocation(href) {
24
+ const match = href.match(/^(https?:)\/\/(([^:/?#]*)(?::([0-9]+))?)([/]?[^?#]*)(\?[^#]*|)(#.*|)$/);
25
+
26
+ return match && {
27
+ href,
28
+ protocol: match[1],
29
+ host: match[2],
30
+ hostname: match[3],
31
+ port: match[4],
32
+ pathname: match[5],
33
+ search: match[6],
34
+ hash: match[7],
35
+ };
36
+ }
37
+
38
+ /**
39
+ * @param configPath, location where webpacker_lite.yml will be found
40
+ * @returns {{
41
+ * devBuild,
42
+ * hotReloadingEnabled,
43
+ * hotReloadingHost,
44
+ * hotReloadingPort,
45
+ * hotReloadingUrl,
46
+ * manifest,
47
+ * webpackOutputPath,
48
+ * webpackPublicOutputDir
49
+ * }}
50
+ */
6
51
  const configLoader = (configPath) => {
7
- const paths = safeLoad(readFileSync(join(configPath, 'paths.yml'), 'utf8'))[env.NODE_ENV];
52
+ const env = process.env;
8
53
 
9
- const devServerConfig = join(configPath, 'development.server.yml');
10
- const devServer = safeLoad(readFileSync(devServerConfig, 'utf8')).development;
54
+ // Some test environments might not have the NODE_ENV set, so we'll have fallbacks.
55
+ const configEnv = (process.env.NODE_ENV || process.env.RAILS_ENV || 'development');
56
+ const ymlConfigPath = join(configPath, 'webpacker_lite.yml');
57
+ const configuration = safeLoad(readFileSync(ymlConfigPath, 'utf8'))[configEnv];
11
58
 
12
- if (env.REACT_ON_RAILS_ENV === 'HOT') {
13
- devServer.enabled = true;
14
- }
15
- const productionBuild = env.NODE_ENV === 'production';
59
+ const devBuild = env !== 'production';
60
+ const hotReloadingHost = configuration.hot_reloading_host || DEFAULT_HOT_RELOADING_HOST;
16
61
 
17
- const publicPath = !productionBuild && devServer.enabled ?
18
- `http://${devServer.host}:${devServer.port}/` : `/${paths.assets}/`;
62
+ // NOTE: Rails path is hard coded to `/public`
63
+ const webpackPublicOutputDir = configuration.webpack_public_output_dir ||
64
+ DEFAULT_WEBPACK_PUBLIC_OUTPUT_DIR;
65
+ const webpackOutputPath = resolve(configPath, '..', 'public', webpackPublicOutputDir);
66
+
67
+ const manifest = configuration.manifest || DEFAULT_MANIFEST;
68
+
69
+ const hotReloadingEnabled = (env.HOT_RELOADING === 'TRUE' || env.HOT_RELOADING === 'YES' ||
70
+ configuration.hot_reloading_enabled_by_default || HOT_RELOADING_ENABLED_BY_DEFAULT);
71
+
72
+ const hotReloadingUrl = hotReloadingHost.match(/^http/)
73
+ ? hotReloadingHost
74
+ : `http://${hotReloadingHost}`;
75
+
76
+ const url = getLocation(hotReloadingUrl);
77
+ const hotReloadingPort = url.port;
78
+ const hotReloadingHostname = url.hostname;
79
+ if (hotReloadingPort === '' || hotReloadingHostname === '') {
80
+ const msg = 'Missing port number. Please specify the `hot_reloading_host` like `localhost:3500`';
81
+ throw new Error(msg);
82
+ }
19
83
 
20
84
  return {
21
- devServer,
22
- env,
23
- paths,
24
- publicPath,
85
+ devBuild,
86
+ hotReloadingEnabled,
87
+ hotReloadingHost,
88
+ hotReloadingHostname,
89
+ hotReloadingPort,
90
+ hotReloadingUrl,
91
+ manifest,
92
+ webpackOutputPath,
93
+ webpackPublicOutputDir,
25
94
  };
26
95
  };
27
96
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_on_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 8.0.0.beta.2
4
+ version: 8.0.0.beta.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Gordon
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-05-08 00:00:00.000000000 Z
11
+ date: 2017-05-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: connection_pool
@@ -382,8 +382,7 @@ files:
382
382
  - lib/generators/react_on_rails/templates/base/base/client/package.json.tt
383
383
  - lib/generators/react_on_rails/templates/base/base/client/webpack.config.js
384
384
  - lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb.tt
385
- - lib/generators/react_on_rails/templates/base/base/config/webpack/development.server.yml
386
- - lib/generators/react_on_rails/templates/base/base/config/webpack/paths.yml
385
+ - lib/generators/react_on_rails/templates/base/base/config/webpacker_lite.yml
387
386
  - lib/generators/react_on_rails/templates/base/base/package.json.tt
388
387
  - lib/generators/react_on_rails/templates/dev_tests/.rspec
389
388
  - lib/generators/react_on_rails/templates/dev_tests/spec/features/hello_world_spec.rb
@@ -1,9 +0,0 @@
1
- default: &default
2
- enabled: false
3
- host: localhost
4
- port: 3500
5
-
6
- development:
7
- <<: *default
8
- # set to true of you want hot loading as default
9
- enabled: false
@@ -1,17 +0,0 @@
1
- # Used by webpacker_lite to configure the helpers and by webpack from the
2
- # client/webpack.config.js file, in variable `paths`.
3
- default: &default
4
- output: public
5
- manifest: manifest.json
6
-
7
- development:
8
- <<: *default
9
- assets: webpack/development
10
-
11
- test:
12
- <<: *default
13
- assets: webpack/test
14
-
15
- production:
16
- <<: *default
17
- assets: webpack/production