react_on_rails 2.0.0.beta.1 → 2.0.0.beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.coveralls.yml +1 -0
- data/.dockerignore +2 -0
- data/.eslintignore +7 -0
- data/.eslintrc +19 -0
- data/.gitignore +28 -0
- data/.jscsrc +27 -0
- data/.npmignore +20 -0
- data/.rspec +2 -0
- data/.rubocop.yml +70 -0
- data/.scss-lint.yml +205 -0
- data/.travis.yml +43 -0
- data/CHANGELOG.md +34 -0
- data/Dockerfile_tests +12 -0
- data/Gemfile +40 -0
- data/README.md +365 -0
- data/Rakefile +5 -0
- data/app/helpers/react_on_rails_helper.rb +215 -0
- data/docker-compose.yml +11 -0
- data/docs/LICENSE +21 -0
- data/docs/additional_reading/heroku_deployment.md +23 -0
- data/docs/additional_reading/manual_installation.md +118 -0
- data/docs/additional_reading/node_dependencies_and_npm.md +29 -0
- data/docs/additional_reading/optional_configuration.md +33 -0
- data/docs/additional_reading/react-and-redux.md +36 -0
- data/docs/additional_reading/react_router.md +45 -0
- data/docs/additional_reading/server_rendering_tips.md +11 -0
- data/docs/additional_reading/tips.md +10 -0
- data/docs/additional_reading/webpack.md +46 -0
- data/docs/code_of_conduct.md +13 -0
- data/docs/coding-style/linters.md +64 -0
- data/docs/coding-style/style.md +42 -0
- data/docs/contributing.md +157 -0
- data/docs/generator_testing.md +20 -0
- data/docs/releasing.md +29 -0
- data/lib/generators/USAGE +99 -0
- data/lib/generators/react_on_rails/base_generator.rb +191 -0
- data/lib/generators/react_on_rails/bootstrap_generator.rb +89 -0
- data/lib/generators/react_on_rails/dev_tests_generator.rb +39 -0
- data/lib/generators/react_on_rails/generator_helper.rb +50 -0
- data/lib/generators/react_on_rails/heroku_deployment_generator.rb +30 -0
- data/lib/generators/react_on_rails/install_generator.rb +99 -0
- data/lib/generators/react_on_rails/js_linters_generator.rb +19 -0
- data/lib/generators/react_on_rails/react_no_redux_generator.rb +40 -0
- data/lib/generators/react_on_rails/react_with_redux_generator.rb +51 -0
- data/lib/generators/react_on_rails/ruby_linters_generator.rb +33 -0
- data/lib/generators/react_on_rails/templates/base/base/Procfile.dev.tt +4 -0
- data/lib/generators/react_on_rails/templates/base/base/REACT_ON_RAILS.md +16 -0
- data/lib/generators/react_on_rails/templates/base/base/app/controllers/hello_world_controller.rb +5 -0
- data/lib/generators/react_on_rails/templates/base/base/app/views/hello_world/index.html.erb.tt +4 -0
- data/lib/generators/react_on_rails/templates/base/base/client/.babelrc +3 -0
- data/lib/generators/react_on_rails/templates/base/base/client/REACT_ON_RAILS_CLIENT_README.md +3 -0
- data/lib/generators/react_on_rails/templates/base/base/client/app/bundles/HelloWorld/startup/clientRegistration.jsx.tt +5 -0
- data/lib/generators/react_on_rails/templates/base/base/client/index.jade +15 -0
- data/lib/generators/react_on_rails/templates/base/base/client/package.json.tt +104 -0
- data/lib/generators/react_on_rails/templates/base/base/client/server.js +64 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.base.config.js.tt +62 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.hot.config.js.tt +69 -0
- data/lib/generators/react_on_rails/templates/base/base/client/webpack.client.rails.config.js +42 -0
- data/lib/generators/react_on_rails/templates/base/base/config/initializers/react_on_rails.rb +26 -0
- data/lib/generators/react_on_rails/templates/base/base/lib/tasks/assets.rake.tt +26 -0
- data/lib/generators/react_on_rails/templates/base/base/lib/tasks/linters.rake.tt +88 -0
- data/lib/generators/react_on_rails/templates/base/base/package.json +31 -0
- data/lib/generators/react_on_rails/templates/base/server_rendering/client/app/bundles/HelloWorld/startup/serverRegistration.jsx +4 -0
- data/lib/generators/react_on_rails/templates/base/server_rendering/client/webpack.server.rails.config.js +39 -0
- data/lib/generators/react_on_rails/templates/bootstrap/app/assets/stylesheets/_bootstrap-custom.scss +63 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_post-bootstrap.scss +10 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_pre-bootstrap.scss +8 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/assets/stylesheets/_react-on-rails-sass-helper.scss +19 -0
- data/lib/generators/react_on_rails/templates/bootstrap/client/bootstrap-sass.config.js +89 -0
- data/lib/generators/react_on_rails/templates/dev_tests/.rspec +2 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/features/hello_world_spec.rb +25 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/rails_helper.rb +57 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/simplecov_helper.rb +21 -0
- data/lib/generators/react_on_rails/templates/dev_tests/spec/spec_helper.rb +95 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/.buildpacks +2 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/Procfile +1 -0
- data/lib/generators/react_on_rails/templates/heroku_deployment/config/puma.rb +15 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.eslintignore +1 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.eslintrc +48 -0
- data/lib/generators/react_on_rails/templates/js_linters/client/.jscsrc +18 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +39 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +33 -0
- data/lib/generators/react_on_rails/templates/no_redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +8 -0
- data/lib/generators/react_on_rails/templates/no_redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/actions/helloWorldActionCreators.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx +48 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/constants/helloWorldConstants.jsx +8 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/containers/HelloWorld.jsx +43 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/helloWorldReducer.jsx +19 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/reducers/index.jsx +14 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/startup/HelloWorldAppClient.jsx.tt +19 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/bundles/HelloWorld/store/helloWorldStore.jsx +35 -0
- data/lib/generators/react_on_rails/templates/redux/base/client/app/lib/middlewares/loggerMiddleware.js +20 -0
- data/lib/generators/react_on_rails/templates/redux/server_rendering/client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx +19 -0
- 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/ruby_linters/lib/tasks/brakeman.rake +17 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/lib/tasks/ci.rake +33 -0
- data/lib/generators/react_on_rails/templates/ruby_linters/ruby-lint.yml +20 -0
- data/lib/react_on_rails.rb +6 -0
- data/lib/react_on_rails/configuration.rb +60 -0
- data/lib/react_on_rails/engine.rb +7 -0
- data/lib/react_on_rails/prerender_error.rb +31 -0
- data/lib/react_on_rails/server_rendering_pool.rb +110 -0
- data/lib/react_on_rails/version.rb +3 -0
- data/package.json +76 -0
- data/rakelib/docker.rake +33 -0
- data/rakelib/dummy_apps.rake +20 -0
- data/rakelib/example_type.rb +160 -0
- data/rakelib/examples.rake +103 -0
- data/rakelib/examples_config.yml +19 -0
- data/rakelib/lint.rake +37 -0
- data/rakelib/node_package.rake +11 -0
- data/rakelib/run_rspec.rake +65 -0
- data/rakelib/task_helpers.rb +44 -0
- data/react_on_rails.gemspec +31 -0
- data/ruby-lint.yml +24 -0
- metadata +119 -2
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
module GeneratorHelper
|
|
2
|
+
# Takes a relative path from the destination root, such as `.gitignore` or `app/assets/javascripts/application.js`
|
|
3
|
+
def dest_file_exists?(file)
|
|
4
|
+
dest_file = File.join(destination_root, file)
|
|
5
|
+
File.exist?(dest_file) ? dest_file : nil
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def dest_dir_exists?(dir)
|
|
9
|
+
dest_dir = File.join(destination_root, dir)
|
|
10
|
+
Dir.exist?(dest_dir) ? dest_dir : nil
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
# Takes the missing file and the
|
|
14
|
+
def puts_setup_file_error(file, data)
|
|
15
|
+
puts "** #{file} was not found."
|
|
16
|
+
puts "Please add the following content to your #{file} file:"
|
|
17
|
+
puts "\n#{data}\n"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def empty_directory_with_keep_file(destination, config = {})
|
|
21
|
+
empty_directory(destination, config)
|
|
22
|
+
keep_file(destination)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def keep_file(destination)
|
|
26
|
+
create_file("#{destination}/.keep") unless options[:skip_keeps]
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# As opposed to Rails::Generators::Testing.create_link, which creates a link pointing to
|
|
30
|
+
# source_root, this symlinks a file in destination_root to a file also in
|
|
31
|
+
# destination_root.
|
|
32
|
+
def symlink_dest_file_to_dest_file(target, link)
|
|
33
|
+
target_pathname = Pathname.new(File.join(destination_root, target))
|
|
34
|
+
link_pathname = Pathname.new(File.join(destination_root, link))
|
|
35
|
+
|
|
36
|
+
link_directory = link_pathname.dirname
|
|
37
|
+
link_basename = link_pathname.basename
|
|
38
|
+
target_relative_path = target_pathname.relative_path_from(link_directory)
|
|
39
|
+
|
|
40
|
+
`cd #{link_directory} && ln -s #{target_relative_path} #{link_basename}`
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def copy_file_and_missing_parent_directories(source_file, destination_file = nil)
|
|
44
|
+
destination_file = source_file unless destination_file
|
|
45
|
+
destination_path = Pathname.new(destination_file)
|
|
46
|
+
parent_directories = destination_path.dirname
|
|
47
|
+
empty_directory(parent_directories) unless dest_dir_exists?(parent_directories)
|
|
48
|
+
copy_file source_file, destination_file
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
require File.expand_path("../generator_helper", __FILE__)
|
|
3
|
+
include GeneratorHelper
|
|
4
|
+
|
|
5
|
+
module ReactOnRails
|
|
6
|
+
module Generators
|
|
7
|
+
class HerokuDeploymentGenerator < Rails::Generators::Base
|
|
8
|
+
hide!
|
|
9
|
+
source_root(File.expand_path("../templates", __FILE__))
|
|
10
|
+
|
|
11
|
+
def copy_heroku_deployment_files
|
|
12
|
+
base_path = "heroku_deployment"
|
|
13
|
+
%w(.buildpacks
|
|
14
|
+
Procfile
|
|
15
|
+
config/puma.rb).each { |file| copy_file("#{base_path}/#{file}", file) }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def add_heroku_production_gems
|
|
19
|
+
gem_text = <<-GEMS.strip_heredoc
|
|
20
|
+
|
|
21
|
+
# For Heroku deployment
|
|
22
|
+
gem 'rails_12factor', group: :production
|
|
23
|
+
gem 'puma', group: :production
|
|
24
|
+
|
|
25
|
+
GEMS
|
|
26
|
+
append_to_file("Gemfile", gem_text)
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module ReactOnRails
|
|
4
|
+
module Generators
|
|
5
|
+
class InstallGenerator < Rails::Generators::Base
|
|
6
|
+
# fetch USAGE file for details generator description
|
|
7
|
+
source_root(File.expand_path("../", __FILE__))
|
|
8
|
+
|
|
9
|
+
# --redux
|
|
10
|
+
class_option :redux,
|
|
11
|
+
type: :boolean,
|
|
12
|
+
default: false,
|
|
13
|
+
desc: "Install Redux gems and Redux version of Hello World Example. Default: false",
|
|
14
|
+
aliases: "-R"
|
|
15
|
+
# --server-rendering
|
|
16
|
+
class_option :server_rendering,
|
|
17
|
+
type: :boolean,
|
|
18
|
+
default: false,
|
|
19
|
+
desc: "Add necessary files and configurations for server-side rendering. Default: false",
|
|
20
|
+
aliases: "-S"
|
|
21
|
+
# --skip-js-linters
|
|
22
|
+
class_option :skip_js_linters,
|
|
23
|
+
type: :boolean,
|
|
24
|
+
default: false,
|
|
25
|
+
desc: "Skip installing JavaScript linting files. Default: false",
|
|
26
|
+
aliases: "-j"
|
|
27
|
+
# --ruby-linters
|
|
28
|
+
class_option :ruby_linters,
|
|
29
|
+
type: :boolean,
|
|
30
|
+
default: false,
|
|
31
|
+
desc: "Install ruby linting files, tasks, and configs. Default: false",
|
|
32
|
+
aliases: "-L"
|
|
33
|
+
# --ruby-linters
|
|
34
|
+
class_option :heroku_deployment,
|
|
35
|
+
type: :boolean,
|
|
36
|
+
default: false,
|
|
37
|
+
desc: "Install files necessary for deploying to Heroku. Default: false",
|
|
38
|
+
aliases: "-H"
|
|
39
|
+
# --skip-bootstrap
|
|
40
|
+
class_option :skip_bootstrap,
|
|
41
|
+
type: :boolean,
|
|
42
|
+
default: false,
|
|
43
|
+
desc: "Skip integrating Bootstrap and don't initialize files and regarding configs. Default: false",
|
|
44
|
+
aliases: "-b"
|
|
45
|
+
|
|
46
|
+
def run_generators
|
|
47
|
+
return unless installation_prerequisites_met?
|
|
48
|
+
warn_if_nvm_is_not_installed
|
|
49
|
+
invoke_generators
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def invoke_generators # rubocop:disable Metrics/CyclomaticComplexity
|
|
55
|
+
invoke "react_on_rails:base"
|
|
56
|
+
invoke "react_on_rails:react_no_redux" unless options.redux?
|
|
57
|
+
invoke "react_on_rails:react_with_redux" if options.redux?
|
|
58
|
+
invoke "react_on_rails:js_linters" unless options.skip_js_linters?
|
|
59
|
+
invoke "react_on_rails:ruby_linters" if options.ruby_linters?
|
|
60
|
+
invoke "react_on_rails:heroku_deployment" if options.heroku_deployment?
|
|
61
|
+
invoke "react_on_rails:bootstrap" unless options.skip_bootstrap?
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# NOTE: other requirements for existing files such as .gitignore or application.
|
|
65
|
+
# js(.coffee) are not checked by this method, but instead produce warning messages
|
|
66
|
+
# and allow the build to continue
|
|
67
|
+
def installation_prerequisites_met?
|
|
68
|
+
!(missing_node? || missing_npm? || uncommitted_changes?)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
def missing_npm?
|
|
72
|
+
return false unless `which npm`.blank?
|
|
73
|
+
error = "** npm is required. Please install it before continuing."
|
|
74
|
+
error << "https://www.npmjs.com/"
|
|
75
|
+
puts error
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def missing_node?
|
|
79
|
+
return false unless `which node`.blank?
|
|
80
|
+
error = "** nodejs is required. Please install it before continuing."
|
|
81
|
+
error << "https://nodejs.org/en/"
|
|
82
|
+
puts error
|
|
83
|
+
end
|
|
84
|
+
|
|
85
|
+
def uncommitted_changes?
|
|
86
|
+
return false if ENV["COVERAGE"]
|
|
87
|
+
status = `git status`
|
|
88
|
+
return false if status.include?("nothing to commit, working directory clean")
|
|
89
|
+
error = "** You have uncommitted code. Please commit or stash your changes before continuing"
|
|
90
|
+
puts error
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def warn_if_nvm_is_not_installed
|
|
94
|
+
return true unless `which nvm`.blank?
|
|
95
|
+
puts "** nvm is advised. Please consider installing it. https://github.com/creationix/nvm"
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
end
|
|
99
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module ReactOnRails
|
|
4
|
+
module Generators
|
|
5
|
+
class JsLintersGenerator < Rails::Generators::Base
|
|
6
|
+
hide!
|
|
7
|
+
source_root File.expand_path("../templates", __FILE__)
|
|
8
|
+
|
|
9
|
+
# NOTE: linter modules are included via template in base/base/client/package.json.tt
|
|
10
|
+
|
|
11
|
+
def copy_js_linter_config_files
|
|
12
|
+
base_path = "js_linters/"
|
|
13
|
+
%w(client/.eslintrc
|
|
14
|
+
client/.eslintignore
|
|
15
|
+
client/.jscsrc).each { |file| copy_file(base_path + file, file) }
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
require File.expand_path("../generator_helper", __FILE__)
|
|
3
|
+
include GeneratorHelper
|
|
4
|
+
|
|
5
|
+
module ReactOnRails
|
|
6
|
+
module Generators
|
|
7
|
+
class ReactNoReduxGenerator < Rails::Generators::Base
|
|
8
|
+
hide!
|
|
9
|
+
source_root(File.expand_path("../templates", __FILE__))
|
|
10
|
+
|
|
11
|
+
# --server-rendering
|
|
12
|
+
class_option :server_rendering,
|
|
13
|
+
type: :boolean,
|
|
14
|
+
default: false,
|
|
15
|
+
desc: "Configure for server-side rendering of webpack JavaScript",
|
|
16
|
+
aliases: "-S"
|
|
17
|
+
|
|
18
|
+
def copy_base_files
|
|
19
|
+
base_path = "no_redux/base/"
|
|
20
|
+
%w(client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx
|
|
21
|
+
client/app/bundles/HelloWorld/containers/HelloWorld.jsx).each do |file|
|
|
22
|
+
copy_file(base_path + file, file)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def copy_server_rendering_files_if_appropriate
|
|
27
|
+
return unless options.server_rendering?
|
|
28
|
+
base_path = "no_redux/server_rendering/"
|
|
29
|
+
file = "client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx"
|
|
30
|
+
copy_file(base_path + file, file)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def template_appropriate_version_of_hello_world_app_client
|
|
34
|
+
filename = "HelloWorldAppClient.jsx"
|
|
35
|
+
location = "client/app/bundles/HelloWorld/startup"
|
|
36
|
+
template("no_redux/base/#{location}/HelloWorldAppClient.jsx.tt", "#{location}/#{filename}")
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module ReactOnRails
|
|
4
|
+
module Generators
|
|
5
|
+
class ReactWithReduxGenerator < Rails::Generators::Base
|
|
6
|
+
hide!
|
|
7
|
+
source_root(File.expand_path("../templates", __FILE__))
|
|
8
|
+
|
|
9
|
+
# --server-rendering
|
|
10
|
+
class_option :server_rendering,
|
|
11
|
+
type: :boolean,
|
|
12
|
+
default: false,
|
|
13
|
+
desc: "Configure for server-side rendering of webpack JavaScript",
|
|
14
|
+
aliases: "-S"
|
|
15
|
+
|
|
16
|
+
def create_redux_directories
|
|
17
|
+
dirs = %w(actions constants reducers store)
|
|
18
|
+
dirs.each { |name| empty_directory("client/app/bundles/HelloWorld/#{name}") }
|
|
19
|
+
|
|
20
|
+
empty_directory("client/app/lib/middlewares")
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def copy_base_redux_files
|
|
24
|
+
base_path = "redux/base/"
|
|
25
|
+
%w(client/app/bundles/HelloWorld/actions/helloWorldActionCreators.jsx
|
|
26
|
+
client/app/bundles/HelloWorld/components/HelloWorldWidget.jsx
|
|
27
|
+
client/app/bundles/HelloWorld/containers/HelloWorld.jsx
|
|
28
|
+
client/app/bundles/HelloWorld/constants/helloWorldConstants.jsx
|
|
29
|
+
client/app/bundles/HelloWorld/reducers/helloWorldReducer.jsx
|
|
30
|
+
client/app/bundles/HelloWorld/reducers/index.jsx
|
|
31
|
+
client/app/bundles/HelloWorld/store/helloWorldStore.jsx
|
|
32
|
+
client/app/lib/middlewares/loggerMiddleware.js).each do |file|
|
|
33
|
+
copy_file(base_path + file, file)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def copy_server_rendering_redux_files
|
|
38
|
+
return unless options.server_rendering?
|
|
39
|
+
base_path = "redux/server_rendering/"
|
|
40
|
+
file = "client/app/bundles/HelloWorld/startup/HelloWorldAppServer.jsx"
|
|
41
|
+
copy_file(base_path + file, file)
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def template_appropriate_version_of_hello_world_app_client
|
|
45
|
+
filename = "HelloWorldAppClient.jsx"
|
|
46
|
+
location = "client/app/bundles/HelloWorld/startup"
|
|
47
|
+
template("redux/base/#{location}/HelloWorldAppClient.jsx.tt", "#{location}/#{filename}")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
require "rails/generators"
|
|
2
|
+
|
|
3
|
+
module ReactOnRails
|
|
4
|
+
module Generators
|
|
5
|
+
class RubyLintersGenerator < Rails::Generators::Base
|
|
6
|
+
hide!
|
|
7
|
+
source_root File.expand_path("../templates", __FILE__)
|
|
8
|
+
|
|
9
|
+
def add_ruby_linter_gems_to_gemfile
|
|
10
|
+
linter_gems = <<-GEMS.strip_heredoc
|
|
11
|
+
|
|
12
|
+
# require: false is necessary for the linters as we only want them loaded
|
|
13
|
+
# when used by the linting rake tasks.
|
|
14
|
+
group :development do
|
|
15
|
+
gem("rubocop", require: false)
|
|
16
|
+
gem("ruby-lint", require: false)
|
|
17
|
+
gem("scss_lint", require: false)
|
|
18
|
+
end
|
|
19
|
+
GEMS
|
|
20
|
+
append_to_file("Gemfile", linter_gems)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def copy_ruby_linting_and_auditing_tasks
|
|
24
|
+
base_path = "ruby_linters/"
|
|
25
|
+
%w(lib/tasks/brakeman.rake
|
|
26
|
+
lib/tasks/ci.rake
|
|
27
|
+
.rubocop.yml
|
|
28
|
+
.scss-lint.yml
|
|
29
|
+
ruby-lint.yml).each { |file| copy_file(base_path + file, file) }
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
The `react_on_rails` gem has been installed. You can view the documentation online at
|
|
2
|
+
[React on Rails](https://github.com/shakacode/react_on_rails).
|
|
3
|
+
|
|
4
|
+
Also, check out the [example application](https://github.com/shakacode/react-webpack-rails-tutorial/blob/master/client/server.js)
|
|
5
|
+
for a live example and code.
|
|
6
|
+
|
|
7
|
+
The "Hello World" example has been installed.
|
|
8
|
+
|
|
9
|
+
+ The view is located at `app/views/hello_world/index.html.erb`
|
|
10
|
+
+ The controller is located at `app/controllers/hello_world_controller.rb`
|
|
11
|
+
|
|
12
|
+
See [the documentation](https://github.com/shakacode/react_on_rails) for how to build your bundles and
|
|
13
|
+
install your packages. Then you can view the example as follows:
|
|
14
|
+
|
|
15
|
+
- Rails Server: [localhost:3000/hello_world](http://localhost:3000/hello_world)
|
|
16
|
+
- Webpack Development Server with HMR: [localhost:4000/hello_world](http://localhost:4000/hello_world)
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
doctype html
|
|
2
|
+
html
|
|
3
|
+
|
|
4
|
+
head
|
|
5
|
+
title Hello, React
|
|
6
|
+
|
|
7
|
+
body
|
|
8
|
+
|
|
9
|
+
h1.alert.alert-info.this-works webpack dev server (with HMR)
|
|
10
|
+
#app
|
|
11
|
+
|
|
12
|
+
script(src="vendor-bundle.js")
|
|
13
|
+
script(src="app-bundle.js")
|
|
14
|
+
script.
|
|
15
|
+
ReactOnRails.render("HelloWorldApp", {name: "Stranger"}, 'app');
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
<%- require 'react_on_rails/version' -%>
|
|
2
|
+
{
|
|
3
|
+
"name": "react-webpack-rails-tutorial",
|
|
4
|
+
"version": "1.1.0",
|
|
5
|
+
"description": "Built using the react_on_rails generator.",
|
|
6
|
+
"main": "server.js",
|
|
7
|
+
"engines": {
|
|
8
|
+
"node": "5.0.0",
|
|
9
|
+
"npm": "3.5.0"
|
|
10
|
+
},
|
|
11
|
+
"repository": {
|
|
12
|
+
"type": "git",
|
|
13
|
+
"url": "https://github.com/shakacode/react-webpack-rails-tutorial.git"
|
|
14
|
+
},
|
|
15
|
+
"keywords": [
|
|
16
|
+
"react",
|
|
17
|
+
"tutorial",
|
|
18
|
+
"comment",
|
|
19
|
+
"example"
|
|
20
|
+
],
|
|
21
|
+
"author": "justin808",
|
|
22
|
+
"license": "MIT",
|
|
23
|
+
"bugs": {
|
|
24
|
+
"url": "https://github.com/shakacode/react-webpack-rails-tutorial/issues"
|
|
25
|
+
},
|
|
26
|
+
"homepage": "https://github.com/shakacode/react-webpack-rails-tutorial",
|
|
27
|
+
"scripts": {
|
|
28
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
29
|
+
"start": "node server.js",
|
|
30
|
+
"build:client": "NODE_ENV=production webpack --config webpack.client.rails.config.js",
|
|
31
|
+
"build:server": "NODE_ENV=production webpack --config webpack.server.rails.config.js",
|
|
32
|
+
"build:dev:client": "webpack -w --config webpack.client.rails.config.js",
|
|
33
|
+
"build:dev:server": "webpack -w --config webpack.server.rails.config.js"<% unless options.skip_js_linters? -%>,
|
|
34
|
+
"lint": "npm run eslint && npm run jscs",
|
|
35
|
+
"eslint": "eslint --ext .js,.jsx .",
|
|
36
|
+
"jscs": "jscs --verbose ."
|
|
37
|
+
<%- end -%>
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"babel": "^6.3.26",
|
|
41
|
+
"babel-cli": "^6.3.17",
|
|
42
|
+
"babel-core": "^6.3.26",
|
|
43
|
+
"babel-loader": "^6.2.0",
|
|
44
|
+
"babel-plugin-syntax-decorators": "^6.3.13",
|
|
45
|
+
"babel-polyfill": "^6.3.14",
|
|
46
|
+
"babel-preset-es2015": "^6.3.13",
|
|
47
|
+
"babel-preset-react": "^6.3.13",
|
|
48
|
+
"babel-preset-stage-0": "^6.3.13",
|
|
49
|
+
"es5-shim": "^4.4.1",
|
|
50
|
+
"expose-loader": "^0.7.1",
|
|
51
|
+
<%- if options.redux? -%>
|
|
52
|
+
"immutable": "^3.7.5",
|
|
53
|
+
<%- end -%>
|
|
54
|
+
"imports-loader": "^0.6.5",
|
|
55
|
+
"jquery": "^2.1.4",
|
|
56
|
+
"jquery-ujs": "^1.1.0-1",
|
|
57
|
+
"loader-utils": "^0.2.11",
|
|
58
|
+
<%- if options.redux? -%>
|
|
59
|
+
"lodash": "^3.10.1",
|
|
60
|
+
"mirror-creator": "0.0.1",
|
|
61
|
+
<%- end -%>
|
|
62
|
+
"react": "^0.14.3",
|
|
63
|
+
<%- unless options.skip_bootstrap? -%>
|
|
64
|
+
"react-bootstrap": "^0.28.1",
|
|
65
|
+
<%- end -%>
|
|
66
|
+
"react-dom": "^0.14.3",
|
|
67
|
+
"react-on-rails": "<%= x = ReactOnRails::VERSION.match(/(\d+\.\d+\.\d+)[.\-](.*)/); "#{x[1]}-#{x[2]}" %>",
|
|
68
|
+
<%- if options.redux? -%>
|
|
69
|
+
"react-redux": "^4.0.5",
|
|
70
|
+
"redux": "^3.0.5",
|
|
71
|
+
"redux-promise": "^0.5.0",
|
|
72
|
+
"redux-thunk": "^1.0.2",
|
|
73
|
+
<%- end -%>
|
|
74
|
+
"webpack": "^1.12.8"
|
|
75
|
+
},
|
|
76
|
+
"devDependencies": {
|
|
77
|
+
<%- unless options.skip_js_linters? -%>
|
|
78
|
+
"babel-eslint": "^5.0.0-beta6",
|
|
79
|
+
<%- end -%>
|
|
80
|
+
"babel-plugin-react-transform": "^2.0.0",
|
|
81
|
+
<%- unless options.skip_bootstrap? -%>
|
|
82
|
+
"bootstrap-sass": "^3.3.5",
|
|
83
|
+
"bootstrap-sass-loader": "^1.0.9",
|
|
84
|
+
<%- end -%>
|
|
85
|
+
"css-loader": "^0.23.0",
|
|
86
|
+
<%- unless options.skip_js_linters? -%>
|
|
87
|
+
"eslint": "^1.10.3",
|
|
88
|
+
"eslint-config-airbnb": "^2.0.0",
|
|
89
|
+
"eslint-plugin-react": "^3.11.3",
|
|
90
|
+
<%- end -%>
|
|
91
|
+
"express": "^4.13.3",
|
|
92
|
+
"file-loader": "^0.8.4",
|
|
93
|
+
"jade": "^1.11.0",
|
|
94
|
+
<%- unless options.skip_js_linters? -%>
|
|
95
|
+
"jscs": "^2.7.0",
|
|
96
|
+
<%- end -%>
|
|
97
|
+
"node-sass": "^3.4.2",
|
|
98
|
+
"react-transform-hmr": "^1.0.1",
|
|
99
|
+
"sass-loader": "^3.1.1",
|
|
100
|
+
"style-loader": "^0.13.0",
|
|
101
|
+
"url-loader": "^0.5.6",
|
|
102
|
+
"webpack-dev-server": "^1.12.1"
|
|
103
|
+
}
|
|
104
|
+
}
|