inertia-roda 0.1.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 34cec6b2b72be515b86d1f644b6f099e137fd3918c77d82e074b7c4dcf8adaad
4
+ data.tar.gz: 9e8e8fc13720148a63a313e7920497600ecb6760be7479015eed62e4801d0cb2
5
+ SHA512:
6
+ metadata.gz: b1b4d63f377d34806cfb98c42d1352f6b58fded0cb2bcde5777e8551dcbc9f11a01affca015d1d5de3abf3038de61f1edcdb270392aeeb8829ce755c8db664ec
7
+ data.tar.gz: da033199d85c5bdef73eb845c646dc0481ae34750c381f0835e72a9986e8277d489eeece88c22f5963a1c4a600550ff878395b26b6f91ec350829d058f13f251
@@ -0,0 +1 @@
1
+ require_relative "roda/plugins/inertia"
@@ -0,0 +1,102 @@
1
+ # lib/roda/plugins/inertia.rb
2
+ require "json"
3
+ require "uri"
4
+
5
+ class Roda
6
+ module RodaPlugins
7
+ module Inertia
8
+ def self.load_dependencies(app, opts = {})
9
+ app.plugin :h
10
+ end
11
+
12
+ def self.configure(app, opts = {})
13
+ app.opts[:inertia_version] = opts[:version]
14
+ end
15
+
16
+ module InstanceMethods
17
+ def inertia_request?
18
+ request.get_header("HTTP_X_INERTIA") == "true"
19
+ end
20
+
21
+ def inertia(component, props: {})
22
+ if request.get? && inertia_request? && version_stale?
23
+ response.status = 409
24
+ response["X-Inertia-Location"] = request.url
25
+ return ""
26
+ end
27
+
28
+ page_data = {
29
+ component: component,
30
+ props: inertia_share.merge(props),
31
+ url: request.url,
32
+ version: inertia_version
33
+ }
34
+
35
+ if inertia_request?
36
+ response["Content-Type"] = "application/json"
37
+ response["X-Inertia"] = "true"
38
+ page_data.to_json
39
+ else
40
+ response["Content-Type"] = "text/html"
41
+ @inertia_page_data = page_data.to_json
42
+ inertia_root
43
+ end
44
+ end
45
+
46
+ def inertia_share
47
+ {}
48
+ end
49
+
50
+ def inertia_root(id: "app")
51
+ %(<div id="#{h(id)}" data-page="#{h(@inertia_page_data)}"></div>)
52
+ end
53
+
54
+ def inertia_redirect(path, status: nil)
55
+ if inertia_request?
56
+ status ||= request.get? ? 302 : 303
57
+
58
+ if external_url?(path)
59
+ response.status = 409
60
+ response["X-Inertia-Location"] = path
61
+ ""
62
+ else
63
+ request.redirect(path, status)
64
+ end
65
+ else
66
+ request.redirect(path, status || 302)
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def version_stale?
73
+ client_version = request.get_header("HTTP_X_INERTIA_VERSION")
74
+ server_version = inertia_version
75
+
76
+ server_version && client_version && client_version != server_version.to_s
77
+ end
78
+
79
+ def external_url?(path)
80
+ return false unless path.start_with?("http://", "https://")
81
+
82
+ uri = URI.parse(path)
83
+ uri.host != request.host
84
+ rescue URI::InvalidURIError
85
+ false
86
+ end
87
+
88
+ def inertia_version
89
+ version = opts[:inertia_version]
90
+
91
+ if version.respond_to?(:call)
92
+ version.call
93
+ else
94
+ version
95
+ end
96
+ end
97
+ end
98
+ end
99
+
100
+ register_plugin(:inertia, Inertia)
101
+ end
102
+ end
metadata ADDED
@@ -0,0 +1,124 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: inertia-roda
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pablo
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: roda
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '3.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '3.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: minitest
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '5.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '5.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: rack-test
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '2.0'
47
+ type: :development
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '2.0'
54
+ - !ruby/object:Gem::Dependency
55
+ name: rake
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '13.0'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '13.0'
68
+ - !ruby/object:Gem::Dependency
69
+ name: tilt
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '2.0'
75
+ type: :development
76
+ prerelease: false
77
+ version_requirements: !ruby/object:Gem::Requirement
78
+ requirements:
79
+ - - "~>"
80
+ - !ruby/object:Gem::Version
81
+ version: '2.0'
82
+ - !ruby/object:Gem::Dependency
83
+ name: standard
84
+ requirement: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - "~>"
87
+ - !ruby/object:Gem::Version
88
+ version: '1.0'
89
+ type: :development
90
+ prerelease: false
91
+ version_requirements: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - "~>"
94
+ - !ruby/object:Gem::Version
95
+ version: '1.0'
96
+ description: A Roda plugin providing server-side Inertia.js adapter
97
+ executables: []
98
+ extensions: []
99
+ extra_rdoc_files: []
100
+ files:
101
+ - lib/inertia_roda.rb
102
+ - lib/roda/plugins/inertia.rb
103
+ homepage: https://github.com/pablo/inertia-roda
104
+ licenses:
105
+ - MIT
106
+ metadata: {}
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - ">="
113
+ - !ruby/object:Gem::Version
114
+ version: 2.7.0
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubygems_version: 3.6.7
122
+ specification_version: 4
123
+ summary: Inertia.js adapter for Roda
124
+ test_files: []