From c1dc4f865f7925be58985671705f1f68c1c6154e Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sat, 5 Aug 2023 02:08:31 +0200 Subject: [PATCH 1/6] feat: adds naive bun support --- test/rake_tasks_test.rb | 14 ++++++++++++++ test/test_helper.rb | 4 +++- vite_ruby/lib/tasks/vite.rake | 6 ++++++ vite_ruby/lib/vite_ruby/cli/install.rb | 1 + vite_ruby/lib/vite_ruby/commands.rb | 1 + vite_ruby/lib/vite_ruby/config.rb | 1 + vite_ruby/lib/vite_ruby/dev_server_proxy.rb | 4 ++-- vite_ruby/lib/vite_ruby/runner.rb | 19 +++++++++++++++---- 8 files changed, 43 insertions(+), 7 deletions(-) diff --git a/test/rake_tasks_test.rb b/test/rake_tasks_test.rb index 39583839..a35d98bc 100644 --- a/test/rake_tasks_test.rb +++ b/test/rake_tasks_test.rb @@ -43,6 +43,20 @@ def test_rake_vite_install_dependencies_in_production_environment 'Expected development dependencies to be installed as well' end + def test_rake_vite_install_dependencies_supports_bun + ViteRuby.commands.send(:with_node_env, 'production') do + Dir.chdir(test_app_path) do + `touch bun.lockb` + `bundle exec rake vite:install_dependencies` + end + end + + assert_includes installed_node_module_names, 'right-pad', + 'Expected development dependencies to be installed as well' + ensure + FileUtils.rm_f(File.expand_path('bun.lockb', test_app_path)) + end + private def test_app_path diff --git a/test/test_helper.rb b/test/test_helper.rb index 16a6f253..d44986f0 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -10,7 +10,9 @@ require 'minitest/reporters' require 'minitest/stub_any_instance' -Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(color: true, location: true, fast_fail: true)] +unless ENV['RM_INFO'] + Minitest::Reporters.use! [Minitest::Reporters::DefaultReporter.new(color: true, location: true, fast_fail: true)] +end require 'rails' require 'rails/test_help' diff --git a/vite_ruby/lib/tasks/vite.rake b/vite_ruby/lib/tasks/vite.rake index 9258da9b..f1f5f920 100644 --- a/vite_ruby/lib/tasks/vite.rake +++ b/vite_ruby/lib/tasks/vite.rake @@ -43,6 +43,12 @@ namespace :vite do desc 'Ensure build dependencies like Vite are installed before bundling' task :install_dependencies do install_env_args = ENV['VITE_RUBY_SKIP_INSTALL_DEV_DEPENDENCIES'] == 'true' ? {} : { 'NODE_ENV' => 'development' } + + if File.exist?('bun.lockb') + result = system(install_env_args, 'bun install') + next unless result.nil? + end + cmd = ViteRuby.commands.legacy_npm_version? ? 'npx ci --yes' : 'npx --yes ci' result = system(install_env_args, cmd) # Fallback to `yarn` if `npx` is not available. diff --git a/vite_ruby/lib/vite_ruby/cli/install.rb b/vite_ruby/lib/vite_ruby/cli/install.rb index 3f167fa4..0f30288e 100644 --- a/vite_ruby/lib/vite_ruby/cli/install.rb +++ b/vite_ruby/lib/vite_ruby/cli/install.rb @@ -117,6 +117,7 @@ def run_with_capture(*args, **options) # Internal: Support all popular package managers. def npm_install + return 'bun install' if root.join('bun.lockb').exist? return 'yarn add' if root.join('yarn.lock').exist? return 'pnpm install' if root.join('pnpm-lock.yaml').exist? diff --git a/vite_ruby/lib/vite_ruby/commands.rb b/vite_ruby/lib/vite_ruby/commands.rb index c4d94043..070c45aa 100644 --- a/vite_ruby/lib/vite_ruby/commands.rb +++ b/vite_ruby/lib/vite_ruby/commands.rb @@ -113,6 +113,7 @@ def print_info $stdout.puts "npm: #{ `npm --version` }" $stdout.puts "yarn: #{ `yarn --version` rescue nil }" $stdout.puts "pnpm: #{ `pnpm --version` rescue nil }" + $stdout.puts "bun: #{ `bun --version` rescue nil }" $stdout.puts "ruby: #{ `ruby --version` }" $stdout.puts "\n" diff --git a/vite_ruby/lib/vite_ruby/config.rb b/vite_ruby/lib/vite_ruby/config.rb index cdb66bbc..3f6fc6aa 100644 --- a/vite_ruby/lib/vite_ruby/config.rb +++ b/vite_ruby/lib/vite_ruby/config.rb @@ -189,6 +189,7 @@ def config_from_file(path, mode:) # Internal: If any of these files is modified the build won't be skipped. DEFAULT_WATCHED_PATHS = %w[ + bun.lockb package-lock.json package.json pnpm-lock.yaml diff --git a/vite_ruby/lib/vite_ruby/dev_server_proxy.rb b/vite_ruby/lib/vite_ruby/dev_server_proxy.rb index 2970b087..c1d0e9f8 100644 --- a/vite_ruby/lib/vite_ruby/dev_server_proxy.rb +++ b/vite_ruby/lib/vite_ruby/dev_server_proxy.rb @@ -54,8 +54,8 @@ def forward_to_vite_dev_server(env) def vite_should_handle?(env) path = normalize_uri(env['PATH_INFO']) - return true if path.start_with?(vite_url_prefix) # Vite asset - return true if file_in_vite_root?(path) # Fallback if Vite can serve the file + path.start_with?(vite_url_prefix) || # Vite asset + file_in_vite_root?(path) # Fallback if Vite can serve the file end # NOTE: When using an empty 'public_output_dir', we need to rely on a diff --git a/vite_ruby/lib/vite_ruby/runner.rb b/vite_ruby/lib/vite_ruby/runner.rb index fd4993ea..4f31acbc 100644 --- a/vite_ruby/lib/vite_ruby/runner.rb +++ b/vite_ruby/lib/vite_ruby/runner.rb @@ -29,8 +29,12 @@ def run(argv, exec: false) def command_for(args) [config.to_env(env)].tap do |cmd| args = args.clone - cmd.push('node', '--inspect-brk') if args.delete('--inspect') - cmd.push('node', '--trace-deprecation') if args.delete('--trace_deprecation') + unless config.root.join('bun.lockb').exist? + puts '-' * 100 + puts 'WARNING: NOT BUN.' + cmd.push('node', '--inspect-brk') if args.delete('--inspect') + cmd.push('node', '--trace-deprecation') if args.delete('--trace_deprecation') + end cmd.push(*vite_executable) cmd.push(*args) cmd.push('--mode', config.mode) unless args.include?('--mode') || args.include?('-m') @@ -40,9 +44,16 @@ def command_for(args) # Internal: Resolves to an executable for Vite. def vite_executable bin_path = config.vite_bin_path - return [bin_path] if File.exist?(bin_path) - if config.root.join('yarn.lock').exist? + if File.exist?(bin_path) + return ['bun', '--bun', bin_path] if config.root.join('bun.lockb').exist? + + return [bin_path] + end + + if config.root.join('bun.lockb').exist? + %w[bun --bun vite] + elsif config.root.join('yarn.lock').exist? %w[yarn vite] else ["#{ `npm bin`.chomp }/vite"] From 849e70f3a46eb2ae3bced6308425d35c15fc1766 Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:02:41 +0200 Subject: [PATCH 2/6] WIP --- vite_ruby/lib/vite_ruby/runner.rb | 3 +++ 1 file changed, 3 insertions(+) diff --git a/vite_ruby/lib/vite_ruby/runner.rb b/vite_ruby/lib/vite_ruby/runner.rb index 4f31acbc..e73d160c 100644 --- a/vite_ruby/lib/vite_ruby/runner.rb +++ b/vite_ruby/lib/vite_ruby/runner.rb @@ -8,6 +8,7 @@ def initialize(vite_ruby) # Public: Executes Vite with the specified arguments. def run(argv, exec: false) + pp "run: #{argv}" config.within_root { cmd = command_for(argv) return Kernel.exec(*cmd) if exec @@ -27,6 +28,8 @@ def run(argv, exec: false) # Internal: Returns an Array with the command to run. def command_for(args) + puts '-' * 100 + puts 'command_for' [config.to_env(env)].tap do |cmd| args = args.clone unless config.root.join('bun.lockb').exist? From 0773cb48ede4e7182e528f7288caa2b13ca3e4bf Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:31:17 +0200 Subject: [PATCH 3/6] wip --- vite_ruby/lib/vite_ruby/runner.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/vite_ruby/lib/vite_ruby/runner.rb b/vite_ruby/lib/vite_ruby/runner.rb index e73d160c..7b6c597a 100644 --- a/vite_ruby/lib/vite_ruby/runner.rb +++ b/vite_ruby/lib/vite_ruby/runner.rb @@ -31,7 +31,9 @@ def command_for(args) puts '-' * 100 puts 'command_for' [config.to_env(env)].tap do |cmd| + puts 'cmd' args = args.clone + pp config.root unless config.root.join('bun.lockb').exist? puts '-' * 100 puts 'WARNING: NOT BUN.' From 9bd558bb7d0c9664f34bb06abe622cdc19d919c9 Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:34:57 +0200 Subject: [PATCH 4/6] wip --- vite_ruby/lib/vite_ruby/runner.rb | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/vite_ruby/lib/vite_ruby/runner.rb b/vite_ruby/lib/vite_ruby/runner.rb index 7b6c597a..ecd2459d 100644 --- a/vite_ruby/lib/vite_ruby/runner.rb +++ b/vite_ruby/lib/vite_ruby/runner.rb @@ -10,7 +10,8 @@ def initialize(vite_ruby) def run(argv, exec: false) pp "run: #{argv}" config.within_root { - cmd = command_for(argv) + p cmd = command_for(argv) + puts "Executing (#{exec.inspect}) ..." return Kernel.exec(*cmd) if exec log_or_noop = ->(line) { logger.info('vite') { line } } unless config.hide_build_console_output @@ -29,17 +30,18 @@ def run(argv, exec: false) # Internal: Returns an Array with the command to run. def command_for(args) puts '-' * 100 - puts 'command_for' + puts "command_for: #{env.inspect}" [config.to_env(env)].tap do |cmd| - puts 'cmd' + puts "cmd: #{cmd}" args = args.clone - pp config.root + pp [config.root, config.root.join('bun.lockb')] unless config.root.join('bun.lockb').exist? puts '-' * 100 puts 'WARNING: NOT BUN.' cmd.push('node', '--inspect-brk') if args.delete('--inspect') cmd.push('node', '--trace-deprecation') if args.delete('--trace_deprecation') end + pp [*vite_executable] cmd.push(*vite_executable) cmd.push(*args) cmd.push('--mode', config.mode) unless args.include?('--mode') || args.include?('-m') From 289e8104e5f5482d0603d72d41d324def7ffa694 Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:36:48 +0200 Subject: [PATCH 5/6] wip --- vite_ruby/lib/vite_ruby/io.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/vite_ruby/lib/vite_ruby/io.rb b/vite_ruby/lib/vite_ruby/io.rb index e335a589..de3021f0 100644 --- a/vite_ruby/lib/vite_ruby/io.rb +++ b/vite_ruby/lib/vite_ruby/io.rb @@ -8,6 +8,7 @@ class << self # Internal: A modified version of capture3 that can continuosly print stdout. # NOTE: Streaming output provides a better UX when running bin/vite build. def capture(*cmd, with_output: $stdout.method(:puts), stdin_data: '', **opts) + pp [with_output, *cmd, **opts] return Open3.capture3(*cmd, **opts) unless with_output Open3.popen3(*cmd, **opts) { |stdin, stdout, stderr, wait_threads| From ca22a75068cde13a4c35ce0215393b5f163adaae Mon Sep 17 00:00:00 2001 From: Paul Keen <125715+pftg@users.noreply.github.com> Date: Sun, 15 Oct 2023 14:49:30 +0200 Subject: [PATCH 6/6] wip --- vite_ruby/lib/vite_ruby/builder.rb | 5 ++++- vite_ruby/lib/vite_ruby/io.rb | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/vite_ruby/lib/vite_ruby/builder.rb b/vite_ruby/lib/vite_ruby/builder.rb index 0273bc46..254f2e09 100644 --- a/vite_ruby/lib/vite_ruby/builder.rb +++ b/vite_ruby/lib/vite_ruby/builder.rb @@ -66,7 +66,10 @@ def watched_files_digest def build_with_vite(*args) logger.info 'Building with Vite ⚡️' - run(['build', *args]) + p(run(['build', *args])) + + ensure + logger.debug '[Done]' end # Internal: Outputs the build results. diff --git a/vite_ruby/lib/vite_ruby/io.rb b/vite_ruby/lib/vite_ruby/io.rb index de3021f0..7dbc2026 100644 --- a/vite_ruby/lib/vite_ruby/io.rb +++ b/vite_ruby/lib/vite_ruby/io.rb @@ -16,7 +16,7 @@ def capture(*cmd, with_output: $stdout.method(:puts), stdin_data: '', **opts) stdin.close out = Thread.new { read_lines(stdout, &with_output) } err = Thread.new { stderr.read } - [out.value, err.value.to_s, wait_threads.value] + p([out.value, err.value.to_s, wait_threads.value]) } end