tombolo 0.9.1 → 0.10.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c83c9dbdab6b8ff99150d3fa57531514628e2c4c98ed68f655cd4cc557553429
4
- data.tar.gz: 18ce866491063647ae333e0f4cb6e768cef06c843139f97df077d4301aebd1d4
3
+ metadata.gz: 873413c284aae7d6d0c85db23c2003bbd30370ccd91b37f0b48c2b67da547799
4
+ data.tar.gz: 035a44bd53c27c2c2175a2502f13ad70968b7203a78beb7bd175f18162d42ec4
5
5
  SHA512:
6
- metadata.gz: aff5dfca04cf8bd500be3cc099b36a7a85f4d65a4b138e99f7a44ec9feb47c02ee7e65bcae57ae458ab31884d0e6ffe06eed1d6787522b54eac9a7fd248ab940
7
- data.tar.gz: 16d329db50843678dacc5d8b8d50a1c20d6c453b3dec5ca5a7b98cf1058c85d3a1c1f0987c179ed22edf3d85451d52f166c881e4116a886deab1dadfb89c570c
6
+ metadata.gz: 5d8acbf9ebf978d082922b21d6385742307329856846e30aa2835a0cb1a8d531b5eb5346398c9dba0eb144020d979032871e9b20b9850e1ee1efef58cd86c7b5
7
+ data.tar.gz: d91194cfd684ac5f781ff7b692380f6fc9a2d00054517816525d6fe6f0be91696f1a933185b884b8146566e1d9f73201422875e4ee4e7cdc33a0fa9925f64dad
data/README.md CHANGED
@@ -150,6 +150,28 @@ Tombolo.configure do |config|
150
150
  end
151
151
  ```
152
152
 
153
+ #### Named render scopes
154
+
155
+ If your app needs multiple SSR bundles with different sets of components, you
156
+ can register named render scopes. Each scope gets its own isolated ExecJS
157
+ runtime:
158
+
159
+ ```ruby
160
+ Tombolo.configuration.server_bundles[:admin] = "app/assets/builds/admin/prerender.js"
161
+ Tombolo.configuration.server_bundles[:storefront] = "app/assets/builds/storefront/prerender.js"
162
+ ```
163
+
164
+ Then reference the scope by name:
165
+
166
+ ```erb
167
+ <%= react_component("Dashboard", prerender: :admin, props: { ... }) %>
168
+ <%= react_component("ProductGrid", prerender: :storefront, props: { ... }) %>
169
+ <%= react_component("Greeting", prerender: true, props: { ... }) %> <%# uses :default %>
170
+ ```
171
+
172
+ `prerender: true` uses the `:default` bundle. `prerender: :name` uses a named
173
+ bundle.
174
+
153
175
  ## Configuration
154
176
 
155
177
  ```ruby
@@ -157,9 +179,12 @@ Tombolo.configure do |config|
157
179
  # Convert snake_case prop keys to camelCase (default: false)
158
180
  config.camelize_props = true
159
181
 
160
- # Path to the server-side JS bundle for SSR
182
+ # Path to the default server-side JS bundle for SSR
161
183
  # (default: "app/assets/builds/prerender.js")
162
184
  config.server_bundle = "app/assets/builds/prerender.js"
185
+
186
+ # Named server bundles for isolated SSR render scopes
187
+ # config.server_bundles[:admin] = "path/to/admin/prerender.js"
163
188
  end
164
189
  ```
165
190
 
@@ -203,9 +228,9 @@ making it callable from ExecJS. Used in server entry points for SSR.
203
228
 
204
229
  Renders a `<div>` with `data-react-component` and `data-react-props`
205
230
  attributes. When `prerender: true`, the component is rendered on the server
206
- via ExecJS and the HTML is placed inside the div. Pass `camelize_props: true`
207
- to convert snake_case prop keys to camelCase, or set it globally in the
208
- configuration.
231
+ via ExecJS using the `:default` bundle. Pass a Symbol (e.g. `prerender: :admin`)
232
+ to use a named render scope instead. Pass `camelize_props: true` to convert
233
+ snake_case prop keys to camelCase, or set it globally in the configuration.
209
234
 
210
235
  #### `Tombolo.configure { |config| ... }`
211
236
 
@@ -2,11 +2,16 @@
2
2
 
3
3
  module Tombolo
4
4
  class Configuration
5
- attr_accessor :camelize_props, :server_bundle
5
+ attr_accessor :camelize_props
6
+ attr_reader :server_bundles
6
7
 
7
8
  def initialize
8
9
  @camelize_props = false
9
- @server_bundle = "app/assets/builds/prerender.js"
10
+ @server_bundles = { default: "app/assets/builds/prerender.js" }
11
+ end
12
+
13
+ def server_bundle=(path)
14
+ @server_bundles[:default] = path
10
15
  end
11
16
  end
12
17
  end
@@ -10,7 +10,8 @@ end
10
10
 
11
11
  module Tombolo
12
12
  class Renderer
13
- def initialize
13
+ def initialize(server_bundle:)
14
+ @server_bundle = server_bundle
14
15
  @mutex = Mutex.new
15
16
  @context = nil
16
17
  end
@@ -28,10 +29,9 @@ module Tombolo
28
29
  end
29
30
 
30
31
  def bundle_source
31
- path = Tombolo.configuration.server_bundle
32
- raise "Tombolo server bundle not found: #{path}" unless File.exist?(path)
32
+ raise "Tombolo server bundle not found: #{@server_bundle}" unless File.exist?(@server_bundle)
33
33
 
34
- console_polyfill + File.read(path)
34
+ console_polyfill + File.read(@server_bundle)
35
35
  end
36
36
 
37
37
  def console_polyfill
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tombolo
4
- VERSION = "0.9.1"
4
+ VERSION = "0.10.0"
5
5
  end
@@ -11,14 +11,19 @@ module Tombolo
11
11
 
12
12
  props_json = props.to_json
13
13
  data = { react_component: name, react_props: props_json }
14
-
15
- content = ""
16
- if prerender
17
- data[:react_prerender] = ""
18
- content = Tombolo.renderer.render(name, props_json).html_safe # rubocop:disable Rails/OutputSafety
19
- end
14
+ content = prerender_content(name, props_json, prerender, data)
20
15
 
21
16
  content_tag(:div, content, data:)
22
17
  end
18
+
19
+ private
20
+
21
+ def prerender_content(name, props_json, prerender, data)
22
+ return "" unless prerender
23
+
24
+ data[:react_prerender] = ""
25
+ renderer = Tombolo.renderer(prerender == true ? :default : prerender)
26
+ renderer.render(name, props_json).html_safe # rubocop:disable Rails/OutputSafety
27
+ end
23
28
  end
24
29
  end
data/lib/tombolo.rb CHANGED
@@ -15,16 +15,20 @@ module Tombolo
15
15
  yield configuration
16
16
  end
17
17
 
18
- def renderer
19
- @renderer ||= begin
18
+ def renderer(name = :default)
19
+ @renderers ||= {}
20
+ @renderers[name] ||= begin
21
+ path = configuration.server_bundles[name]
22
+ raise ArgumentError, "No server bundle configured for #{name.inspect}" unless path
23
+
20
24
  require "tombolo/renderer"
21
- Renderer.new
25
+ Renderer.new(server_bundle: path)
22
26
  end
23
27
  end
24
28
 
25
29
  def reset!
26
30
  @configuration = nil
27
- @renderer = nil
31
+ @renderers = nil
28
32
  end
29
33
  end
30
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tombolo
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.10.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Inge Jørgensen