react_webpack_rails 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +30 -0
  4. data/CONTRIBUTING.md +17 -0
  5. data/README.md +23 -10
  6. data/docs/README.md +4 -2
  7. data/docs/api.md +18 -4
  8. data/docs/install_generator.md +55 -0
  9. data/docs/server_side_rendering.md +33 -0
  10. data/js/src/index.js +30 -17
  11. data/js/src/integrations-manager.js +9 -0
  12. data/js/src/integrations/react.js +11 -0
  13. data/js/src/version.js +1 -1
  14. data/lib/generators/react_webpack_rails/install/core_generator.rb +47 -0
  15. data/lib/generators/react_webpack_rails/install/example_generator.rb +34 -0
  16. data/lib/generators/react_webpack_rails/install/hot_reload_generator.rb +34 -0
  17. data/lib/generators/react_webpack_rails/install/karma_setup_generator.rb +26 -0
  18. data/lib/generators/react_webpack_rails/install/react_router_generator.rb +21 -0
  19. data/lib/generators/react_webpack_rails/install/server_side_generator.rb +30 -0
  20. data/lib/generators/react_webpack_rails/install_generator.rb +60 -28
  21. data/lib/generators/react_webpack_rails/merge_helpers.rb +26 -0
  22. data/lib/generators/react_webpack_rails/package_merge.rb +21 -0
  23. data/lib/generators/react_webpack_rails/templates/examples/component_view.html.erb +1 -0
  24. data/lib/generators/react_webpack_rails/templates/examples/react_examples_controller.rb +5 -0
  25. data/lib/generators/react_webpack_rails/templates/examples/ssr-component_view.html.erb +1 -0
  26. data/lib/generators/react_webpack_rails/templates/forever/development.json +8 -0
  27. data/lib/generators/react_webpack_rails/templates/forever/production.json +6 -0
  28. data/lib/generators/react_webpack_rails/templates/{package.json.erb → packages/core.json} +1 -16
  29. data/lib/generators/react_webpack_rails/templates/packages/hot-reload.json +9 -0
  30. data/lib/generators/react_webpack_rails/templates/packages/js-specs.json +16 -0
  31. data/lib/generators/react_webpack_rails/templates/packages/react-router.json +5 -0
  32. data/lib/generators/react_webpack_rails/templates/packages/server-side.json +11 -0
  33. data/lib/generators/react_webpack_rails/templates/react/components/hello-world.jsx +8 -2
  34. data/lib/generators/react_webpack_rails/templates/react/index.js +2 -0
  35. data/lib/generators/react_webpack_rails/templates/react/node_server.js +38 -0
  36. data/lib/react_webpack_rails.rb +8 -2
  37. data/lib/react_webpack_rails/errors/base.rb +11 -0
  38. data/lib/react_webpack_rails/errors/node_failure.rb +13 -0
  39. data/lib/react_webpack_rails/node_helpers.rb +7 -0
  40. data/lib/react_webpack_rails/node_integration_runner.rb +35 -0
  41. data/lib/react_webpack_rails/railtie.rb +23 -2
  42. data/lib/react_webpack_rails/react_component_renderer.rb +13 -0
  43. data/lib/react_webpack_rails/version.rb +1 -1
  44. data/lib/react_webpack_rails/view_helpers.rb +13 -2
  45. data/package.json +1 -1
  46. metadata +30 -4
  47. data/lib/generators/react_webpack_rails/templates/react/index.js.erb +0 -10
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 95002a306fa194b5eb678dca9b9837d366db9df0
4
- data.tar.gz: e14adcbbec3aab1e87f6025718c111754fc40f96
3
+ metadata.gz: c981ff55a0491767f0c8b6b521117293422993b1
4
+ data.tar.gz: 0fa4f59a58b398701a14d16b6dc089977f63edb8
5
5
  SHA512:
6
- metadata.gz: 8c56369c886b81056e4d774ca417efc81f6a12cad2129b8df634c7cccb4b3f68848a43dcbf02c0d7122488c8255f13261f7be6925dd259878bf094dd6d0064fb
7
- data.tar.gz: c7cda2c3749e953e5313ce232392906d2f7285f9b4a4dbd8e9db4f4b801c4c6c197793381f62f0f416d8ad239b7570079e3d5d099d4c4d5465b04f60232a729e
6
+ metadata.gz: be91c9be8c46a94a70fd0100448e6a2e77b4c8ed4828f78799c4a920d896608d9a13b9ebf6d255f2fc90044e30e79553b0cb3c270338c4b9e42cfc89571d0adc
7
+ data.tar.gz: fb0566a5a651221b866e4cac13a98eb861d4cd3a70eee3f03941da8a147825cf6853fff45480ee48273193f4a0f82db25d8ab6973125d3586c8522fa20ab3d78
data/.gitignore CHANGED
@@ -1,9 +1,10 @@
1
1
  /.bundle/
2
2
  /.yardoc
3
- /Gemfile.lock
4
3
  /_yardoc/
5
4
  /coverage/
6
5
  /doc/
6
+ /Gemfile.lock
7
+ /node_modules
7
8
  /pkg/
8
9
  /spec/reports/
9
10
  /tmp/
@@ -11,3 +12,4 @@
11
12
 
12
13
  node_modules
13
14
  react_webpack_rails-*.gem
15
+ react_bundle.js
@@ -1,3 +1,33 @@
1
+ ## 0.2.0
2
+ * Added server-side execution of js
3
+ * Updated package.json generator,
4
+ * Added dependencies:
5
+ * http
6
+ * httpdispatcher
7
+ * forever
8
+ * Added npm scripts for running node-server on development/production
9
+ * Added node server generator (`app/react/node_server.js`)
10
+ * Updated `app/react/index.js` generator
11
+ * Added NodeIntegrationRunner service for running JS code on node server.
12
+ * Updated React-integration:
13
+ * Added server-side render support to npm package
14
+ * Updated react_component helper
15
+ * fixed props processing
16
+ * Added react_component render
17
+
18
+ #### migration 0.1.2 -> 0.2.0
19
+ * Make sure you have latest npm package installed. In your package.json:
20
+ ```js
21
+ "react_webpack_rails": "0.2.0"
22
+ ```
23
+ * In `app/react/index.js` replace `window.RWR = RWR;` with `RWR.run();` - it's required by node environment.
24
+ * Setup node server by running server_side generator.
25
+ ```bash
26
+ $ rails generate react_webpack_rails:install:server_side
27
+ ```
28
+
29
+ ***note***: *generator will ask you to override existing package.json. Don't worry about its content - generator will merge existing package with the one from gem.*
30
+
1
31
  ## 0.1.2 (February 3, 2015)
