universal_renderer 0.4.1 → 0.4.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5bc4a2c6514d4a6ae61956f9904ce2387303bbeef0f0f1476a92243405e1489e
4
- data.tar.gz: 91fa36be3e8258cf92486ea6631e368e968a8ec67fc7dc5c7732bb9018b92e61
3
+ metadata.gz: 551cd8e80275fa95b8c3f66672f4a4262a25f5f0038fe4c45375b9bc852fbabe
4
+ data.tar.gz: bad53819a7dfdbdb10fbe1d3317e3877fcb05dc4fc2663ed5954e4975d3bd5b3
5
5
  SHA512:
6
- metadata.gz: 84c1091722cad8ba00c15e6ac2254a2fde144db10c2cb2440a5fc5a388dc9d13d6b88af595bc4f53166bc76c413d8fec94508d17565072dbac959cd49142a7e0
7
- data.tar.gz: 8417a03a6ec8083a70a721f93e945121007721743d2bee8287899e4b76b52be163753ea945875b722930d96c9ccd3eef3b41b0a2e2de9bdcacf1330e644848a7
6
+ metadata.gz: 0eecc4335c6c69929077c77db58fd22e7dbc9db04eeb78efa16826e2b8a35425c270990c96141adf842db4a5d725eacda04f277edbab60f7df41b0580a9b1252
7
+ data.tar.gz: 4df736ee5b781353f2543f00badc3efbdecd1eebb66a2e6405ff8136599a0f1136ef2fc52dc2d27732cbf7c84bf15a3eb904d3303e7367e1b7c8923fdf0d176c
data/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # UniversalRenderer
2
2
 
