inertia_rails 1.9.0 → 1.11.1
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 +22 -0
- data/README.md +5 -9
- data/inertia_rails.gemspec +1 -0
- data/lib/generators/inertia_rails/install/controller.rb +7 -0
- data/lib/generators/inertia_rails/install/react/InertiaExample.jsx +9 -0
- data/lib/generators/inertia_rails/install/react/inertia.jsx +21 -0
- data/lib/generators/inertia_rails/install/vue/InertiaExample.vue +11 -0
- data/lib/generators/inertia_rails/install/vue/inertia.js +24 -0
- data/lib/generators/inertia_rails/install_generator.rb +74 -0
- data/lib/inertia_rails/controller.rb +7 -7
- data/lib/inertia_rails/middleware.rb +65 -53
- data/lib/inertia_rails/rspec.rb +7 -1
- data/lib/inertia_rails/version.rb +1 -1
- data/lib/tasks/inertia_rails.rake +16 -0
- metadata +23 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 60a2f2a20da36323f792051d3a0c1327b3f085f78e8fed5906064e8892c516d9
|
4
|
+
data.tar.gz: c9a40fd17509def36b88862a671f98a4ed839f158ffd0959a66aba3023ee6084
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c136e534632a852b4d92ec7303cb5eba67fed88706cf28cc16e8bc541fda5320f9f09aa3e92f481951fe93390e30714813f0950bd67b75389b933634721d8dd5
|
7
|
+
data.tar.gz: b6f8568840f971249c90142afd6b20adf39b4d99a4864d952ddbedcbfdfb49884a6e35f9c419fd180d7abf50590bee70863f3766b94e6883a171b8995cef5f9e
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,28 @@ 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
|
+
## [1.11.1] - 2021-06-27
|
8
|
+
|
9
|
+
* Fixed thread safety in the middleware. Thanks @caifara!
|
10
|
+
|
11
|
+
## [1.11.0] - 2021-03-23
|
12
|
+
|
13
|
+
* Fixed the install generator. `installable?` was always returning false, preventing it from actually running.
|
14
|
+
* Added an install generator for Vue.
|
15
|
+
|
16
|
+
## [1.10.0] - 2021-03-22
|
17
|
+
|
18
|
+
* Added install generator to quickly add Inertia to existing rails apps via `rails inertia_rails:install:react`
|
19
|
+
|
20
|
+
## [1.9.2] - 2021-02-23
|
21
|
+
|
22
|
+
* Improve method for detecting whether a user used the RSpec helpers without adding `inertia: true` to the spec
|
23
|
+
* Emit a warning when expecting an Inertia response in RSpec and never reaching a `render inertia:` call
|
24
|
+
|
25
|
+
## [1.9.1] - 2021-02-10
|
26
|
+
|
27
|
+
* Define `redirect_to` and `redirect_back` as public methods for compatibility with other code using them
|
28
|
+
|
7
29
|
## [1.9.0] - 2021-01-17
|
8
30
|
|
9
31
|
* Added the same inertia awareness that redirect_to has to redirect_back
|
data/README.md
CHANGED
@@ -1,14 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
Visit [inertiajs.com](https://inertiajs.com/) to learn more.
|
1
|
+

|
4
2
|
|
5
|
-
# Note to pre Rubygems release users
|
6
3
|
|
7
|
-
|
4
|
+
# Inertia.js Rails Adapter
|
8
5
|
|
9
|
-
|
6
|
+
Visit [inertiajs.com](https://inertiajs.com/) for installation instructions, documentation, and to learn more.
|
10
7
|
|
11
|
-
|
8
|
+
*Maintained and sponsored by the team at [bellaWatt](https://bellawatt.com/)*
|
12
9
|
|
13
|
-
|
14
|
-
2. Change any `Inertia.configure` calls to `InertiaRails.configure`
|
10
|
+
[](https://bellawatt.com/)
|
data/inertia_rails.gemspec
CHANGED
@@ -0,0 +1,21 @@
|
|
1
|
+
import { App } from '@inertiajs/inertia-react';
|
2
|
+
import React from 'react';
|
3
|
+
import { render } from 'react-dom';
|
4
|
+
import axios from 'axios';
|
5
|
+
import { InertiaProgress } from '@inertiajs/progress';
|
6
|
+
|
7
|
+
document.addEventListener('DOMContentLoaded', () => {
|
8
|
+
InertiaProgress.init();
|
9
|
+
const el = document.getElementById('app')
|
10
|
+
|
11
|
+
const csrfToken = document.querySelector('meta[name=csrf-token]').content;
|
12
|
+
axios.defaults.headers.common['X-CSRF-Token'] = csrfToken;
|
13
|
+
|
14
|
+
render(
|
15
|
+
<App
|
16
|
+
initialPage={JSON.parse(el.dataset.page)}
|
17
|
+
resolveComponent={name => require(`../Pages/${name}`).default}
|
18
|
+
/>,
|
19
|
+
el
|
20
|
+
)
|
21
|
+
});
|
@@ -0,0 +1,24 @@
|
|
1
|
+
import axios from 'axios'
|
2
|
+
import Vue from 'vue'
|
3
|
+
|
4
|
+
import { app, plugin } from '@inertiajs/inertia-vue'
|
5
|
+
import { InertiaProgress } from '@inertiajs/progress'
|
6
|
+
|
7
|
+
document.addEventListener('DOMContentLoaded', () => {
|
8
|
+
const csrfToken = document.querySelector('meta[name=csrf-token]').content
|
9
|
+
axios.defaults.headers.common['X-CSRF-Token'] = csrfToken
|
10
|
+
|
11
|
+
InertiaProgress.init();
|
12
|
+
const el = document.getElementById('app')
|
13
|
+
|
14
|
+
Vue.use(plugin)
|
15
|
+
|
16
|
+
new Vue({
|
17
|
+
render: h => h(app, {
|
18
|
+
props: {
|
19
|
+
initialPage: JSON.parse(el.dataset.page),
|
20
|
+
resolveComponent: name => require(`../Pages/${name}`).default,
|
21
|
+
},
|
22
|
+
}),
|
23
|
+
}).$mount(el)
|
24
|
+
})
|
@@ -0,0 +1,74 @@
|
|
1
|
+
module InertiaRails
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
source_root File.expand_path('./install', __dir__)
|
4
|
+
class_option :front_end, type: :string, default: 'react'
|
5
|
+
|
6
|
+
FRONT_END_INSTALLERS = [
|
7
|
+
'react',
|
8
|
+
'vue',
|
9
|
+
]
|
10
|
+
|
11
|
+
def install
|
12
|
+
exit! unless installable?
|
13
|
+
|
14
|
+
install_base!
|
15
|
+
|
16
|
+
send "install_#{options[:front_end]}!"
|
17
|
+
|
18
|
+
say "You're all set! Run rails s and checkout localhost:3000/inertia-example", :green
|
19
|
+
end
|
20
|
+
|
21
|
+
protected
|
22
|
+
|
23
|
+
def installable?
|
24
|
+
unless run("./bin/rails webpacker:verify_install")
|
25
|
+
say "Sorry, you need to have webpacker installed for inertia_rails default setup.", :red
|
26
|
+
return false
|
27
|
+
end
|
28
|
+
|
29
|
+
unless options[:front_end].in? FRONT_END_INSTALLERS
|
30
|
+
say "Sorry, there is no generator for #{options[:front_end]}!\n\n", :red
|
31
|
+
say "If you are a #{options[:front_end]} developer, please help us improve inertia_rails by contributing an installer.\n\n"
|
32
|
+
say "https://github.com/inertiajs/inertia-rails/\n\n"
|
33
|
+
|
34
|
+
return false
|
35
|
+
end
|
36
|
+
|
37
|
+
true
|
38
|
+
end
|
39
|
+
|
40
|
+
def install_base!
|
41
|
+
say "Adding inertia pack tag to application layout", :blue
|
42
|
+
insert_into_file Rails.root.join("app/views/layouts/application.html.erb").to_s, after: "<%= javascript_pack_tag 'application' %>\n" do
|
43
|
+
"\t\t<%= javascript_pack_tag 'inertia' %>\n"
|
44
|
+
end
|
45
|
+
|
46
|
+
say "Installing inertia client packages", :blue
|
47
|
+
run "yarn add @inertiajs/inertia @inertiajs/progress"
|
48
|
+
|
49
|
+
say "Copying example files", :blue
|
50
|
+
template "controller.rb", Rails.root.join("app/controllers/inertia_example_controller.rb").to_s
|
51
|
+
|
52
|
+
say "Adding a route for the example inertia controller...", :blue
|
53
|
+
route "get 'inertia-example', to: 'inertia_example#index'"
|
54
|
+
end
|
55
|
+
|
56
|
+
def install_react!
|
57
|
+
say "Creating a React page component...", :blue
|
58
|
+
run 'yarn add @inertiajs/inertia-react'
|
59
|
+
template "react/InertiaExample.jsx", Rails.root.join("app/javascript/Pages/InertiaExample.js").to_s
|
60
|
+
say "Copying inertia.jsx into webpacker's packs folder...", :blue
|
61
|
+
template "react/inertia.jsx", Rails.root.join("app/javascript/packs/inertia.jsx").to_s
|
62
|
+
say "done!", :green
|
63
|
+
end
|
64
|
+
|
65
|
+
def install_vue!
|
66
|
+
say "Creating a Vue page component...", :blue
|
67
|
+
run 'yarn add @inertiajs/inertia-vue'
|
68
|
+
template "vue/InertiaExample.vue", Rails.root.join("app/javascript/Pages/InertiaExample.vue").to_s
|
69
|
+
say "Copying inertia.js into webpacker's packs folder...", :blue
|
70
|
+
template "vue/inertia.js", Rails.root.join("app/javascript/packs/inertia.js").to_s
|
71
|
+
say "done!", :green
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -20,13 +20,6 @@ module InertiaRails
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
private
|
24
|
-
|
25
|
-
def inertia_location(url)
|
26
|
-
headers['X-Inertia-Location'] = url
|
27
|
-
head :conflict
|
28
|
-
end
|
29
|
-
|
30
23
|
def redirect_to(options = {}, response_options = {})
|
31
24
|
capture_inertia_errors(response_options)
|
32
25
|
super(options, response_options)
|
@@ -41,6 +34,13 @@ module InertiaRails
|
|
41
34
|
)
|
42
35
|
end
|
43
36
|
|
37
|
+
private
|
38
|
+
|
39
|
+
def inertia_location(url)
|
40
|
+
headers['X-Inertia-Location'] = url
|
41
|
+
head :conflict
|
42
|
+
end
|
43
|
+
|
44
44
|
def capture_inertia_errors(options)
|
45
45
|
if (inertia_errors = options.dig(:inertia, :errors))
|
46
46
|
session[:inertia_errors] = inertia_errors
|
@@ -5,79 +5,91 @@ module InertiaRails
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def call(env)
|
8
|
-
@
|
8
|
+
InertiaRailsRequest.new(@app, env)
|
9
|
+
.response
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
+
class InertiaRailsRequest
|
13
|
+
def initialize(app, env)
|
14
|
+
@app = app
|
15
|
+
@env = env
|
16
|
+
end
|
12
17
|
|
13
|
-
|
18
|
+
def response
|
19
|
+
status, headers, body = @app.call(@env)
|
20
|
+
request = ActionDispatch::Request.new(@env)
|
14
21
|
|
15
|
-
|
16
|
-
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
|
22
|
+
::InertiaRails.reset!
|
17
23
|
|
18
|
-
|
24
|
+
# Inertia errors are added to the session via redirect_to
|
25
|
+
request.session.delete(:inertia_errors) unless keep_inertia_errors?(status)
|
19
26
|
|
20
|
-
|
21
|
-
end
|
27
|
+
status = 303 if inertia_non_post_redirect?(status)
|
22
28
|
|
23
|
-
|
29
|
+
stale_inertia_get? ? force_refresh(request) : [status, headers, body]
|
30
|
+
end
|
24
31
|
|
25
|
-
|
26
|
-
redirect_status?(status) || stale_inertia_request?
|
27
|
-
end
|
32
|
+
private
|
28
33
|
|
29
|
-
|
30
|
-
|
31
|
-
|
34
|
+
def keep_inertia_errors?(status)
|
35
|
+
redirect_status?(status) || stale_inertia_request?
|
36
|
+
end
|
32
37
|
|
33
|
-
|
34
|
-
|
35
|
-
|
38
|
+
def stale_inertia_request?
|
39
|
+
inertia_request? && version_stale?
|
40
|
+
end
|
36
41
|
|
37
|
-
|
38
|
-
|
39
|
-
|
42
|
+
def redirect_status?(status)
|
43
|
+
[301, 302].include? status
|
44
|
+
end
|
40
45
|
|
41
|
-
|
42
|
-
|
43
|
-
|
46
|
+
def non_get_redirectable_method?
|
47
|
+
['PUT', 'PATCH', 'DELETE'].include? request_method
|
48
|
+
end
|
44
49
|
|
45
|
-
|
46
|
-
|
47
|
-
|
50
|
+
def inertia_non_post_redirect?(status)
|
51
|
+
inertia_request? && redirect_status?(status) && non_get_redirectable_method?
|
52
|
+
end
|
48
53
|
|
49
|
-
|
50
|
-
|
51
|
-
|
54
|
+
def stale_inertia_get?
|
55
|
+
get? && stale_inertia_request?
|
56
|
+
end
|
52
57
|
|
53
|
-
|
54
|
-
|
55
|
-
|
58
|
+
def get?
|
59
|
+
request_method == 'GET'
|
60
|
+
end
|
56
61
|
|
57
|
-
|
58
|
-
|
59
|
-
|
62
|
+
def request_method
|
63
|
+
@env['REQUEST_METHOD']
|
64
|
+
end
|
60
65
|
|
61
|
-
|
62
|
-
|
63
|
-
|
66
|
+
def inertia_version
|
67
|
+
@env['HTTP_X_INERTIA_VERSION']
|
68
|
+
end
|
64
69
|
|
65
|
-
|
66
|
-
|
67
|
-
|
70
|
+
def inertia_request?
|
71
|
+
@env['HTTP_X_INERTIA'].present?
|
72
|
+
end
|
68
73
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
end
|
74
|
+
def version_stale?
|
75
|
+
sent_version != saved_version
|
76
|
+
end
|
73
77
|
|
74
|
-
|
75
|
-
|
76
|
-
|
78
|
+
def sent_version
|
79
|
+
return nil if inertia_version.nil?
|
80
|
+
|
81
|
+
InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
|
82
|
+
end
|
77
83
|
|
78
|
-
|
79
|
-
|
80
|
-
|
84
|
+
def saved_version
|
85
|
+
InertiaRails.version.is_a?(Numeric) ? InertiaRails.version.to_f : InertiaRails.version
|
86
|
+
end
|
87
|
+
|
88
|
+
def force_refresh(request)
|
89
|
+
request.flash.keep
|
90
|
+
Rack::Response.new('', 409, {'X-Inertia-Location' => request.original_url}).finish
|
91
|
+
end
|
81
92
|
end
|
82
93
|
end
|
83
94
|
end
|
95
|
+
|
data/lib/inertia_rails/rspec.rb
CHANGED
@@ -35,6 +35,9 @@ module InertiaRails
|
|
35
35
|
def inertia
|
36
36
|
raise 'Inertia test helpers aren\'t set up! Make sure you add inertia: true to describe blocks using inertia tests.' unless inertia_tests_setup?
|
37
37
|
|
38
|
+
if @_inertia_render_wrapper.nil? && !::RSpec.configuration.inertia[:skip_missing_renderer_warnings]
|
39
|
+
warn 'WARNING: the test never created an Inertia renderer. Maybe the code wasn\'t able to reach a `render inertia:` call? If this was intended, or you don\'t want to see this message, set ::RSpec.configuration.inertia[:skip_missing_renderer_warnings] = true'
|
40
|
+
end
|
38
41
|
@_inertia_render_wrapper
|
39
42
|
end
|
40
43
|
|
@@ -49,7 +52,7 @@ module InertiaRails
|
|
49
52
|
protected
|
50
53
|
|
51
54
|
def inertia_tests_setup?
|
52
|
-
|
55
|
+
::RSpec.current_example.metadata.fetch(:inertia, false)
|
53
56
|
end
|
54
57
|
end
|
55
58
|
end
|
@@ -57,6 +60,9 @@ end
|
|
57
60
|
|
58
61
|
RSpec.configure do |config|
|
59
62
|
config.include ::InertiaRails::RSpec::Helpers
|
63
|
+
config.add_setting :inertia, default: {
|
64
|
+
skip_missing_renderer_warnings: false
|
65
|
+
}
|
60
66
|
|
61
67
|
config.before(:each, inertia: true) do
|
62
68
|
new_renderer = InertiaRails::Renderer.method(:new)
|
@@ -0,0 +1,16 @@
|
|
1
|
+
namespace :inertia_rails do
|
2
|
+
namespace :install do
|
3
|
+
desc "Installs inertia_rails packages and configurations for a React based app"
|
4
|
+
task :react => :environment do
|
5
|
+
system 'rails g inertia_rails:install --front_end react'
|
6
|
+
end
|
7
|
+
desc "Installs inertia_rails packages and configurations for a Vue based app"
|
8
|
+
task vue: :environment do
|
9
|
+
system 'rails g inertia_rails:install --front_end vue'
|
10
|
+
end
|
11
|
+
desc "Installs inertia_rails packages and configurations for a Svelte based app"
|
12
|
+
task svelte: :environment do
|
13
|
+
system 'rails g inertia_rails:install --front_end svelte'
|
14
|
+
end
|
15
|
+
end
|
16
|
+
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: 1.
|
4
|
+
version: 1.11.1
|
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: 2021-
|
13
|
+
date: 2021-06-27 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rails
|
@@ -110,6 +110,20 @@ dependencies:
|
|
110
110
|
- - ">="
|
111
111
|
- !ruby/object:Gem::Version
|
112
112
|
version: '0'
|
113
|
+
- !ruby/object:Gem::Dependency
|
114
|
+
name: responders
|
115
|
+
requirement: !ruby/object:Gem::Requirement
|
116
|
+
requirements:
|
117
|
+
- - ">="
|
118
|
+
- !ruby/object:Gem::Version
|
119
|
+
version: '0'
|
120
|
+
type: :development
|
121
|
+
prerelease: false
|
122
|
+
version_requirements: !ruby/object:Gem::Requirement
|
123
|
+
requirements:
|
124
|
+
- - ">="
|
125
|
+
- !ruby/object:Gem::Version
|
126
|
+
version: '0'
|
113
127
|
description:
|
114
128
|
email:
|
115
129
|
- brain@bellawatt.com
|
@@ -139,6 +153,12 @@ files:
|
|
139
153
|
- gemfiles/rails_6.0.gemfile
|
140
154
|
- gemfiles/rails_6.1.gemfile
|
141
155
|
- inertia_rails.gemspec
|
156
|
+
- lib/generators/inertia_rails/install/controller.rb
|
157
|
+
- lib/generators/inertia_rails/install/react/InertiaExample.jsx
|
158
|
+
- lib/generators/inertia_rails/install/react/inertia.jsx
|
159
|
+
- lib/generators/inertia_rails/install/vue/InertiaExample.vue
|
160
|
+
- lib/generators/inertia_rails/install/vue/inertia.js
|
161
|
+
- lib/generators/inertia_rails/install_generator.rb
|
142
162
|
- lib/inertia_rails.rb
|
143
163
|
- lib/inertia_rails/controller.rb
|
144
164
|
- lib/inertia_rails/engine.rb
|
@@ -154,6 +174,7 @@ files:
|
|
154
174
|
- lib/patches/debug_exceptions/patch-5-1.rb
|
155
175
|
- lib/patches/mapper.rb
|
156
176
|
- lib/patches/request.rb
|
177
|
+
- lib/tasks/inertia_rails.rake
|
157
178
|
homepage: https://github.com/inertiajs/inertia-rails
|
158
179
|
licenses:
|
159
180
|
- MIT
|