2
32
  * fix camelize_props
3
33
  * allow camelize for AMS objects
@@ -0,0 +1,17 @@
1
+ # Contributing to React Webpack Rails gem
2
+
3
+ ## Issues
4
+
5
+ Found a bug in React Webpack Rails? Open an issue on [GitHub Issues](https://github.com/netguru/react_webpack_rails/issues).
6
+
7
+ ## Pull requests
8
+
9
+ Interested in contributing to React Webpack Rails? That's great, and thank you for your interest!
10
+
11
+ After checking out the repo, run `bundle exec rake setup:all` to install every environment dependencies.
12
+
13
+ To get your contributions accepted, make sure:
14
+
15
+ * All the tests pass. Run `bundle exec rake test:all`.
16
+ * Any new code paths you've added are covered by tests.
17
+ * Describe your changes in pull request (what it adds, how to migrate from previous version etc.)
data/README.md CHANGED
@@ -2,7 +2,18 @@
2
2
  [![Travis CI](https://travis-ci.org/netguru/react_webpack_rails.svg?branch=master)](https://travis-ci.org/netguru/react_webpack_rails)
3
3
 
4
4
  #### Rails - Webpack setup with React integration.
5
- Inspired and partially based on https://github.com/reactjs/react-rails/ this gem provides generators and helpers that makes react-webpack-rails integration easy.
5
+ This gem provides easy and convenient way to build modern JavaScript stack on top of Rails applications using [Webpack](http://webpack.github.io/) and [React](https://facebook.github.io/react/).
6
+
7
+ ### Development branch!
8
+ See [0.1-stable](https://github.com/netguru/react_webpack_rails/tree/0.1-stable) for latest release.
9
+
10
+ ## Features
11
+ * [Install Generator](https://github.com/netguru/react_webpack_rails/blob/master/docs/install_generator.md) for quick [Webpack](http://webpack.github.io/) setup.
12
+ * Integrated [react-hot-loader](https://github.com/gaearon/react-hot-loader)
13
+ * ES6/7 support with [bablejs](https://babeljs.io/).
14
+ * Node.js based [server-side JavaScript execution](https://github.com/netguru/react_webpack_rails/blob/master/docs/server_side_rendering.md).
15
+ * [React](https://facebook.github.io/react/) integration with server prerender option.
16
+ * [React-router](https://github.com/rackt/react-router) integration.
6
17
 
7
18
  ## Installation
8
19
 
@@ -81,7 +92,7 @@ By default, `react-webpack-rails` uses Babel Stage 1 - Proposal. If you want to
81
92
 
82
93
  ```js
83
94
  import Component from './components/some-component';
84
- registerComponent('customComponentName', Component);
95
+ RWR.registerComponent('customComponentName', Component);
85
96
  ```
86
97
 
87
98
  #### Use it in rails view
@@ -94,7 +105,15 @@ registerComponent('customComponentName', Component);
94
105
 
95
106
  ```js
96
107
  const element = $('#my-element');
97
- renderComponent('customComponentName', {user_id: 1}, element);
108
+ RWR.renderComponent('customComponentName', {user_id: 1}, element);
109
+ ```
110
+
111
+ #### Render component in controller
112
+
113
+ ```ruby
114
+ def action_name
115
+ render react_component 'customComponentName', props: { user_id: 1 }
116
+ end
98
117
  ```
99
118
 
100
119
  ### Development environment
@@ -123,15 +142,9 @@ or manually:
123
142
  #### Deployment
124
143
  Check [docs/deployment.md](docs/deployment.md)
125
144
 
126
- ## Gem development
127
-
128
- After checking out the repo, run `bundle exec rake setup:all` to install dependencies. Then, run `rake` to run the tests (includes gem, test app and node module).
129
- Run `bundle exec rake -T` to check available development commands.
130
-
131
145
  ## Contributing
132
146
 
133
- Bug reports and pull requests are welcome on GitHub at https://github.com/netguru/react_webpack_rails.
134
-
147
+ See the [contribution guide](https://github.com/netguru/react_webpack_rails/blob/master/CONTRIBUTING.md).
135
148
 
136
149
  ## License
137
150
 
@@ -1,12 +1,14 @@
1
1
  # Docs
2
2
  1. [Api](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md)
3
- 1. [React](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#React)
3
+ 1.1 [React](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#React)
4
4
  * [js: registerComponent](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#registercomponent)
5
5
  * [js: createComponent](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#getcomponent)
6
6
  * [js: renderComponent](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#rendercomponent)
7
7
  * [js: unmountComponent](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#unmountcomponent)
8
8
  * [ruby: react_component](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#react_component)
9
- 1. [ReactRouter](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#ReactRouter)
9
+ 1.2 [ReactRouter](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#ReactRouter)
10
10
  * [js: getRouter](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#getrouter)
11
11
  * [js: renderRouter](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#renderrouter)
12
12
  * [ruby: react_router](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#react_router)
13
+ 2. [Server-Side Rendering](https://github.com/netguru/react_webpack_rails/blob/master/docs/server_side_rendering.md)
14
+ 3. [Install Generator]((https://github.com/netguru/react_webpack_rails/blob/master/docs/install_generator.md))
@@ -79,21 +79,35 @@
79
79
 
80
80
 
81
81
  * ### react_component [ruby]
82
+ #### helper
82
83
 
83
84
  ```ruby
84
85
  react_component(String component_name[, Object props, Object options])
85
86
  ```
86
87
 
87
- Creates DOM node with props as data attributes in rendered view so RWR can grab it and mount proper component.
88
+ #### renderer
89
+
90
+ ```ruby
91
+ render react_component String component_name[, Object options])
92
+ ```
93
+
94
+ Creates DOM node with props as data attributes in rendered view, so RWR can grab it and mount proper component.
88
95
  Options hash contains customization of React component, such as `tag`, `class`.
96
+ Also, the options hash is the place where you can override the global server-side rendering setting.
89
97
 
90
- ##### example:
98
+ **note:** Props Object will be parsed to JSON. Be careful when passing rails models there - all its data accessible after `.to_json` will be exposed as data-attributes. We recommend using serializers to control it.
99
+
100
+ ##### helper example:
91
101
 
92
102
  ```ruby
93
- <%= react_component('MyComponentName', MySerializer.new(my_data), { tag: :ul, class: 'my-class' }) %>
103
+ <%= react_component('MyComponentName', MySerializer.new(my_data), { tag: :ul, class: 'my-class', server_side: true }) %>
94
104
  ```
95
105
 
96
- **note:** Props Object will be parsed to JSON. Be careful when passing rails models there - all its data accessible after `.to_json` will be exposed as data-attributes. We recommend using serializers to control it.
106
+ ##### renderer example:
107
+
108
+ ```ruby
109
+ render react_component: 'MyComponentName', props: MySerializer.new(my_data), tag: :ul, server_side: true
110
+ ```
97
111
 
98
112
 
99
113
  ## ReactRouter
@@ -0,0 +1,55 @@
1
+ Instlall Generator
2
+ =======
3
+
4
+ `Install` generator is build from 6 independent generators responsible for different parts of installation process. All steps except core generator can be skipped by passing one of possible [options]().
5
+
6
+ ```bash
7
+ $ rails generate react_webpack_rails:install
8
+ ```
9
+
10
+ Install generator run with default options will create following structure:
11
+
12
+ ```
13
+ ├── app
14
+ │ ├── react
15
+ │ │ ├── components
16
+ │ │ │ ├── hello-world.jsx (example)
17
+ │ │ │ └── hello-world-test.jsx (example)
18
+ │ │ ├── index.js (core)
19
+ │ │ └── node_server.js (server_side)
20
+ │ ├── views
21
+ │ │ ├── layouts
22
+ │ │ │ └── _react_hot_assets.html.erb (hot_relaod)
23
+ │ │ └── react_examples
24
+ │ │ └── component.html.erb (example)
25
+ │ ├── assets
26
+ │ │ └── javascripts
27
+ │ │ └──react_bundle.js (core)
28
+ │ └── controllers
29
+ │ └── react_examples_controller.rb (example)
30
+ ├── webpack
31
+ │ ├── dev.config.js (core)
32
+ │ ├── hot-dev.config.js (hot_reload)
33
+ │ ├── production.config.js (core)
34
+ │ └── tests.config.js (karma_setup)
35
+ ├── forever
36
+ │ ├── development.json (server_side)
37
+ │ └── production.json (server_side)
38
+ ├── .babelrc (core)
39
+ ├── karma.conf.js (karma_setup)
40
+ ├── package.json (core)
41
+ └── webpack.config.js (core)
42
+ ```
43
+
44
+ And modify:
45
+ - `config/routes.rb` by adding a route for example component,
46
+ - `app/views/layouts/application.html.erb` by adding hot_reload partial.
47
+
48
+ ### Options
49
+ * *--no-example* - skip example generator
50
+ * *--no-hot-reload* - skip hot_reload generator
51
+ * *--no-server-side* - skip server_side generator
52
+ * *--no-karma-setup* - skip karma_setup generator
53
+ * *--react-router* - run react_rotuer generator
54
+
55
+ *Detailed description of generators coming soon...*
@@ -0,0 +1,33 @@
1
+ Server-Side Rendering
2
+ =======
3
+ Server-side processing enables execution of any JavaScript code on the server side. The React integration we have prepared allows you to render React components to string on the server. The integration accepts component name and props, and returns valid HTML ([see API](https://github.com/netguru/react_webpack_rails/blob/master/docs/api.md#react_component-ruby)). This happens using provided node server. After running RWR install generator, you will find the server code in `app/react/` directory: `node_server.js`. You must ensure it is up and running if you want to use the SSR (or any other server-side processing of JavaScript). We use [Forever](https://github.com/foreverjs/forever) to keep the node server up. It handles watch and reload, and enables running and tracking background processes. Should you use current package.json, there are scripts ready to run:
4
+ * running on development:
5
+ ```bash
6
+ npm run rwr-node-dev-server
7
+ ```
8
+ * running on production (foregroud):
9
+ ```bash
10
+ npm run rwr-node-server
11
+ ```
12
+
13
+ To set the node server address, override this option to a string of your choice:
14
+ ```ruby
15
+ Rails.application.config.rwr.node_server_host
16
+ ```
17
+
18
+ ### How to use SSR:
19
+
20
+ ```erb
21
+ <%# A view in erb %>
22
+ <%= react_component('HelloWorld', { name: @name }, server_side: true) %>
23
+ ```
24
+ `HelloWorld` is the name of the react component, which has to be `import`ed and `registered`ed in your `app/react/index.js` like so:
25
+ ```js
26
+ import HelloWorld from './components/hello-world';
27
+ RWR.registerComponent('HelloWorld', HelloWorld);
28
+ ```
29
+ `{ name: @name }` is the component's props, and the option `server_side: true` turns SSR on. By default it is set to `false`. You can change it globally by setting the following config option to a Boolean value of your choice:
30
+ ```ruby
31
+ Rails.application.config.react.server_side
32
+ ```
33
+ This global config may be overridden by passing the `server_side` option to a specific `react_component` invocation.
@@ -11,20 +11,33 @@ export { integrationsManager as integrationsManager };
11
11
  export { env as env };
12
12
  export { reactRouter as reactRouter };
13
13
 
14
- export default {
15
- version: version,
16
-
17
- registerComponent: react.registerComponent,
18
- getComponent: react.getComponent,
19
- createComponent: react.createComponent,
20
- renderComponent: react.renderComponent,
21
- unmountComponent: react.unmountComponent,
22
-
23
- renderRouter: reactRouter.renderRouter,
24
- registerRouter: reactRouter.registerRouter,
25
- unmountRouter: reactRouter.unmountRouter,
26
- getRouter: reactRouter.getRouter,
27
-
28
- mountNodes: nodes.mountNodes,
29
- unmountNodes: nodes.unmountNodes,
30
- };
14
+
15
+ class RWR {
16
+ constructor() {
17
+ this.version = version;
18
+
19
+ this.registerComponent = react.registerComponent;
20
+ this.getComponent = react.getComponent;
21
+ this.createComponent = react.createComponent;
22
+ this.renderComponent = react.renderComponent;
23
+ this.unmountComponent = react.unmountComponent;
24
+
25
+ this.renderRouter = reactRouter.renderRouter;
26
+ this.registerRouter = reactRouter.registerRouter;
27
+ this.unmountRouter = reactRouter.unmountRouter;
28
+ this.getRouter = reactRouter.getRouter;
29
+
30
+ this.mountNodes = nodes.mountNodes;
31
+ this.unmountNodes = nodes.unmountNodes;
32
+ }
33
+
34
+ run() {
35
+ if (typeof(window) !== 'undefined') {
36
+ window.RWR = this;
37
+ } else {
38
+ global.RWR = this;
39
+ }
40
+ }
41
+ }
42
+
43
+ export default new RWR;
@@ -17,6 +17,15 @@ class IntegrationsManager {
17
17
  register(name, integration) {
18
18
  this.integrations[name] = integration;
19
19
  }
20
+
21
+ runNodeIntegration(data) {
22
+ let result = '';
23
+ const { nodeRun } = this.get(data.integrationName);
24
+ if (typeof(nodeRun) === 'function') {
25
+ result = nodeRun(data.payload);
26
+ }
27
+ return result;
28
+ }
20
29
  }
21
30
 
22
31
  export default new IntegrationsManager;
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import ReactDOM from 'react-dom';
3
+ import ReactDOMServer from 'react-dom/server';
3
4
 
4
5
  class ReactIntegration {
5
6
  constructor() {
@@ -9,6 +10,7 @@ class ReactIntegration {
9
10
  this.createComponent = this.createComponent.bind(this);
10
11
  this.renderComponent = this.renderComponent.bind(this);
11
12
  this.unmountComponent = this.unmountComponent.bind(this);
13
+ this.renderComponentToString = this.renderComponentToString.bind(this);
12
14
  }
13
15
 
14
16
  registerComponent(name, component) {
@@ -33,6 +35,11 @@ class ReactIntegration {
33
35
  ReactDOM.unmountComponentAtNode(node);
34
36
  }
35
37
 
38
+ renderComponentToString(name, props) {
39
+ const component = this.createComponent(name, props);
40
+ return ReactDOMServer.renderToString(component);
41
+ }
42
+
36
43
  get integrationWrapper() {
37
44
  return {
38
45
  mount: function _mount(node, payload) {
@@ -42,6 +49,10 @@ class ReactIntegration {
42
49
  unmount: function _unmount(node) {
43
50
  this.unmountComponent(node);
44
51
  }.bind(this),
52
+
53
+ nodeRun: function _prerender(payload) {
54
+ return this.renderComponentToString(payload.name, payload.props);
55
+ }.bind(this),
45
56
  };
46
57
  }
47
58
  }
@@ -1 +1 @@
1
- export default '0.1.2';
1
+ export default '0.2.0';
@@ -0,0 +1,47 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ class CoreGenerator < Rails::Generators::Base
4
+ desc 'Create basic files structure, prepare package.json and webpack setup'
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ class_option :tmp_package,
8
+ type: :boolean,
9
+ default: false,
10
+ desc: 'Force update tmp/package.json instead package.json'
11
+
12
+
13
+ def base
14
+ copy_file '.babelrc', '.babelrc'
15
+ create_file 'app/assets/javascripts/react_bundle.js'
16
+ template 'react/index.js', 'app/react/index.js'
17
+ end
18
+
19
+ def structure
20
+ create_file 'app/react/components/.keep'
21
+ end
22
+
23
+ def gitignore
24
+ append_file '.gitignore' do <<-'TEXT'.strip_heredoc
25
+ /node_modules
26
+ /app/assets/javascripts/react_bundle.js
27
+ /app/assets/stylesheets/react_bundle.css
28
+ TEXT
29
+ end
30
+ end
31
+
32
+ def package
33
+ if options.tmp_package
34
+ copy_file 'packages/core.json', 'tmp/package.json', force: true
35
+ else
36
+ copy_file 'packages/core.json', 'package.json'
37
+ end
38
+ end
39
+
40
+ def webpack
41
+ copy_file 'webpack.config.js', 'webpack.config.js'
42
+ copy_file 'webpack/dev.config.js', 'webpack/dev.config.js'
43
+ copy_file 'webpack/production.config.js', 'webpack/production.config.js'
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,34 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ class ExampleGenerator < Rails::Generators::Base
4
+ desc 'Add example component, its controller and router'
5
+ source_root File.expand_path('../../templates', __FILE__)
6
+
7
+ class_option :server_side,
8
+ type: :boolean,
9
+ default: true,
10
+ desc: 'Set server_side: true in example'
11
+
12
+ def es6_example
13
+ copy_file 'react/components/hello-world-test.jsx', 'app/react/components/hello-world-test.jsx'
14
+ copy_file 'react/components/hello-world.jsx', 'app/react/components/hello-world.jsx'
15
+ inject_into_file 'app/react/index.js', after: "RWR.run();\n" do <<-'JS'.strip_heredoc
16
+
17
+ import HelloWorld from './components/hello-world';
18
+ RWR.registerComponent('HelloWorld', HelloWorld);
19
+ JS
20
+ end
21
+ end
22
+
23
+ def controller_and_view
24
+ copy_file 'examples/react_examples_controller.rb', 'app/controllers/react_examples_controller.rb'
25
+ template = "examples/#{options.server_side ? 'ssr-' : ''}component_view.html.erb"
26
+ copy_file template, 'app/views/react_examples/component.html.erb'
27
+ end
28
+
29
+ def example_route
30
+ route "get 'react_examples/component', to: 'react_examples#component', as: :component"
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,34 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ require 'generators/react_webpack_rails/merge_helpers'
4
+
5
+ class HotReloadGenerator < Rails::Generators::Base
6
+ include MergeHelpers
7
+ desc 'Add hot reload setup'
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ class_option :tmp_package,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: 'Force update tmp/package.json instead package.json'
14
+
15
+ def package
16
+ merge_options = options.tmp_package ? { package_file: 'tmp/package.json', force: true } : {}
17
+ merge_into_package 'packages/hot-reload.json', merge_options
18
+ end
19
+
20
+ def hot_dev_config
21
+ copy_file 'webpack/hot-dev.config.js', 'webpack/hot-dev.config.js'
22
+ end
23
+
24
+ def partial
25
+ copy_file 'partial/_react_hot_assets.html.erb', 'app/views/layouts/_react_hot_assets.html.erb'
26
+
27
+ inject_into_file 'app/views/layouts/application.html.erb', after: "<body>\n" do <<-'HTML'.strip_heredoc
28
+ <%= render 'layouts/react_hot_assets' %>
29
+ HTML
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,26 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ require 'generators/react_webpack_rails/merge_helpers'
4
+
5
+ class KarmaSetup < Rails::Generators::Base
6
+ include MergeHelpers
7
+ desc 'Add karma setup with mocha and except'
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ class_option :tmp_package,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: 'Force update tmp/package.json instead package.json'
14
+
15
+ def package
16
+ merge_options = options.tmp_package ? { package_file: 'tmp/package.json', force: true } : {}
17
+ merge_into_package 'packages/js-specs.json', merge_options
18
+ end
19
+
20
+ def karma_config
21
+ copy_file 'karma.conf.js', 'karma.conf.js'
22
+ copy_file 'webpack/tests.config.js', 'webpack/tests.config.js'
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ require 'generators/react_webpack_rails/merge_helpers'
4
+
5
+ class ReactRouterGenerator < Rails::Generators::Base
6
+ include MergeHelpers
7
+ desc 'Add react-router setup'
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ class_option :tmp_package,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: 'Force update tmp/package.json instead package.json'
14
+
15
+ def package
16
+ merge_options = options.tmp_package ? { package_file: 'tmp/package.json', force: true } : {}
17
+ merge_into_package 'packages/react-router.json', merge_options
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,30 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ require 'generators/react_webpack_rails/merge_helpers'
4
+
5
+ class ServerSideGenerator < Rails::Generators::Base
6
+ include MergeHelpers
7
+ desc 'Add and setup node server for server side execution'
8
+ source_root File.expand_path('../../templates', __FILE__)
9
+
10
+ class_option :tmp_package,
11
+ type: :boolean,
12
+ default: false,
13
+ desc: 'Force update tmp/package.json instead package.json'
14
+
15
+ def package
16
+ merge_options = options.tmp_package ? { package_file: 'tmp/package.json', force: true } : {}
17
+ merge_into_package 'packages/server-side.json', merge_options
18
+ end
19
+
20
+ def forever
21
+ copy_file 'forever/development.json', 'forever/development.json'
22
+ copy_file 'forever/production.json', 'forever/production.json'
23
+ end
24
+
25
+ def node_server
26
+ copy_file 'react/node_server.js', 'app/react/node_server.js'
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,34 +1,66 @@
1
1
  module ReactWebpackRails
2
2
  class InstallGenerator < Rails::Generators::Base
3
+ desc 'Prepare files necessary to use react-webpack-rails gem in a rails app.'
3
4
  source_root File.expand_path('../templates', __FILE__)
4
- class_option :example, type: :boolean, default: true, desc: 'Include example component and test files.'
5
- class_option :router, type: :boolean, default: true, desc: 'Add and expose react-router globally.'
6
-
7
-
8
- def generate_layout
9
- copy_file '.babelrc', '.babelrc'
10
- copy_file 'webpack.config.js', 'webpack.config.js'
11
- copy_file 'webpack/dev.config.js', 'webpack/dev.config.js'
12
- copy_file 'webpack/hot-dev.config.js', 'webpack/hot-dev.config.js'
13
- copy_file 'webpack/production.config.js', 'webpack/production.config.js'
14
- copy_file 'karma.conf.js', 'karma.conf.js'
15
- copy_file 'webpack/tests.config.js', 'webpack/tests.config.js'
16
- copy_file 'partial/_react_hot_assets.html.erb', 'app/views/layouts/_react_hot_assets.html.erb'
17
- template 'react/index.js.erb', 'app/react/index.js'
18
- create_file 'app/assets/javascripts/react_bundle.js'
19
- if options.example
20
- copy_file 'react/components/hello-world.jsx', 'app/react/components/hello-world.jsx'
21
- copy_file 'react/components/hello-world-test.jsx', 'app/react/components/hello-world-test.jsx'
22
- else
23
- create_file 'app/react/components/.keep'
24
- end
25
- template 'package.json.erb', 'package.json'
26
- end
27
-
28
- private
29
-
30
- def file_name
31
- layout_name.underscore
5
+
6
+ class_option :example,
7
+ type: :boolean,
8
+ default: true,
9
+ desc: 'Run example generator.'
10
+ class_option :server_side,
11
+ type: :boolean,
12
+ default: true,
13
+ desc: 'Run server_side generator'
14
+ class_option :hot_reload,
15
+ type: :boolean,
16
+ default: true,
17
+ desc: 'Run hot_reload generator'
18
+ class_option :karma_setup,
19
+ type: :boolean,
20
+ default: true,
21
+ desc: 'Run karma_setup generator'
22
+ class_option :react_router,
23
+ type: :boolean,
24
+ default: false,
25
+ desc: 'Run react_router generator'
26
+
27
+ def generate_core
28
+ generate 'react_webpack_rails:install:core --tmp-package'
29
+ end
30
+
31
+ def generate_hot_reload
32
+ return unless options.hot_reload
33
+ generate 'react_webpack_rails:install:hot_reload --tmp-package'
34
+ end
35
+
36
+ def generate_server_side
37
+ return unless options.server_side
38
+ generate 'react_webpack_rails:install:server_side --tmp-package'
39
+ end
40
+
41
+ def generate_karma_setup
42
+ return unless options.karma_setup
43
+ generate 'react_webpack_rails:install:karma_setup --tmp-package'
44
+ end
45
+
46
+ def generate_example
47
+ return unless options.example
48
+ example_generator = 'react_webpack_rails:install:example'
49
+ example_generator += ' --server-side' if options.server_side
50
+ generate example_generator
51
+ end
52
+
53
+ def generate_react_router
54
+ return unless options.react_router
55
+ generate 'react_webpack_rails:install:react_router --tmp_package'
56
+ end
57
+
58
+ def copy_package
59
+ create_file 'package.json', File.read(Rails.root.join('tmp/package.json'))
60
+ end
61
+
62
+ def cleanup
63
+ remove_file('tmp/package.json')
32
64
  end
33
65
  end
34
66
  end
@@ -0,0 +1,26 @@
1
+ module ReactWebpackRails
2
+ module Install
3
+ module MergeHelpers
4
+ require 'generators/react_webpack_rails/package_merge'
5
+
6
+ private
7
+
8
+ def load_json(file)
9
+ JSON.load(Rails.root.join(file))
10
+ end
11
+
12
+ def merge_into_package(file, options = {})
13
+ package_file = options.fetch(:package_file, 'package.json')
14
+ copy_file file, "tmp/#{file}"
15
+
16
+ extending = load_json("tmp/#{file}")
17
+ base = load_json(package_file)
18
+
19
+ merged = PackageMerge.new(base, extending).merge
20
+ create_file package_file, JSON.pretty_generate(merged), force: options.fetch(:force, false)
21
+
22
+ remove_file("tmp/#{file}")
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,21 @@
1
+ class PackageMerge
2
+ def initialize(base, extending)
3
+ @base_package = base
4
+ @extending = extending
5
+ end
6
+
7
+ def merge
8
+ %w(dependencies devDependencies scripts).each do |key|
9
+ base_package[key] = merge_and_sort_level(key)
10
+ end
11
+ base_package
12
+ end
13
+
14
+ private
15
+
16
+ attr_accessor :base_package, :extending
17
+
18
+ def merge_and_sort_level(key)
19
+ base_package[key].merge(extending.fetch(key, {})).sort.to_h
20
+ end
21
+ end
@@ -0,0 +1 @@
1
+ <%= react_component('HelloWorld', name: @name) %>
@@ -0,0 +1,5 @@
1
+ class ReactExamplesController < ApplicationController
2
+ def component
3
+ @name = 'test'
4
+ end
5
+ end
@@ -0,0 +1 @@
1
+ <%= react_component('HelloWorld', { name: @name }, { server_side: true }) %>
@@ -0,0 +1,8 @@
1
+ {
2
+ "uid": "rwr-node-server",
3
+ "append": true,
4
+ "script": "node_server.js",
5
+ "sourceDir": "./app/react",
6
+ "watch": true,
7
+ "watchDirectory": "./app/react"
8
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "uid": "rwr-node-server",
3
+ "append": true,
4
+ "script": "node_server.js",
5
+ "sourceDir": "./app/react"
6
+ }
@@ -1,20 +1,9 @@
1
1
  {
2
- "name": "<%="#{Rails.application.class.parent_name}"%>",
2
+ "private": true,
3
3
  "devDependencies": {
4
4
  "babel-eslint": "^5.0.0-beta6",
5
5
  "eslint": "^1.7.3",
6
6
  "eslint-plugin-react": "^3.6.3",
7
- "expect": "^1.12.2",
8
- "karma": "^0.13.13",
9
- "karma-chrome-launcher": "^0.2.1",
10
- "karma-mocha": "^0.2.0",
11
- "karma-sinon": "^1.0.4",
12
- "karma-sourcemap-loader": "^0.3.6",
13
- "karma-webpack": "^1.7.0",
14
- "mocha": "^2.3.4",
15
- "sinon": "^1.17.2",
16
- "react-hot-loader": "^1.3.0",
17
- "webpack-dev-server": "^1.12.1",
18
7
  "webpack-notifier": "^1.2.1"
19
8
  },
20
9
  "dependencies": {
@@ -27,16 +16,12 @@
27
16
  "node-sass": "^3.3.3",
28
17
  "react": "^0.14.0",
29
18
  "react-dom": "^0.14.0",
30
- <%= options.router ? ' "react-router": "1.0.0-rc3",' : ''%>
31
- "react-tools": "*",
32
19
  "react-webpack-rails": "0.1.0",
33
20
  "sass-loader": "^3.0.0",
34
21
  "webpack": "^1.12.1"
35
22
  },
36
23
  "scripts": {
37
- "test": "karma start",
38
24
  "start": "webpack -w --config webpack/dev.config.js",
39
- "start-hot-dev": "webpack-dev-server --hot --inline --config webpack/hot-dev.config.js",
40
25
  "build": "webpack -p --config webpack/production.config.js"
41
26
  },
42
27
  "license": "",
@@ -0,0 +1,9 @@
1
+ {
2
+ "devDependencies": {
3
+ "react-hot-loader": "^1.3.0",
4
+ "webpack-dev-server": "^1.12.1"
5
+ },
6
+ "scripts": {
7
+ "start-hot-dev": "webpack-dev-server --hot --inline --config webpack/hot-dev.config.js"
8
+ }
9
+ }
@@ -0,0 +1,16 @@
1
+ {
2
+ "devDependencies": {
3
+ "expect": "^1.12.2",
4
+ "karma": "^0.13.13",
5
+ "karma-chrome-launcher": "^0.2.1",
6
+ "karma-mocha": "^0.2.0",
7
+ "karma-sinon": "^1.0.4",
8
+ "karma-sourcemap-loader": "^0.3.6",
9
+ "karma-webpack": "^1.7.0",
10
+ "mocha": "^2.3.4",
11
+ "sinon": "^1.17.2"
12
+ },
13
+ "scripts": {
14
+ "test": "karma start"
15
+ }
16
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "react-router": "^1.0.0"
4
+ }
5
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "dependencies": {
3
+ "forever": "^0.15.0",
4
+ "http": "*",
5
+ "httpdispatcher": "^0.4.0"
6
+ },
7
+ "scripts": {
8
+ "rwr-node-dev-server": "forever forever/development.json",
9
+ "rwr-node-server": "forever -o log/rwr-server-out.log -e log/rwr-server-err.log forever/production.json"
10
+ }
11
+ }
@@ -1,7 +1,13 @@
1
1
  import React from 'react';
2
2
 
3
- export default class HelloWorld extends React.Component {
3
+ class HelloWorld extends React.Component {
4
4
  render() {
5
- return <div>Hello World</div>;
5
+ return(
6
+ <div>
7
+ <p>Hello World {this.props.name}</p>
8
+ </div>
9
+ );
6
10
  }
7
11
  }
12
+
13
+ export default HelloWorld;
@@ -0,0 +1,2 @@
1
+ import RWR from 'react-webpack-rails';
2
+ RWR.run();
@@ -0,0 +1,38 @@
1
+ global.__RWR_ENV__ = {};
2
+ require('babel-core/register');
3
+ const IM = require('react-webpack-rails').integrationsManager;
4
+ require('./index');
5
+
6
+ const http = require('http');
7
+ const dispatcher = require('httpdispatcher');
8
+ const PORT = 8081;
9
+
10
+ function handleRequest(request, response){
11
+ try {
12
+ console.log(`started: ${request.method} "${request.url}" at ${new Date().toLocaleTimeString()}`);
13
+ dispatcher.dispatch(request, response);
14
+ } catch(ex) {
15
+ console.log(ex)
16
+ response.writeHead(500);
17
+ response.end(ex.name + ': ' + ex.message);
18
+ }
19
+ }
20
+
21
+ dispatcher.onPost("/run", function(request, response) {
22
+ try {
23
+ const data = JSON.parse(request.body);
24
+ const result = IM.runNodeIntegration(data);
25
+ response.writeHead(200, {'Content-Type': 'text/plain'});
26
+ response.end(result);
27
+ } catch(ex) {
28
+ console.log(ex)
29
+ response.writeHead(500);
30
+ response.end("nodeRun failed:\n" + ex.name + ': ' + ex.message);
31
+ }
32
+ });
33
+
34
+ const server = http.createServer(handleRequest);
35
+
36
+ server.listen(PORT, function(){
37
+ console.log("Server listening on: http://localhost:%s", PORT);
38
+ });
@@ -1,3 +1,9 @@
1
1
  require 'react_webpack_rails/version'
2
- require 'react_webpack_rails/engine' if defined?(Rails)
3
- require 'react_webpack_rails/railtie' if defined?(Rails)
2
+ if defined?(Rails)
3
+ require 'react_webpack_rails/engine'
4
+ require 'react_webpack_rails/railtie'
5
+ require 'react_webpack_rails/node_helpers'
6
+ require 'react_webpack_rails/node_integration_runner'
7
+ require 'react_webpack_rails/errors/base'
8
+ require 'react_webpack_rails/errors/node_failure'
9
+ end
@@ -0,0 +1,11 @@
1
+ module Errors
2
+ class Base < RuntimeError
3
+ def status
4
+ fail NotImplementedError
5
+ end
6
+
7
+ def message
8
+ fail NotImplementedError
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,13 @@
1
+ module Errors
2
+ class NodeFailure < Base
3
+ attr_accessor :message
4
+
5
+ def initialize(message)
6
+ @message = message
7
+ end
8
+
9
+ def status
10
+ 500
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,7 @@
1
+ module ReactWebpackRails
2
+ module NodeHelpers
3
+ def node_uri(path = '')
4
+ URI(Rails.application.config.rwr.node_server_host).merge(path)
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,35 @@
1
+ module ReactWebpackRails
2
+ class NodeIntegrationRunner
3
+ include NodeHelpers
4
+
5
+ def initialize(integration_name, payload)
6
+ @integration_name = integration_name
7
+ @payload = payload
8
+ end
9
+
10
+ def run
11
+ response = Net::HTTP.start(node_uri.host, node_uri.port) do |http|
12
+ http.request(request)
13
+ end
14
+ if response.code.to_i >= 500
15
+ fail Errors::NodeFailure, response.body
16
+ else
17
+ response.body.force_encoding('utf-8')
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ attr_reader :integration_name, :payload
24
+
25
+ def data_hash
26
+ { integrationName: integration_name, payload: payload }
27
+ end
28
+
29
+ def request
30
+ request = Net::HTTP::Post.new(node_uri('run'))
31
+ request.body = data_hash.to_json
32
+ request
33
+ end
34
+ end
35
+ end
@@ -1,14 +1,35 @@
1
1
  require 'react_webpack_rails/view_helpers'
2
+ require 'react_webpack_rails/react_component_renderer'
2
3
 
3
4
  module ReactWebpackRails
4
5
  class Railtie < ::Rails::Railtie
6
+ # Sensible defaults. Can be overridden in application.rb.
7
+
8
+ # gem related config default:
9
+ config.rwr = ActiveSupport::OrderedOptions.new
10
+ config.rwr.node_server_host = 'http://localhost:8081/'
11
+
12
+ # react integration related config default:
5
13
  config.react = ActiveSupport::OrderedOptions.new
6
- # Sensible defaults. Can be overridden in application.rb
7
- config.react.camelize_props = false # pass in an underscored hash but get a camelized hash
14
+ config.react.camelize_props = false
15
+ config.react.server_side = false
8
16
  config.react.shared = {}
9
17
 
10
18
  initializer 'react_webpack_rails.view_helpers' do
11
19
  ActionView::Base.send :include, ViewHelpers
12
20
  end
21
+
22
+ initializer 'react_webpack_rails.add_react_component_renderer' do
23
+ ActionController::Renderers.add :react_component do |name, options = {}|
24
+ renderer = ReactWebpackRails::ReactComponentRenderer.new
25
+ component_options = options.slice(:aria, :class, :data, :id, :tag, :server_side)
26
+ props = options.delete(:props)
27
+
28
+ html = renderer.call(name, props, component_options)
29
+ render_options = options.merge(inline: html)
30
+
31
+ render(render_options)
32
+ end
33
+ end
13
34
  end
14
35
  end
@@ -0,0 +1,13 @@
1
+ module ReactWebpackRails
2
+ class ReactComponentRenderer
3
+ include ReactWebpackRails::ViewHelpers
4
+ include ActionView::Helpers::TagHelper
5
+ include ActionView::Helpers::TextHelper
6
+
7
+ attr_accessor :output_buffer
8
+
9
+ def call(name, props, options)
10
+ react_component(name, props, options)
11
+ end
12
+ end
13
+ end
@@ -1,3 +1,3 @@
1
1
  module ReactWebpackRails
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
@@ -11,10 +11,17 @@ module ReactWebpackRails
11
11
  content_tag(html_tag, '', html_options, &block)
12
12
  end
13
13
 
14
- def react_component(name, raw_props = {}, options = { ssr: false })
14
+ def react_component(name, raw_props = {}, options = {})
15
15
  props = raw_props.as_json
16
16
  props = camelize_props_key(props) if Rails.application.config.react.camelize_props
17
- react_element('react-component', { props: props, name: name }, options)
17
+ if server_side(options.delete(:server_side))
18
+ result = NodeIntegrationRunner.new('react-component', props: props, name: name).run
19
+ react_element('react-component', { props: props, name: name }, options) do
20
+ result.html_safe
21
+ end
22
+ else
23
+ react_element('react-component', { props: props, name: name }, options)
24
+ end
18
25
  end
19
26
 
20
27
  def react_router(name)
@@ -30,5 +37,9 @@ module ReactWebpackRails
30
37
  h
31
38
  end
32
39
  end
40
+
41
+ def server_side(server_side)
42
+ server_side.nil? ? Rails.application.config.react.server_side : server_side
43
+ end
33
44
  end
34
45
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-webpack-rails",
3
- "version": "0.1.2",
3
+ "version": "0.2.0",
4
4
  "description": "Js part of react_webpack_rails - webpack based React & Rails integration.",
5
5
  "main": "js/lib/index.js",
6
6
  "files": [
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: react_webpack_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafał Gawlik
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-02-03 00:00:00.000000000 Z
12
+ date: 2016-02-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -81,6 +81,7 @@ files:
81
81
  - ".rspec"
82
82
  - ".travis.yml"
83
83
  - CHANGELOG.md
84
+ - CONTRIBUTING.md
84
85
  - Gemfile
85
86
  - LICENSE.txt
86
87
  - README.md
@@ -90,6 +91,8 @@ files:
90
91
  - docs/README.md
91
92
  - docs/api.md
92
93
  - docs/deployment.md
94
+ - docs/install_generator.md
95
+ - docs/server_side_rendering.md
93
96
  - js/.eslintrc
94
97
  - js/src/env.js
95
98
  - js/src/index.js
@@ -104,14 +107,32 @@ files:
104
107
  - js/test/integrations/react.spec.js
105
108
  - js/test/nodes.spec.js
106
109
  - lib/assets/javascripts/react_integration.js.erb
110
+ - lib/generators/react_webpack_rails/install/core_generator.rb
111
+ - lib/generators/react_webpack_rails/install/example_generator.rb
112
+ - lib/generators/react_webpack_rails/install/hot_reload_generator.rb
113
+ - lib/generators/react_webpack_rails/install/karma_setup_generator.rb
114
+ - lib/generators/react_webpack_rails/install/react_router_generator.rb
115
+ - lib/generators/react_webpack_rails/install/server_side_generator.rb
107
116
  - lib/generators/react_webpack_rails/install_generator.rb
117
+ - lib/generators/react_webpack_rails/merge_helpers.rb
118
+ - lib/generators/react_webpack_rails/package_merge.rb
108
119
  - lib/generators/react_webpack_rails/templates/.babelrc
120
+ - lib/generators/react_webpack_rails/templates/examples/component_view.html.erb
121
+ - lib/generators/react_webpack_rails/templates/examples/react_examples_controller.rb
122
+ - lib/generators/react_webpack_rails/templates/examples/ssr-component_view.html.erb
123
+ - lib/generators/react_webpack_rails/templates/forever/development.json
124
+ - lib/generators/react_webpack_rails/templates/forever/production.json
109
125
  - lib/generators/react_webpack_rails/templates/karma.conf.js
110
- - lib/generators/react_webpack_rails/templates/package.json.erb
126
+ - lib/generators/react_webpack_rails/templates/packages/core.json
127
+ - lib/generators/react_webpack_rails/templates/packages/hot-reload.json
128
+ - lib/generators/react_webpack_rails/templates/packages/js-specs.json
129
+ - lib/generators/react_webpack_rails/templates/packages/react-router.json
130
+ - lib/generators/react_webpack_rails/templates/packages/server-side.json
111
131
  - lib/generators/react_webpack_rails/templates/partial/_react_hot_assets.html.erb
112
132
  - lib/generators/react_webpack_rails/templates/react/components/hello-world-test.jsx
113
133
  - lib/generators/react_webpack_rails/templates/react/components/hello-world.jsx
114
- - lib/generators/react_webpack_rails/templates/react/index.js.erb
134
+ - lib/generators/react_webpack_rails/templates/react/index.js
135
+ - lib/generators/react_webpack_rails/templates/react/node_server.js
115
136
  - lib/generators/react_webpack_rails/templates/webpack.config.js
116
137
  - lib/generators/react_webpack_rails/templates/webpack/dev.config.js
117
138
  - lib/generators/react_webpack_rails/templates/webpack/hot-dev.config.js
@@ -119,7 +140,12 @@ files:
119
140
  - lib/generators/react_webpack_rails/templates/webpack/tests.config.js
120
141
  - lib/react_webpack_rails.rb
121
142
  - lib/react_webpack_rails/engine.rb
143
+ - lib/react_webpack_rails/errors/base.rb
144
+ - lib/react_webpack_rails/errors/node_failure.rb
145
+ - lib/react_webpack_rails/node_helpers.rb
146
+ - lib/react_webpack_rails/node_integration_runner.rb
122
147
  - lib/react_webpack_rails/railtie.rb
148
+ - lib/react_webpack_rails/react_component_renderer.rb
123
149
  - lib/react_webpack_rails/version.rb
124
150
  - lib/react_webpack_rails/view_helpers.rb
125
151
  - package.json
@@ -1,10 +0,0 @@
1
- import RWR from 'react-webpack-rails';
2
- window.RWR = RWR;
3
- <% if options.example %>
4
- import HelloWorld from './components/hello-world';
5
- RWR.registerComponent('HelloWorld', HelloWorld);
6
- <% else %>
7
- // example usage:
8
- // import HelloWorld from './components/hello-world';
9
- // RWR.registerComponent('HelloWorld', HelloWorld);
10
- <% end %>