inertia_rails 3.2.0 → 3.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +17 -0
- data/README.md +105 -33
- data/lib/inertia_rails/action_filter.rb +27 -0
- data/lib/inertia_rails/configuration.rb +90 -0
- data/lib/inertia_rails/controller.rb +106 -52
- data/lib/inertia_rails/helper.rb +14 -0
- data/lib/inertia_rails/inertia_rails.rb +6 -38
- data/lib/inertia_rails/middleware.rb +11 -10
- data/lib/inertia_rails/renderer.rb +45 -21
- data/lib/inertia_rails/rspec.rb +10 -3
- data/lib/inertia_rails/version.rb +1 -1
- data/lib/inertia_rails.rb +4 -0
- metadata +17 -117
- data/.github/workflows/push.yml +0 -33
- data/.gitignore +0 -22
- data/.rspec +0 -3
- data/CODE_OF_CONDUCT.md +0 -74
- data/Gemfile +0 -7
- data/Rakefile +0 -6
- data/bin/console +0 -14
- data/bin/setup +0 -8
- data/inertia_rails.gemspec +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58d0616b3504cdbe3a0002ea2568b8af2bf8ab442882115109c1c4fcd636fbf2
|
4
|
+
data.tar.gz: ad704410b5c41f0c75a6dc6b2029e9e3742ec16539ab607414f86d0c63a7a397
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b19bade9694bad666820b90e25727658679ce057c06c501f95344d70cbced198ed217d5f965d8146eb303ae48794675e93da9cd371c012afb8965533cf8c9eba
|
7
|
+
data.tar.gz: 1a1ce123b90feecc66c211ea38cbcd4a3db6d2696ec0807a0e196baad99b32901d205fefae38497db2eba22d8da7f7dbc8b2923c20474f6626d639e7c033a99d
|
data/CHANGELOG.md
CHANGED
@@ -4,6 +4,23 @@ 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.4.0] - 2024-11-02
|
8
|
+
|
9
|
+
* Inertia Rails documentation (@skryukov)
|
10
|
+
* Add specs for config refactor (#139)
|
11
|
+
* New feature: if/unless/only/except options for inertia_share. Enables per-action sharing! (#137, @skryukov)
|
12
|
+
* Bugfix: for inertia errors when using message_pack to serialize cookies. (#143, @BenMorganMY)
|
13
|
+
* Test Rails 7.2 in CI/CD (#145, @skryukov)
|
14
|
+
* Bring redirect behavior in line with Rails 7.0 behavior (#146, @skryukov)
|
15
|
+
* Gemspec cleanup (#149, @skryukov)
|
16
|
+
|
17
|
+
## [3.3.0] - 2024-10-27
|
18
|
+
|
19
|
+
* Refactor Inertia configuration into a controller class method. Thanks @ElMassimo!
|
20
|
+
* Documentation updates. Thanks @osbre and @austenmadden!
|
21
|
+
* Further fixes to the `Vary` header. Thanks @skryukov!
|
22
|
+
* Add configuration option for the component path in the renderer.
|
23
|
+
|
7
24
|
## [3.2.0] - 2024-06-19
|
8
25
|
|
9
26
|
* 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!
|
data/README.md
CHANGED
@@ -7,14 +7,26 @@
|
|
7
7
|
|
8
8
|
### Backend
|
9
9
|
|
10
|
-
|
10
|
+
Add the `inertia_rails` gem to your Gemfile.
|
11
|
+
|
11
12
|
```ruby
|
12
13
|
gem 'inertia_rails'
|
13
14
|
```
|
14
15
|
|
16
|
+
For more instructions, see [Server-side setup](https://inertia-rails.netlify.app/guide/server-side-setup.html).
|
17
|
+
|
15
18
|
### Frontend
|
16
19
|
|
17
|
-
|
20
|
+
We are discussing on bringing official docs for Inertia Rails to this repo, as
|
21
|
+
the [official docs](https://inertiajs.com/client-side-setup) are specific to Laravel.
|
22
|
+
|
23
|
+
In the meantime, you can refer to the community-maintained [Client-side setup](https://inertia-rails.netlify.app/guide/client-side-setup.html).
|
24
|
+
|
25
|
+
Examples:
|
26
|
+
|
27
|
+
- [React/Vite](https://github.com/BrandonShar/inertia-rails-template)
|
28
|
+
- [React/Vite + SSR](https://github.com/ElMassimo/inertia-rails-ssr-template)
|
29
|
+
- [PingCRM with Vue and Vite](https://github.com/ledermann/pingcrm)
|
18
30
|
|
19
31
|
## Usage
|
20
32
|
|
@@ -63,12 +75,24 @@ end
|
|
63
75
|
In order to use instance props, you must call `use_inertia_instance_props` on the controller (or a base controller it inherits from). If any props are provided manually, instance props
|
64
76
|
are automatically disabled for that response. Instance props are only included if they are defined after the before filter is set from `use_inertia_instance_props`.
|
65
77
|
|
66
|
-
Automatic component name is also opt in, you must set the `default_render` config value to `true`. Otherwise, you can simply `render inertia: true` for the same behavior explicitly.
|
78
|
+
Automatic component name is also opt in, you must set the [`default_render`](#default_render) config value to `true`. Otherwise, you can simply `render inertia: true` for the same behavior explicitly.
|
79
|
+
|
80
|
+
If the default component path doesn't match your convention, you can define a method to resolve it however you like via the `component_path_resolver` config value. The value of this should be callable and will receive the path and action and should return a string component path.
|
81
|
+
|
82
|
+
```ruby
|
83
|
+
inertia_config(
|
84
|
+
component_path_resolver: ->(path:, action:) do
|
85
|
+
"Storefront/#{path.camelize}/#{action.camelize}"
|
86
|
+
end
|
87
|
+
)
|
88
|
+
|
89
|
+
```
|
90
|
+
|
91
|
+
|
67
92
|
|
68
93
|
### Layout
|
69
94
|
|
70
|
-
Inertia layouts use the rails layout convention and can be set or changed in the same way.
|
71
|
-
of using rails layouts.
|
95
|
+
Inertia layouts use the rails layout convention and can be set or changed in the same way.
|
72
96
|
|
73
97
|
```ruby
|
74
98
|
class EventsController < ApplicationController
|
@@ -133,20 +157,14 @@ end
|
|
133
157
|
}
|
134
158
|
```
|
135
159
|
|
136
|
-
Deep merging can be
|
160
|
+
Deep merging can be configured using the [`deep_merge_shared_data`](#deep_merge_shared_data) configuration option.
|
137
161
|
|
138
|
-
|
139
|
-
# config/initializers/some_initializer.rb
|
140
|
-
InertiaRails.configure do |config|
|
141
|
-
config.deep_merge_shared_data = true
|
142
|
-
end
|
143
|
-
|
144
|
-
```
|
145
|
-
|
146
|
-
If deep merging is enabled by default, it's possible to opt out within the action:
|
162
|
+
If deep merging is enabled, you can still opt-out within the action:
|
147
163
|
|
148
164
|
```ruby
|
149
165
|
class CrazyScorersController < ApplicationController
|
166
|
+
inertia_config(deep_merge_shared_data: true)
|
167
|
+
|
150
168
|
inertia_share do
|
151
169
|
{
|
152
170
|
basketball_data: {
|
@@ -163,7 +181,7 @@ class CrazyScorersController < ApplicationController
|
|
163
181
|
end
|
164
182
|
end
|
165
183
|
|
166
|
-
#
|
184
|
+
# `deep_merge: false` overrides the default:
|
167
185
|
{
|
168
186
|
basketball_data: {
|
169
187
|
points: 100,
|
@@ -177,6 +195,9 @@ On the front end, Inertia supports the concept of "partial reloads" where only t
|
|
177
195
|
|
178
196
|
```ruby
|
179
197
|
inertia_share some_data: InertiaRails.lazy(lambda { some_very_slow_method })
|
198
|
+
|
199
|
+
# Using a Ruby block syntax
|
200
|
+
inertia_share some_data: InertiaRails.lazy { some_very_slow_method }
|
180
201
|
```
|
181
202
|
|
182
203
|
### Routing
|
@@ -187,34 +208,85 @@ If you don't need a controller to handle a static component, you can route direc
|
|
187
208
|
inertia 'about' => 'AboutComponent'
|
188
209
|
```
|
189
210
|
|
190
|
-
### SSR
|
211
|
+
### SSR _(experimental)_
|
212
|
+
|
213
|
+
Enable SSR via the configuration options for [`ssr_enabled`](#ssr_enabled-experimental) and [`ssr_url`](#ssr_url-experimental).
|
214
|
+
|
215
|
+
When using SSR, don't forget to add `<%= inertia_ssr_head %>` to the `<head>` of your layout (i.e. `application.html.erb`).
|
191
216
|
|
192
|
-
|
217
|
+
## Configuration ⚙️
|
193
218
|
|
194
|
-
|
219
|
+
Inertia Rails can be configured globally or in a specific controller (and subclasses).
|
195
220
|
|
196
|
-
|
221
|
+
### Global Configuration
|
197
222
|
|
198
|
-
|
223
|
+
If using global configuration, we recommend you place the code inside an initializer:
|
199
224
|
|
200
|
-
The default config is shown below
|
201
225
|
```ruby
|
226
|
+
# config/initializers/inertia.rb
|
227
|
+
|
202
228
|
InertiaRails.configure do |config|
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
config.default_render = true
|
208
|
-
|
209
|
-
# ssr specific options
|
210
|
-
config.ssr_enabled = false
|
211
|
-
config.ssr_url = 'http://localhost:13714'
|
229
|
+
# Example: force a full-reload if the deployed assets change.
|
230
|
+
config.version = ViteRuby.digest
|
231
|
+
end
|
232
|
+
```
|
212
233
|
|
213
|
-
|
214
|
-
|
234
|
+
The default configuration can be found [here](https://github.com/inertiajs/inertia-rails/blob/master/lib/inertia_rails/configuration.rb#L5-L22).
|
235
|
+
|
236
|
+
### Local Configuration
|
237
|
+
|
238
|
+
Use `inertia_config` in your controllers to override global settings:
|
239
|
+
|
240
|
+
```ruby
|
241
|
+
class EventsController < ApplicationController
|
242
|
+
inertia_config(
|
243
|
+
version: "events-#{InertiaRails.configuration.version}",
|
244
|
+
ssr_enabled: -> { action_name == "index" },
|
245
|
+
)
|
215
246
|
end
|
216
247
|
```
|
217
248
|
|
249
|
+
### Configuration Options
|
250
|
+
|
251
|
+
#### `version` _(recommended)_
|
252
|
+
|
253
|
+
This allows Inertia to detect if the app running in the client is oudated,
|
254
|
+
forcing a full page visit instead of an XHR visit on the next request.
|
255
|
+
|
256
|
+
See [assets versioning](https://inertiajs.com/asset-versioning).
|
257
|
+
|
258
|
+
__Default__: `nil`
|
259
|
+
|
260
|
+
#### `deep_merge_shared_data`
|
261
|
+
|
262
|
+
When enabled, props will be deep merged with shared data, combining hashes
|
263
|
+
with the same keys instead of replacing them.
|
264
|
+
|
265
|
+
__Default__: `false`
|
266
|
+
|
267
|
+
#### `default_render`
|
268
|
+
|
269
|
+
Overrides Rails default rendering behavior to render using Inertia by default.
|
270
|
+
|
271
|
+
__Default__: `false`
|
272
|
+
|
273
|
+
#### `ssr_enabled` _(experimental)_
|
274
|
+
|
275
|
+
Whether to use a JavaScript server to pre-render your JavaScript pages,
|
276
|
+
allowing your visitors to receive fully rendered HTML when they first visit
|
277
|
+
your application.
|
278
|
+
|
279
|
+
Requires a JS server to be available at `ssr_url`. [_Example_](https://github.com/ElMassimo/inertia-rails-ssr-template)
|
280
|
+
|
281
|
+
__Default__: `false`
|
282
|
+
|
283
|
+
#### `ssr_url` _(experimental)_
|
284
|
+
|
285
|
+
The URL of the JS server that will pre-render the app using the specified
|
286
|
+
component and props.
|
287
|
+
|
288
|
+
__Default__: `"http://localhost:13714"`
|
289
|
+
|
218
290
|
## Testing
|
219
291
|
|
220
292
|
If you're using Rspec, Inertia Rails comes with some nice test helpers to make things simple.
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
#
|
3
|
+
# Based on AbstractController::Callbacks::ActionFilter
|
4
|
+
# https://github.com/rails/rails/blob/v7.2.0/actionpack/lib/abstract_controller/callbacks.rb#L39
|
5
|
+
module InertiaRails
|
6
|
+
class ActionFilter
|
7
|
+
def initialize(conditional_key, actions)
|
8
|
+
@conditional_key = conditional_key
|
9
|
+
@actions = Array(actions).map(&:to_s).to_set
|
10
|
+
end
|
11
|
+
|
12
|
+
def match?(controller)
|
13
|
+
missing_action = @actions.find { |action| !controller.available_action?(action) }
|
14
|
+
if missing_action
|
15
|
+
message = <<~MSG
|
16
|
+
The #{missing_action} action could not be found for the :inertia_share
|
17
|
+
callback on #{controller.class.name}, but it is listed in the controller's
|
18
|
+
#{@conditional_key.inspect} option.
|
19
|
+
MSG
|
20
|
+
|
21
|
+
raise AbstractController::ActionNotFound.new(message, controller, missing_action)
|
22
|
+
end
|
23
|
+
|
24
|
+
@actions.include?(controller.action_name)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module InertiaRails
|
4
|
+
class Configuration
|
5
|
+
DEFAULTS = {
|
6
|
+
# Whether to combine hashes with the same keys instead of replacing them.
|
7
|
+
deep_merge_shared_data: false,
|
8
|
+
|
9
|
+
# Overrides Rails default rendering behavior to render using Inertia by default.
|
10
|
+
default_render: false,
|
11
|
+
|
12
|
+
# Allows the user to hook into the default rendering behavior and change it to fit their needs
|
13
|
+
component_path_resolver: ->(path:, action:) { "#{path}/#{action}" },
|
14
|
+
|
15
|
+
# DEPRECATED: Let Rails decide which layout should be used based on the
|
16
|
+
# controller configuration.
|
17
|
+
layout: true,
|
18
|
+
|
19
|
+
# SSR options.
|
20
|
+
ssr_enabled: false,
|
21
|
+
ssr_url: 'http://localhost:13714',
|
22
|
+
|
23
|
+
# Used to detect version drift between server and client.
|
24
|
+
version: nil,
|
25
|
+
}.freeze
|
26
|
+
|
27
|
+
OPTION_NAMES = DEFAULTS.keys.freeze
|
28
|
+
|
29
|
+
protected attr_reader :controller
|
30
|
+
protected attr_reader :options
|
31
|
+
|
32
|
+
def initialize(controller: nil, **attrs)
|
33
|
+
@controller = controller
|
34
|
+
@options = attrs.extract!(*OPTION_NAMES)
|
35
|
+
|
36
|
+
unless attrs.empty?
|
37
|
+
raise ArgumentError, "Unknown options for #{self.class}: #{attrs.keys}"
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def bind_controller(controller)
|
42
|
+
Configuration.new(**@options, controller: controller)
|
43
|
+
end
|
44
|
+
|
45
|
+
def freeze
|
46
|
+
@options.freeze
|
47
|
+
super
|
48
|
+
end
|
49
|
+
|
50
|
+
def merge!(config)
|
51
|
+
@options.merge!(config.options)
|
52
|
+
self
|
53
|
+
end
|
54
|
+
|
55
|
+
def merge(config)
|
56
|
+
Configuration.new(**@options.merge(config.options))
|
57
|
+
end
|
58
|
+
|
59
|
+
# Internal: Finalizes the configuration for a specific controller.
|
60
|
+
def with_defaults(config)
|
61
|
+
@options = config.options.merge(@options)
|
62
|
+
freeze
|
63
|
+
end
|
64
|
+
|
65
|
+
def component_path_resolver(path:, action:)
|
66
|
+
@options[:component_path_resolver].call(path:, action:)
|
67
|
+
end
|
68
|
+
|
69
|
+
OPTION_NAMES.each do |option|
|
70
|
+
define_method(option) {
|
71
|
+
evaluate_option @options[option]
|
72
|
+
} unless method_defined?(option)
|
73
|
+
define_method("#{option}=") { |value|
|
74
|
+
@options[option] = value
|
75
|
+
}
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.default
|
79
|
+
new(**DEFAULTS)
|
80
|
+
end
|
81
|
+
|
82
|
+
private
|
83
|
+
|
84
|
+
def evaluate_option(value)
|
85
|
+
return value unless value.respond_to?(:call)
|
86
|
+
return value.call unless controller
|
87
|
+
controller.instance_exec(&value)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -1,37 +1,42 @@
|
|
1
1
|
require_relative "inertia_rails"
|
2
|
+
require_relative "helper"
|
3
|
+
require_relative "action_filter"
|
2
4
|
|
3
5
|
module InertiaRails
|
4
6
|
module Controller
|
5
7
|
extend ActiveSupport::Concern
|
6
8
|
|
7
9
|
included do
|
8
|
-
|
9
|
-
|
10
|
-
before_action do
|
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 ||= []
|
23
|
-
end
|
10
|
+
helper ::InertiaRails::Helper
|
24
11
|
|
25
12
|
after_action do
|
26
|
-
cookies['XSRF-TOKEN'] = form_authenticity_token
|
13
|
+
cookies['XSRF-TOKEN'] = form_authenticity_token if protect_against_forgery?
|
27
14
|
end
|
28
15
|
end
|
29
16
|
|
30
17
|
module ClassMethods
|
31
|
-
def inertia_share(hash = nil, &block)
|
32
|
-
|
33
|
-
|
34
|
-
|
18
|
+
def inertia_share(hash = nil, **props, &block)
|
19
|
+
options = extract_inertia_share_options(props)
|
20
|
+
return push_to_inertia_share(**(hash || props), &block) if options.empty?
|
21
|
+
|
22
|
+
push_to_inertia_share do
|
23
|
+
next unless options[:if].all? { |filter| instance_exec(&filter) } if options[:if]
|
24
|
+
next unless options[:unless].none? { |filter| instance_exec(&filter) } if options[:unless]
|
25
|
+
|
26
|
+
next hash unless block
|
27
|
+
|
28
|
+
res = instance_exec(&block)
|
29
|
+
hash ? hash.merge(res) : res
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def inertia_config(**attrs)
|
34
|
+
config = InertiaRails::Configuration.new(**attrs)
|
35
|
+
|
36
|
+
if @inertia_config
|
37
|
+
@inertia_config.merge!(config)
|
38
|
+
else
|
39
|
+
@inertia_config = config
|
35
40
|
end
|
36
41
|
end
|
37
42
|
|
@@ -41,55 +46,108 @@ module InertiaRails
|
|
41
46
|
@_inertia_skip_props = view_assigns.keys + ['_inertia_skip_props']
|
42
47
|
end
|
43
48
|
end
|
44
|
-
end
|
45
49
|
|
46
|
-
|
47
|
-
|
48
|
-
|
50
|
+
def _inertia_configuration
|
51
|
+
@_inertia_configuration ||= begin
|
52
|
+
config = superclass.try(:_inertia_configuration) || ::InertiaRails.configuration
|
53
|
+
@inertia_config&.with_defaults(config) || config
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def _inertia_shared_data
|
58
|
+
@_inertia_shared_data ||= begin
|
59
|
+
shared_data = superclass.try(:_inertia_shared_data)
|
60
|
+
|
61
|
+
if @inertia_share && shared_data.present?
|
62
|
+
shared_data + @inertia_share.freeze
|
63
|
+
else
|
64
|
+
@inertia_share || shared_data || []
|
65
|
+
end.freeze
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
private
|
70
|
+
|
71
|
+
def push_to_inertia_share(**attrs, &block)
|
72
|
+
@inertia_share ||= []
|
73
|
+
@inertia_share << attrs.freeze unless attrs.empty?
|
74
|
+
@inertia_share << block if block
|
75
|
+
end
|
76
|
+
|
77
|
+
def extract_inertia_share_options(props)
|
78
|
+
options = props.slice(:if, :unless, :only, :except)
|
79
|
+
|
80
|
+
return options if options.empty?
|
81
|
+
|
82
|
+
if props.except(:if, :unless, :only, :except).any?
|
83
|
+
raise ArgumentError, "You must not mix shared data and [:if, :unless, :only, :except] options, pass data as a hash or a block."
|
84
|
+
end
|
85
|
+
|
86
|
+
transform_inertia_share_option(options, :only, :if)
|
87
|
+
transform_inertia_share_option(options, :except, :unless)
|
88
|
+
|
89
|
+
options.transform_values! do |filters|
|
90
|
+
Array(filters).map!(&method(:filter_to_proc))
|
91
|
+
end
|
92
|
+
|
93
|
+
options
|
94
|
+
end
|
95
|
+
|
96
|
+
def transform_inertia_share_option(options, from, to)
|
97
|
+
if (from_value = options.delete(from))
|
98
|
+
filter = InertiaRails::ActionFilter.new(from, from_value)
|
99
|
+
options[to] = Array(options[to]).unshift(filter)
|
100
|
+
end
|
101
|
+
end
|
49
102
|
|
50
|
-
|
51
|
-
|
103
|
+
def filter_to_proc(filter)
|
104
|
+
case filter
|
105
|
+
when Symbol
|
106
|
+
-> { send(filter) }
|
107
|
+
when Proc
|
108
|
+
filter
|
109
|
+
when InertiaRails::ActionFilter
|
110
|
+
-> { filter.match?(self) }
|
111
|
+
else
|
112
|
+
raise ArgumentError, "You must pass a symbol or a proc as a filter."
|
113
|
+
end
|
114
|
+
end
|
52
115
|
end
|
53
116
|
|
54
117
|
def default_render
|
55
|
-
if
|
118
|
+
if inertia_configuration.default_render
|
56
119
|
render(inertia: true)
|
57
120
|
else
|
58
121
|
super
|
59
122
|
end
|
60
123
|
end
|
61
124
|
|
62
|
-
def shared_data
|
63
|
-
(@_inertia_shared_plain_data || {}).merge(evaluated_blocks)
|
64
|
-
end
|
65
|
-
|
66
125
|
def redirect_to(options = {}, response_options = {})
|
67
126
|
capture_inertia_errors(response_options)
|
68
|
-
super
|
127
|
+
super
|
69
128
|
end
|
70
129
|
|
71
|
-
|
72
|
-
capture_inertia_errors(options)
|
73
|
-
super(
|
74
|
-
fallback_location: fallback_location,
|
75
|
-
allow_other_host: allow_other_host,
|
76
|
-
**options,
|
77
|
-
)
|
78
|
-
end
|
130
|
+
private
|
79
131
|
|
80
132
|
def inertia_view_assigns
|
81
133
|
return {} unless @_inertia_instance_props
|
82
134
|
view_assigns.except(*@_inertia_skip_props)
|
83
135
|
end
|
84
136
|
|
85
|
-
|
137
|
+
def inertia_configuration
|
138
|
+
self.class._inertia_configuration.bind_controller(self)
|
139
|
+
end
|
86
140
|
|
87
|
-
def
|
88
|
-
|
141
|
+
def inertia_shared_data
|
142
|
+
initial_data = session[:inertia_errors].present? ? {errors: session[:inertia_errors]} : {}
|
89
143
|
|
90
|
-
|
91
|
-
|
92
|
-
|
144
|
+
self.class._inertia_shared_data.filter_map { |shared_data|
|
145
|
+
if shared_data.respond_to?(:call)
|
146
|
+
instance_exec(&shared_data)
|
147
|
+
else
|
148
|
+
shared_data
|
149
|
+
end
|
150
|
+
}.reduce(initial_data, &:merge)
|
93
151
|
end
|
94
152
|
|
95
153
|
def inertia_location(url)
|
@@ -99,12 +157,8 @@ module InertiaRails
|
|
99
157
|
|
100
158
|
def capture_inertia_errors(options)
|
101
159
|
if (inertia_errors = options.dig(:inertia, :errors))
|
102
|
-
session[:inertia_errors] = inertia_errors
|
160
|
+
session[:inertia_errors] = inertia_errors.to_hash
|
103
161
|
end
|
104
162
|
end
|
105
|
-
|
106
|
-
def evaluated_blocks
|
107
|
-
(@_inertia_shared_blocks || []).map { |block| instance_exec(&block) }.reduce(&:merge) || {}
|
108
|
-
end
|
109
163
|
end
|
110
164
|
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require_relative 'inertia_rails'
|
2
|
+
|
3
|
+
module InertiaRails::Helper
|
4
|
+
def inertia_ssr_head
|
5
|
+
controller.instance_variable_get("@_inertia_ssr_head")
|
6
|
+
end
|
7
|
+
|
8
|
+
def inertia_headers
|
9
|
+
InertiaRails.deprecator.warn(
|
10
|
+
"`inertia_headers` is deprecated and will be removed in InertiaRails 4.0, use `inertia_ssr_head` instead."
|
11
|
+
)
|
12
|
+
inertia_ssr_head
|
13
|
+
end
|
14
|
+
end
|
@@ -1,52 +1,20 @@
|
|
1
1
|
# Needed for `thread_mattr_accessor`
|
2
2
|
require 'active_support/core_ext/module/attribute_accessors_per_thread'
|
3
3
|
require 'inertia_rails/lazy'
|
4
|
+
require 'inertia_rails/configuration'
|
4
5
|
|
5
6
|
module InertiaRails
|
6
|
-
|
7
|
-
yield(Configuration)
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.version
|
11
|
-
Configuration.evaluated_version
|
12
|
-
end
|
13
|
-
|
14
|
-
def self.layout
|
15
|
-
Configuration.layout
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.ssr_enabled?
|
19
|
-
Configuration.ssr_enabled
|
20
|
-
end
|
7
|
+
CONFIGURATION = Configuration.default
|
21
8
|
|
22
|
-
def self.
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
def self.default_render?
|
27
|
-
Configuration.default_render
|
9
|
+
def self.configure
|
10
|
+
yield(CONFIGURATION)
|
28
11
|
end
|
29
12
|
|
30
|
-
def self.
|
31
|
-
|
13
|
+
def self.configuration
|
14
|
+
CONFIGURATION
|
32
15
|
end
|
33
16
|
|
34
17
|
def self.lazy(value = nil, &block)
|
35
18
|
InertiaRails::Lazy.new(value, &block)
|
36
19
|
end
|
37
|
-
|
38
|
-
private
|
39
|
-
|
40
|
-
module Configuration
|
41
|
-
mattr_accessor(:layout) { nil }
|
42
|
-
mattr_accessor(:version) { nil }
|
43
|
-
mattr_accessor(:ssr_enabled) { false }
|
44
|
-
mattr_accessor(:ssr_url) { 'http://localhost:13714' }
|
45
|
-
mattr_accessor(:default_render) { false }
|
46
|
-
mattr_accessor(:deep_merge_shared_data) { false }
|
47
|
-
|
48
|
-
def self.evaluated_version
|
49
|
-
self.version.respond_to?(:call) ? self.version.call : self.version
|
50
|
-
end
|
51
|
-
end
|
52
20
|
end
|
@@ -5,8 +5,7 @@ module InertiaRails
|
|
5
5
|
end
|
6
6
|
|
7
7
|
def call(env)
|
8
|
-
InertiaRailsRequest.new(@app, env)
|
9
|
-
.response
|
8
|
+
InertiaRailsRequest.new(@app, env).response
|
10
9
|
end
|
11
10
|
|
12
11
|
class InertiaRailsRequest
|
@@ -58,11 +57,15 @@ module InertiaRails
|
|
58
57
|
request_method == 'GET'
|
59
58
|
end
|
60
59
|
|
60
|
+
def controller
|
61
|
+
@env["action_controller.instance"]
|
62
|
+
end
|
63
|
+
|
61
64
|
def request_method
|
62
65
|
@env['REQUEST_METHOD']
|
63
66
|
end
|
64
67
|
|
65
|
-
def
|
68
|
+
def client_version
|
66
69
|
@env['HTTP_X_INERTIA_VERSION']
|
67
70
|
end
|
68
71
|
|
@@ -71,17 +74,15 @@ module InertiaRails
|
|
71
74
|
end
|
72
75
|
|
73
76
|
def version_stale?
|
74
|
-
|
77
|
+
coerce_version(client_version) != coerce_version(server_version)
|
75
78
|
end
|
76
79
|
|
77
|
-
def
|
78
|
-
|
79
|
-
|
80
|
-
InertiaRails.version.is_a?(Numeric) ? inertia_version.to_f : inertia_version
|
80
|
+
def server_version
|
81
|
+
controller&.send(:inertia_configuration)&.version
|
81
82
|
end
|
82
83
|
|
83
|
-
def
|
84
|
-
|
84
|
+
def coerce_version(version)
|
85
|
+
server_version.is_a?(Numeric) ? version.to_f : version
|
85
86
|
end
|
86
87
|
|
87
88
|
def force_refresh(request)
|
@@ -1,52 +1,74 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
1
3
|
require_relative "inertia_rails"
|
2
4
|
|
3
5
|
module InertiaRails
|
4
6
|
class Renderer
|
5
|
-
attr_reader
|
7
|
+
attr_reader(
|
8
|
+
:component,
|
9
|
+
:configuration,
|
10
|
+
:controller,
|
11
|
+
:props,
|
12
|
+
:view_data,
|
13
|
+
)
|
6
14
|
|
7
15
|
def initialize(component, controller, request, response, render_method, props: nil, view_data: nil, deep_merge: nil)
|
8
|
-
@component = component.is_a?(TrueClass) ? "#{controller.controller_path}/#{controller.action_name}" : component
|
9
16
|
@controller = controller
|
17
|
+
@configuration = controller.__send__(:inertia_configuration)
|
18
|
+
@component = resolve_component(component)
|
10
19
|
@request = request
|
11
20
|
@response = response
|
12
21
|
@render_method = render_method
|
13
|
-
@props = props
|
22
|
+
@props = props || controller.__send__(:inertia_view_assigns)
|
14
23
|
@view_data = view_data || {}
|
15
|
-
@deep_merge = !deep_merge.nil? ? deep_merge :
|
24
|
+
@deep_merge = !deep_merge.nil? ? deep_merge : configuration.deep_merge_shared_data
|
16
25
|
end
|
17
26
|
|
18
27
|
def render
|
28
|
+
if @response.headers["Vary"].blank?
|
29
|
+
@response.headers["Vary"] = 'X-Inertia'
|
30
|
+
else
|
31
|
+
@response.headers["Vary"] = "#{@response.headers["Vary"]}, X-Inertia"
|
32
|
+
end
|
19
33
|
if @request.headers['X-Inertia']
|
20
|
-
@response.set_header('Vary', 'X-Inertia')
|
21
34
|
@response.set_header('X-Inertia', 'true')
|
22
35
|
@render_method.call json: page, status: @response.status, content_type: Mime[:json]
|
23
36
|
else
|
24
|
-
return render_ssr if
|
25
|
-
@render_method.call template: 'inertia', layout: layout, locals:
|
37
|
+
return render_ssr if configuration.ssr_enabled rescue nil
|
38
|
+
@render_method.call template: 'inertia', layout: layout, locals: view_data.merge(page: page)
|
26
39
|
end
|
27
40
|
end
|
28
41
|
|
29
42
|
private
|
30
43
|
|
31
44
|
def render_ssr
|
32
|
-
uri = URI("#{
|
45
|
+
uri = URI("#{configuration.ssr_url}/render")
|
33
46
|
res = JSON.parse(Net::HTTP.post(uri, page.to_json, 'Content-Type' => 'application/json').body)
|
34
47
|
|
35
|
-
|
36
|
-
@render_method.call html: res['body'].html_safe, layout: layout, locals:
|
48
|
+
controller.instance_variable_set("@_inertia_ssr_head", res['head'].join.html_safe)
|
49
|
+
@render_method.call html: res['body'].html_safe, layout: layout, locals: view_data.merge(page: page)
|
37
50
|
end
|
38
51
|
|
39
52
|
def layout
|
40
|
-
|
53
|
+
layout = configuration.layout
|
54
|
+
layout.nil? ? true : layout
|
55
|
+
end
|
56
|
+
|
57
|
+
def shared_data
|
58
|
+
controller.__send__(:inertia_shared_data)
|
59
|
+
end
|
60
|
+
|
61
|
+
# Cast props to symbol keyed hash before merging so that we have a consistent data structure and
|
62
|
+
# avoid duplicate keys after merging.
|
63
|
+
#
|
64
|
+
# Functionally, this permits using either string or symbol keys in the controller. Since the results
|
65
|
+
# is cast to json, we should treat string/symbol keys as identical.
|
66
|
+
def merge_props(shared_data, props)
|
67
|
+
shared_data.deep_symbolize_keys.send(@deep_merge ? :deep_merge : :merge, props.deep_symbolize_keys)
|
41
68
|
end
|
42
69
|
|
43
70
|
def computed_props
|
44
|
-
|
45
|
-
# avoid duplicate keys after merging.
|
46
|
-
#
|
47
|
-
# Functionally, this permits using either string or symbol keys in the controller. Since the results
|
48
|
-
# is cast to json, we should treat string/symbol keys as identical.
|
49
|
-
_props = @controller.shared_data.merge.deep_symbolize_keys.send(prop_merge_method, @props.deep_symbolize_keys).select do |key, prop|
|
71
|
+
_props = merge_props(shared_data, props).select do |key, prop|
|
50
72
|
if rendering_partial_component?
|
51
73
|
key.in? partial_keys
|
52
74
|
else
|
@@ -57,7 +79,7 @@ module InertiaRails
|
|
57
79
|
deep_transform_values(
|
58
80
|
_props,
|
59
81
|
lambda do |prop|
|
60
|
-
prop.respond_to?(:call) ?
|
82
|
+
prop.respond_to?(:call) ? controller.instance_exec(&prop) : prop
|
61
83
|
end
|
62
84
|
)
|
63
85
|
end
|
@@ -67,7 +89,7 @@ module InertiaRails
|
|
67
89
|
component: component,
|
68
90
|
props: computed_props,
|
69
91
|
url: @request.original_fullpath,
|
70
|
-
version:
|
92
|
+
version: configuration.version,
|
71
93
|
}
|
72
94
|
end
|
73
95
|
|
@@ -85,8 +107,10 @@ module InertiaRails
|
|
85
107
|
@request.inertia_partial? && @request.headers['X-Inertia-Partial-Component'] == component
|
86
108
|
end
|
87
109
|
|
88
|
-
def
|
89
|
-
|
110
|
+
def resolve_component(component)
|
111
|
+
return component unless component.is_a? TrueClass
|
112
|
+
|
113
|
+
configuration.component_path_resolver(path: controller.controller_path, action: controller.action_name)
|
90
114
|
end
|
91
115
|
end
|
92
116
|
end
|
data/lib/inertia_rails/rspec.rb
CHANGED
@@ -25,9 +25,16 @@ module InertiaRails
|
|
25
25
|
protected
|
26
26
|
|
27
27
|
def set_values(params)
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
if params[:locals].present?
|
29
|
+
@view_data = params[:locals].except(:page)
|
30
|
+
@props = params[:locals][:page][:props]
|
31
|
+
@component = params[:locals][:page][:component]
|
32
|
+
else
|
33
|
+
# Sequential Inertia request
|
34
|
+
@view_data = {}
|
35
|
+
@props = params[:json][:props]
|
36
|
+
@component = params[:json][:component]
|
37
|
+
end
|
31
38
|
end
|
32
39
|
end
|
33
40
|
|
data/lib/inertia_rails.rb
CHANGED
metadata
CHANGED
@@ -1,16 +1,16 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: inertia_rails
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Knoles
|
8
8
|
- Brandon Shar
|
9
9
|
- Eugene Granovsky
|
10
10
|
autorequire:
|
11
|
-
bindir:
|
11
|
+
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2024-
|
13
|
+
date: 2024-11-02 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: railties
|
@@ -18,135 +18,29 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version: '
|
21
|
+
version: '6'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version: '
|
29
|
-
-
|
30
|
-
|
31
|
-
requirement: !ruby/object:Gem::Requirement
|
32
|
-
requirements:
|
33
|
-
- - "~>"
|
34
|
-
- !ruby/object:Gem::Version
|
35
|
-
version: '2.0'
|
36
|
-
type: :development
|
37
|
-
prerelease: false
|
38
|
-
version_requirements: !ruby/object:Gem::Requirement
|
39
|
-
requirements:
|
40
|
-
- - "~>"
|
41
|
-
- !ruby/object:Gem::Version
|
42
|
-
version: '2.0'
|
43
|
-
- !ruby/object:Gem::Dependency
|
44
|
-
name: rake
|
45
|
-
requirement: !ruby/object:Gem::Requirement
|
46
|
-
requirements:
|
47
|
-
- - "~>"
|
48
|
-
- !ruby/object:Gem::Version
|
49
|
-
version: '13.0'
|
50
|
-
type: :development
|
51
|
-
prerelease: false
|
52
|
-
version_requirements: !ruby/object:Gem::Requirement
|
53
|
-
requirements:
|
54
|
-
- - "~>"
|
55
|
-
- !ruby/object:Gem::Version
|
56
|
-
version: '13.0'
|
57
|
-
- !ruby/object:Gem::Dependency
|
58
|
-
name: rspec-rails
|
59
|
-
requirement: !ruby/object:Gem::Requirement
|
60
|
-
requirements:
|
61
|
-
- - "~>"
|
62
|
-
- !ruby/object:Gem::Version
|
63
|
-
version: '4.0'
|
64
|
-
type: :development
|
65
|
-
prerelease: false
|
66
|
-
version_requirements: !ruby/object:Gem::Requirement
|
67
|
-
requirements:
|
68
|
-
- - "~>"
|
69
|
-
- !ruby/object:Gem::Version
|
70
|
-
version: '4.0'
|
71
|
-
- !ruby/object:Gem::Dependency
|
72
|
-
name: rails-controller-testing
|
73
|
-
requirement: !ruby/object:Gem::Requirement
|
74
|
-
requirements:
|
75
|
-
- - ">="
|
76
|
-
- !ruby/object:Gem::Version
|
77
|
-
version: '0'
|
78
|
-
type: :development
|
79
|
-
prerelease: false
|
80
|
-
version_requirements: !ruby/object:Gem::Requirement
|
81
|
-
requirements:
|
82
|
-
- - ">="
|
83
|
-
- !ruby/object:Gem::Version
|
84
|
-
version: '0'
|
85
|
-
- !ruby/object:Gem::Dependency
|
86
|
-
name: sqlite3
|
87
|
-
requirement: !ruby/object:Gem::Requirement
|
88
|
-
requirements:
|
89
|
-
- - ">="
|
90
|
-
- !ruby/object:Gem::Version
|
91
|
-
version: '0'
|
92
|
-
type: :development
|
93
|
-
prerelease: false
|
94
|
-
version_requirements: !ruby/object:Gem::Requirement
|
95
|
-
requirements:
|
96
|
-
- - ">="
|
97
|
-
- !ruby/object:Gem::Version
|
98
|
-
version: '0'
|
99
|
-
- !ruby/object:Gem::Dependency
|
100
|
-
name: responders
|
101
|
-
requirement: !ruby/object:Gem::Requirement
|
102
|
-
requirements:
|
103
|
-
- - ">="
|
104
|
-
- !ruby/object:Gem::Version
|
105
|
-
version: '0'
|
106
|
-
type: :development
|
107
|
-
prerelease: false
|
108
|
-
version_requirements: !ruby/object:Gem::Requirement
|
109
|
-
requirements:
|
110
|
-
- - ">="
|
111
|
-
- !ruby/object:Gem::Version
|
112
|
-
version: '0'
|
113
|
-
- !ruby/object:Gem::Dependency
|
114
|
-
name: debug
|
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'
|
127
|
-
description:
|
28
|
+
version: '6'
|
29
|
+
description: Quickly build modern single-page React, Vue and Svelte apps using classic
|
30
|
+
server-side routing and controllers.
|
128
31
|
email:
|
129
|
-
-
|
32
|
+
- brian@bellawatt.com
|
130
33
|
- brandon@bellawatt.com
|
131
34
|
- eugene@bellawatt.com
|
132
35
|
executables: []
|
133
36
|
extensions: []
|
134
37
|
extra_rdoc_files: []
|
135
38
|
files:
|
136
|
-
- ".github/workflows/push.yml"
|
137
|
-
- ".gitignore"
|
138
|
-
- ".rspec"
|
139
39
|
- CHANGELOG.md
|
140
|
-
- CODE_OF_CONDUCT.md
|
141
|
-
- Gemfile
|
142
40
|
- LICENSE.txt
|
143
41
|
- README.md
|
144
|
-
- Rakefile
|
145
42
|
- app/controllers/inertia_rails/static_controller.rb
|
146
43
|
- app/views/inertia.html.erb
|
147
|
-
- bin/console
|
148
|
-
- bin/setup
|
149
|
-
- inertia_rails.gemspec
|
150
44
|
- lib/generators/inertia_rails/install/controller.rb
|
151
45
|
- lib/generators/inertia_rails/install/react/InertiaExample.jsx
|
152
46
|
- lib/generators/inertia_rails/install/react/inertia.jsx
|
@@ -156,8 +50,11 @@ files:
|
|
156
50
|
- lib/generators/inertia_rails/install/vue/inertia.js
|
157
51
|
- lib/generators/inertia_rails/install_generator.rb
|
158
52
|
- lib/inertia_rails.rb
|
53
|
+
- lib/inertia_rails/action_filter.rb
|
54
|
+
- lib/inertia_rails/configuration.rb
|
159
55
|
- lib/inertia_rails/controller.rb
|
160
56
|
- lib/inertia_rails/engine.rb
|
57
|
+
- lib/inertia_rails/helper.rb
|
161
58
|
- lib/inertia_rails/inertia_rails.rb
|
162
59
|
- lib/inertia_rails/lazy.rb
|
163
60
|
- lib/inertia_rails/middleware.rb
|
@@ -175,9 +72,12 @@ homepage: https://github.com/inertiajs/inertia-rails
|
|
175
72
|
licenses:
|
176
73
|
- MIT
|
177
74
|
metadata:
|
75
|
+
bug_tracker_uri: https://github.com/inertiajs/inertia-rails/issues
|
76
|
+
changelog_uri: https://github.com/inertiajs/inertia-rails/blob/master/CHANGELOG.md
|
77
|
+
documentation_uri: https://github.com/inertiajs/inertia-rails/blob/master/README.md
|
178
78
|
homepage_uri: https://github.com/inertiajs/inertia-rails
|
179
79
|
source_code_uri: https://github.com/inertiajs/inertia-rails
|
180
|
-
|
80
|
+
rubygems_mfa_required: 'true'
|
181
81
|
post_install_message:
|
182
82
|
rdoc_options: []
|
183
83
|
require_paths:
|
@@ -193,8 +93,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
193
93
|
- !ruby/object:Gem::Version
|
194
94
|
version: '0'
|
195
95
|
requirements: []
|
196
|
-
rubygems_version: 3.5.
|
96
|
+
rubygems_version: 3.5.11
|
197
97
|
signing_key:
|
198
98
|
specification_version: 4
|
199
|
-
summary: Inertia adapter for Rails
|
99
|
+
summary: Inertia.js adapter for Rails
|
200
100
|
test_files: []
|
data/.github/workflows/push.yml
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
name: Testing
|
2
|
-
|
3
|
-
on: [push, pull_request]
|
4
|
-
|
5
|
-
jobs:
|
6
|
-
test:
|
7
|
-
strategy:
|
8
|
-
fail-fast: false
|
9
|
-
matrix:
|
10
|
-
ruby: ['3.1', '3.2', '3.3']
|
11
|
-
rails: ['6.1', '7.0', '7.1']
|
12
|
-
|
13
|
-
runs-on: ubuntu-latest
|
14
|
-
name: Test against Ruby ${{ matrix.ruby }} / Rails ${{ matrix.rails }}
|
15
|
-
|
16
|
-
steps:
|
17
|
-
- uses: actions/checkout@v4
|
18
|
-
|
19
|
-
- name: Setup System
|
20
|
-
run: sudo apt-get install libsqlite3-dev
|
21
|
-
|
22
|
-
- name: Set up Ruby
|
23
|
-
uses: ruby/setup-ruby@v1
|
24
|
-
with:
|
25
|
-
ruby-version: ${{ matrix.ruby }}
|
26
|
-
bundler-cache: true
|
27
|
-
env:
|
28
|
-
RAILS_VERSION: ${{ matrix.rails }}
|
29
|
-
|
30
|
-
- name: Run tests
|
31
|
-
run: bundle exec rake
|
32
|
-
env:
|
33
|
-
RAILS_VERSION: ${{ matrix.rails }}
|
data/.gitignore
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
/.bundle/
|
2
|
-
/.yardoc
|
3
|
-
/_yardoc/
|
4
|
-
/coverage/
|
5
|
-
/doc/
|
6
|
-
/pkg/
|
7
|
-
/spec/reports/
|
8
|
-
/tmp/
|
9
|
-
/Gemfile.lock
|
10
|
-
|
11
|
-
/spec/dummy/db/*.sqlite3
|
12
|
-
/spec/dummy/db/*.sqlite3-journal
|
13
|
-
/spec/dummy/db/log/*.log
|
14
|
-
/spec/dummy/tmp/
|
15
|
-
/spec/dummy/.sass-cache
|
16
|
-
/spec/dummy/log/
|
17
|
-
|
18
|
-
# rspec failure tracking
|
19
|
-
.rspec_status
|
20
|
-
|
21
|
-
# Appraisal
|
22
|
-
gemfiles/*.gemfile.lock
|
data/.rspec
DELETED
data/CODE_OF_CONDUCT.md
DELETED
@@ -1,74 +0,0 @@
|
|
1
|
-
# Contributor Covenant Code of Conduct
|
2
|
-
|
3
|
-
## Our Pledge
|
4
|
-
|
5
|
-
In the interest of fostering an open and welcoming environment, we as
|
6
|
-
contributors and maintainers pledge to making participation in our project and
|
7
|
-
our community a harassment-free experience for everyone, regardless of age, body
|
8
|
-
size, disability, ethnicity, gender identity and expression, level of experience,
|
9
|
-
nationality, personal appearance, race, religion, or sexual identity and
|
10
|
-
orientation.
|
11
|
-
|
12
|
-
## Our Standards
|
13
|
-
|
14
|
-
Examples of behavior that contributes to creating a positive environment
|
15
|
-
include:
|
16
|
-
|
17
|
-
* Using welcoming and inclusive language
|
18
|
-
* Being respectful of differing viewpoints and experiences
|
19
|
-
* Gracefully accepting constructive criticism
|
20
|
-
* Focusing on what is best for the community
|
21
|
-
* Showing empathy towards other community members
|
22
|
-
|
23
|
-
Examples of unacceptable behavior by participants include:
|
24
|
-
|
25
|
-
* The use of sexualized language or imagery and unwelcome sexual attention or
|
26
|
-
advances
|
27
|
-
* Trolling, insulting/derogatory comments, and personal or political attacks
|
28
|
-
* Public or private harassment
|
29
|
-
* Publishing others' private information, such as a physical or electronic
|
30
|
-
address, without explicit permission
|
31
|
-
* Other conduct which could reasonably be considered inappropriate in a
|
32
|
-
professional setting
|
33
|
-
|
34
|
-
## Our Responsibilities
|
35
|
-
|
36
|
-
Project maintainers are responsible for clarifying the standards of acceptable
|
37
|
-
behavior and are expected to take appropriate and fair corrective action in
|
38
|
-
response to any instances of unacceptable behavior.
|
39
|
-
|
40
|
-
Project maintainers have the right and responsibility to remove, edit, or
|
41
|
-
reject comments, commits, code, wiki edits, issues, and other contributions
|
42
|
-
that are not aligned to this Code of Conduct, or to ban temporarily or
|
43
|
-
permanently any contributor for other behaviors that they deem inappropriate,
|
44
|
-
threatening, offensive, or harmful.
|
45
|
-
|
46
|
-
## Scope
|
47
|
-
|
48
|
-
This Code of Conduct applies both within project spaces and in public spaces
|
49
|
-
when an individual is representing the project or its community. Examples of
|
50
|
-
representing a project or community include using an official project e-mail
|
51
|
-
address, posting via an official social media account, or acting as an appointed
|
52
|
-
representative at an online or offline event. Representation of a project may be
|
53
|
-
further defined and clarified by project maintainers.
|
54
|
-
|
55
|
-
## Enforcement
|
56
|
-
|
57
|
-
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
58
|
-
reported by contacting the project team at TODO: Write your email address. All
|
59
|
-
complaints will be reviewed and investigated and will result in a response that
|
60
|
-
is deemed necessary and appropriate to the circumstances. The project team is
|
61
|
-
obligated to maintain confidentiality with regard to the reporter of an incident.
|
62
|
-
Further details of specific enforcement policies may be posted separately.
|
63
|
-
|
64
|
-
Project maintainers who do not follow or enforce the Code of Conduct in good
|
65
|
-
faith may face temporary or permanent repercussions as determined by other
|
66
|
-
members of the project's leadership.
|
67
|
-
|
68
|
-
## Attribution
|
69
|
-
|
70
|
-
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
|
71
|
-
available at [http://contributor-covenant.org/version/1/4][version]
|
72
|
-
|
73
|
-
[homepage]: http://contributor-covenant.org
|
74
|
-
[version]: http://contributor-covenant.org/version/1/4/
|
data/Gemfile
DELETED
data/Rakefile
DELETED
data/bin/console
DELETED
@@ -1,14 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/setup"
|
4
|
-
require "inertia_rails/rails"
|
5
|
-
|
6
|
-
# You can add fixtures and/or initialization code here to make experimenting
|
7
|
-
# with your gem easier. You can also use a different console, if you like.
|
8
|
-
|
9
|
-
# (If you use this, don't forget to add pry to your Gemfile!)
|
10
|
-
# require "pry"
|
11
|
-
# Pry.start
|
12
|
-
|
13
|
-
require "irb"
|
14
|
-
IRB.start(__FILE__)
|
data/bin/setup
DELETED
data/inertia_rails.gemspec
DELETED
@@ -1,37 +0,0 @@
|
|
1
|
-
lib = File.expand_path("lib", __dir__)
|
2
|
-
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
3
|
-
require "inertia_rails/version"
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = "inertia_rails"
|
7
|
-
spec.version = InertiaRails::VERSION
|
8
|
-
spec.authors = ["Brian Knoles", "Brandon Shar", "Eugene Granovsky"]
|
9
|
-
spec.email = ["brain@bellawatt.com", "brandon@bellawatt.com", "eugene@bellawatt.com"]
|
10
|
-
|
11
|
-
spec.summary = %q{Inertia adapter for Rails}
|
12
|
-
spec.homepage = "https://github.com/inertiajs/inertia-rails"
|
13
|
-
spec.license = "MIT"
|
14
|
-
|
15
|
-
spec.metadata["homepage_uri"] = spec.homepage
|
16
|
-
spec.metadata["source_code_uri"] = spec.homepage
|
17
|
-
spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/master/CHANGELOG.md"
|
18
|
-
|
19
|
-
# Specify which files should be added to the gem when it is released.
|
20
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
21
|
-
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
22
|
-
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
23
|
-
end
|
24
|
-
spec.bindir = "exe"
|
25
|
-
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
26
|
-
spec.require_paths = ["lib"]
|
27
|
-
|
28
|
-
spec.add_runtime_dependency "railties", '>= 5'
|
29
|
-
|
30
|
-
spec.add_development_dependency "bundler", "~> 2.0"
|
31
|
-
spec.add_development_dependency "rake", "~> 13.0"
|
32
|
-
spec.add_development_dependency "rspec-rails", "~> 4.0"
|
33
|
-
spec.add_development_dependency "rails-controller-testing"
|
34
|
-
spec.add_development_dependency "sqlite3"
|
35
|
-
spec.add_development_dependency "responders"
|
36
|
-
spec.add_development_dependency "debug"
|
37
|
-
end
|