Description: Use system yarnpkg instead of yarn
 In Debian, yarn is packaged as "yarnpkg".
 .
 This patch will replace all the "bin/yarn" usages to "bin/yarnpkg".
Author: Jongmin Kim <jmkim@pukyong.ac.kr>
Forwarded: no
Last-Update: 2019-06-21
--- a/railties/lib/rails/app_updater.rb
+++ b/railties/lib/rails/app_updater.rb
@@ -21,7 +21,7 @@
       private
         def generator_options
           options = { api: !!Rails.application.config.api_only, update: true }
-          options[:skip_javascript] = !File.exist?(Rails.root.join("bin", "yarn"))
+          options[:skip_javascript] = !File.exist?(Rails.root.join("bin", "yarnpkg"))
           options[:skip_active_record]  = !defined?(ActiveRecord::Railtie)
           options[:skip_active_storage] = !defined?(ActiveStorage::Engine) || !defined?(ActiveRecord::Railtie)
           options[:skip_action_mailer]  = !defined?(ActionMailer::Railtie)
--- a/railties/lib/rails/generators/rails/app/app_generator.rb
+++ b/railties/lib/rails/generators/rails/app/app_generator.rb
@@ -96,7 +96,7 @@
       chmod "bin", 0755 & ~File.umask, verbose: false
 
       remove_file "bin/spring" unless spring_install?
-      remove_file "bin/yarn" if options[:skip_javascript]
+      remove_file "bin/yarnpkg" if options[:skip_javascript]
     end
 
     def bin_when_updating
@@ -104,7 +104,7 @@
     end
 
     def yarn_when_updating
-      template "bin/yarn", force: true do |content|
+      template "bin/yarnpkg", force: true do |content|
         "#{shebang}\n" + content
       end
 
--- a/railties/lib/rails/generators/rails/app/templates/bin/setup.tt
+++ b/railties/lib/rails/generators/rails/app/templates/bin/setup.tt
@@ -18,7 +18,7 @@
 <% unless options.skip_javascript? -%>
 
   # Install JavaScript dependencies
-  system! 'bin/yarn'
+  system! 'bin/yarnpkg'
 <% end -%>
 <% unless options.skip_active_record? -%>
 
--- a/railties/lib/rails/tasks/yarn.rake
+++ b/railties/lib/rails/tasks/yarn.rake
@@ -10,21 +10,21 @@
     end
 
     yarn_flags =
-      if `#{RbConfig.ruby} "#{Rails.root}/bin/yarn" --version`.start_with?("1")
+      if `#{RbConfig.ruby} "#{Rails.root}/bin/yarnpkg" --version`.start_with?("1")
         "--no-progress --frozen-lockfile"
       else
         "--immutable"
       end
 
-    system({ "NODE_ENV" => node_env }, "#{RbConfig.ruby} \"#{Rails.root}/bin/yarn\" install #{yarn_flags}")
+    system({ "NODE_ENV" => node_env }, "#{RbConfig.ruby} \"#{Rails.root}/bin/yarnpkg\" install #{yarn_flags}")
   rescue Errno::ENOENT
-    $stderr.puts "bin/yarn was not found."
+    $stderr.puts "bin/yarnpkg was not found."
     $stderr.puts "Please run `bundle exec rails app:update:bin` to create it."
     exit 1
   end
 end
 
 # Run Yarn prior to Sprockets assets precompilation, so dependencies are available for use.
-if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarn"))
+if Rake::Task.task_defined?("assets:precompile") && File.exist?(Rails.root.join("bin", "yarnpkg"))
   Rake::Task["assets:precompile"].enhance [ "yarn:install" ]
 end
--- a/railties/test/generators/api_app_generator_test.rb
+++ b/railties/test/generators/api_app_generator_test.rb
@@ -106,7 +106,7 @@
       { api: true, update: true }, { destination_root: destination_root, shell: @shell }
     quietly { generator.update_bin_files }
 
