rwr-react_router 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a3833f3d96ddf37b3fbb317b63d5792732242f3
4
- data.tar.gz: cb17d557a4919ff1f8af7922287e84b327577cb3
3
+ metadata.gz: a82a539d7fa4cc94968d47f181921640262c3e0b
4
+ data.tar.gz: 01711290a407177f24f836f001b5b356a0cde023
5
5
  SHA512:
6
- metadata.gz: af6cc16e5dab4b9bfe781b7538ad14aab6896b0efcf37663447d5abd969406ee6b8d5090326bc7df8b33c6ce2175cd178f5095a86b617ce1eae8c82b6e91f07d
7
- data.tar.gz: 3326daef28a1425b97d67178dfb947139d7ef39e6dc92ba36d41baf70af7f21e92c58c66b7501fd56098cc3820a8d79eda3d90c0ef2186dbb0cecd1fcf3f09eb
6
+ metadata.gz: 1f2e3315b1944e2fa4f67672d72ba6c5af94e9680cc87f60ef53028edfe6ce8930db12f86ab1f3427057942f5e8627d701dc0d8e1697c87efeb6485b41b7e0b3
7
+ data.tar.gz: 125f5b0ac9cebb1f68031efa3d012827c553a0edfd1ce71a6f26a9cd6f797659d935325a024f2a49ac18f49fec9d0db08146220c5349398949441db38d5bb4ce
@@ -22,6 +22,8 @@ matrix:
22
22
  env: TEST_SUITE=node
23
23
 
24
24
  before_script:
25
+ - nvm install 4.1
26
+ - nvm use 4.1
25
27
  - npm install -g npm@^2.0
26
28
  - npm install -g webpack@^1.12.1
27
29
  - bundle exec rake setup:$TEST_SUITE
@@ -1,3 +1,7 @@
1
+ ## 0.3.0 26 March 2016
2
+ * support server-side render,
3
+ * handle redirect and missing route Rails side.
4
+
1
5
  ## 0.2.0 21 March 2016
2
6
  * support passing props to router.
3
7
 
data/README.md CHANGED
@@ -24,6 +24,13 @@ $ npm install --save rwr-react-router
24
24
  import RWRReactRouter from 'rwr-react-router';
25
25
  ```
26
26
 
27
+ * Register integration in RWR using RWR's IntegrationsManager manager:
28
+
29
+ ```js
30
+ import { integrationsManager } from 'react-webpack-rails';
31
+ integrationsManager.register('react-router', RWRReactRouter.integrationWrapper);
32
+ ```
33
+
27
34
  * Register one of your routers:
28
35
  ```js
29
36
  RWRReactRouter.register('MyRouter', MyRouter);
@@ -52,6 +59,29 @@ function RouterWithProps(props) {
52
59
 
53
60
  Props passed to route will be available under `props.route.yourName`.
54
61
 
62
+ ### Server side rendering.
63
+ To make router work server-side it need to work on browserHistory. Otherwise, rails don't have access to current route in request. This can be achieved by adding wildcard route to rails routes:
64
+ ```ruby
65
+ get '/server_side/' => 'pages#server_side'
66
+ get '/server_side/*path' => 'pages#server_side'
67
+ ```
68
+ and setting browserHistory for router:
69
+ ```js
70
+ <Router history={browserHistory}>
71
+ <Route path="/server_side" component={App}>
72
+ ...
73
+ </Route>
74
+ </Router>
75
+ ```
76
+ **note:** react router will analyze whole path so don't forget to add rails path part to it.
77
+
78
+ With valid setup simply enable server side by passing `server_side: true` flag in options:
79
+ ```erb
80
+ <%= react_router('MyRouter', { foo: :bar }, server_side: true) %>
81
+ ```
82
+
83
+ **note:** rwr-react_router automatically handles matching, redirects and routing errors. Redirects and 404's are passed to Rails and handled there so you will be redirect or get 404 page like in normal Rails app.
84
+
55
85
  ## Contributing
56
86
  ## Issues
57
87
 
data/Rakefile CHANGED
@@ -16,10 +16,18 @@ namespace :test do
16
16
  task :gem do
17
17
  sh %Q(bundle exec rspec spec/rwr-react_router.rb)
18
18
  end
19
+
19
20
  desc 'Run rspec for rails4 application'
20
21
  task :rails4 do
21
22
  Bundler.with_clean_env do
22
- sh %Q(cd spec/rails4_dummy_app && npm run build && bundle exec rspec)
23
+ sh %(
24
+ cd spec/rails4_dummy_app &&
25
+ npm run build &&
26
+ npm run rwr-background-node &&
27
+ sleep 3 &&
28
+ bundle exec rspec &&
29
+ npm run rwr-stop-background-node
30
+ )
23
31
  end
24
32
  end
25
33
  end
@@ -1,4 +1,7 @@
1
+ import React from 'react';
2
+ import { match, RouterContext } from 'react-router';
1
3
  import ReactDOM from 'react-dom';
4
+ import ReactDOMServer from 'react-dom/server';
2
5
  import VERSION from './version';
3
6
 
4
7
  class ReactRouterIntegration {
@@ -27,9 +30,7 @@ class ReactRouterIntegration {
27
30
  );
28
31
  }
29
32
  this.enabled = true;
30
- const constructor = this.get(name);
31
- const router = typeof(constructor) === 'function' ? constructor(props) : constructor;
32
- ReactDOM.render(router, node);
33
+ ReactDOM.render(this._initializeRouter(name, props), node);
33
34
  }