3
+ [![CI](https://img.shields.io/github/actions/workflow/status/thaske/universal_renderer/ci.yml)](https://github.com/thaske/universal_renderer/actions/workflows/ci.yml)
4
+
3
5
  [![Gem Version](https://img.shields.io/gem/v/universal_renderer)](https://rubygems.org/gems/universal_renderer) [![NPM Version](https://img.shields.io/npm/v/universal-renderer)](https://www.npmjs.com/package/universal-renderer)
4
6
 
5
7
  A streamlined solution for integrating Server-Side Rendering (SSR) into Rails applications.
@@ -10,22 +12,12 @@ UniversalRenderer helps you forward rendering requests to external SSR services,
10
12
 
11
13
  ## Features
12
14
 
13
- - **Static and streaming SSR** support
15
+ - **Streaming SSR** support
14
16
  - **Configurable SSR server endpoint** and timeouts
15
17
  - **Simple API** for passing data between Rails and your SSR service
16
18
  - **Automatic fallback** to client-side rendering if SSR fails
17
19
  - **View helpers** for easy integration into your layouts
18
20
 
19
- ## Requirements
20
-
21
- > **Heads-up ⚠️**  The JavaScript side of UniversalRenderer is **Bun-native**.
22
- >
23
- > • You **must** run the SSR server with **Bun ≥ 1.2**.
24
- >
25
- > • The exported helpers call Bun's built-in HTTP router and `Response` implementation; they **will not boot under Node, Deno, or Cloudflare Workers**.
26
- >
27
- > • The Ruby gem is runtime-agnostic and continues to work on every platform – only the SSR service requires Bun.
28
-
29
21
  ## Installation
30
22
 
31
23
  1. Add to your Gemfile:
@@ -91,13 +83,13 @@ end
91
83
  ```erb
92
84
  <%# "ssr/index" %>
93
85
 
94
- <%# Inject SSR snippets using the provided helpers. When streaming is enabled
95
- these render HTML placeholders (<!-- SSR_HEAD --> / <!-- SSR_BODY -->);
96
- otherwise they output the sanitised HTML returned by the SSR service. %>
86
+ <%# Inject SSR snippets using the provided helpers %>
87
+ <%# When streaming is enabled these render HTML placeholders %>
88
+ <%# Otherwise they output the sanitised HTML returned by the SSR service %>
97
89
 
98
- <head>
90
+ <%= content_for :head do %>
99
91
  <%= ssr_head %>
100
- </head>
92
+ <% end %>
101
93
 
102
94
  <div id="root">
103
95
  <%= ssr_body %>
@@ -143,7 +135,7 @@ To set up the SSR server for your Rails application:
143
135
  query_data.forEach(({ key, data }) => queryClient.setQueryData(key, data));
144
136
  const state = dehydrate(queryClient);
145
137
 
146
- const jsx = sheet.collectStyles(
138
+ const app = sheet.collectStyles(
147
139
  <HelmetProvider context={helmetContext}>
148
140
  <Metadata url={url} />
149
141
  <QueryClientProvider client={queryClient}>
@@ -155,7 +147,7 @@ To set up the SSR server for your Rails application:
155
147
  </HelmetProvider>,
156
148
  );
157
149
 
158
- return { jsx, helmetContext, sheet, queryClient };
150
+ return { app, helmetContext, sheet, queryClient };
159
151
  }
160
152
  ```
161
153
 
@@ -196,18 +188,10 @@ To set up the SSR server for your Rails application:
196
188
  import { head, transform } from "@/ssr/utils";
197
189
  import { renderToString } from "react-dom/server.node";
198
190
  import { createServer } from "universal-renderer";
199
- import { createServer as createViteServer } from "vite";
200
-
201
- const vite = await createViteServer({
202
- server: { middlewareMode: true },
203
- appType: "custom",
204
- });
205
-
206
- await createServer({
207
- port: 3001,
208
- middleware: vite.middlewares,
209
191
 
192
+ const app = await createServer({
210
193
  setup: (await import("@/ssr/setup")).default,
194
+
211
195
  render: ({ app, helmet, sheet }) => {
212
196
  const root = renderToString(app);
213
197
  const styles = sheet.getStyleTags();
@@ -216,11 +200,14 @@ To set up the SSR server for your Rails application:
216
200
  body: `${root}\n${styles}`,
217
201
  };
218
202
  },
203
+
219
204
  cleanup: ({ sheet, queryClient }) => {
220
205
  sheet?.seal();
221
206
  queryClient?.clear();
222
207
  },
223
208
  });
209
+
210
+ app.listen(3001);
224
211
  ```
225
212
 
226
213
  5. Build the SSR bundle:
@@ -39,12 +39,12 @@ module UniversalRenderer
39
39
  self.class.try(:ssr_streaming_preference)
40
40
  end
41
41
 
42
- def render(*args, **kwargs)
42
+ def render(*, **)
43
43
  return super unless self.class.enable_ssr
44
44
  return super unless request.format.html?
45
45
 
46
46
  if ssr_streaming?
47
- success = render_ssr_stream(*args, **kwargs)
47
+ success = render_ssr_stream(*, **)
48
48
  super unless success
49
49
  else
50
50
  fetch_ssr
@@ -54,8 +54,8 @@ module UniversalRenderer
54
54
 
55
55
  private
56
56
 
57
- def render_ssr_stream(*args, **kwargs)
58
- full_layout = render_to_string(*args, **kwargs)
57
+ def render_ssr_stream(*, **)
58
+ full_layout = render_to_string(*, **)
59
59
  current_props = @universal_renderer_props.dup
60
60
 
61
61
  streaming_succeeded =
@@ -7,7 +7,7 @@ module UniversalRenderer
7
7
  # @return [String] The HTML-safe string "<!-- SSR_HEAD -->".
8
8
  def ssr_head
9
9
  if ssr_streaming?
10
- Placeholders::HEAD.html_safe
10
+ Placeholders::HEAD
11
11
  elsif @ssr && @ssr.head.present?
12
12
  sanitize_ssr(@ssr.head)
13
13
  else
@@ -21,7 +21,7 @@ module UniversalRenderer
21
21
  # @return [String] The HTML-safe string "<!-- SSR_BODY -->".
22
22
  def ssr_body
23
23
  if ssr_streaming?
24
- Placeholders::BODY.html_safe
24
+ Placeholders::BODY
25
25
  elsif @ssr && @ssr.body.present?
26
26
  sanitize_ssr(@ssr.body)
27
27
  else
@@ -49,9 +49,7 @@ module UniversalRenderer
49
49
  # - If `ssr_streaming_preference` is `nil` (not set), streaming is disabled.
50
50
  # @return [Boolean, nil] The value of `ssr_streaming_preference` (true, false, or nil).
51
51
  # In conditional contexts, `nil` will behave as `false`.
52
- def ssr_streaming?
53
- controller.ssr_streaming?
54
- end
52
+ delegate :ssr_streaming?, to: :controller
55
53
  end
56
54
  end
57
55
  end
@@ -1,8 +1,8 @@
1
1
  module UniversalRenderer
2
2
  module SSR
3
3
  module Placeholders
4
- HEAD = "<!-- SSR_HEAD -->".freeze
5
- BODY = "<!-- SSR_BODY -->".freeze
4
+ HEAD = "<!-- SSR_HEAD -->".html_safe.freeze
5
+ BODY = "<!-- SSR_BODY -->".html_safe.freeze
6
6
  end
7
7
  end
8
8
  end
@@ -1,3 +1,3 @@
1
1
  module UniversalRenderer
2
- VERSION = "0.4.1".freeze
2
+ VERSION = "0.4.3".freeze
3
3
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: universal_renderer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - thaske
8
8
  bindir: bin
9
9
  cert_chain: []
10
- date: 2025-05-22 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: loofah
@@ -27,16 +27,22 @@ dependencies:
27
27
  name: rails
28
28
  requirement: !ruby/object:Gem::Requirement
29
29
  requirements:
30
- - - "~>"
30
+ - - ">="
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7.1'
33
+ - - "<"
34
+ - !ruby/object:Gem::Version
35
+ version: '9.0'
33
36
  type: :runtime
34
37
  prerelease: false
35
38
  version_requirements: !ruby/object:Gem::Requirement
36
39
  requirements:
37
- - - "~>"
40
+ - - ">="
38
41
  - !ruby/object:Gem::Version
39
42
  version: '7.1'
43
+ - - "<"
44
+ - !ruby/object:Gem::Version
45
+ version: '9.0'
40
46
  description: Provides helper methods and configuration to forward rendering requests
41
47
  from a Rails app to an external SSR server and return the response.
42
48
  email:
@@ -48,7 +54,6 @@ files:
48
54
  - MIT-LICENSE
49
55
  - README.md
50
56
  - Rakefile
51
- - config/routes.rb
52
57
  - lib/generators/universal_renderer/install_generator.rb
53
58
  - lib/generators/universal_renderer/templates/initializer.rb
54
59
  - lib/tasks/universal_renderer_tasks.rake
@@ -73,6 +78,7 @@ metadata:
73
78
  allowed_push_host: https://rubygems.org
74
79
  homepage_uri: https://github.com/thaske/universal_renderer
75
80
  changelog_uri: https://github.com/thaske/universal_renderer/blob/main/CHANGELOG.md
81
+ rubygems_mfa_required: 'true'
76
82
  rdoc_options: []
77
83
  require_paths:
78
84
  - lib
@@ -80,14 +86,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
80
86
  requirements:
81
87
  - - ">="
82
88
  - !ruby/object:Gem::Version
83
- version: 3.0.0
89
+ version: 3.2.0
84
90
  required_rubygems_version: !ruby/object:Gem::Requirement
85
91
  requirements:
86
92
  - - ">="
87
93
  - !ruby/object:Gem::Version
88
94
  version: '0'
89
95
  requirements: []
90
- rubygems_version: 3.6.2
96
+ rubygems_version: 3.6.9
91
97
  specification_version: 4
92
98
  summary: Facilitates Server-Side Rendering (SSR) in Rails applications.
93
99
  test_files: []
data/config/routes.rb DELETED
@@ -1 +0,0 @@
1
- Rails.application.routes.draw {}