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.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/CHANGELOG.md +30 -0
- data/CONTRIBUTING.md +17 -0
- data/README.md +23 -10
- data/docs/README.md +4 -2
- data/docs/api.md +18 -4
- data/docs/install_generator.md +55 -0
- data/docs/server_side_rendering.md +33 -0
- data/js/src/index.js +30 -17
- data/js/src/integrations-manager.js +9 -0
- data/js/src/integrations/react.js +11 -0
- data/js/src/version.js +1 -1
- data/lib/generators/react_webpack_rails/install/core_generator.rb +47 -0
- data/lib/generators/react_webpack_rails/install/example_generator.rb +34 -0
- data/lib/generators/react_webpack_rails/install/hot_reload_generator.rb +34 -0
- data/lib/generators/react_webpack_rails/install/karma_setup_generator.rb +26 -0
- data/lib/generators/react_webpack_rails/install/react_router_generator.rb +21 -0
- data/lib/generators/react_webpack_rails/install/server_side_generator.rb +30 -0
- data/lib/generators/react_webpack_rails/install_generator.rb +60 -28
- data/lib/generators/react_webpack_rails/merge_helpers.rb +26 -0
- data/lib/generators/react_webpack_rails/package_merge.rb +21 -0
- data/lib/generators/react_webpack_rails/templates/examples/component_view.html.erb +1 -0
- data/lib/generators/react_webpack_rails/templates/examples/react_examples_controller.rb +5 -0
- data/lib/generators/react_webpack_rails/templates/examples/ssr-component_view.html.erb +1 -0
- data/lib/generators/react_webpack_rails/templates/forever/development.json +8 -0
- data/lib/generators/react_webpack_rails/templates/forever/production.json +6 -0
- data/lib/generators/react_webpack_rails/templates/{package.json.erb → packages/core.json} +1 -16
- data/lib/generators/react_webpack_rails/templates/packages/hot-reload.json +9 -0
- data/lib/generators/react_webpack_rails/templates/packages/js-specs.json +16 -0
- data/lib/generators/react_webpack_rails/templates/packages/react-router.json +5 -0
- data/lib/generators/react_webpack_rails/templates/packages/server-side.json +11 -0
- data/lib/generators/react_webpack_rails/templates/react/components/hello-world.jsx +8 -2
- data/lib/generators/react_webpack_rails/templates/react/index.js +2 -0
- data/lib/generators/react_webpack_rails/templates/react/node_server.js +38 -0
- data/lib/react_webpack_rails.rb +8 -2
- data/lib/react_webpack_rails/errors/base.rb +11 -0
- data/lib/react_webpack_rails/errors/node_failure.rb +13 -0
- data/lib/react_webpack_rails/node_helpers.rb +7 -0
- data/lib/react_webpack_rails/node_integration_runner.rb +35 -0
- data/lib/react_webpack_rails/railtie.rb +23 -2
- data/lib/react_webpack_rails/react_component_renderer.rb +13 -0
- data/lib/react_webpack_rails/version.rb +1 -1
- data/lib/react_webpack_rails/view_helpers.rb +13 -2
- data/package.json +1 -1
- metadata +30 -4
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c981ff55a0491767f0c8b6b521117293422993b1
|
4
|
+
data.tar.gz: 0fa4f59a58b398701a14d16b6dc089977f63edb8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: be91c9be8c46a94a70fd0100448e6a2e77b4c8ed4828f78799c4a920d896608d9a13b9ebf6d255f2fc90044e30e79553b0cb3c270338c4b9e42cfc89571d0adc
|
7
|
+
data.tar.gz: fb0566a5a651221b866e4cac13a98eb861d4cd3a70eee3f03941da8a147825cf6853fff45480ee48273193f4a0f82db25d8ab6973125d3586c8522fa20ab3d78
|
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
@@ -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
|
data/CONTRIBUTING.md
ADDED
@@ -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
|
-
|
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
|
-
|
134
|
-
|
147
|
+
See the [contribution guide](https://github.com/netguru/react_webpack_rails/blob/master/CONTRIBUTING.md).
|
135
148
|
|
136
149
|
## License
|
137
150
|
|
data/docs/README.md
CHANGED
@@ -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))
|
data/docs/api.md
CHANGED
@@ -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
|
-
|
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
|
-
|
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
|
-
|
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.
|
data/js/src/index.js
CHANGED
@@ -11,20 +11,33 @@ export { integrationsManager as integrationsManager };
|
|
11
11
|
export { env as env };
|
12
12
|
export { reactRouter as reactRouter };
|
13
13
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
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
|
}
|
data/js/src/version.js
CHANGED
@@ -1 +1 @@
|
|
1
|
-
export default '0.
|
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
|
-
|
5
|
-
class_option :
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
def
|
31
|
-
|
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 @@
|
|
1
|
+
<%= react_component('HelloWorld', { name: @name }, { server_side: true }) %>
|
@@ -1,20 +1,9 @@
|
|
1
1
|
{
|
2
|
-
"
|
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,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,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
|
-
|
3
|
+
class HelloWorld extends React.Component {
|
4
4
|
render() {
|
5
|
-
return
|
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,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
|
+
});
|
data/lib/react_webpack_rails.rb
CHANGED
@@ -1,3 +1,9 @@
|
|
1
1
|
require 'react_webpack_rails/version'
|
2
|
-
|
3
|
-
require 'react_webpack_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,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
|
-
|
7
|
-
config.react.
|
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
|
@@ -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 = {
|
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
|
-
|
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
|
data/package.json
CHANGED
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.
|
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-
|
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/
|
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
|
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 %>
|