-    assert_no_file "bin/yarn"
+    assert_no_file "bin/yarnpkg"
   end
 
   private
@@ -168,7 +168,7 @@
       %w(app/assets
          app/helpers
          app/views/layouts/application.html.erb
-         bin/yarn
+         bin/yarnpkg
          config/initializers/assets.rb
          config/initializers/cookies_serializer.rb
          config/initializers/content_security_policy.rb
--- a/railties/test/generators/app_generator_test.rb
+++ b/railties/test/generators/app_generator_test.rb
@@ -42,7 +42,7 @@
   bin/rails
   bin/rake
   bin/setup
-  bin/yarn
+  /bin/yarnpkg
   config/application.rb
   config/boot.rb
   config/cable.yml
@@ -301,11 +301,11 @@
   def test_adds_bin_yarn_into_setup_script
     run_generator
 
-    assert_file "bin/yarn"
+    assert_file "bin/yarnpkg"
 
     assert_file "bin/setup" do |content|
       # Does not comment yarn install
-      assert_match(/(?=[^#]*?) system! 'bin\/yarn'/, content)
+      assert_match(/(?=[^#]*?) system! 'bin\/yarnpkg'/, content)
     end
   end
 
@@ -318,10 +318,10 @@
       generator.send(:app_const)
       quietly { generator.update_bin_files }
 
-      assert_no_file "#{app_root}/bin/yarn"
+      assert_no_file "#{app_root}/bin/yarnpkg"
 
       assert_file "#{app_root}/bin/setup" do |content|
-        assert_no_match(/system! 'bin\/yarn'/, content)
+        assert_no_match(/system! 'bin\/yarnpkg'/, content)
       end
     end
   end
@@ -1168,7 +1168,7 @@
     assert_no_file "#{app_root}/config/storage.yml"
     assert_no_file "#{app_root}/config/webpacker.yml"
     assert_no_file "#{app_root}/config/cable.yml"
-    assert_no_file "#{app_root}/bin/yarn"
+    assert_no_file "#{app_root}/bin/yarnpkg"
     assert_no_file "#{app_root}/views/layouts/mailer.html.erb"
     assert_no_file "#{app_root}/config/spring.rb"
     assert_no_file "#{app_root}/app/jobs/application.rb"
--- a/railties/test/generators/shared_generator_tests.rb
+++ b/railties/test/generators/shared_generator_tests.rb
@@ -340,14 +340,13 @@
     skip "#34009 disabled JS by default for plugins" if generator_class.name == "Rails::Generators::PluginGenerator"
     run_generator
     assert_file "#{application_path}/package.json", /dependencies/
-    assert_file "#{application_path}/bin/yarn"
+    assert_file "/bin/yarnpkg"
     assert_file "#{application_path}/config/initializers/assets.rb", /node_modules/
   end
 
   def test_generator_for_yarn_skipped
     run_generator([destination_root, "--skip-javascript"])
     assert_no_file "#{application_path}/package.json"
-    assert_no_file "#{application_path}/bin/yarn"
 
     assert_file "#{application_path}/config/initializers/assets.rb" do |content|
       assert_no_match(/node_modules/, content)
--- a/railties/test/isolation/abstract_unit.rb
+++ b/railties/test/isolation/abstract_unit.rb
@@ -518,14 +518,14 @@
 
   unless File.exist?("#{RAILS_FRAMEWORK_ROOT}/actionview/lib/assets/compiled/rails-ujs.js")
     Dir.chdir("#{RAILS_FRAMEWORK_ROOT}/actionview") do
-      sh "yarn build"
+      sh "yarnpkg build"
     end
   end
 
   assets_path = "#{RAILS_FRAMEWORK_ROOT}/railties/test/isolation/assets"
   unless Dir.exist?("#{assets_path}/node_modules")
     Dir.chdir(assets_path) do
-      sh "yarn install"
+      sh "yarnpkg install"
     end
   end
 
