Module: InertiaRails::Generators::Helper

Constant Summary collapse

DEFAULT_PACKAGE_PATH =
Rails.root.join('package.json')

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.guess_inertia_template(package_json_path = DEFAULT_PACKAGE_PATH) ⇒ Object



30
31
32
33
34
35
36
# File 'lib/inertia_rails/generators/helper.rb', line 30

def guess_inertia_template(package_json_path = DEFAULT_PACKAGE_PATH)
  if package_json_path.read.include?('"tailwindcss"')
    'inertia_tw_templates'
  else
    'inertia_templates'
  end
end

.guess_the_default_framework(package_json_path = DEFAULT_PACKAGE_PATH) ⇒ Object



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# File 'lib/inertia_rails/generators/helper.rb', line 9

def guess_the_default_framework(package_json_path = DEFAULT_PACKAGE_PATH)
  package_json = JSON.parse(package_json_path.read)
  dependencies = package_json['dependencies'] || {}

  if dependencies['@inertiajs/react']
    'react'
  elsif dependencies['@inertiajs/svelte']
    version = dependencies['svelte'].gsub(/[\^~]/, '') # Remove ^ or ~ from version
    version.start_with?('5') ? 'svelte' : 'svelte4'
  elsif dependencies['@inertiajs/vue3']
    'vue'
  else
    Thor::Shell::Basic.new.say_error 'Could not determine the Inertia.js framework you are using.'
    exit 1
  end
end

.uses_typescript?Boolean

Returns:

  • (Boolean)


26
27
28
# File 'lib/inertia_rails/generators/helper.rb', line 26

def uses_typescript?
  Rails.root.join('tsconfig.json').exist?
end

Instance Method Details

#attributes_to_serializeObject



55
56
57
58
59
60
61
# File 'lib/inertia_rails/generators/helper.rb', line 55

def attributes_to_serialize
  [:id] + attributes.reject do |attribute|
    attribute.password_digest? ||
      attribute.attachment? ||
      attribute.attachments?
  end.map(&:column_name)
end

#custom_form_attributesObject



63
64
65
66
67
68
69
# File 'lib/inertia_rails/generators/helper.rb', line 63

def custom_form_attributes
  attributes.select do |attribute|
    attribute.password_digest? ||
      attribute.attachment? ||
      attribute.attachments?
  end
end

#default_value(attribute) ⇒ Object



133
134
135
136
137
138
139
140
# File 'lib/inertia_rails/generators/helper.rb', line 133

def default_value(attribute)
  case attribute.type
  when :boolean
    'false'
  else
    "''"
  end
end

#inertia_base_pathObject



39
40
41
# File 'lib/inertia_rails/generators/helper.rb', line 39

def inertia_base_path
  (class_path + [file_name]).map(&:camelize).join('/')
end

#inertia_component_nameObject



43
44
45
# File 'lib/inertia_rails/generators/helper.rb', line 43

def inertia_component_name
  singular_name.camelize
end

#inertia_js_versionObject



91
92
93
94
95
96
97
# File 'lib/inertia_rails/generators/helper.rb', line 91

def inertia_js_version
  @inertia_js_version ||= Gem::Version.new(
    JSON.parse(`npm ls @inertiajs/core --json`).then do |json|
      json['dependencies'].values.first['version']
    end
  )
end

#inertia_model_form_typeObject



51
52
53
# File 'lib/inertia_rails/generators/helper.rb', line 51

def inertia_model_form_type
  "#{inertia_component_name}FormType"
end

#inertia_model_typeObject



47
48
49
# File 'lib/inertia_rails/generators/helper.rb', line 47

def inertia_model_type
  "#{inertia_component_name}Type"
end

#input_type(attribute) ⇒ Object



114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/inertia_rails/generators/helper.rb', line 114

def input_type(attribute)
  case attribute.type
  when :text, :rich_text
    'text_area'
  when :integer, :float, :decimal
    'number'
  when :datetime, :timestamp, :time
    'datetime-local'
  when :date
    'date'
  when :boolean
    'checkbox'
  when :attachments, :attachment
    'file'
  else
    'text'
  end
end

#js_edit_resource_pathObject



79
80
81
# File 'lib/inertia_rails/generators/helper.rb', line 79

def js_edit_resource_path
  "#{route_url}/${#{singular_table_name}.id}/edit"
end

#js_new_resource_pathObject



83
84
85
# File 'lib/inertia_rails/generators/helper.rb', line 83

def js_new_resource_path
  "#{route_url}/new"
end

#js_resource_pathObject



75
76
77
# File 'lib/inertia_rails/generators/helper.rb', line 75

def js_resource_path
  "#{route_url}/${#{singular_table_name}.id}"
end

#js_resources_pathObject



87
88
89
# File 'lib/inertia_rails/generators/helper.rb', line 87

def js_resources_path
  route_url
end

#omit_input_attributesObject



71
72
73
# File 'lib/inertia_rails/generators/helper.rb', line 71

def omit_input_attributes
  ['id'] + attributes.select { |attribute| attribute.attachment? || attribute.attachments? }.map(&:column_name)
end

#ts_type(attribute) ⇒ Object



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/inertia_rails/generators/helper.rb', line 99

def ts_type(attribute)
  case attribute.type
  when :float, :decimal, :integer
    'number'
  when :boolean
    'boolean'
  when :attachment
    '{ filename: string; url: string }'
  when :attachments
    '{ filename: string; url: string }[]'
  else
    'string'
  end
end