alba-inertia 0.1.2 → 0.1.4
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 +24 -2
- data/README.md +12 -2
- data/lib/alba/inertia/prop_builder.rb +42 -16
- data/lib/alba/inertia/resource.rb +2 -10
- data/lib/alba/inertia/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: cfe281c753944eadf0114123a314af226fb73fadeac1053a89c11c87577cdc6c
|
|
4
|
+
data.tar.gz: ad63713f57f9066ec4f0de804d51cd6ea856eec0d09e3e17a443f5327b0a128c
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 207186eb671f60205cd46f03862d84e6569473b18a7424f19c1eaae61435408fd5aeaf167e7642e9f0d46d3749af6f4ebef92e5d08ca394029e069f3de4f3e98
|
|
7
|
+
data.tar.gz: 6f6b0825a3bfbe83b1d4cd6c42ae2b2e2d9d789d5c84dfd79d36b480b1d9b9c879feed73b531a40789022f1439e163e6fc62ffdec34c1c1285a6675229b091fb
|
data/CHANGELOG.md
CHANGED
|
@@ -7,11 +7,29 @@ and this project adheres to [Semantic Versioning].
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [0.1.4] - 2026-04-21
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Support for `InertiaRails.cache` props. ([@skryukov])
|
|
15
|
+
- Support for deferred scroll props. ([@nickpellant])
|
|
16
|
+
- Respect configured `transform_keys` on top-level prop keys. ([@bknoles])
|
|
17
|
+
|
|
18
|
+
### Changed
|
|
19
|
+
|
|
20
|
+
- Compatibility with InertiaRails 3.19.0+ load path. ([@bknoles])
|
|
21
|
+
|
|
22
|
+
## [0.1.3] - 2025-12-08
|
|
23
|
+
|
|
24
|
+
### Added
|
|
25
|
+
|
|
26
|
+
- Support for `InertiaRails.once`. ([@skryukov])
|
|
27
|
+
|
|
10
28
|
## [0.1.2] - 2025-12-08
|
|
11
29
|
|
|
12
30
|
### Added
|
|
13
31
|
|
|
14
|
-
- Support for `InertiaRails.scroll
|
|
32
|
+
- Support for `InertiaRails.scroll`. ([@skryukov])
|
|
15
33
|
- Add `serializer_params` option to `render_inertia` and `inertia_serializer_params` controller method for passing params to serializers. ([@skryukov])
|
|
16
34
|
|
|
17
35
|
## [0.1.1] - 2025-11-05
|
|
@@ -31,9 +49,13 @@ and this project adheres to [Semantic Versioning].
|
|
|
31
49
|
|
|
32
50
|
- Initial release ([@skryukov])
|
|
33
51
|
|
|
52
|
+
[@bknoles]: https://github.com/bknoles
|
|
53
|
+
[@nickpellant]: https://github.com/nickpellant
|
|
34
54
|
[@skryukov]: https://github.com/skryukov
|
|
35
55
|
|
|
36
|
-
[Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.
|
|
56
|
+
[Unreleased]: https://github.com/skryukov/alba-inertia/compare/v0.1.4...HEAD
|
|
57
|
+
[0.1.4]: https://github.com/skryukov/alba-inertia/compare/v0.1.3...v0.1.4
|
|
58
|
+
[0.1.3]: https://github.com/skryukov/alba-inertia/compare/v0.1.2...v0.1.3
|
|
37
59
|
[0.1.2]: https://github.com/skryukov/alba-inertia/compare/v0.1.1...v0.1.2
|
|
38
60
|
[0.1.1]: https://github.com/skryukov/alba-inertia/compare/v0.1.0...v0.1.1
|
|
39
61
|
[0.1.0]: https://github.com/skryukov/alba-inertia/commits/v0.1.0
|
data/README.md
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
# Alba::Inertia
|
|
2
2
|
|
|
3
|
+
[](https://rubygems.org/gems/alba-inertia)
|
|
4
|
+
|
|
3
5
|
Seamless integration between [Alba](https://github.com/okuramasafumi/alba) serializers and [Inertia Rails](https://inertia-rails.dev/).
|
|
4
6
|
|
|
5
7
|
## Features
|
|
@@ -8,6 +10,10 @@ Seamless integration between [Alba](https://github.com/okuramasafumi/alba) seria
|
|
|
8
10
|
- Lazy evaluation for efficient data loading on partial reloads
|
|
9
11
|
- Auto-detection of resource classes based on controller/action naming
|
|
10
12
|
|
|
13
|
+
<a href="https://evilmartians.com/?utm_source=alba-inertia&utm_campaign=project_page">
|
|
14
|
+
<img src="https://evilmartians.com/badges/sponsored-by-evil-martians.svg" alt="Built by Evil Martians" width="236" height="54">
|
|
15
|
+
</a>
|
|
16
|
+
|
|
11
17
|
## Installation
|
|
12
18
|
|
|
13
19
|
Add to your Gemfile:
|
|
@@ -71,8 +77,12 @@ class CoursesIndexResource < ApplicationResource
|
|
|
71
77
|
|
|
72
78
|
# Scroll prop with explicit metadata
|
|
73
79
|
has_many :items, inertia: { scroll: :meta }
|
|
74
|
-
has_many :items, inertia: { scroll: -> {
|
|
75
|
-
has_many :items, inertia: { scroll: -> {
|
|
80
|
+
has_many :items, inertia: { scroll: ->(obj) { obj.meta } }
|
|
81
|
+
has_many :items, inertia: { scroll: ->(obj) { obj.meta }, wrapper: 'data' }
|
|
82
|
+
|
|
83
|
+
# Once prop
|
|
84
|
+
has_many :plans, inertia: :once
|
|
85
|
+
has_many :plans, inertia: { once: { key: 'active_plans', expires_in: 1.hour, fresh: ->(obj) { obj.fresh? } } }
|
|
76
86
|
end
|
|
77
87
|
```
|
|
78
88
|
|
|
@@ -3,18 +3,24 @@
|
|
|
3
3
|
module Alba
|
|
4
4
|
module Inertia
|
|
5
5
|
class PropBuilder
|
|
6
|
+
ONCE_KEYS = %i[once key expires_in fresh]
|
|
7
|
+
|
|
6
8
|
class << self
|
|
7
9
|
def build(evaluation_block, options, object = nil)
|
|
8
10
|
if options[:optional]
|
|
9
11
|
wrap_optional(evaluation_block, options[:optional], object)
|
|
12
|
+
elsif options[:once]
|
|
13
|
+
wrap_once(evaluation_block, options[:once], object)
|
|
14
|
+
elsif options[:scroll]
|
|
15
|
+
wrap_scroll(evaluation_block, options[:scroll], object, options)
|
|
10
16
|
elsif options[:defer]
|
|
11
17
|
wrap_defer(evaluation_block, options[:defer], object)
|
|
12
18
|
elsif options[:merge]
|
|
13
19
|
wrap_merge(evaluation_block, options[:merge], object)
|
|
14
|
-
elsif options[:scroll]
|
|
15
|
-
wrap_scroll(evaluation_block, options[:scroll], object)
|
|
16
20
|
elsif options[:always]
|
|
17
21
|
wrap_always(evaluation_block, options[:always], object)
|
|
22
|
+
elsif options[:cache]
|
|
23
|
+
wrap_cache(evaluation_block, options[:cache], object)
|
|
18
24
|
else
|
|
19
25
|
Alba::Inertia.config.lazy_by_default ? evaluation_block : evaluation_block.call
|
|
20
26
|
end
|
|
@@ -26,18 +32,36 @@ module Alba
|
|
|
26
32
|
::InertiaRails.always(&value_block)
|
|
27
33
|
end
|
|
28
34
|
|
|
29
|
-
def
|
|
30
|
-
|
|
35
|
+
def wrap_cache(value_block, opts, _object)
|
|
36
|
+
if opts.is_a?(Hash)
|
|
37
|
+
raise ArgumentError, "cache: hash requires a :key" unless opts.key?(:key)
|
|
38
|
+
::InertiaRails.cache(opts[:key], **opts.except(:key), &value_block)
|
|
39
|
+
else
|
|
40
|
+
::InertiaRails.cache(opts, &value_block)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def wrap_optional(value_block, opts, _object)
|
|
45
|
+
if opts.is_a?(Hash)
|
|
46
|
+
options = opts.slice(:cache, *ONCE_KEYS)
|
|
47
|
+
::InertiaRails.optional(**options, &value_block)
|
|
48
|
+
else
|
|
49
|
+
::InertiaRails.optional(&value_block)
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def wrap_once(value_block, opts, _object)
|
|
54
|
+
if opts.is_a?(Hash)
|
|
55
|
+
options = opts.slice(*ONCE_KEYS)
|
|
56
|
+
::InertiaRails.once(**options, &value_block)
|
|
57
|
+
else
|
|
58
|
+
::InertiaRails.once(&value_block)
|
|
59
|
+
end
|
|
31
60
|
end
|
|
32
61
|
|
|
33
62
|
def wrap_defer(value_block, opts, _object)
|
|
34
63
|
if opts.is_a?(Hash)
|
|
35
|
-
options =
|
|
36
|
-
group: opts[:group],
|
|
37
|
-
merge: opts[:merge],
|
|
38
|
-
deep_merge: opts[:deep_merge],
|
|
39
|
-
match_on: opts[:match_on]
|
|
40
|
-
}.compact
|
|
64
|
+
options = opts.slice(:group, :deep_merge, :merge, :match_on, :cache, *ONCE_KEYS)
|
|
41
65
|
|
|
42
66
|
::InertiaRails.defer(**options, &value_block)
|
|
43
67
|
else
|
|
@@ -47,30 +71,32 @@ module Alba
|
|
|
47
71
|
|
|
48
72
|
def wrap_merge(value_block, opts, _object)
|
|
49
73
|
if opts.is_a?(Hash)
|
|
50
|
-
options =
|
|
74
|
+
options = opts.slice(:match_on, *ONCE_KEYS)
|
|
51
75
|
::InertiaRails.merge(**options, &value_block)
|
|
52
76
|
else
|
|
53
77
|
::InertiaRails.merge(&value_block)
|
|
54
78
|
end
|
|
55
79
|
end
|
|
56
80
|
|
|
57
|
-
def wrap_scroll(value_block, opts, object)
|
|
81
|
+
def wrap_scroll(value_block, opts, object, all_options = {})
|
|
82
|
+
extra = all_options.slice(:defer, :group)
|
|
83
|
+
|
|
58
84
|
case opts
|
|
59
85
|
when Symbol
|
|
60
86
|
# scroll: :meta => extract metadata from object[:meta] or object.meta
|
|
61
87
|
metadata = extract_from_object(object, opts)
|
|
62
|
-
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
88
|
+
::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
|
|
63
89
|
when Proc
|
|
64
90
|
# scroll: -> { |obj| obj.meta } => call proc with object
|
|
65
91
|
metadata = opts.call(object)
|
|
66
|
-
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
92
|
+
::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
|
|
67
93
|
when Hash
|
|
68
94
|
options = build_scroll_options(opts, object)
|
|
69
95
|
::InertiaRails.scroll(**options, &value_block)
|
|
70
96
|
when TrueClass
|
|
71
97
|
# scroll: true => auto-detect metadata
|
|
72
98
|
metadata = auto_detect_pagination_metadata(object)
|
|
73
|
-
::InertiaRails.scroll(metadata: metadata, &value_block)
|
|
99
|
+
::InertiaRails.scroll(metadata: metadata, **extra, &value_block)
|
|
74
100
|
else
|
|
75
101
|
raise ArgumentError, "Invalid scroll option. Expected Symbol, Proc, Hash, or true."
|
|
76
102
|
end
|
|
@@ -86,7 +112,7 @@ module Alba
|
|
|
86
112
|
opts[:scroll]
|
|
87
113
|
end
|
|
88
114
|
|
|
89
|
-
{metadata: metadata}.merge(opts.slice(:wrapper, :page_name, :previous_page, :next_page, :current_page))
|
|
115
|
+
{metadata: metadata}.merge(opts.slice(:defer, :group, :wrapper, :page_name, :previous_page, :next_page, :current_page))
|
|
90
116
|
end
|
|
91
117
|
|
|
92
118
|
def extract_from_object(object, key)
|
|
@@ -56,15 +56,7 @@ module Alba
|
|
|
56
56
|
#
|
|
57
57
|
# @example Merge with custom options
|
|
58
58
|
# inertia_prop :metadata, merge: { match_on: :id, prepend: 'meta_' }
|
|
59
|
-
def inertia_prop(name, **
|
|
60
|
-
options = {
|
|
61
|
-
optional: kwargs.delete(:optional) || false,
|
|
62
|
-
defer: kwargs.delete(:defer) || false,
|
|
63
|
-
merge: kwargs.delete(:merge) || false,
|
|
64
|
-
scroll: kwargs.delete(:scroll) || false,
|
|
65
|
-
always: kwargs.delete(:always) || false
|
|
66
|
-
}.select { |_k, v| v.present? }
|
|
67
|
-
|
|
59
|
+
def inertia_prop(name, **options)
|
|
68
60
|
inertia_metadata[name] = options.freeze
|
|
69
61
|
auto_typelize_from_inertia(name, options)
|
|
70
62
|
end
|
|
@@ -121,7 +113,7 @@ module Alba
|
|
|
121
113
|
result = {}
|
|
122
114
|
|
|
123
115
|
self.class._attributes.each do |attr_name, attr_body|
|
|
124
|
-
attr_name_str = attr_name
|
|
116
|
+
attr_name_str = transform_key(attr_name)
|
|
125
117
|
|
|
126
118
|
evaluation_block = build_evaluation_block(attr_name, attr_body)
|
|
127
119
|
|
data/lib/alba/inertia/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: alba-inertia
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.1.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Svyatoslav Kryukov
|
|
@@ -91,7 +91,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
91
91
|
- !ruby/object:Gem::Version
|
|
92
92
|
version: '0'
|
|
93
93
|
requirements: []
|
|
94
|
-
rubygems_version: 4.0.
|
|
94
|
+
rubygems_version: 4.0.6
|
|
95
95
|
specification_version: 4
|
|
96
96
|
summary: Seamless integration between Alba and Inertia Rails.
|
|
97
97
|
test_files: []
|