From 6463fba5e3980aca3dcbcf5b5363b8a35903a8b3 Mon Sep 17 00:00:00 2001 From: Andy Ruiz Garramones Date: Sun, 13 Apr 2025 22:39:07 -0300 Subject: [PATCH 1/2] Fix install generator for typescript setups --- .../inertia/install/install_generator.rb | 15 +++++++ .../install/install_generator_spec.rb | 45 ++++++++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/lib/generators/inertia/install/install_generator.rb b/lib/generators/inertia/install/install_generator.rb index 8d617e67..1e599cc0 100644 --- a/lib/generators/inertia/install/install_generator.rb +++ b/lib/generators/inertia/install/install_generator.rb @@ -125,6 +125,13 @@ def install_typescript return end + if File.exist?(application_js_path) && application_layout.read.include?("<%= vite_javascript_tag 'application' %>") + say 'Renaming application.js to application.ts' + FileUtils.mv(application_js_path, application_ts_path) + say 'Updating Vite tag on application layout to use TypeScript' + gsub_file application_layout.to_s, /<%= vite_javascript_tag 'application' %>/, "<%= vite_typescript_tag 'application' %>" + end + add_dependencies(*FRAMEWORKS[framework]['packages_ts']) say 'Copying adding scripts to package.json' @@ -253,6 +260,14 @@ def typescript? @typescript = options[:typescript] || yes?('Would you like to use TypeScript? (y/n)', :green) end + def application_js_path + js_file_path('entrypoints/application.js') + end + + def application_ts_path + js_file_path('entrypoints/application.ts') + end + def inertia_entrypoint "inertia.#{typescript? ? 'ts' : 'js'}" end diff --git a/spec/generators/install/install_generator_spec.rb b/spec/generators/install/install_generator_spec.rb index 9c43cbab..9399a833 100644 --- a/spec/generators/install/install_generator_spec.rb +++ b/spec/generators/install/install_generator_spec.rb @@ -32,6 +32,40 @@ let(:ext) { 'ts' } include_context 'assert framework structure' + include_context 'assert application.js entrypoint renaming' + end + end + + shared_context 'assert application.js entrypoint renaming' do + context 'when application.js exists' do + before do + FileUtils.mkdir_p(File.join(destination_root, 'app/frontend/entrypoints')) + File.write(File.join(destination_root, 'app/frontend/entrypoints/application.js'), '// Application JS') + end + + it 'renames application.js to application.ts when TypeScript is enabled' do + expect { generator }.not_to raise_error + + if ext == 'ts' + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be true + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be false + else + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be true + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be false + end + end + end + + context 'when application.js does not exist' do + before do + FileUtils.rm_f(File.join(destination_root, 'app/frontend/entrypoints/application.js')) + end + + it 'does not attempt to rename when TypeScript is enabled' do + expect { generator }.not_to raise_error + + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be false + end end end @@ -81,6 +115,7 @@ let(:ext) { 'ts' } include_context 'assert framework structure' + include_context 'assert application.js entrypoint renaming' context 'with old Inertia version' do let(:inertia_version) { '1.2.0' } @@ -101,6 +136,7 @@ let(:ext) { 'ts' } include_context 'assert framework structure' + include_context 'assert application.js entrypoint renaming' context 'with old Inertia version' do let(:inertia_version) { '1.2.0' } @@ -192,7 +228,7 @@ def expect_packages_for(framework, ext: 'js') end) end - def expect_inertia_prepared_for(framework, ext: 'js') + def expect_inertia_prepared_for(framework, ext: 'js', application_js_exists: false) expect(destination_root).to(have_structure do case framework when :react @@ -230,10 +266,15 @@ def expect_inertia_prepared_for(framework, ext: 'js') end end file('app/views/layouts/application.html.erb') do - if ext == 'ts' + if ext == 'ts' && application_js_exists + contains('<%= vite_typescript_tag "inertia" %>') + contains("<%= vite_typescript_tag 'application' %>") + elsif ext == 'ts' && !application_js_exists contains('<%= vite_typescript_tag "inertia" %>') + contains("<%= vite_javascript_tag 'application' %>") else contains('<%= vite_javascript_tag "inertia" %>') + contains("<%= vite_javascript_tag 'application' %>") end if framework == :react contains('<%= vite_react_refresh_tag %>') From a197826da7d097ee1560297b1206e6e92b31760f Mon Sep 17 00:00:00 2001 From: Andy Ruiz Garramones Date: Sun, 27 Apr 2025 17:26:08 -0300 Subject: [PATCH 2/2] :recycle: Move `application.ts` rename to `install_vite` logic Users may install Inertia on projects that already have Vite installed. Now, the renaming only occurs when the Inertia generator is also installing Vite, ensuring compatibility with existing Vite setups and preventing unnecessary file renaming. --- .../inertia/install/install_generator.rb | 15 ++++--- .../install/install_generator_spec.rb | 44 +++++++------------ 2 files changed, 24 insertions(+), 35 deletions(-) diff --git a/lib/generators/inertia/install/install_generator.rb b/lib/generators/inertia/install/install_generator.rb index 1e599cc0..42483e51 100644 --- a/lib/generators/inertia/install/install_generator.rb +++ b/lib/generators/inertia/install/install_generator.rb @@ -125,13 +125,6 @@ def install_typescript return end - if File.exist?(application_js_path) && application_layout.read.include?("<%= vite_javascript_tag 'application' %>") - say 'Renaming application.js to application.ts' - FileUtils.mv(application_js_path, application_ts_path) - say 'Updating Vite tag on application layout to use TypeScript' - gsub_file application_layout.to_s, /<%= vite_javascript_tag 'application' %>/, "<%= vite_typescript_tag 'application' %>" - end - add_dependencies(*FRAMEWORKS[framework]['packages_ts']) say 'Copying adding scripts to package.json' @@ -189,6 +182,7 @@ def install_vite exit(false) end if (capture = run('bundle exec vite install', capture: !verbose?)) + rename_application_js_to_ts if typescript? say 'Vite Rails successfully installed', :green else say capture @@ -199,6 +193,13 @@ def install_vite end end + def rename_application_js_to_ts + return unless File.exist?(application_js_path) && application_layout.read.include?("<%= vite_javascript_tag 'application' %>") + + FileUtils.mv(application_js_path, application_ts_path) + gsub_file application_layout.to_s, /<%= vite_javascript_tag 'application' %>/, "<%= vite_typescript_tag 'application' %>" + end + def ruby_vite_installed? return true if package_manager.present? && ruby_vite? diff --git a/spec/generators/install/install_generator_spec.rb b/spec/generators/install/install_generator_spec.rb index 9399a833..f75a10b9 100644 --- a/spec/generators/install/install_generator_spec.rb +++ b/spec/generators/install/install_generator_spec.rb @@ -32,38 +32,20 @@ let(:ext) { 'ts' } include_context 'assert framework structure' - include_context 'assert application.js entrypoint renaming' end end shared_context 'assert application.js entrypoint renaming' do - context 'when application.js exists' do - before do - FileUtils.mkdir_p(File.join(destination_root, 'app/frontend/entrypoints')) - File.write(File.join(destination_root, 'app/frontend/entrypoints/application.js'), '// Application JS') - end - - it 'renames application.js to application.ts when TypeScript is enabled' do - expect { generator }.not_to raise_error - - if ext == 'ts' - expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be true - expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be false - else - expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be true - expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be false - end - end - end - - context 'when application.js does not exist' do - before do - FileUtils.rm_f(File.join(destination_root, 'app/frontend/entrypoints/application.js')) - end + let(:typescript_enabled?) { args.include?('--typescript') } - it 'does not attempt to rename when TypeScript is enabled' do - expect { generator }.not_to raise_error + it 'renames application.js to application.ts if TypeScript flag is enabled' do + expect { generator }.not_to raise_error + if typescript_enabled? + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be true + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be false + else + expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.js'))).to be true expect(File.exist?(File.join(destination_root, 'app/frontend/entrypoints/application.ts'))).to be false end end @@ -91,6 +73,14 @@ end end) end + + include_context 'assert application.js entrypoint renaming' + + context 'with --typescript' do + let(:args) { super() + %w[--typescript] } + + include_context 'assert application.js entrypoint renaming' + end end end @@ -115,7 +105,6 @@ let(:ext) { 'ts' } include_context 'assert framework structure' - include_context 'assert application.js entrypoint renaming' context 'with old Inertia version' do let(:inertia_version) { '1.2.0' } @@ -136,7 +125,6 @@ let(:ext) { 'ts' } include_context 'assert framework structure' - include_context 'assert application.js entrypoint renaming' context 'with old Inertia version' do let(:inertia_version) { '1.2.0' }