inertia_rails 3.7.1 → 3.8.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 23cbc78f6ae041fed8c26c46f5da887291f40d96bb755386ad888fdfe545343c
4
- data.tar.gz: 26839f99bcdc7bc96cf6a82d5aa4730688c6c019089b82041020b4e0896b7549
3
+ metadata.gz: 9c17e6224188fa7a4299b694eb6747091f20259c78a05d26604cac21ed52d8eb
4
+ data.tar.gz: cf0fc91563c2f5ec178fcf815132354c245eb7ceb6ce0dda7f7f4d29339a57fe
5
5
  SHA512:
6
- metadata.gz: 134e4664360f7a72f6d38e47153c49348b38eae52b765f0c9da5b7b62e4f48d1d9ed9986bfac6d729739a3954c5860f4348798ac6caca6256e692a13ce74d798
7
- data.tar.gz: fafd03acd45c4be9c9cf01159fe2a54e0bdf174a4fb02fbd80d9cfc93b026b1693bbf68a0ad53c15db4894514655dab70408c8551422c16c43305ade43984058
6
+ metadata.gz: 677bc4c32845494734ef8b453ce2a0d9096803bdc9037701ccb09288ac0f815de1a4b9406687c7387aad6c82de329e5cd8eb2d5aa6275a539129849bd01a4c22
7
+ data.tar.gz: b8ae423e24556d08d4bd51413a0ebf84793f1f41e19c28784dbfc58aab2a8a7330767e5b60a22c3011e38366ace5db70ab62a4e932b1e379799d1c69da0ddd36
data/CHANGELOG.md CHANGED
@@ -4,6 +4,15 @@ All notable changes to this project will be documented in this file.
4
4
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5
5
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6
6
 
