Skip to content

Commit c9e84ad

Browse files
authored
Merge pull request #174 from brodienguyen/improve-framework-detection-logic-and-add-test-coverage
Improve framework detection logic and add test coverage
2 parents cb692eb + c443294 commit c9e84ad

File tree

9 files changed

+83
-7
lines changed

9 files changed

+83
-7
lines changed

lib/inertia_rails/generators/helper.rb

+9-7
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,16 @@ module InertiaRails
44
module Generators
55
module Helper
66
class << self
7-
def guess_the_default_framework
8-
package = Rails.root.join('package.json').read
9-
case package
10-
when %r{@inertiajs/react}
7+
def guess_the_default_framework(package_json_path = Rails.root.join('package.json'))
8+
package_json = JSON.parse(package_json_path.read)
9+
dependencies = package_json['dependencies'] || {}
10+
11+
if dependencies['@inertiajs/react']
1112
'react'
12-
when %r{@inertiajs/svelte}
13-
package.match?(/"svelte": "\^5/) ? 'svelte' : 'svelte4'
14-
when %r{@inertiajs/vue3}
13+
elsif dependencies['@inertiajs/svelte']
14+
version = dependencies['svelte'].gsub(/[\^~]/, '') # Remove ^ or ~ from version
15+
version.start_with?('5') ? 'svelte' : 'svelte4'
16+
elsif dependencies['@inertiajs/vue3']
1517
'vue'
1618
else
1719
Thor::Shell::Basic.new.say_error 'Could not determine the Inertia.js framework you are using.'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"dependencies": {}
3+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/react": "1.0.0"
4+
}
5+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/svelte": "1.0.0",
4+
"svelte": "^4.0.0"
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/svelte": "1.0.0",
4+
"svelte": "^5.0.0"
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/svelte": "1.0.0",
4+
"svelte": "5.0.0"
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/svelte": "1.0.0",
4+
"svelte": "~5.0.0"
5+
}
6+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"@inertiajs/vue3": "1.0.0"
4+
}
5+
}
+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
# frozen_string_literal: true
2+
3+
require 'thor'
4+
require_relative '../../lib/inertia_rails/generators/helper'
5+
6+
RSpec.describe InertiaRails::Generators::Helper, type: :helper do
7+
describe '#guess_the_default_framework' do
8+
let(:package_json_path) { Pathname.new(File.expand_path("spec/fixtures/package_json_files/#{fixture_file_name}", Dir.pwd)) }
9+
10+
shared_examples 'framework detection' do |file_name, expected_framework|
11+
let(:fixture_file_name) { file_name }
12+
13+
it "returns #{expected_framework.inspect} when inspect \"#{file_name}\"" do
14+
expect(described_class.guess_the_default_framework(package_json_path)).to eq(expected_framework)
15+
end
16+
end
17+
18+
it_behaves_like 'framework detection', 'react_package.json', 'react'
19+
it_behaves_like 'framework detection', 'svelte5_caret_package.json', 'svelte'
20+
it_behaves_like 'framework detection', 'svelte5_exact_package.json', 'svelte'
21+
it_behaves_like 'framework detection', 'svelte5_tilde_package.json', 'svelte'
22+
it_behaves_like 'framework detection', 'svelte4_package.json', 'svelte4'
23+
it_behaves_like 'framework detection', 'vue_package.json', 'vue'
24+
25+
# Handle exception
26+
context 'when framework cannot be determined' do
27+
let(:fixture_file_name) { 'empty_package.json' }
28+
29+
it 'raises an error' do
30+
allow(described_class).to receive(:exit) # Prevent `exit` from terminating the test
31+
expect(Thor::Shell::Basic).to receive_message_chain(:new, :say_error)
32+
.with('Could not determine the Inertia.js framework you are using.')
33+
described_class.guess_the_default_framework(package_json_path)
34+
end
35+
end
36+
end
37+
end

0 commit comments

Comments
 (0)