react_on_rails 1.0.1 → 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +182 -56
- data/{LICENSE → docs/LICENSE} +0 -0
- data/docs/{gen-notes/reducers.md → additional_reading/generated_client_code.md} +5 -1
- data/docs/additional_reading/heroku_deployment.md +21 -0
- data/docs/{manual_configuration.md → additional_reading/manual_installation.md} +4 -63
- data/docs/{node_dependencies_and_npm.md → additional_reading/node_dependencies_and_npm.md} +0 -0
- data/docs/additional_reading/optional_configuration.md +34 -0
- data/docs/additional_reading/server_rendering_tips.md +16 -0
- data/docs/additional_reading/tips.md +10 -0
- data/{CODE_OF_CONDUCT.md → docs/code_of_conduct.md} +0 -0
- data/docs/{Contributing.md → contributing.md} +0 -0
- data/lib/generators/react_on_rails/base_generator.rb +35 -4
- data/lib/generators/react_on_rails/bootstrap_generator.rb +27 -7
- data/lib/generators/react_on_rails/generator_helper.rb +4 -2
- data/lib/generators/react_on_rails/install_generator.rb +13 -19
- data/lib/generators/react_on_rails/js_linters_generator.rb +19 -0
- data/lib/generators/react_on_rails/react_no_redux_generator.rb +7 -3
- data/lib/generators/react_on_rails/react_with_redux_generator.rb +6 -15
- data/lib/generators/react_on_rails/ruby_linters_generator.rb +33 -0
- data/lib/generators/react_on_rails/templates/base/base/client/app/bundles/HelloWorld/startup/globals.jsx.tt +5 -0
- data/lib/generators/react_on_rails/templates/{redux → base}/base/client/package.json.tt +23 -10
- data/lib/generators/react_on_rails/templates/base/base/client/server.js +8 -2
- data/lib/generators/react_on_rails/templates/base/base/client/{webpack.client.base.config.js → webpack.client.base.config.js.tt} +2 -1
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +1 -3
- data/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake +1 -3
- data/lib/generators/react_on_rails/templates/{linters/lib/tasks/linters.rake → base/base/lib/tasks/linters.rake.tt} +36 -29
- data/lib/generators/react_on_rails/templates/{linters → js_linters}/client/.eslintignore +0 -0
- data/lib/generators/react_on_rails/templates/{linters → js_linters}/client/.eslintrc +0 -0
- data/lib/generators/react_on_rails/templates/{linters → js_linters}/client/.jscsrc +0 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +12 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/index.jsx +2 -2
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/startup/{HelloWorldAppClient.jsx → HelloWorldAppClient.jsx.tt} +3 -2
- data/lib/generators/react_on_rails/templates/redux/base/client/app/lib/middlewares/loggerMiddleware.js +1 -5
- data/lib/generators/react_on_rails/templates/ruby_linters/.rubocop.yml +26 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/.scss-lint.yml +205 -0
- data/lib/generators/react_on_rails/templates/{linters → ruby_linters}/lib/tasks/brakeman.rake +0 -0
- data/lib/generators/react_on_rails/templates/{linters → ruby_linters}/lib/tasks/ci.rake +0 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/ruby-lint.yml +20 -0
- data/lib/react_on_rails/version.rb +1 -1
- metadata +29 -24
- data/docs/gen-notes/react_syntax.md +0 -3
- data/docs/linters.md +0 -25
- data/lib/generators/react_on_rails/linters_generator.rb +0 -38
- data/lib/generators/react_on_rails/templates/base/base/client/app/bundles/HelloWorld/startup/clientGlobals.jsx +0 -4
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx +0 -11
- data/lib/generators/react_on_rails/templates/no_redux/base/client/package.json.tt +0 -75
@@ -1,11 +1,9 @@
|
|
1
1
|
// This file is used by the webpack HMR dev server to load your component without using Rails
|
2
2
|
// It should simply match routes to basic HTML or jade files that render your component
|
3
3
|
/* eslint-disable no-console, func-names, no-var */
|
4
|
-
var bodyParser = require('body-parser');
|
5
4
|
var webpack = require('webpack');
|
6
5
|
var WebpackDevServer = require('webpack-dev-server');
|
7
6
|
var jade = require('jade');
|
8
|
-
var sleep = require('sleep');
|
9
7
|
var config = require('./webpack.client.hot.config');
|
10
8
|
|
11
9
|
var server = new WebpackDevServer(webpack(config), {
|
@@ -21,6 +19,14 @@ var server = new WebpackDevServer(webpack(config), {
|
|
21
19
|
},
|
22
20
|
});
|
23
21
|
|
22
|
+
// The following code is commented out because the HelloWorld example
|
23
|
+
// does not use any asynchronous functionality. It is meant to serve
|
24
|
+
// as an example of how one might implement an API in express for their
|
25
|
+
// webpack dev server
|
26
|
+
// Note, it would be necessary to run `npm i --save body-parser sleep` for
|
27
|
+
// the following to work:
|
28
|
+
// var bodyParser = require('body-parser');
|
29
|
+
// var sleep = require('sleep');
|
24
30
|
// See tutorial for example of using AJAX:
|
25
31
|
// https://github.com/shakacode/react-webpack-rails-tutorial
|
26
32
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%- client_globals_name = options.server_rendering? ? "clientGlobals" : "globals" -%>
|
1
2
|
// Common client-side webpack configuration used by webpack.hot.config and webpack.rails.config.
|
2
3
|
|
3
4
|
const webpack = require('webpack');
|
@@ -20,7 +21,7 @@ module.exports = {
|
|
20
21
|
|
21
22
|
// This will contain the app entry points defined by webpack.hot.config and webpack.rails.config
|
22
23
|
app: [
|
23
|
-
'./app/bundles/HelloWorld/startup
|
24
|
+
'./app/bundles/HelloWorld/startup/<%= client_globals_name %>',
|
24
25
|
],
|
25
26
|
},
|
26
27
|
resolve: {
|
data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb
CHANGED
@@ -4,9 +4,7 @@ ReactOnRails.configure do |config|
|
|
4
4
|
|
5
5
|
# Server rendering:
|
6
6
|
# Server bundle is a single file for all server rendering of components.
|
7
|
-
|
8
|
-
# that the default file of server-bundle.js does not exist.
|
9
|
-
config.server_bundle_js_file = "app/assets/javascripts/generated/server-bundle.js" # This is the default
|
7
|
+
config.server_bundle_js_file = "app/assets/javascripts/generated/server-bundle.js"
|
10
8
|
# increase if you're on JRuby
|
11
9
|
config.server_renderer_pool_size = 1
|
12
10
|
# seconds
|
@@ -19,8 +19,6 @@ namespace :assets do
|
|
19
19
|
end
|
20
20
|
|
21
21
|
task :clobber do
|
22
|
-
|
23
|
-
rm_rf "#{Rails.application.config.root}/app/assets/javascripts/generated/client-bundle.js"
|
24
|
-
rm_rf "#{Rails.application.config.root}/app/assets/javascripts/generated/server-bundle.js"
|
22
|
+
rm_r Dir.glob(Rails.root.join("app/assets/javascripts/generated/*"))
|
25
23
|
end
|
26
24
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
if %w(development test).include? Rails.env
|
2
2
|
namespace :lint do
|
3
|
+
<%- if options.ruby_linters? -%>
|
3
4
|
# This fails: https://github.com/bbatsov/rubocop/issues/1840
|
4
5
|
# RuboCop::RakeTask.new
|
5
6
|
# require "rubocop/rake_task"
|
@@ -24,23 +25,17 @@ if %w(development test).include? Rails.env
|
|
24
25
|
sh cmd
|
25
26
|
end
|
26
27
|
|
27
|
-
desc "
|
28
|
-
task :
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
sh cmd
|
39
|
-
end
|
40
|
-
|
41
|
-
desc "JS Linting"
|
42
|
-
task js: [:eslint, :jscs] do
|
43
|
-
puts "Completed running all JavaScript Linters"
|
28
|
+
desc "See docs for task 'scss_lint'"
|
29
|
+
task :scss do
|
30
|
+
begin
|
31
|
+
require 'scss_lint/rake_task'
|
32
|
+
SCSSLint::RakeTask.new do |t|
|
33
|
+
t.files = ["app/assets/stylesheets/", "client/assets/stylesheets/"]
|
34
|
+
end
|
35
|
+
Rake::Task[:scss_lint].invoke
|
36
|
+
rescue LoadError
|
37
|
+
puts "** add gem 'scss_lint' to your Gemfile for scss linting."
|
38
|
+
end
|
44
39
|
end
|
45
40
|
|
46
41
|
# desc "haml_lint"
|
@@ -58,20 +53,32 @@ if %w(development test).include? Rails.env
|
|
58
53
|
# t.files = ["app/views"]
|
59
54
|
# end
|
60
55
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
56
|
+
<%- end -%>
|
57
|
+
<%- unless options.skip_js_linters? -%>
|
58
|
+
desc "eslint"
|
59
|
+
task :eslint do
|
60
|
+
cmd = "cd client && npm run eslint . -- --ext .jsx,.js"
|
61
|
+
puts "Running eslint via `#{cmd}`"
|
62
|
+
sh cmd
|
63
|
+
end
|
64
|
+
|
65
|
+
desc "jscs"
|
66
|
+
task :jscs do
|
67
|
+
cmd = "cd client && npm run jscs ."
|
68
|
+
puts "Running jscs via `#{cmd}`"
|
69
|
+
sh cmd
|
70
|
+
end
|
71
|
+
|
72
|
+
desc "JS Linting"
|
73
|
+
task js: [:eslint, :jscs] do
|
74
|
+
puts "Completed running all JavaScript Linters"
|
72
75
|
end
|
76
|
+
<%- end -%>
|
73
77
|
|
74
|
-
|
78
|
+
<%- enabled_linters = [] -%>
|
79
|
+
<%- enabled_linters << %i(rubocop, ruby) if options.ruby_linters? -%>
|
80
|
+
<%- enabled_linters << %i(js scss) unless options.skip_js_linters? -%>
|
81
|
+
task lint: <%= enabled_linters.flatten %> do
|
75
82
|
puts "Completed all linting"
|
76
83
|
end
|
77
84
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -0,0 +1,12 @@
|
|
1
|
+
<%- component_name = options.server_rendering? ? "HelloWorldAppClient" : "HelloWorldApp" -%>
|
2
|
+
import React from 'react';
|
3
|
+
import HelloWorld from '../containers/HelloWorld';
|
4
|
+
|
5
|
+
const <%= component_name %> = props => {
|
6
|
+
const reactComponent = (
|
7
|
+
<HelloWorld {...props} />
|
8
|
+
);
|
9
|
+
return reactComponent;
|
10
|
+
};
|
11
|
+
|
12
|
+
export default <%= component_name %>;
|
@@ -1,7 +1,7 @@
|
|
1
1
|
// This file is our manifest of all reducers for the app.
|
2
|
-
// See /client/app/bundles/HelloWorld/store/helloWorldStore.jsx
|
2
|
+
// See also /client/app/bundles/HelloWorld/store/helloWorldStore.jsx
|
3
3
|
// A real world app will like have many reducers and it helps to organize them in one file.
|
4
|
-
//
|
4
|
+
// `https://github.com/shakacode/react_on_rails/tree/master/docs/additional_reading/generated_client_code.md`
|
5
5
|
import helloWorldReducer from './helloWorldReducer';
|
6
6
|
import { $$initialState as $$helloWorldState } from './helloWorldReducer';
|
7
7
|
|
@@ -1,3 +1,4 @@
|
|
1
|
+
<%- generator_function_name = options.server_rendering? ? "HelloWorldAppClient" : "HelloWorldApp" -%>
|
1
2
|
import React from 'react';
|
2
3
|
import { Provider } from 'react-redux';
|
3
4
|
|
@@ -7,7 +8,7 @@ import HelloWorld from '../containers/HelloWorld';
|
|
7
8
|
// See documentation for https://github.com/rackt/react-redux.
|
8
9
|
// This is how you get props from the Rails view into the redux store.
|
9
10
|
// This code here binds your smart component to the redux store.
|
10
|
-
const
|
11
|
+
const <%= generator_function_name %> = props => {
|
11
12
|
const store = createStore(props);
|
12
13
|
const reactComponent = (
|
13
14
|
<Provider store={store}>
|
@@ -17,4 +18,4 @@ const HelloWorldAppClient = props => {
|
|
17
18
|
return reactComponent;
|
18
19
|
};
|
19
20
|
|
20
|
-
export default
|
21
|
+
export default <%= generator_function_name %>;
|
@@ -10,13 +10,9 @@ export default function logger({ getState }) {
|
|
10
10
|
// Call the next dispatch method in the middleware chain.
|
11
11
|
const result = next(action);
|
12
12
|
|
13
|
-
// We can't console.log immutable objects out-of-the-box.
|
14
13
|
const immutableState = getState();
|
15
|
-
const readableState = _.reduce(immutableState, (result, immutable, key) => {
|
16
|
-
result[key] = immutable.toJS();
|
17
|
-
}, {});
|
18
14
|
|
19
|
-
console.log('state after dispatch',
|
15
|
+
console.log('state after dispatch', JSON.stringify(immutableState));
|
20
16
|
|
21
17
|
// This will likely be the action itself, unless
|
22
18
|
// a middleware further in chain changed it.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# This is the configuration used to check the rubocop source code.
|
2
|
+
# Check out: https://github.com/bbatsov/rubocop
|
3
|
+
|
4
|
+
AllCops:
|
5
|
+
Include:
|
6
|
+
- '**/Rakefile'
|
7
|
+
- '**/config.ru'
|
8
|
+
Exclude:
|
9
|
+
- 'vendor/**/*'
|
10
|
+
- 'spec/fixtures/**/*'
|
11
|
+
- 'node_modules/**/*'
|
12
|
+
- 'db/**/*'
|
13
|
+
- 'db/schema.rb'
|
14
|
+
- 'db/seeds.rb'
|
15
|
+
- 'client/node_modules/**/*'
|
16
|
+
- 'bin/**/*'
|
17
|
+
- !ruby/regexp /old_and_unused\.rb$/
|
18
|
+
|
19
|
+
Metrics/LineLength:
|
20
|
+
Max: 120
|
21
|
+
|
22
|
+
Style/StringLiterals:
|
23
|
+
EnforcedStyle: double_quotes
|
24
|
+
|
25
|
+
Style/Documentation:
|
26
|
+
Enabled: false
|
@@ -0,0 +1,205 @@
|
|
1
|
+
# See http://sass-guidelin.es/#zeros
|
2
|
+
|
3
|
+
scss_files:
|
4
|
+
- 'app/assets/stylesheets/**/*.scss'
|
5
|
+
- 'client/assets/stylesheets/**/*.scss'
|
6
|
+
|
7
|
+
linters:
|
8
|
+
# BangFormat:
|
9
|
+
# enabled: true
|
10
|
+
# space_before_bang: true
|
11
|
+
# space_after_bang: false
|
12
|
+
#
|
13
|
+
# BorderZero:
|
14
|
+
# enabled: true
|
15
|
+
# convention: zero # or `none`
|
16
|
+
#
|
17
|
+
ColorKeyword:
|
18
|
+
enabled: false
|
19
|
+
ColorVariable:
|
20
|
+
enabled: false
|
21
|
+
#
|
22
|
+
# Comment:
|
23
|
+
# enabled: true
|
24
|
+
#
|
25
|
+
# DebugStatement:
|
26
|
+
# enabled: true
|
27
|
+
#
|
28
|
+
# DeclarationOrder:
|
29
|
+
# enabled: true
|
30
|
+
#
|
31
|
+
# DuplicateProperty:
|
32
|
+
# enabled: true
|
33
|
+
#
|
34
|
+
# ElsePlacement:
|
35
|
+
# enabled: true
|
36
|
+
# style: same_line # or 'new_line'
|
37
|
+
#
|
38
|
+
# EmptyLineBetweenBlocks:
|
39
|
+
# enabled: true
|
40
|
+
# ignore_single_line_blocks: true
|
41
|
+
#
|
42
|
+
# EmptyRule:
|
43
|
+
# enabled: true
|
44
|
+
#
|
45
|
+
# FinalNewline:
|
46
|
+
# enabled: true
|
47
|
+
# present: true
|
48
|
+
#
|
49
|
+
HexLength:
|
50
|
+
enabled: true
|
51
|
+
style: long
|
52
|
+
|
53
|
+
HexNotation:
|
54
|
+
enabled: true
|
55
|
+
style: uppercase
|
56
|
+
#
|
57
|
+
# HexValidation:
|
58
|
+
# enabled: true
|
59
|
+
#
|
60
|
+
IdSelector:
|
61
|
+
enabled: true
|
62
|
+
#
|
63
|
+
# ImportantRule:
|
64
|
+
# enabled: true
|
65
|
+
#
|
66
|
+
# ImportPath:
|
67
|
+
# enabled: true
|
68
|
+
# leading_underscore: false
|
69
|
+
# filename_extension: false
|
70
|
+
#
|
71
|
+
# Indentation:
|
72
|
+
# enabled: true
|
73
|
+
# allow_non_nested_indentation: false
|
74
|
+
# character: space # or 'tab'
|
75
|
+
# width: 2
|
76
|
+
#
|
77
|
+
LeadingZero:
|
78
|
+
enabled: true
|
79
|
+
style: include_zero
|
80
|
+
#
|
81
|
+
# MergeableSelector:
|
82
|
+
# enabled: true
|
83
|
+
# force_nesting: true
|
84
|
+
#
|
85
|
+
# NameFormat:
|
86
|
+
# enabled: true
|
87
|
+
# allow_leading_underscore: true
|
88
|
+
# convention: hyphenated_lowercase # or 'camel_case', or 'snake_case', or a regex pattern
|
89
|
+
#
|
90
|
+
# NestingDepth:
|
91
|
+
# enabled: true
|
92
|
+
# max_depth: 3
|
93
|
+
#
|
94
|
+
# PlaceholderInExtend:
|
95
|
+
# enabled: true
|
96
|
+
#
|
97
|
+
# PropertyCount:
|
98
|
+
# enabled: false
|
99
|
+
# include_nested: false
|
100
|
+
# max_properties: 10
|
101
|
+
#
|
102
|
+
# PropertyUnits:
|
103
|
+
# enabled: true
|
104
|
+
# global: [
|
105
|
+
# 'ch', 'em', 'ex', 'rem', # Font-relative lengths
|
106
|
+
# 'cm', 'in', 'mm', 'pc', 'pt', 'px', 'q', # Absolute lengths
|
107
|
+
# 'vh', 'vw', 'vmin', 'vmax', # Viewport-percentage lengths
|
108
|
+
# 'deg', 'grad', 'rad', 'turn', # Angle
|
109
|
+
# 'ms', 's', # Duration
|
110
|
+
# 'Hz', 'kHz', # Frequency
|
111
|
+
# 'dpi', 'dpcm', 'dppx', # Resolution
|
112
|
+
# '%', # Other
|
113
|
+
# ]
|
114
|
+
# properties: {}
|
115
|
+
#
|
116
|
+
# PropertySortOrder:
|
117
|
+
# enabled: true
|
118
|
+
# ignore_unspecified: false
|
119
|
+
# separate_groups: false
|
120
|
+
#
|
121
|
+
# PropertySpelling:
|
122
|
+
# enabled: true
|
123
|
+
# extra_properties: []
|
124
|
+
#
|
125
|
+
# QualifyingElement:
|
126
|
+
# enabled: true
|
127
|
+
# allow_element_with_attribute: false
|
128
|
+
# allow_element_with_class: false
|
129
|
+
# allow_element_with_id: false
|
130
|
+
#
|
131
|
+
# SelectorDepth:
|
132
|
+
# enabled: true
|
133
|
+
# max_depth: 3
|
134
|
+
#
|
135
|
+
# SelectorFormat:
|
136
|
+
# enabled: true
|
137
|
+
# convention: hyphenated_lowercase # or 'strict_BEM', or 'hyphenated_BEM', or 'snake_case', or 'camel_case', or a regex pattern
|
138
|
+
#
|
139
|
+
# Shorthand:
|
140
|
+
# enabled: true
|
141
|
+
# allowed_shorthands: [1, 2, 3]
|
142
|
+
#
|
143
|
+
# SingleLinePerProperty:
|
144
|
+
# enabled: true
|
145
|
+
# allow_single_line_rule_sets: true
|
146
|
+
#
|
147
|
+
# SingleLinePerSelector:
|
148
|
+
# enabled: true
|
149
|
+
#
|
150
|
+
# SpaceAfterComma:
|
151
|
+
# enabled: true
|
152
|
+
#
|
153
|
+
# SpaceAfterPropertyColon:
|
154
|
+
# enabled: true
|
155
|
+
# style: one_space # or 'no_space', or 'at_least_one_space', or 'aligned'
|
156
|
+
#
|
157
|
+
# SpaceAfterPropertyName:
|
158
|
+
# enabled: true
|
159
|
+
#
|
160
|
+
# SpaceBeforeBrace:
|
161
|
+
# enabled: true
|
162
|
+
# style: space # or 'new_line'
|
163
|
+
# allow_single_line_padding: false
|
164
|
+
#
|
165
|
+
# SpaceBetweenParens:
|
166
|
+
# enabled: true
|
167
|
+
# spaces: 0
|
168
|
+
#
|
169
|
+
# StringQuotes:
|
170
|
+
# enabled: true
|
171
|
+
# style: single_quotes # or double_quotes
|
172
|
+
#
|
173
|
+
# TrailingSemicolon:
|
174
|
+
# enabled: true
|
175
|
+
#
|
176
|
+
# TrailingZero:
|
177
|
+
# enabled: false
|
178
|
+
#
|
179
|
+
# UnnecessaryMantissa:
|
180
|
+
# enabled: true
|
181
|
+
#
|
182
|
+
# UnnecessaryParentReference:
|
183
|
+
# enabled: true
|
184
|
+
#
|
185
|
+
# UrlFormat:
|
186
|
+
# enabled: true
|
187
|
+
#
|
188
|
+
# UrlQuotes:
|
189
|
+
# enabled: true
|
190
|
+
#
|
191
|
+
# VariableForProperty:
|
192
|
+
# enabled: false
|
193
|
+
# properties: []
|
194
|
+
#
|
195
|
+
# VendorPrefix:
|
196
|
+
# enabled: true
|
197
|
+
# identifier_list: base
|
198
|
+
# additional_identifiers: []
|
199
|
+
# excluded_identifiers: []
|
200
|
+
#
|
201
|
+
# ZeroUnit:
|
202
|
+
# enabled: true
|
203
|
+
#
|
204
|
+
# Compass::*:
|
205
|
+
# enabled: false
|