7
+ ## [3.8.0] - 2025-04-12
8
+
9
+ * Docs updates
10
+ * Fix template detection for scaffolds using Tailwind 4 (#202)
11
+ * Improved inertia route helper (#201)
12
+ * RSpec tweaks
13
+ * Add inertia_rendering? helper method (#209)
14
+ * Add support for new client-side deep merging option (#213)
15
+
7
16
  ## [3.7.1] - 2025-04-01
8
17
 
9
18
  * Docs updates
@@ -6,16 +6,22 @@ module InertiaRails
6
6
 
7
7
  attr_reader :group
8
8
 
9
- def initialize(group: nil, merge: nil, &block)
9
+ def initialize(group: nil, merge: nil, deep_merge: nil, &block)
10
+ raise ArgumentError, 'Cannot set both `deep_merge` and `merge` to true' if deep_merge && merge
11
+
10
12
  super(&block)
11
13
 
12
14
  @group = group || DEFAULT_GROUP
13
- @merge = merge
14
- @block = block
15
+ @merge = merge || deep_merge
16
+ @deep_merge = deep_merge
15
17
  end
16
18
 
17
19
  def merge?
18
20
  @merge
19
21
  end
22
+
23
+ def deep_merge?
24
+ @deep_merge
25
+ end
20
26
  end
21
27
  end
@@ -11,4 +11,8 @@ module InertiaRails::Helper
11
11
  )
12
12
  inertia_ssr_head
13
13
  end
14
+
15
+ def inertia_rendering?
16
+ controller.instance_variable_get("@_inertia_rendering")
17
+ end
14
18
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'inertia_rails/base_prop'
2
4
  require 'inertia_rails/ignore_on_first_load_prop'
3
5
  require 'inertia_rails/always_prop'
@@ -35,8 +37,12 @@ module InertiaRails
35
37
  MergeProp.new(&block)
36
38
  end
37
39
 
38
- def defer(group: nil, merge: nil, &block)
39
- DeferProp.new(group: group, merge: merge, &block)
40
+ def deep_merge(&block)
41
+ MergeProp.new(deep_merge: true, &block)
42
+ end
43
+
44
+ def defer(group: nil, merge: nil, deep_merge: nil, &block)
45
+ DeferProp.new(group: group, merge: merge, deep_merge: deep_merge, &block)
40
46
  end
41
47
  end
42
48
  end
@@ -2,13 +2,17 @@
2
2
 
3
3
  module InertiaRails
4
4
  class MergeProp < BaseProp
5
- def initialize(*)
6
- super
7
- @merge = true
5
+ def initialize(deep_merge: false, &block)
6
+ super(&block)
7
+ @deep_merge = deep_merge
8
8
  end
9
9
 
10
10
  def merge?
11
- @merge
11
+ true
12
+ end
13
+
14
+ def deep_merge?
15
+ @deep_merge
12
16
  end
13
17
  end
14
18
  end
@@ -47,7 +47,7 @@ module InertiaRails
47
47
  end
48
48
 
49
49
  def non_get_redirectable_method?
50
- ['PUT', 'PATCH', 'DELETE'].include? request_method
50
+ %w[PUT PATCH DELETE].include? request_method
51
51
  end
52
52
 
53
53
  def inertia_non_post_redirect?(status)
@@ -63,7 +63,7 @@ module InertiaRails
63
63
  end
64
64
 
65
65
  def controller
66
- @env["action_controller.instance"]
66
+ @env['action_controller.instance']
67
67
  end
68
68
 
69
69
  def request_method
@@ -83,7 +83,7 @@ module InertiaRails
83
83
  end
84
84
 
85
85
  def server_version
86
- controller&.send(:inertia_configuration)&.version
86
+ (controller&.send(:inertia_configuration) || InertiaRails.configuration).version
87
87
  end
88
88
 
89
89
  def coerce_version(version)
@@ -92,7 +92,7 @@ module InertiaRails
92
92
 
93
93
  def force_refresh(request)
94
94
  request.flash.keep
95
- Rack::Response.new('', 409, {'X-Inertia-Location' => request.original_url}).finish
95
+ Rack::Response.new('', 409, { 'X-Inertia-Location' => request.original_url }).finish
96
96
  end
97
97
 
98
98
  def copy_xsrf_to_csrf!
@@ -6,9 +6,6 @@ require_relative 'inertia_rails'
6
6
 
7
7
  module InertiaRails
8
8
  class Renderer
9
- KEEP_PROP = :keep
10
- DONT_KEEP_PROP = :dont_keep
11
-
12
9
  attr_reader(
13
10
  :component,
14
11
  :configuration,
@@ -37,6 +34,7 @@ module InertiaRails
37
34
  @deep_merge = deep_merge.nil? ? configuration.deep_merge_shared_data : deep_merge
38
35
  @encrypt_history = encrypt_history.nil? ? configuration.encrypt_history : encrypt_history
39
36
  @clear_history = clear_history || controller.session[:inertia_clear_history] || false
37
+ @controller.instance_variable_set('@_inertia_rendering', true)
40
38
  end
41
39
 
42
40
  def render
@@ -82,31 +80,17 @@ module InertiaRails
82
80
  #
83
81
  # Functionally, this permits using either string or symbol keys in the controller. Since the results
84
82
  # is cast to json, we should treat string/symbol keys as identical.
85
- def merge_props(shared_data, props)
83
+ def merge_props(shared_props, props)
86
84
  if @deep_merge
87
- shared_data.deep_symbolize_keys.deep_merge!(props.deep_symbolize_keys)
85
+ shared_props.deep_symbolize_keys.deep_merge!(props.deep_symbolize_keys)
88
86
  else
89
- shared_data.symbolize_keys.merge(props.symbolize_keys)
87
+ shared_props.symbolize_keys.merge(props.symbolize_keys)
90
88
  end
91
89
  end
92
90
 
93
91
  def computed_props
94
92
  merged_props = merge_props(shared_data, props)
95
-
96
- deep_transform_props merged_props do |prop, path|
97
- next [DONT_KEEP_PROP] unless keep_prop?(prop, path)
98
-
99
- transformed_prop = case prop
100
- when BaseProp
101
- prop.call(controller)
102
- when Proc
103
- controller.instance_exec(&prop)
104
- else
105
- prop
106
- end
107
-
108
- [KEEP_PROP, transformed_prop]
109
- end
93
+ deep_transform_props(merged_props)
110
94
  end
111
95
 
112
96
  def page
@@ -122,22 +106,35 @@ module InertiaRails
122
106
  deferred_props = deferred_props_keys
123
107
  default_page[:deferredProps] = deferred_props if deferred_props.present?
124
108
 
125
- merge_props = merge_props_keys
109
+ all_merge_props = merge_props_keys
110
+
111
+ deep_merge_props, merge_props = all_merge_props.partition do |key|
112
+ @props[key].deep_merge?
113
+ end
114
+
126
115
  default_page[:mergeProps] = merge_props if merge_props.present?
116
+ default_page[:deepMergeProps] = deep_merge_props if deep_merge_props.present?
127
117
 
128
118
  default_page
129
119
  end
130
120
 
131
- def deep_transform_props(props, parent_path = [], &block)
121
+ def deep_transform_props(props, parent_path = [])
132
122
  props.each_with_object({}) do |(key, prop), transformed_props|
133
123
  current_path = parent_path + [key]
134
124
 
135
125
  if prop.is_a?(Hash) && prop.any?
136
- nested = deep_transform_props(prop, current_path, &block)
137
- transformed_props.merge!(key => nested) unless nested.empty?
138
- else
139
- action, transformed_prop = block.call(prop, current_path)
140
- transformed_props.merge!(key => transformed_prop) if action == KEEP_PROP
126
+ nested = deep_transform_props(prop, current_path)
127
+ transformed_props[key] = nested unless nested.empty?
128
+ elsif keep_prop?(prop, current_path)
129
+ transformed_props[key] =
130
+ case prop
131
+ when BaseProp
132
+ prop.call(controller)
133
+ when Proc
134
+ controller.instance_exec(&prop)
135
+ else
136
+ prop
137
+ end
141
138
  end
142
139
  end
143
140
  end
@@ -1,3 +1,3 @@
1
1
  module InertiaRails
2
- VERSION = "3.7.1"
2
+ VERSION = "3.8.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: inertia_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.7.1
4
+ version: 3.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Knoles
@@ -9,7 +9,7 @@ authors:
9
9
  - Eugene Granovsky
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2025-04-01 00:00:00.000000000 Z
12
+ date: 2025-04-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: railties