diff --git a/.github/workflows/ruby.yml b/.github/workflows/ruby.yml index 1b9039467..23d3f4c35 100644 --- a/.github/workflows/ruby.yml +++ b/.github/workflows/ruby.yml @@ -20,6 +20,8 @@ jobs: matrix: ruby: [2.7] runs-on: ubuntu-latest + env: + PACKAGE_JSON_FALLBACK_MANAGER: yarn_classic steps: - uses: actions/checkout@v4 with: @@ -56,6 +58,15 @@ jobs: strategy: fail-fast: false matrix: + js_package_manager: + - name: npm + installer: npm + - name: yarn_classic + installer: yarn + - name: pnpm + installer: pnpm + - name: bun + installer: bun ruby: [2.7] gemfile: # These have shakapacker: @@ -71,12 +82,14 @@ jobs: # Workaround b/c upgrading Minitest broke some mocking expectations # having to do with automatic kwarg splatting MT_KWARGS_HACK: 1 + PACKAGE_JSON_FALLBACK_MANAGER: ${{ matrix.js_package_manager.name }} + SHAKAPACKER_USE_PACKAGE_JSON_GEM: true steps: - uses: actions/checkout@v4 with: persist-credentials: false - uses: actions/setup-node@v3 - - run: npm -g install yalc + - run: npm -g install yalc ${{ matrix.js_package_manager.installer }} - run: yalc publish - name: Save root node_modules to cache uses: actions/cache@v3 @@ -92,6 +105,7 @@ jobs: with: bundler: 2.4.9 ruby-version: ${{ matrix.ruby }} + - run: ./test/bin/create-fake-js-package-managers ${{ matrix.js_package_manager.installer }} - name: Save dummy app ruby gems to cache uses: actions/cache@v3 with: @@ -99,7 +113,7 @@ jobs: key: dummy-app-gem-cache-${{ hashFiles('${{ github.workspace }}/gemfiles/${{ matrix.gemfile }}.gemfile.lock') }} - name: Install Ruby Gems for dummy app run: bundle lock --add-platform 'x86_64-linux' && bundle check --path=test/dummy/vendor/bundle || bundle _2.4.9_ install --frozen --path=test/dummy/vendor/bundle --jobs=4 --retry=3 - - run: cd test/dummy && yalc add react_ujs && yarn + - run: cd test/dummy && yalc add react_ujs && ${{ matrix.js_package_manager.installer }} install - run: bundle exec rake test env: NODE_OPTIONS: --openssl-legacy-provider diff --git a/Appraisals b/Appraisals index a28c31403..967ed8ecb 100644 --- a/Appraisals +++ b/Appraisals @@ -16,7 +16,7 @@ end appraise 'shakapacker' do gem 'rails', '~> 7.0.x' - gem 'shakapacker', '7.0.2' + gem 'shakapacker', '7.2.0' end appraise 'base' do diff --git a/CHANGELOG.md b/CHANGELOG.md index a01f77c21..d2f8204de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ _Please add entries here for your pull requests that are not yet released._ #### Changed - Make es6 and ts usable at same time. #1299 +- Support other JS package managers using `package_json` gem #1306 ## [3.1.1] - 2023-08-16 diff --git a/Gemfile.lock b/Gemfile.lock index 164b2b8ff..e109d23ef 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -102,12 +102,8 @@ GEM matrix (0.4.2) method_source (1.0.0) mini_mime (1.0.2) - mini_portile2 (2.8.4) minitest (5.17.0) nenv (0.3.0) - nokogiri (1.14.3) - mini_portile2 (~> 2.8.0) - racc (~> 1.4) nokogiri (1.14.3-x86_64-darwin) racc (~> 1.4) nokogiri (1.14.3-x86_64-linux) @@ -115,6 +111,7 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + package_json (0.1.0) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) @@ -166,7 +163,6 @@ GEM zeitwerk (2.6.6) PLATFORMS - ruby x86_64-darwin-20 x86_64-linux @@ -182,6 +178,7 @@ DEPENDENCIES guard-minitest jbuilder listen (~> 3.0.0) + package_json pry-byebug react-rails! selenium-webdriver diff --git a/Rakefile b/Rakefile index 76112a049..de4274c86 100644 --- a/Rakefile +++ b/Rakefile @@ -8,31 +8,26 @@ end Bundler::GemHelper.install_tasks +require "package_json" + def copy_react_asset(webpack_file, destination_file) full_webpack_path = File.expand_path("../react-builds/build/#{webpack_file}", __FILE__) full_destination_path = File.expand_path("../lib/assets/react-source/#{destination_file}", __FILE__) FileUtils.cp(full_webpack_path, full_destination_path) end -# Move to `dirname` and execute `yarn {cmd}` -def yarn_run_in(dirname, cmd) - Dir.chdir(dirname) do - `yarn #{cmd}` - end -end - namespace :react do desc "Run the JS build process to put files in the gem source" task update: %i[install build copy] desc "Install the JavaScript dependencies" task :install do - yarn_run_in("react-builds", "install") + PackageJson.read("react-builds").manager.install end desc "Build the JS bundles with Webpack" task :build do - yarn_run_in("react-builds", "build") + PackageJson.read("react-builds").manager.run("build") end desc "Copy browser-ready JS files to the gem's asset paths" @@ -51,12 +46,12 @@ namespace :ujs do desc "Install the JavaScript dependencies" task :install do - `yarn install` + PackageJson.read.manager.install end desc "Build the JS bundles with Webpack" task :build do - `yarn build` + PackageJson.read.manager.run("build") end desc "Copy browser-ready JS files to the gem's asset paths" @@ -87,7 +82,7 @@ task default: :test task :test_setup do Dir.chdir("./test/dummy") do - `yarn install` + PackageJson.read.manager.install end end diff --git a/gemfiles/base.gemfile.lock b/gemfiles/base.gemfile.lock index 3fd3b9201..a21eb747e 100644 --- a/gemfiles/base.gemfile.lock +++ b/gemfiles/base.gemfile.lock @@ -174,6 +174,7 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + package_json (0.1.0) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) @@ -258,6 +259,7 @@ DEPENDENCIES guard-minitest jbuilder listen (~> 3.0.0) + package_json pry-byebug rails (~> 7.0.x) react-rails! diff --git a/gemfiles/shakapacker.gemfile b/gemfiles/shakapacker.gemfile index 86c2338d1..bbd6c5b47 100644 --- a/gemfiles/shakapacker.gemfile +++ b/gemfiles/shakapacker.gemfile @@ -3,6 +3,6 @@ source "http://rubygems.org" gem "rails", "~> 7.0.x" -gem "shakapacker", "7.0.2" +gem "shakapacker", "7.2.0" gemspec path: "../" diff --git a/gemfiles/shakapacker.gemfile.lock b/gemfiles/shakapacker.gemfile.lock index 4fb41f942..7c2d64807 100644 --- a/gemfiles/shakapacker.gemfile.lock +++ b/gemfiles/shakapacker.gemfile.lock @@ -176,6 +176,7 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + package_json (0.1.0) pry (0.14.2) coderay (~> 1.1) method_source (~> 1.0) @@ -185,7 +186,7 @@ GEM public_suffix (5.0.1) racc (1.6.2) rack (2.2.7) - rack-proxy (0.7.6) + rack-proxy (0.7.7) rack rack-test (2.1.0) rack (>= 1.3) @@ -227,8 +228,9 @@ GEM rubyzip (>= 1.2.2, < 3.0) websocket (~> 1.0) semantic_range (3.0.0) - shakapacker (7.0.2) + shakapacker (7.2.0) activesupport (>= 5.2) + package_json rack-proxy (>= 0.6.1) railties (>= 5.2) semantic_range (>= 2.3.0) @@ -268,11 +270,12 @@ DEPENDENCIES guard-minitest jbuilder listen (~> 3.0.0) + package_json pry-byebug rails (~> 7.0.x) react-rails! selenium-webdriver - shakapacker (= 7.0.2) + shakapacker (= 7.2.0) test-unit (~> 2.5) BUNDLED WITH diff --git a/gemfiles/sprockets_3.gemfile.lock b/gemfiles/sprockets_3.gemfile.lock index 8e044462c..d6c114564 100644 --- a/gemfiles/sprockets_3.gemfile.lock +++ b/gemfiles/sprockets_3.gemfile.lock @@ -178,6 +178,7 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + package_json (0.1.0) pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) @@ -270,6 +271,7 @@ DEPENDENCIES jbuilder listen (~> 3.0.0) mini_racer + package_json pry-byebug rails (~> 7.0.x) react-rails! diff --git a/gemfiles/sprockets_4.gemfile.lock b/gemfiles/sprockets_4.gemfile.lock index 815347067..0de2c85bf 100644 --- a/gemfiles/sprockets_4.gemfile.lock +++ b/gemfiles/sprockets_4.gemfile.lock @@ -178,6 +178,7 @@ GEM notiffany (0.1.3) nenv (~> 0.1) shellany (~> 0.0) + package_json (0.1.0) pry (0.12.2) coderay (~> 1.1.0) method_source (~> 0.9.0) @@ -270,6 +271,7 @@ DEPENDENCIES jbuilder listen (~> 3.0.0) mini_racer + package_json pry-byebug rails (~> 7.0.x) react-rails! diff --git a/lib/generators/react/install_generator.rb b/lib/generators/react/install_generator.rb index a64320bfe..5c48e5e7d 100644 --- a/lib/generators/react/install_generator.rb +++ b/lib/generators/react/install_generator.rb @@ -103,8 +103,19 @@ def setup_react_sprockets ReactRailsUJS.useContext(componentRequireContext); JS + def require_package_json_gem + require "bundler/inline" + + gemfile(true) { gem "package_json" } + + puts "using package_json v#{PackageJson::VERSION}" + end + def setup_react_shakapacker - `yarn add react_ujs` + require_package_json_gem + + PackageJson.read.manager.add(["react_ujs"]) + if manifest.exist? append_file(manifest, SHAKAPACKER_SETUP_UJS) else diff --git a/react-rails.gemspec b/react-rails.gemspec index fc5755456..39f06120e 100644 --- a/react-rails.gemspec +++ b/react-rails.gemspec @@ -28,6 +28,7 @@ Gem::Specification.new do |s| s.add_development_dependency 'selenium-webdriver' s.add_development_dependency 'test-unit', '~> 2.5' s.add_development_dependency 'pry-byebug' + s.add_development_dependency 'package_json' s.add_dependency 'connection_pool' diff --git a/test/bin/create-fake-js-package-managers b/test/bin/create-fake-js-package-managers new file mode 100755 index 000000000..d911151fa --- /dev/null +++ b/test/bin/create-fake-js-package-managers @@ -0,0 +1,36 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# creates a set of fake JavaScript package managers in a temporary bin +# directory for GitHub Actions, _excluding_ the one passed in as an +# argument in order to assert that only that package manager is used + +require "tmpdir" + +# setup the bin directory we want to use +bin_dir = Dir.mktmpdir("react-rails-") + +if ENV["GITHUB_ACTIONS"] + puts "adding #{bin_dir} to GITHUB_PATH..." + File.write(ENV.fetch("GITHUB_PATH"), "#{bin_dir}\n", mode: "a+") +end + +managers = %w[npm yarn pnpm bun] +manager_in_use = ARGV[0] + +Dir.chdir(bin_dir) do + managers.each do |manager| + next if manager == manager_in_use + + puts "creating #{bin_dir}/#{manager}..." + File.write( + manager, + <<~CONTENTS + #!/usr/bin/env node + + throw new Error("(#{manager}) this is not the package manager you're looking..."); + CONTENTS + ) + File.chmod(0o755, manager) + end +end