inertia_rails 3.1.4 → 3.2.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 +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/inertia_rails/controller.rb +34 -8
- data/lib/inertia_rails/inertia_rails.rb +0 -54
- data/lib/inertia_rails/middleware.rb +1 -4
- data/lib/inertia_rails/renderer.rb +4 -6
- data/lib/inertia_rails/rspec.rb +0 -1
- data/lib/inertia_rails/version.rb +1 -1
- metadata +3 -4
- data/lib/inertia_rails/helper.rb +0 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 76a7152d32edba5a140ed16b25efe25a6766a7d53c955f39f6b5efb2b5fc0d12
|
4
|
+
data.tar.gz: c1dc0d2bf09b2f3c71e4729a26dc6c24c78dc0fe4c5b8d09484bacee18543953
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 70ff7787dd839a58c652ffe5fa402be2baa2036ea54b86b2b033ecaf2062304a4f5e8433316eea192ab25009d6c5e8b1cf45dfeba71dc6f8775b361cb3055f50
|
7
|
+
data.tar.gz: 9e9072c293cd62385df9e8be3f464c7b688acc665ad4ce40daea5fd29c0414c18ba5c9f72967edfc3c7963974867d2791486e78714cea98ac212c64f38144ccb
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,12 @@ 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.2.0] - 2024-06-19
|
8
|
+
|
9
|
+
* Refactor the internals of shared Inertia data to use controller instance variables instead of module level variables that run a higher risk of being leaked between requests. Big thanks to @ledermann for the initial work many years ago and to @PedroAugustoRamalhoDuarte for finishing it up!
|
10
|
+
* Change the Inertia response to set the `Vary` header to `X-Inertia` instead of `Accept`, Thanks @osbre!
|
11
|
+
* Always set the `XSRF-TOKEN` in an `after_action` request instead of only on non-Inertia requests. This fixes a bug where logging out (and resetting the session) via Inertia would create a CSRF token mismatch on a subsequent Inertia request (until you manually hard refreshed the page). Thanks @jordanhiltunen!
|
12
|
+
|
7
13
|
## [3.1.4] - 2024-04-28
|
8
14
|
|
9
15
|
* Reset Inertia shared data after each RSpec example where `inertia: true` is used. Thanks @coreyaus!
|
@@ -1,27 +1,37 @@
|
|
1
1
|
require_relative "inertia_rails"
|
2
|
-
require_relative "helper"
|
3
2
|
|
4
3
|
module InertiaRails
|
5
4
|
module Controller
|
6
5
|
extend ActiveSupport::Concern
|
7
6
|
|
8
7
|
included do
|
8
|
+
helper_method :inertia_headers
|
9
|
+
|
9
10
|
before_action do
|
10
|
-
|
11
|
-
|
11
|
+
error_sharing = proc do
|
12
|
+
# :inertia_errors are deleted from the session by the middleware
|
13
|
+
if @_request && session[:inertia_errors].present?
|
14
|
+
{ errors: session[:inertia_errors] }
|
15
|
+
else
|
16
|
+
{}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
@_inertia_shared_plain_data ||= {}
|
21
|
+
@_inertia_shared_blocks ||= [error_sharing]
|
22
|
+
@_inertia_html_headers ||= []
|
12
23
|
end
|
13
|
-
helper ::InertiaRails::Helper
|
14
24
|
|
15
25
|
after_action do
|
16
|
-
cookies['XSRF-TOKEN'] = form_authenticity_token unless
|
26
|
+
cookies['XSRF-TOKEN'] = form_authenticity_token unless !protect_against_forgery?
|
17
27
|
end
|
18
28
|
end
|
19
29
|
|
20
30
|
module ClassMethods
|
21
|
-
def inertia_share(
|
31
|
+
def inertia_share(hash = nil, &block)
|
22
32
|
before_action do
|
23
|
-
|
24
|
-
|
33
|
+
@_inertia_shared_plain_data = @_inertia_shared_plain_data.merge(hash) if hash
|
34
|
+
@_inertia_shared_blocks = @_inertia_shared_blocks + [block] if block_given?
|
25
35
|
end
|
26
36
|
end
|
27
37
|
|
@@ -33,6 +43,14 @@ module InertiaRails
|
|
33
43
|
end
|
34
44
|
end
|
35
45
|
|
46
|
+
def inertia_headers
|
47
|
+
@_inertia_html_headers.join.html_safe
|
48
|
+
end
|
49
|
+
|
50
|
+
def inertia_headers=(value)
|
51
|
+
@_inertia_html_headers = value
|
52
|
+
end
|
53
|
+
|
36
54
|
def default_render
|
37
55
|
if InertiaRails.default_render?
|
38
56
|
render(inertia: true)
|
@@ -41,6 +59,10 @@ module InertiaRails
|
|
41
59
|
end
|
42
60
|
end
|
43
61
|
|
62
|
+
def shared_data
|
63
|
+
(@_inertia_shared_plain_data || {}).merge(evaluated_blocks)
|
64
|
+
end
|
65
|
+
|
44
66
|
def redirect_to(options = {}, response_options = {})
|
45
67
|
capture_inertia_errors(response_options)
|
46
68
|
super(options, response_options)
|
@@ -80,5 +102,9 @@ module InertiaRails
|
|
80
102
|
session[:inertia_errors] = inertia_errors
|
81
103
|
end
|
82
104
|
end
|
105
|
+
|
106
|
+
def evaluated_blocks
|
107
|
+
(@_inertia_shared_blocks || []).map { |block| instance_exec(&block) }.reduce(&:merge) || {}
|
108
|
+
end
|
83
109
|
end
|
84
110
|
end
|
@@ -3,20 +3,10 @@ require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
|
3
3
|
require 'inertia_rails/lazy'
|
4
4
|
|
5
5
|
module InertiaRails
|
6
|
-
thread_mattr_accessor :threadsafe_shared_plain_data
|
7
|
-
thread_mattr_accessor :threadsafe_shared_blocks
|
8
|
-
thread_mattr_accessor :threadsafe_html_headers
|
9
|
-
|
10
6
|
def self.configure
|
11
7
|
yield(Configuration)
|
12
8
|
end
|
13
9
|
|
14
|
-
# "Getters"
|
15
|
-
def self.shared_data(controller)
|
16
|
-
shared_plain_data.
|
17
|
-
merge!(evaluated_blocks(controller, shared_blocks))
|
18
|
-
end
|
19
|
-
|
20
10
|
def self.version
|
21
11
|
Configuration.evaluated_version
|
22
12
|
end
|
@@ -35,35 +25,12 @@ module InertiaRails
|
|
35
25
|
|
36
26
|
def self.default_render?
|
37
27
|
Configuration.default_render
|
38
|
-
end
|
39
|
-
|
40
|
-
def self.html_headers
|
41
|
-
self.threadsafe_html_headers || []
|
42
28
|
end
|
43
29
|
|
44
30
|
def self.deep_merge_shared_data?
|
45
31
|
Configuration.deep_merge_shared_data
|
46
32
|
end
|
47
33
|
|
48
|
-
# "Setters"
|
49
|
-
def self.share(**args)
|
50
|
-
self.shared_plain_data = self.shared_plain_data.merge(args)
|
51
|
-
end
|
52
|
-
|
53
|
-
def self.share_block(block)
|
54
|
-
self.shared_blocks = self.shared_blocks + [block]
|
55
|
-
end
|
56
|
-
|
57
|
-
def self.html_headers=(headers)
|
58
|
-
self.threadsafe_html_headers = headers
|
59
|
-
end
|
60
|
-
|
61
|
-
def self.reset!
|
62
|
-
self.shared_plain_data = {}
|
63
|
-
self.shared_blocks = []
|
64
|
-
self.html_headers = []
|
65
|
-
end
|
66
|
-
|
67
34
|
def self.lazy(value = nil, &block)
|
68
35
|
InertiaRails::Lazy.new(value, &block)
|
69
36
|
end
|
@@ -82,25 +49,4 @@ module InertiaRails
|
|
82
49
|
self.version.respond_to?(:call) ? self.version.call : self.version
|
83
50
|
end
|
84
51
|
end
|
85
|
-
|
86
|
-
# Getters and setters to provide default values for the threadsafe attributes
|
87
|
-
def self.shared_plain_data
|
88
|
-
self.threadsafe_shared_plain_data || {}
|
89
|
-
end
|
90
|
-
|
91
|
-
def self.shared_plain_data=(val)
|
92
|
-
self.threadsafe_shared_plain_data = val
|
93
|
-
end
|
94
|
-
|
95
|
-
def self.shared_blocks
|
96
|
-
self.threadsafe_shared_blocks || []
|
97
|
-
end
|
98
|
-
|
99
|
-
def self.shared_blocks=(val)
|
100
|
-
self.threadsafe_shared_blocks = val
|
101
|
-
end
|
102
|
-
|
103
|
-
def self.evaluated_blocks(controller, blocks)
|
104
|
-
blocks.flat_map { |block| controller.instance_exec(&block) }.reduce(&:merge) || {}
|
105
|
-
end
|
106
52
|
end
|
@@ -7,8 +7,6 @@ module InertiaRails
|
|
7
7
|
def call(env)
|
8
8
|
InertiaRailsRequest.new(@app, env)
|
9
9
|
.response
|
10
|
-
ensure
|
11
|
-
::InertiaRails.reset!
|
12
10
|
end
|
13
11
|
|
14
12
|
class InertiaRailsRequest
|
@@ -22,7 +20,7 @@ module InertiaRails
|
|
22
20
|
status, headers, body = @app.call(@env)
|
23
21
|
request = ActionDispatch::Request.new(@env)
|
24
22
|
|
25
|
-
# Inertia errors are added to the session via redirect_to
|
23
|
+
# Inertia errors are added to the session via redirect_to
|
26
24
|
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
|
27
25
|
|
28
26
|
status = 303 if inertia_non_post_redirect?(status)
|
@@ -97,4 +95,3 @@ module InertiaRails
|
|
97
95
|
end
|
98
96
|
end
|
99
97
|
end
|
100
|
-
|
@@ -1,5 +1,3 @@
|
|
1
|
-
require 'net/http'
|
2
|
-
require 'json'
|
3
1
|
require_relative "inertia_rails"
|
4
2
|
|
5
3
|
module InertiaRails
|
@@ -19,7 +17,7 @@ module InertiaRails
|
|
19
17
|
|
20
18
|
def render
|
21
19
|
if @request.headers['X-Inertia']
|
22
|
-
@response.set_header('Vary', '
|
20
|
+
@response.set_header('Vary', 'X-Inertia')
|
23
21
|
@response.set_header('X-Inertia', 'true')
|
24
22
|
@render_method.call json: page, status: @response.status, content_type: Mime[:json]
|
25
23
|
else
|
@@ -33,8 +31,8 @@ module InertiaRails
|
|
33
31
|
def render_ssr
|
34
32
|
uri = URI("#{::InertiaRails.ssr_url}/render")
|
35
33
|
res = JSON.parse(Net::HTTP.post(uri, page.to_json, 'Content-Type' => 'application/json').body)
|
36
|
-
|
37
|
-
|
34
|
+
|
35
|
+
@controller.inertia_headers = res['head']
|
38
36
|
@render_method.call html: res['body'].html_safe, layout: layout, locals: (view_data).merge({page: page})
|
39
37
|
end
|
40
38
|
|
@@ -48,7 +46,7 @@ module InertiaRails
|
|
48
46
|
#
|
49
47
|
# Functionally, this permits using either string or symbol keys in the controller. Since the results
|
50
48
|
# is cast to json, we should treat string/symbol keys as identical.
|
51
|
-
_props =
|
49
|
+
_props = @controller.shared_data.merge.deep_symbolize_keys.send(prop_merge_method, @props.deep_symbolize_keys).select do |key, prop|
|
52
50
|
if rendering_partial_component?
|
53
51
|
key.in? partial_keys
|
54
52
|
else
|
data/lib/inertia_rails/rspec.rb
CHANGED
@@ -65,7 +65,6 @@ RSpec.configure do |config|
|
|
65
65
|
}
|
66
66
|
|
67
67
|
config.before(:each, inertia: true) do
|
68
|
-
::InertiaRails.reset!
|
69
68
|
new_renderer = InertiaRails::Renderer.method(:new)
|
70
69
|
allow(InertiaRails::Renderer).to receive(:new) do |component, controller, request, response, render, named_args|
|
71
70
|
new_renderer.call(component, controller, request, response, inertia_wrap_render(render), **named_args)
|
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.
|
4
|
+
version: 3.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Knoles
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-06-19 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: railties
|
@@ -158,7 +158,6 @@ files:
|
|
158
158
|
- lib/inertia_rails.rb
|
159
159
|
- lib/inertia_rails/controller.rb
|
160
160
|
- lib/inertia_rails/engine.rb
|
161
|
-
- lib/inertia_rails/helper.rb
|
162
161
|
- lib/inertia_rails/inertia_rails.rb
|
163
162
|
- lib/inertia_rails/lazy.rb
|
164
163
|
- lib/inertia_rails/middleware.rb
|
@@ -194,7 +193,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
194
193
|
- !ruby/object:Gem::Version
|
195
194
|
version: '0'
|
196
195
|
requirements: []
|
197
|
-
rubygems_version: 3.5.
|
196
|
+
rubygems_version: 3.5.10
|
198
197
|
signing_key:
|
199
198
|
specification_version: 4
|
200
199
|
summary: Inertia adapter for Rails
|