34
35
 
35
36
  unmount(node) {
@@ -37,6 +38,34 @@ class ReactRouterIntegration {
37
38
  this.enabled = false;
38
39
  }
39
40
 
41
+ _initializeRouter(name, props) {
42
+ const constructor = this.get(name);
43
+ return typeof(constructor) === 'function' ? constructor(props) : constructor;
44
+ }
45
+
46
+ renderRouterToString(routerName, props, href) {
47
+ const routes = this._initializeRouter(routerName, props);
48
+ const result = {
49
+ body: '',
50
+ code: 0,
51
+ };
52
+
53
+ match({ routes, location: href }, (error, redirectLocation, renderProps) => {
54
+ if (error) {
55
+ throw error;
56
+ } else if (redirectLocation) {
57
+ result.code = 302;
58
+ result.redirectUri = `${redirectLocation.pathname}${redirectLocation.search}`;
59
+ } else if (renderProps) {
60
+ result.body = ReactDOMServer.renderToString(<RouterContext {...renderProps} />);
61
+ result.code = 200;
62
+ } else {
63
+ result.code = 404;
64
+ }
65
+ });
66
+ return JSON.stringify(result);
67
+ }
68
+
40
69
  get integrationWrapper() {
41
70
  return {
42
71
  mount: function _mount(node, payload) {
@@ -46,6 +75,10 @@ class ReactRouterIntegration {
46
75
  unmount: function _unmount(node) {
47
76
  this.unmount(node);
48
77
  }.bind(this),
78
+
79
+ nodeRun: function _prerender(payload) {
80
+ return this.renderRouterToString(payload.name, payload.props, payload.path);
81
+ }.bind(this),
49
82
  };
50
83
  }
51
84
  }
@@ -1 +1 @@
1
- export default '0.2.0';
1
+ export default '0.3.0';
@@ -1,5 +1,5 @@
1
1
  module ReactWebpackRails
2
2
  module ReactRouterIntegration
3
- VERSION = '0.2.0'
3
+ VERSION = '0.3.0'
4
4
  end
5
5
  end
@@ -1,8 +1,37 @@
1
1
  module ReactWebpackRails
2
2
  module ReactRouterIntegration
3
3
  module ViewHelpers
4
- def react_router(name, props = {})
5
- react_element('react-router', name: name, props: props)
4
+ def react_router(name, props = {}, options = {})
5
+ payload = { name: name, props: props }
6
+ result = ''
7
+ if server_side?(options.delete(:server_side))
8
+ result = execute_router_server_side!(payload, request.path)
9
+ end
10
+ react_element('react-router', payload, options) { result }
11
+ end
12
+
13
+ private
14
+
15
+ def routing_error(name, path)
16
+ "RactRouter: No route found in #{name} router for #{path}."
17
+ end
18
+
19
+ def server_side?(server_side)
20
+ server_side.nil? ? Rails.application.config.react.server_side : server_side
21
+ end
22
+
23
+ def execute_router_server_side!(payload, path)
24
+ runner = NodeIntegrationRunner.new('react-router', payload.merge(path: path))
25
+ result = JSON.parse(runner.run)
26
+
27
+ case result['code']
28
+ when 200
29
+ result['body'].html_safe
30
+ when 302
31
+ controller.redirect_to result['redirectUri']
32
+ else
33
+ fail ActionController::RoutingError, routing_error(payload[:name], path)
34
+ end
6
35
  end
7
36
  end
8
37
  end
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rwr-react-router",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "",
5
5
  "main": "js/lib/index.js",
6
6
  "files": [
@@ -28,7 +28,8 @@
28
28
  "react-dom": "^0.14.0"
29
29
  },
30
30
  "dependencies": {
31
- "react-webpack-rails": "^0.1.0"
31
+ "react-webpack-rails": "^0.1.0",
32
+ "react-router": "^2.0.1"
32
33
  },
33
34
  "devDependencies": {
34
35
  "babel-cli": "^6.4.0",
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rwr-react_router
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Rafał Gawlik
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-03-21 00:00:00.000000000 Z
11
+ date: 2016-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler