inertia_rails 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (209) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -0
  3. data/README.md +6 -7
  4. data/lib/generators/inertia/controller/controller_generator.rb +18 -0
  5. data/lib/generators/inertia/controller/templates/controller.rb.tt +10 -0
  6. data/lib/generators/inertia/install/frameworks.yml +98 -0
  7. data/lib/generators/inertia/install/helpers.rb +51 -0
  8. data/lib/generators/inertia/install/install_generator.rb +291 -0
  9. data/lib/generators/inertia/install/js_package_manager.rb +50 -0
  10. data/lib/generators/inertia/install/templates/assets/inertia.svg +1 -0
  11. data/lib/generators/inertia/install/templates/assets/react.svg +1 -0
  12. data/lib/generators/inertia/install/templates/assets/svelte.svg +1 -0
  13. data/lib/generators/inertia/install/templates/assets/vite_ruby.svg +1 -0
  14. data/lib/generators/inertia/install/templates/assets/vue.svg +1 -0
  15. data/lib/generators/{inertia_rails/install → inertia/install/templates}/controller.rb +3 -1
  16. data/lib/generators/inertia/install/templates/dev +23 -0
  17. data/lib/generators/inertia/install/templates/initializer.rb +6 -0
  18. data/lib/generators/inertia/install/templates/react/InertiaExample.jsx +60 -0
  19. data/lib/generators/inertia/install/templates/react/InertiaExample.module.css +80 -0
  20. data/lib/generators/inertia/install/templates/react/InertiaExample.tsx +60 -0
  21. data/lib/generators/inertia/install/templates/react/inertia.js +45 -0
  22. data/lib/generators/inertia/install/templates/react/inertia.ts +51 -0
  23. data/lib/generators/inertia/install/templates/react/tsconfig.app.json +27 -0
  24. data/lib/generators/inertia/install/templates/react/tsconfig.json +11 -0
  25. data/lib/generators/inertia/install/templates/react/tsconfig.node.json +13 -0
  26. data/lib/generators/inertia/install/templates/react/vite-env.d.ts +1 -0
  27. data/lib/generators/inertia/install/templates/svelte/InertiaExample.svelte +112 -0
  28. data/lib/generators/inertia/install/templates/svelte/InertiaExample.ts.svelte +112 -0
  29. data/lib/generators/inertia/install/templates/svelte/inertia.js +44 -0
  30. data/lib/generators/inertia/install/templates/svelte/inertia.ts.tt +45 -0
  31. data/lib/generators/inertia/install/templates/svelte/svelte.config.js +7 -0
  32. data/lib/generators/inertia/install/templates/svelte/tsconfig.json +21 -0
  33. data/lib/generators/inertia/install/templates/svelte/tsconfig.node.json +12 -0
  34. data/lib/generators/inertia/install/templates/svelte/vite-env.d.ts +2 -0
  35. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.svelte +116 -0
  36. data/lib/generators/inertia/install/templates/svelte4/InertiaExample.ts.svelte +116 -0
  37. data/lib/generators/inertia/install/templates/svelte4/inertia.js +43 -0
  38. data/lib/generators/inertia/install/templates/svelte4/inertia.ts.tt +44 -0
  39. data/lib/generators/inertia/install/templates/svelte4/svelte.config.js +7 -0
  40. data/lib/generators/inertia/install/templates/svelte4/tsconfig.json +21 -0
  41. data/lib/generators/inertia/install/templates/svelte4/tsconfig.node.json +12 -0
  42. data/lib/generators/inertia/install/templates/svelte4/vite-env.d.ts +2 -0
  43. data/lib/generators/inertia/install/templates/tailwind/application.css +13 -0
  44. data/lib/generators/inertia/install/templates/tailwind/postcss.config.js +6 -0
  45. data/lib/generators/inertia/install/templates/tailwind/tailwind.config.js.tt +18 -0
  46. data/lib/generators/inertia/install/templates/vue/InertiaExample.ts.vue +117 -0
  47. data/lib/generators/inertia/install/templates/vue/InertiaExample.vue +117 -0
  48. data/lib/generators/inertia/install/templates/vue/inertia.js +35 -0
  49. data/lib/generators/inertia/install/templates/vue/inertia.ts +35 -0
  50. data/lib/generators/inertia/install/templates/vue/tsconfig.app.json +24 -0
  51. data/lib/generators/inertia/install/templates/vue/tsconfig.json +11 -0
  52. data/lib/generators/inertia/install/templates/vue/tsconfig.node.json +22 -0
  53. data/lib/generators/inertia/install/templates/vue/vite-env.d.ts +1 -0
  54. data/lib/generators/inertia/scaffold/scaffold_generator.rb +16 -0
  55. data/lib/generators/inertia/scaffold_controller/scaffold_controller_generator.rb +60 -0
  56. data/lib/generators/inertia/scaffold_controller/templates/controller.rb.tt +100 -0
  57. data/lib/generators/inertia_templates/controller/controller_generator.rb +12 -0
  58. data/lib/generators/inertia_templates/controller/templates/react/view.jsx.tt +8 -0
  59. data/lib/generators/inertia_templates/controller/templates/react/view.tsx.tt +8 -0
  60. data/lib/generators/inertia_templates/controller/templates/svelte/view.svelte.tt +2 -0
  61. data/lib/generators/inertia_templates/controller/templates/svelte4/view.svelte.tt +2 -0
  62. data/lib/generators/inertia_templates/controller/templates/vue/view.vue.tt +4 -0
  63. data/lib/generators/inertia_templates/scaffold/scaffold_generator.rb +12 -0
  64. data/lib/generators/inertia_templates/scaffold/templates/react/Edit.jsx.tt +35 -0
  65. data/lib/generators/inertia_templates/scaffold/templates/react/Edit.tsx.tt +40 -0
  66. data/lib/generators/inertia_templates/scaffold/templates/react/Form.jsx.tt +111 -0
  67. data/lib/generators/inertia_templates/scaffold/templates/react/Form.tsx.tt +130 -0
  68. data/lib/generators/inertia_templates/scaffold/templates/react/Index.jsx.tt +26 -0
  69. data/lib/generators/inertia_templates/scaffold/templates/react/Index.tsx.tt +32 -0
  70. data/lib/generators/inertia_templates/scaffold/templates/react/New.jsx.tt +27 -0
  71. data/lib/generators/inertia_templates/scaffold/templates/react/New.tsx.tt +32 -0
  72. data/lib/generators/inertia_templates/scaffold/templates/react/One.jsx.tt +26 -0
  73. data/lib/generators/inertia_templates/scaffold/templates/react/One.tsx.tt +32 -0
  74. data/lib/generators/inertia_templates/scaffold/templates/react/Show.jsx.tt +32 -0
  75. data/lib/generators/inertia_templates/scaffold/templates/react/Show.tsx.tt +38 -0
  76. data/lib/generators/inertia_templates/scaffold/templates/react/types.ts.tt +19 -0
  77. data/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.svelte.tt +36 -0
  78. data/lib/generators/inertia_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +37 -0
  79. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.svelte.tt +97 -0
  80. data/lib/generators/inertia_templates/scaffold/templates/svelte/Form.ts.svelte.tt +102 -0
  81. data/lib/generators/inertia_templates/scaffold/templates/svelte/Index.svelte.tt +35 -0
  82. data/lib/generators/inertia_templates/scaffold/templates/svelte/Index.ts.svelte.tt +39 -0
  83. data/lib/generators/inertia_templates/scaffold/templates/svelte/New.svelte.tt +29 -0
  84. data/lib/generators/inertia_templates/scaffold/templates/svelte/New.ts.svelte.tt +30 -0
  85. data/lib/generators/inertia_templates/scaffold/templates/svelte/One.svelte.tt +28 -0
  86. data/lib/generators/inertia_templates/scaffold/templates/svelte/One.ts.svelte.tt +30 -0
  87. data/lib/generators/inertia_templates/scaffold/templates/svelte/Show.svelte.tt +35 -0
  88. data/lib/generators/inertia_templates/scaffold/templates/svelte/Show.ts.svelte.tt +39 -0
  89. data/lib/generators/inertia_templates/scaffold/templates/svelte/types.ts.tt +19 -0
  90. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Edit.svelte.tt +37 -0
  91. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +38 -0
  92. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.svelte.tt +96 -0
  93. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +106 -0
  94. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.svelte.tt +36 -0
  95. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +37 -0
  96. data/lib/generators/inertia_templates/scaffold/templates/svelte4/New.svelte.tt +30 -0
  97. data/lib/generators/inertia_templates/scaffold/templates/svelte4/New.ts.svelte.tt +31 -0
  98. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.svelte.tt +28 -0
  99. data/lib/generators/inertia_templates/scaffold/templates/svelte4/One.ts.svelte.tt +30 -0
  100. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.svelte.tt +39 -0
  101. data/lib/generators/inertia_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +40 -0
  102. data/lib/generators/inertia_templates/scaffold/templates/svelte4/types.ts.tt +19 -0
  103. data/lib/generators/inertia_templates/scaffold/templates/vue/Edit.ts.vue.tt +37 -0
  104. data/lib/generators/inertia_templates/scaffold/templates/vue/Edit.vue.tt +36 -0
  105. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.ts.vue.tt +101 -0
  106. data/lib/generators/inertia_templates/scaffold/templates/vue/Form.vue.tt +94 -0
  107. data/lib/generators/inertia_templates/scaffold/templates/vue/Index.ts.vue.tt +35 -0
  108. data/lib/generators/inertia_templates/scaffold/templates/vue/Index.vue.tt +31 -0
  109. data/lib/generators/inertia_templates/scaffold/templates/vue/New.ts.vue.tt +30 -0
  110. data/lib/generators/inertia_templates/scaffold/templates/vue/New.vue.tt +29 -0
  111. data/lib/generators/inertia_templates/scaffold/templates/vue/One.ts.vue.tt +28 -0
  112. data/lib/generators/inertia_templates/scaffold/templates/vue/One.vue.tt +26 -0
  113. data/lib/generators/inertia_templates/scaffold/templates/vue/Show.ts.vue.tt +41 -0
  114. data/lib/generators/inertia_templates/scaffold/templates/vue/Show.vue.tt +37 -0
  115. data/lib/generators/inertia_templates/scaffold/templates/vue/types.ts.tt +19 -0
  116. data/lib/generators/inertia_tw_templates/controller/controller_generator.rb +12 -0
  117. data/lib/generators/inertia_tw_templates/controller/templates/react/view.jsx.tt +8 -0
  118. data/lib/generators/inertia_tw_templates/controller/templates/react/view.tsx.tt +8 -0
  119. data/lib/generators/inertia_tw_templates/controller/templates/svelte/view.svelte.tt +2 -0
  120. data/lib/generators/inertia_tw_templates/controller/templates/svelte4/view.svelte.tt +2 -0
  121. data/lib/generators/inertia_tw_templates/controller/templates/vue/view.vue.tt +4 -0
  122. data/lib/generators/inertia_tw_templates/scaffold/scaffold_generator.rb +12 -0
  123. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Edit.jsx.tt +42 -0
  124. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Edit.tsx.tt +47 -0
  125. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.jsx.tt +122 -0
  126. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Form.tsx.tt +142 -0
  127. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Index.jsx.tt +43 -0
  128. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Index.tsx.tt +49 -0
  129. data/lib/generators/inertia_tw_templates/scaffold/templates/react/New.jsx.tt +30 -0
  130. data/lib/generators/inertia_tw_templates/scaffold/templates/react/New.tsx.tt +35 -0
  131. data/lib/generators/inertia_tw_templates/scaffold/templates/react/One.jsx.tt +26 -0
  132. data/lib/generators/inertia_tw_templates/scaffold/templates/react/One.tsx.tt +32 -0
  133. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Show.jsx.tt +47 -0
  134. data/lib/generators/inertia_tw_templates/scaffold/templates/react/Show.tsx.tt +53 -0
  135. data/lib/generators/inertia_tw_templates/scaffold/templates/react/types.ts.tt +19 -0
  136. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Edit.svelte.tt +44 -0
  137. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Edit.ts.svelte.tt +45 -0
  138. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.svelte.tt +118 -0
  139. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Form.ts.svelte.tt +123 -0
  140. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.svelte.tt +42 -0
  141. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Index.ts.svelte.tt +46 -0
  142. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.svelte.tt +32 -0
  143. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/New.ts.svelte.tt +33 -0
  144. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/One.svelte.tt +28 -0
  145. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/One.ts.svelte.tt +30 -0
  146. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.svelte.tt +50 -0
  147. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/Show.ts.svelte.tt +54 -0
  148. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte/types.ts.tt +19 -0
  149. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Edit.svelte.tt +45 -0
  150. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Edit.ts.svelte.tt +46 -0
  151. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.svelte.tt +120 -0
  152. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Form.ts.svelte.tt +130 -0
  153. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.svelte.tt +43 -0
  154. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Index.ts.svelte.tt +44 -0
  155. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/New.svelte.tt +33 -0
  156. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/New.ts.svelte.tt +34 -0
  157. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.svelte.tt +28 -0
  158. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/One.ts.svelte.tt +30 -0
  159. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.svelte.tt +51 -0
  160. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/Show.ts.svelte.tt +52 -0
  161. data/lib/generators/inertia_tw_templates/scaffold/templates/svelte4/types.ts.tt +19 -0
  162. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Edit.ts.vue.tt +45 -0
  163. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Edit.vue.tt +44 -0
  164. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Form.ts.vue.tt +134 -0
  165. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Form.vue.tt +127 -0
  166. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Index.ts.vue.tt +47 -0
  167. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Index.vue.tt +43 -0
  168. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/New.ts.vue.tt +33 -0
  169. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/New.vue.tt +32 -0
  170. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/One.ts.vue.tt +28 -0
  171. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/One.vue.tt +26 -0
  172. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Show.ts.vue.tt +53 -0
  173. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/Show.vue.tt +49 -0
  174. data/lib/generators/inertia_tw_templates/scaffold/templates/vue/types.ts.tt +19 -0
  175. data/lib/inertia_rails/action_filter.rb +27 -0
  176. data/lib/inertia_rails/always_prop.rb +6 -0
  177. data/lib/inertia_rails/base_prop.rb +14 -0
  178. data/lib/inertia_rails/configuration.rb +1 -1
  179. data/lib/inertia_rails/controller.rb +70 -15
  180. data/lib/inertia_rails/generators/controller_template_base.rb +63 -0
  181. data/lib/inertia_rails/generators/helper.rb +139 -0
  182. data/lib/inertia_rails/generators/scaffold_template_base.rb +45 -0
  183. data/lib/inertia_rails/inertia_rails.rb +18 -12
  184. data/lib/inertia_rails/lazy_prop.rb +20 -0
  185. data/lib/inertia_rails/renderer.rb +71 -17
  186. data/lib/inertia_rails/version.rb +1 -1
  187. data/lib/patches/better_errors.rb +10 -8
  188. data/lib/patches/debug_exceptions/patch-5-0.rb +7 -3
  189. data/lib/patches/debug_exceptions/patch-5-1.rb +7 -3
  190. data/lib/patches/mapper.rb +9 -5
  191. data/lib/patches/request.rb +10 -6
  192. metadata +192 -126
  193. data/.github/workflows/push.yml +0 -33
  194. data/.gitignore +0 -25
  195. data/.rspec +0 -3
  196. data/CODE_OF_CONDUCT.md +0 -74
  197. data/Gemfile +0 -7
  198. data/Rakefile +0 -6
  199. data/bin/console +0 -13
  200. data/bin/setup +0 -8
  201. data/inertia_rails.gemspec +0 -37
  202. data/lib/generators/inertia_rails/install/react/InertiaExample.jsx +0 -9
  203. data/lib/generators/inertia_rails/install/react/inertia.jsx +0 -17
  204. data/lib/generators/inertia_rails/install/svelte/InertiaExample.svelte +0 -11
  205. data/lib/generators/inertia_rails/install/svelte/inertia.js +0 -14
  206. data/lib/generators/inertia_rails/install/vue/InertiaExample.vue +0 -11
  207. data/lib/generators/inertia_rails/install/vue/inertia.js +0 -20
  208. data/lib/generators/inertia_rails/install_generator.rb +0 -84
  209. data/lib/inertia_rails/lazy.rb +0 -28
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/resource_helpers'
4
+ require_relative 'controller_template_base'
5
+
6
+ module InertiaRails
7
+ module Generators
8
+ class ScaffoldTemplateBase < ControllerTemplateBase
9
+ include Rails::Generators::ResourceHelpers
10
+
11
+ remove_argument :actions
12
+
13
+ argument :attributes, type: :array, default: [], banner: 'field:type field:type'
14
+
15
+ def copy_view_files
16
+ available_views.each do |view|
17
+ template "#{options.frontend_framework}/#{view}.#{template_extension}",
18
+ File.join(base_path, "#{view}.#{extension}")
19
+ end
20
+
21
+ template "#{options.frontend_framework}/#{partial_name}.#{template_extension}",
22
+ File.join(base_path, "#{inertia_component_name}.#{extension}")
23
+
24
+ template "#{options.frontend_framework}/types.ts", File.join(base_path, 'types.ts') if typescript?
25
+ end
26
+
27
+ private
28
+
29
+ def template_extension
30
+ return extension unless typescript?
31
+ return 'tsx' if options.frontend_framework == 'react'
32
+
33
+ "ts.#{extension}"
34
+ end
35
+
36
+ def available_views
37
+ %w[Index Edit Show New Form]
38
+ end
39
+
40
+ def partial_name
41
+ 'One'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -1,20 +1,26 @@
1
- # Needed for `thread_mattr_accessor`
2
- require 'active_support/core_ext/module/attribute_accessors_per_thread'
3
- require 'inertia_rails/lazy'
1
+ require 'inertia_rails/base_prop'
2
+ require 'inertia_rails/always_prop'
3
+ require 'inertia_rails/lazy_prop'
4
4
  require 'inertia_rails/configuration'
5
5
 
6
6
  module InertiaRails
7
- CONFIGURATION = Configuration.default
7
+ class << self
8
+ CONFIGURATION = Configuration.default
8
9
 
9
- def self.configure
10
- yield(CONFIGURATION)
11
- end
10
+ def configure
11
+ yield(CONFIGURATION)
12
+ end
12
13
 
13
- def self.configuration
14
- CONFIGURATION
15
- end
14
+ def configuration
15
+ CONFIGURATION
16
+ end
17
+
18
+ def lazy(value = nil, &block)
19
+ LazyProp.new(value, &block)
20
+ end
16
21
 
17
- def self.lazy(value = nil, &block)
18
- InertiaRails::Lazy.new(value, &block)
22
+ def always(&block)
23
+ AlwaysProp.new(&block)
24
+ end
19
25
  end
20
26
  end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module InertiaRails
4
+ class LazyProp < BaseProp
5
+ def initialize(value = nil, &block)
6
+ raise ArgumentError, 'You must provide either a value or a block, not both' if value && block
7
+
8
+ @value = value
9
+ @block = block
10
+ end
11
+
12
+ def call(controller)
13
+ value.respond_to?(:call) ? controller.instance_exec(&value) : value
14
+ end
15
+
16
+ def value
17
+ @value.nil? ? @block : @value
18
+ end
19
+ end
20
+ end
@@ -1,9 +1,14 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'net/http'
2
4
  require 'json'
3
5
  require_relative "inertia_rails"
4
6
 
5
7
  module InertiaRails
6
8
  class Renderer
9
+ KEEP_PROP = :keep
10
+ DONT_KEEP_PROP = :dont_keep
11
+
7
12
  attr_reader(
8
13
  :component,
9
14
  :configuration,
@@ -64,24 +69,30 @@ module InertiaRails
64
69
  # Functionally, this permits using either string or symbol keys in the controller. Since the results
65
70
  # is cast to json, we should treat string/symbol keys as identical.
66
71
  def merge_props(shared_data, props)
67
- shared_data.deep_symbolize_keys.send(@deep_merge ? :deep_merge : :merge, props.deep_symbolize_keys)
72
+ if @deep_merge
73
+ shared_data.deep_symbolize_keys.deep_merge!(props.deep_symbolize_keys)
74
+ else
75
+ shared_data.symbolize_keys.merge(props.symbolize_keys)
76
+ end
68
77
  end
69
78
 
70
79
  def computed_props
71
- _props = merge_props(shared_data, props).select do |key, prop|
72
- if rendering_partial_component?
73
- key.in? partial_keys
80
+ _props = merge_props(shared_data, props)
81
+
82
+ deep_transform_props _props do |prop, path|
83
+ next [DONT_KEEP_PROP] unless keep_prop?(prop, path)
84
+
85
+ transformed_prop = case prop
86
+ when BaseProp
87
+ prop.call(controller)
88
+ when Proc
89
+ controller.instance_exec(&prop)
74
90
  else
75
- !prop.is_a?(InertiaRails::Lazy)
91
+ prop
76
92
  end
77
- end
78
93
 
79
- deep_transform_values(
80
- _props,
81
- lambda do |prop|
82
- prop.respond_to?(:call) ? controller.instance_exec(&prop) : prop
83
- end
84
- )
94
+ [KEEP_PROP, transformed_prop]
95
+ end
85
96
  end
86
97
 
87
98
  def page
@@ -93,18 +104,32 @@ module InertiaRails
93
104
  }
94
105
  end
95
106
 
96
- def deep_transform_values(hash, proc)
97
- return proc.call(hash) unless hash.is_a? Hash
107
+ def deep_transform_props(props, parent_path = [], &block)
108
+ props.reduce({}) do |transformed_props, (key, prop)|
109
+ current_path = parent_path + [key]
98
110
 
99
- hash.transform_values {|value| deep_transform_values(value, proc)}
111
+ if prop.is_a?(Hash) && prop.any?
112
+ nested = deep_transform_props(prop, current_path, &block)
113
+ transformed_props.merge!(key => nested) unless nested.empty?
114
+ else
115
+ action, transformed_prop = block.call(prop, current_path)
116
+ transformed_props.merge!(key => transformed_prop) if action == KEEP_PROP
117
+ end
118
+
119
+ transformed_props
120
+ end
100
121
  end
101
122
 
102
123
  def partial_keys
103
- (@request.headers['X-Inertia-Partial-Data'] || '').split(',').compact.map(&:to_sym)
124
+ (@request.headers['X-Inertia-Partial-Data'] || '').split(',').compact
125
+ end
126
+
127
+ def partial_except_keys
128
+ (@request.headers['X-Inertia-Partial-Except'] || '').split(',').compact
104
129
  end
105
130
 
106
131
  def rendering_partial_component?
107
- @request.inertia_partial? && @request.headers['X-Inertia-Partial-Component'] == component
132
+ @request.headers['X-Inertia-Partial-Component'] == component
108
133
  end
109
134
 
110
135
  def resolve_component(component)
@@ -112,5 +137,34 @@ module InertiaRails
112
137
 
113
138
  configuration.component_path_resolver(path: controller.controller_path, action: controller.action_name)
114
139
  end
140
+
141
+ def keep_prop?(prop, path)
142
+ return true if prop.is_a?(AlwaysProp)
143
+
144
+ if rendering_partial_component?
145
+ path_with_prefixes = path_prefixes(path)
146
+ return false if excluded_by_only_partial_keys?(path_with_prefixes)
147
+ return false if excluded_by_except_partial_keys?(path_with_prefixes)
148
+ end
149
+
150
+ # Precedence: Evaluate LazyProp only after partial keys have been checked
151
+ return false if prop.is_a?(LazyProp) && !rendering_partial_component?
152
+
153
+ true
154
+ end
155
+
156
+ def path_prefixes(parts)
157
+ (0...parts.length).map do |i|
158
+ parts[0..i].join('.')
159
+ end
160
+ end
161
+
162
+ def excluded_by_only_partial_keys?(path_with_prefixes)
163
+ partial_keys.present? && (path_with_prefixes & partial_keys).empty?
164
+ end
165
+
166
+ def excluded_by_except_partial_keys?(path_with_prefixes)
167
+ partial_except_keys.present? && (path_with_prefixes & partial_except_keys).any?
168
+ end
115
169
  end
116
170
  end
@@ -1,3 +1,3 @@
1
1
  module InertiaRails
2
- VERSION = "3.3.0"
2
+ VERSION = "3.5.0"
3
3
  end
@@ -4,14 +4,16 @@
4
4
  # https://github.com/BetterErrors/better_errors/blob/v2.5.1/lib/better_errors/middleware.rb
5
5
  #
6
6
 
7
- if defined?(BetterErrors)
8
- BetterErrors::Middleware.class_eval do
9
- prepend(InertiaBetterErrors = Module.new do
10
- def text?(env)
11
- return false if env["HTTP_X_INERTIA"]
7
+ module InertiaRails
8
+ module InertiaBetterErrors
9
+ def text?(env)
10
+ return false if env["HTTP_X_INERTIA"]
12
11
 
13
- super
14
- end
15
- end)
12
+ super
13
+ end
16
14
  end
17
15
  end
16
+
17
+ if defined?(BetterErrors)
18
+ BetterErrors::Middleware.include InertiaRails::InertiaBetterErrors
19
+ end
@@ -4,8 +4,8 @@
4
4
  # https://github.com/rails/rails/blob/5-0-stable/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
5
5
  #
6
6
 
7
- ActionDispatch::DebugExceptions.class_eval do
8
- prepend(InertiaDebugExceptions = Module.new do
7
+ module InertiaRails
8
+ module InertiaDebugExceptions
9
9
  def render_for_default_application(request, wrapper)
10
10
  template = create_template(request, wrapper)
11
11
  file = "rescues/#{wrapper.rescue_template}"
@@ -19,5 +19,9 @@ ActionDispatch::DebugExceptions.class_eval do
19
19
  end
20
20
  render(wrapper.status_code, body, format)
21
21
  end
22
- end)
22
+ end
23
+ end
24
+
25
+ if defined?(ActionDispatch::DebugExceptions)
26
+ ActionDispatch::DebugExceptions.prepend InertiaRails::InertiaDebugExceptions
23
27
  end
@@ -6,8 +6,8 @@
6
6
  # https://github.com/rails/rails/blob/6-0-stable/actionpack/lib/action_dispatch/middleware/debug_exceptions.rb
7
7
  #
8
8
 
9
- ActionDispatch::DebugExceptions.class_eval do
10
- prepend(InertiaDebugExceptions = Module.new do
9
+ module InertiaRails
10
+ module InertiaDebugExceptions
11
11
  def render_for_browser_request(request, wrapper)
12
12
  template = create_template(request, wrapper)
13
13
  file = "rescues/#{wrapper.rescue_template}"
@@ -22,5 +22,9 @@ ActionDispatch::DebugExceptions.class_eval do
22
22
 
23
23
  render(wrapper.status_code, body, format)
24
24
  end
25
- end)
25
+ end
26
+ end
27
+
28
+ if defined?(ActionDispatch::DebugExceptions)
29
+ ActionDispatch::DebugExceptions.prepend InertiaRails::InertiaDebugExceptions
26
30
  end
@@ -1,8 +1,12 @@
1
- ActionDispatch::Routing::Mapper.class_eval do
2
- def inertia(args, &block)
3
- route = args.keys.first
4
- component = args.values.first
1
+ module InertiaRails
2
+ module InertiaMapper
3
+ def inertia(args, &block)
4
+ route = args.keys.first
5
+ component = args.values.first
5
6
 
6
- get(route => 'inertia_rails/static#static', defaults: {component: component})
7
+ get(route => 'inertia_rails/static#static', defaults: { component: component })
8
+ end
7
9
  end
8
10
  end
11
+
12
+ ActionDispatch::Routing::Mapper.include InertiaRails::InertiaMapper
@@ -1,9 +1,13 @@
1
- ActionDispatch::Request.class_eval do
2
- def inertia?
3
- key? 'HTTP_X_INERTIA'
4
- end
1
+ module InertiaRails
2
+ module InertiaRequest
3
+ def inertia?
4
+ key? 'HTTP_X_INERTIA'
5
+ end
5
6
 
6
- def inertia_partial?
7
- key? 'HTTP_X_INERTIA_PARTIAL_DATA'
7
+ def inertia_partial?
8
+ key?('HTTP_X_INERTIA_PARTIAL_COMPONENT')
9
+ end
8
10
  end
9
11
  end
12
+
13
+ ActionDispatch::Request.include InertiaRails::InertiaRequest