这是indexloc提供的服务,不要输入任何密码
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 5 additions & 14 deletions railties/lib/rails/generators/app_base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -447,7 +447,7 @@ def jbuilder_gemfile_entry
def javascript_gemfile_entry
return if options[:skip_javascript]

if adjusted_javascript_option == "importmap"
if options[:javascript] == "importmap"
GemfileEntry.floats "importmap-rails", "Use JavaScript with ESM import maps [https://github.com/rails/importmap-rails]"
else
GemfileEntry.floats "jsbundling-rails", "Bundle and transpile JavaScript [https://github.com/rails/jsbundling-rails]"
Expand All @@ -467,7 +467,8 @@ def hotwire_gemfile_entry
end

def using_node?
options[:javascript] && options[:javascript] != "importmap"
(options[:javascript] && !%w[importmap].include?(options[:javascript])) ||
(options[:css] && !%w[tailwind sass].include?(options[:css]))
end

def node_version
Expand Down Expand Up @@ -564,16 +565,6 @@ def dockerfile_deploy_packages
packages.compact.sort
end

# CSS processors other than Tailwind and Sass require a node-based JavaScript environment. So overwrite the normal JS default
# if one such processor has been specified.
def adjusted_javascript_option
if options[:css] && options[:css] != "tailwind" && options[:css] != "sass" && options[:javascript] == "importmap"
"esbuild"
else
options[:javascript]
end
end

def css_gemfile_entry
return unless options[:css]

Expand Down Expand Up @@ -677,9 +668,9 @@ def run_bundle
def run_javascript
return if options[:skip_javascript] || !bundle_install?

case adjusted_javascript_option
case options[:javascript]
when "importmap" then rails_command "importmap:install"
when "webpack", "esbuild", "rollup" then rails_command "javascript:install:#{adjusted_javascript_option}"
when "webpack", "esbuild", "rollup" then rails_command "javascript:install:#{options[:javascript]}"
end
end

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ FileUtils.chdir APP_ROOT do
puts "== Installing dependencies =="
system! "gem install bundler --conservative"
system("bundle check") || system!("bundle install")
<% if ["webpack", "esbuild", "rollup"].include?(options.javascript) -%>
<% if using_node? -%>

# Install JavaScript dependencies
system("yarn check --check-files") || system!("yarn install")
Expand Down
60 changes: 45 additions & 15 deletions railties/test/generators/app_generator_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -726,6 +726,8 @@ def test_skip_javascript_option
end

assert_no_gem "importmap-rails"
assert_no_gem "jsbundling-rails"
assert_no_node_files

assert_file "config/initializers/content_security_policy.rb" do |content|
assert_no_match(/policy\.connect_src/, content)
Expand All @@ -734,8 +736,6 @@ def test_skip_javascript_option
assert_file ".gitattributes" do |content|
assert_no_match(/yarn\.lock/, content)
end

assert_no_file ".node-version"
end

def test_webpack_option
Expand All @@ -755,19 +755,7 @@ def test_webpack_option

assert_equal 1, webpacker_called, "`javascript:install:webpack` expected to be called once, but was called #{webpacker_called} times."
assert_gem "jsbundling-rails"

assert_file "Dockerfile" do |content|
assert_match(/yarn/, content)
assert_match(/node-gyp/, content)
end

assert_file ".node-version" do |content|
if ENV["NODE_VERSION"]
assert_match(/#{ENV["NODE_VERSION"]}/, content)
else
assert_match(/\d+\.\d+\.\d+/, content)
end
end
assert_node_files
end

def test_esbuild_option
Expand All @@ -787,6 +775,7 @@ def test_esbuild_option

assert_equal 1, esbuild_called, "`javascript:install:esbuild` expected to be called once, but was called #{esbuild_called} times."
assert_gem "jsbundling-rails"
assert_node_files
end

def test_esbuild_option_with_javacript_argument
Expand Down Expand Up @@ -861,18 +850,39 @@ def test_css_option_with_asset_pipeline_tailwind
assert_file "app/views/layouts/application.html.erb" do |content|
assert_match(/tailwind/, content)
end
assert_no_node_files
end

def test_css_option_with_tailwind_uses_cssbundling_gem_when_using_node
run_generator [destination_root, "--css=tailwind", "--javascript=esbuild"]
assert_gem "cssbundling-rails"
assert_no_gem "tailwindcss-rails"
end

def test_css_option_with_asset_pipeline_sass
run_generator_and_bundler [destination_root, "--css=sass"]
assert_gem "dartsass-rails"
assert_file "app/assets/stylesheets/application.scss"
assert_no_node_files
end

def test_css_option_with_sass_uses_cssbundling_gem_when_using_node
run_generator [destination_root, "--css=sass", "--javascript=esbuild"]
assert_gem "cssbundling-rails"
assert_no_gem "dartsass-rails"
end

def test_css_option_with_cssbundling_gem
run_generator_and_bundler [destination_root, "--css=postcss"]
assert_gem "cssbundling-rails"
assert_file "app/assets/stylesheets/application.postcss.css"
assert_node_files
end

def test_css_option_with_cssbundling_gem_does_not_force_jsbundling_gem
run_generator [destination_root, "--css=postcss"]
assert_no_gem "jsbundling-rails"
assert_gem "importmap-rails"
end

def test_dev_gems
Expand Down Expand Up @@ -1137,6 +1147,26 @@ def test_name_option
end

private
def assert_node_files
assert_file ".node-version" do |content|
assert_match %r/\d+\.\d+\.\d+/, content
end

assert_file "Dockerfile" do |content|
assert_match "yarn", content
assert_match "node-gyp", content
end
end

def assert_no_node_files
assert_no_file ".node-version"

assert_file "Dockerfile" do |content|
assert_no_match "yarn", content
assert_no_match "node-gyp", content
end
end

def run_generator_and_bundler(args)
option_args, positional_args = args.partition { |arg| arg.start_with?("--") }
option_args << "--no-skip-bundle"
Expand Down