isomorfeus-preact 10.6.36 → 10.6.37

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: 8b8caa31aa809b6b2d5a661043f1d63c601b68435abb00e82b427875b40e8843
4
- data.tar.gz: 2e6e86666baaf1afed35e623d498190a8dd3c81ba1a2778efef3e9fd47a0ac20
3
+ metadata.gz: f82bf99a53bc67d3fd34a366579d35c1e560c6dd860e9981dca3c24e58a4bed6
4
+ data.tar.gz: c031adbcb8102d1225012d1526e602b70275b872be1b74c96828c1e53c20c78d
5
5
  SHA512:
6
- metadata.gz: 37963c919f5580f5efff03dec74ae6a34cee64f7789cb5db65b9d1944af95b12076e098da6feaf5198e86d992761673f27f528c80e859f17fa70b3a85a44c70c
7
- data.tar.gz: 407af4aa4f09bed6ffc05c94a1670534cea93fbb3c6cd664e9dd49fdaa05a7f78e990c542f165758b8a2247c72f15d87c1c62dcf8ff82999499a3804075288ac
6
+ metadata.gz: c238454b703626f7db793109fe26c81443e55ffe6bae3e0a717132369bcdb8854c5319bc56db2780f976b4721e1e0f26bd07ddb21cddcb04fe0d8a15bc63e4cf
7
+ data.tar.gz: 28b3a937f2e305534e7cfc038de0f76445128b58c464d6596b5de36e79d3f25f709956d34969f8e681d3780c0d2fe9e4a07d672005aba5cc205c9ab477493e15
@@ -83,7 +83,7 @@ module Isomorfeus
83
83
 
84
84
  def start_app!
85
85
  Isomorfeus.zeitwerk.setup
86
- Isomorfeus::TopLevel.mount!
86
+ Isomorfeus::TopLevel.mount! unless on_ssr?
87
87
  end
88
88
 
89
89
  def force_render
@@ -17,19 +17,13 @@ module Isomorfeus
17
17
  end
18
18
 
19
19
  def mount_component(component_name, props = {}, asset_key = 'ssr.js', skip_ssr: false, use_ssr: false, max_passes: 4)
20
+ ssr_start_time = Time.now if Isomorfeus.development?
20
21
  @ssr_response_status = nil
21
22
  @ssr_styles = nil
22
- thread_id_asset = "#{Thread.current.object_id}#{asset_key}"
23
23
  render_result = "<div data-iso-env=\"#{Isomorfeus.env}\" data-iso-root=\"#{component_name}\" data-iso-props='#{Oj.dump(props, mode: :strict)}'"
24
24
  if !skip_ssr && (Isomorfeus.server_side_rendering || use_ssr)
25
+ thread_id_asset = "#{Thread.current.object_id}#{asset_key}"
25
26
  if Isomorfeus.development?
26
- # always create a new context, effectively reloading code
27
- # delete the existing context first, saves memory
28
- if Isomorfeus.ssr_contexts.key?(thread_id_asset)
29
- uuid = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@uuid)
30
- runtime = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@runtime)
31
- runtime.vm.delete_context(uuid)
32
- end
33
27
  begin
34
28
  init_speednode_context(asset_key, thread_id_asset)
35
29
  rescue Exception => e
@@ -41,7 +35,7 @@ module Isomorfeus
41
35
  end
42
36
  end
43
37
 
44
- start_time = Time.now if Isomorfeus.development?
38
+ ctx = Isomorfeus.ssr_contexts[thread_id_asset]
45
39
  pass = 0
46
40
  # if location_host and scheme are given and if Transport is loaded, connect and then render,
47
41
  # otherwise do not render because only one pass is required
@@ -53,110 +47,84 @@ module Isomorfeus
53
47
  # build javascript for rendering first pass
54
48
  # it will initialize buffers to guard against leaks, maybe caused by previous exceptions
55
49
  javascript = <<~JAVASCRIPT
56
- global.Opal.Preact.render_buffer = [];
57
- global.Opal.Preact.active_components = [];
58
- global.Opal.Preact.active_redux_components = [];
59
- global.FirstPassFinished = false;
60
- global.Exception = false;
61
- global.IsomorfeusSessionId = '#{Thread.current[:isomorfeus_session_id]}';
62
- global.Opal.Isomorfeus['$env=']('#{Isomorfeus.env}');
63
- if (typeof global.Opal.Isomorfeus["$current_locale="] === 'function') {
64
- global.Opal.Isomorfeus["$current_locale="]('#{props[:locale]}');
65
- } else if (typeof global.Opal.Isomorfeus["$negotiated_locale="] === 'function') { // remove later on
66
- global.Opal.Isomorfeus["$negotiated_locale="]('#{props[:locale]}');
67
- }
68
- global.Opal.Isomorfeus['$force_init!']();
69
- global.Opal.Isomorfeus['$ssr_response_status='](200);
70
- global.Opal.Isomorfeus.TopLevel['$ssr_route_path=']('#{props[:location]}');
71
- let api_ws_path = '#{api_ws_path}';
72
- let exception;
73
- if (typeof global.Opal.Isomorfeus.Transport !== 'undefined' && api_ws_path !== '') {
74
- global.Opal.Isomorfeus.TopLevel["$transport_ws_url="]("#{transport_ws_url}");
75
- global.Opal.send(global.Opal.Isomorfeus.Transport.$promise_connect(global.IsomorfeusSessionId), 'then', [], ($$1 = function(){
76
- try {
77
- global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)});
78
- global.FirstPassFinished = 'transport';
79
- } catch (e) {
80
- global.Exception = e;
81
- global.FirstPassFinished = 'transport';
82
- }
83
- }, $$1.$$s = this, $$1.$$arity = 0, $$1))
84
- return false;
85
- } else { global.FirstPassFinished = true; return true; };
50
+ return Opal.Isomorfeus.SSR.first_pass('#{Thread.current[:isomorfeus_session_id]}', '#{Isomorfeus.env}', '#{props[:locale]}', '#{props[:location]}', '#{api_ws_path}', '#{transport_ws_url}', '#{component_name}', #{Oj.dump(props, mode: :strict)})
86
51
  JAVASCRIPT
52
+
53
+ finished = false
87
54
  # execute first render pass
88
55
  begin
89
- first_pass_skipped = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
56
+ pass += 1
57
+ has_transport, has_store, need_further_pass, exception = ctx.exec(javascript)
58
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
90
59
  rescue Exception => e
91
60
  Isomorfeus.raise_error(error: e)
92
61
  end
93
- # wait for first pass to finish
94
- unless first_pass_skipped
95
- pass += 1
96
- first_pass_finished, exception = Isomorfeus.ssr_contexts[thread_id_asset].exec('return [global.FirstPassFinished, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false ]')
62
+
63
+ if has_transport
64
+ # wait for first pass to finish
65
+ first_pass_finished, need_further_pass, exception = ctx.eval_script(key: :first_pass_check)
97
66
  Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
98
67
  unless first_pass_finished
99
68
  start_time = Time.now
100
69
  while !first_pass_finished
101
70
  break if (Time.now - start_time) > 10
102
- sleep 0.01
103
- first_pass_finished = Isomorfeus.ssr_contexts[thread_id_asset].exec('return global.FirstPassFinished')
71
+ sleep 0.005
72
+ first_pass_finished, need_further_pass, exception = ctx.eval_script(key: :first_pass_check)
73
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
104
74
  end
105
75
  end
106
- # wait for transport requests to finish
107
- if first_pass_finished == 'transport'
108
- transport_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec('return global.Opal.Isomorfeus.Transport["$busy?"]()')
109
- if transport_busy
110
- start_time = Time.now
111
- while transport_busy
112
- break if (Time.now - start_time) > 5
113
- sleep 0.01
114
- transport_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec('return global.Opal.Isomorfeus.Transport["$busy?"]()')
115
- end
76
+
77
+ # wait for transport to settle
78
+ transport_busy = ctx.eval_script(key: :transport_busy)
79
+ if transport_busy
80
+ start_time = Time.now
81
+ while transport_busy
82
+ break if (Time.now - start_time) > 5
83
+ sleep 0.005
84
+ transport_busy = ctx.eval_script(key: :transport_busy)
116
85
  end
117
86
  end
118
87
  end
119
- # build javascript for additional render passes
120
- # guard against leaks from first pass, maybe because of a exception
121
- javascript = <<~JAVASCRIPT
122
- global.Opal.Preact.render_buffer = [];
123
- global.Opal.Preact.active_components = [];
124
- global.Opal.Preact.active_redux_components = [];
125
- global.Exception = false;
126
- let rendered_tree;
127
- let ssr_styles;
128
- let component;
129
- try {
130
- rendered_tree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string('#{component_name}', #{Oj.dump(props, mode: :strict)});
131
- } catch (e) {
132
- global.Exception = e;
133
- }
134
- let application_state = global.Opal.Isomorfeus.store.native.getState();
135
- let still_busy = (#{pass}<2) ? global.Opal.Isomorfeus.store['$recently_dispatched?']() : false;
136
- if (typeof global.Opal.Isomorfeus.Transport !== 'undefined' && global.Opal.Isomorfeus.Transport["$busy?"]()) { still_busy = true; }
137
- if (typeof global.NanoCSSInstance !== 'undefined') { ssr_styles = global.NanoCSSInstance.raw }
138
- return [rendered_tree, application_state, ssr_styles, global.Opal.Isomorfeus['$ssr_response_status'](), still_busy, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false];
139
- JAVASCRIPT
140
- # execute further render passes
141
- pass += 1
142
- rendered_tree, application_state, @ssr_styles, @ssr_response_status, still_busy, exception = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
143
- start_time = Time.now
144
- while still_busy
145
- break if (Time.now - start_time) > 5
146
- while still_busy
147
- break if (Time.now - start_time) > 4
148
- sleep 0.01
149
- still_busy = Isomorfeus.ssr_contexts[thread_id_asset].exec('return (typeof global.Opal.Isomorfeus.Transport !== "undefined") ? global.Opal.Isomorfeus.Transport["$busy?"]() : false')
88
+
89
+ if !need_further_pass
90
+ rendered_tree, application_state, @ssr_styles, @ssr_response_status, exception = ctx.eval_script(key: :first_pass_result)
91
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
92
+ else
93
+ start_time = Time.now
94
+ script_key = if has_transport && has_store
95
+ :sill_busy
96
+ elsif has_transport
97
+ :transport_busy
98
+ elsif has_store
99
+ :store_busy
100
+ else
101
+ nil
102
+ end
103
+ while need_further_pass
104
+ # execute further render passes
105
+ javascript = <<~JAVASCRIPT
106
+ return Opal.Isomorfeus.SSR.further_pass('#{component_name}', #{Oj.dump(props, mode: :strict)})
107
+ JAVASCRIPT
108
+ pass += 1
109
+ rendered_tree, application_state, @ssr_styles, @ssr_response_status, need_further_pass, exception = ctx.exec(javascript)
110
+ Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
111
+ if need_further_pass && script_key
112
+ break if (Time.now - start_time) > 5
113
+ need_further_pass = ctx.eval_script(key: script_key)
114
+ while need_further_pass
115
+ break if (Time.now - start_time) > 4
116
+ sleep 0.01
117
+ need_further_pass = ctx.eval_script(key: script_key)
118
+ end
119
+ break if pass >= max_passes
120
+ else
121
+ break
122
+ end
150
123
  end
151
- pass += 1
152
- rendered_tree, application_state, @ssr_styles, @ssr_response_status, still_busy, exception = Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
153
- break if pass >= max_passes
154
124
  end
155
- javascript = <<~JAVASCRIPT
156
- if (typeof global.Opal.Isomorfeus.Transport !== 'undefined') { global.Opal.Isomorfeus.Transport.$disconnect(); }
157
- JAVASCRIPT
158
- Isomorfeus.ssr_contexts[thread_id_asset].exec(javascript)
159
- Isomorfeus.raise_error(message: exception['message'], stack: exception['stack']) if exception
125
+
126
+ ctx.eval_script(key: :transport_disconnect) if has_transport
127
+
160
128
  render_result << " data-iso-hydrated='true'" if rendered_tree
161
129
  if Isomorfeus.respond_to?(:current_user) && Isomorfeus.current_user && !Isomorfeus.current_user.anonymous?
162
130
  render_result << " data-iso-usid=#{Oj.dump(Isomorfeus.current_user.sid, mode: :strict)}"
@@ -170,10 +138,10 @@ module Isomorfeus
170
138
  render_result << " data-iso-nloc='#{props[:locale]}'>"
171
139
  end
172
140
  render_result << '</div>'
173
- if Isomorfeus.server_side_rendering
141
+ if Isomorfeus.server_side_rendering && !skip_ssr
174
142
  render_result = "<script type='application/javascript'>\nServerSideRenderingStateJSON = #{Oj.dump(application_state, mode: :strict)}\n</script>\n" << render_result
143
+ puts "PreactViewHelper Server Side Rendering rendered #{pass} passes and took ~#{((Time.now - ssr_start_time)*1000).to_i}ms" if Isomorfeus.development?
175
144
  end
176
- STDERR.puts "PreactViewHelper Server Side Rendering rendered #{pass} passes and took ~#{((Time.now - start_time)*1000).to_i}ms" if Isomorfeus.development? && !skip_ssr
177
145
  render_result
178
146
  end
179
147
 
@@ -198,8 +166,32 @@ module Isomorfeus
198
166
  def init_speednode_context(asset_key, thread_id_asset)
199
167
  asset = Isomorfeus.assets[asset_key]
200
168
  raise "#{self.class.name}: Asset not found: #{asset_key}" unless asset
201
- asset_manager.transition(asset_key, asset)
202
- Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(asset.bundle)
169
+ if !Isomorfeus.ssr_contexts.key?(thread_id_asset) || !asset.bundled?
170
+ if Isomorfeus.ssr_contexts.key?(thread_id_asset)
171
+ uuid = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@uuid)
172
+ runtime = Isomorfeus.ssr_contexts[thread_id_asset].instance_variable_get(:@runtime)
173
+ runtime.vm.delete_context(uuid)
174
+ end
175
+ asset_manager.transition(asset_key, asset)
176
+ Isomorfeus.ssr_contexts[thread_id_asset] = ExecJS.permissive_compile(asset.bundle)
177
+ ctx = Isomorfeus.ssr_contexts[thread_id_asset]
178
+ ctx.exec(top_level_mod)
179
+ ctx.exec(ssr_mod)
180
+ ctx.add_script(key: :first_pass_check, source: '[global.FirstPassFinished, global.NeedFurtherPass, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false ]')
181
+ ctx.add_script(key: :first_pass_result, source: 'Opal.Isomorfeus.SSR.first_pass_result()')
182
+ ctx.add_script(key: :still_busy, source: 'let nfp = global.Opal.Isomorfeus.Transport["$busy?"]() || global.Opal.Isomorfeus.store["$recently_dispatched?"](); (nfp == nil) ? false : nfp;')
183
+ ctx.add_script(key: :store_busy, source: 'let nfp = global.Opal.Isomorfeus.store["$recently_dispatched?"](); (nfp == nil) ? false : nfp;')
184
+ ctx.add_script(key: :transport_busy, source: 'global.Opal.Isomorfeus.Transport["$busy?"]()')
185
+ ctx.add_script(key: :transport_disconnect, source: 'global.Opal.Isomorfeus.Transport.$disconnect()')
186
+ end
187
+ end
188
+
189
+ def ssr_mod
190
+ @_ssr_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'ssr.rb'))))
191
+ end
192
+
193
+ def top_level_mod
194
+ @_top_level_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'top_level_ssr.rb'))))
203
195
  end
204
196
  end
205
197
  end
@@ -0,0 +1,75 @@
1
+ module Isomorfeus
2
+ module SSR
3
+ %x{
4
+ self.first_pass = function(session_id, env, locale, location, api_ws_path, transport_ws_url, component_name, props) {
5
+ global.Opal.Preact.render_buffer = [];
6
+ global.Opal.Preact.active_components = [];
7
+ global.Opal.Preact.active_redux_components = [];
8
+ global.FirstPassFinished = false;
9
+ global.NeedFurtherPass = false;
10
+ global.RenderedTree = '';
11
+ global.Exception = false;
12
+ global.IsomorfeusSessionId = session_id;
13
+ global.HasTransport = (typeof global.Opal.Isomorfeus.Transport !== 'undefined') && (api_ws_path !== '');
14
+ global.HasStore = typeof global.Opal.Isomorfeus.store !== 'undefined';
15
+ global.Opal.Isomorfeus['$env='](env);
16
+ if (typeof global.Opal.Isomorfeus["$current_locale="] === 'function') { global.Opal.Isomorfeus["$current_locale="](''); }
17
+ global.Opal.Isomorfeus['$force_init!']();
18
+ global.Opal.Isomorfeus['$ssr_response_status='](200);
19
+ global.Opal.Isomorfeus.TopLevel['$ssr_route_path='](location);
20
+ if (global.HasTransport) {
21
+ global.Opal.Isomorfeus.TopLevel["$transport_ws_url="](transport_ws_url);
22
+ global.Opal.send(global.Opal.Isomorfeus.Transport.$promise_connect(global.IsomorfeusSessionId), 'then', [], ($$1 = function(){
23
+ try {
24
+ global.RenderedTree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string(component_name, props);
25
+ let nfp = global.Opal.Isomorfeus.Transport["$busy?"]() || global.Opal.Isomorfeus.store['$recently_dispatched?']();
26
+ global.NeedFurtherPass = (nfp == nil) ? false : nfp;
27
+ global.FirstPassFinished = false;
28
+ } catch (e) {
29
+ global.Exception = e;
30
+ global.NeedFurtherPass = false;
31
+ }
32
+ }, $$1.$$s = this, $$1.$$arity = 0, $$1))
33
+ } else {
34
+ try {
35
+ global.RenderedTree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string(component_name, props);
36
+ if (global.HasStore) {
37
+ let nfp = global.Opal.Isomorfeus.store['$recently_dispatched?']();
38
+ global.NeedFurtherPass = (nfp == nil) ? false : nfp;
39
+ }
40
+ } catch (e) {
41
+ global.Exception = e;
42
+ global.NeedFurtherPass = false;
43
+ }
44
+ };
45
+ return [global.HasTransport, global.HasStore, global.NeedFurtherPass, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false];
46
+ }
47
+
48
+ self.first_pass_result = function() {
49
+ let ssr_styles;
50
+ let application_state = global.Opal.Isomorfeus.store.native.getState();
51
+ if (typeof global.NanoCSSInstance !== 'undefined') { ssr_styles = global.NanoCSSInstance.raw }
52
+ return [global.RenderedTree, application_state, ssr_styles, global.Opal.Isomorfeus['$ssr_response_status'](), global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false];
53
+ }
54
+
55
+ self.further_pass = function(component_name, props) {
56
+ global.Opal.Preact.render_buffer = [];
57
+ global.Opal.Preact.active_components = [];
58
+ global.Opal.Preact.active_redux_components = [];
59
+ global.Exception = false;
60
+ let rendered_tree;
61
+ let ssr_styles;
62
+ try {
63
+ rendered_tree = global.Opal.Isomorfeus.TopLevel.$render_component_to_string(component_name, props);
64
+ } catch (e) {
65
+ global.Exception = e;
66
+ }
67
+ let application_state = global.Opal.Isomorfeus.store.native.getState();
68
+ if (typeof global.NanoCSSInstance !== 'undefined') { ssr_styles = global.NanoCSSInstance.raw }
69
+ let nfp = (global.HasTransport && global.Opal.Isomorfeus.Transport["$busy?"]()) || (global.HasStore && global.Opal.Isomorfeus.store["$recently_dispatched?"]());
70
+ global.NeedFurtherPass = (nfp == nil) ? false : nfp;
71
+ return [rendered_tree, application_state, ssr_styles, global.Opal.Isomorfeus['$ssr_response_status'](), global.NeedFurtherPass, global.Exception ? { message: global.Exception.message, stack: global.Exception.stack } : false];
72
+ }
73
+ }
74
+ end
75
+ end
@@ -1,7 +1,7 @@
1
1
  module Isomorfeus
2
2
  class TopLevel
3
3
  class << self
4
- if on_browser? # execution environment
4
+ if on_browser?
5
5
  def mount!
6
6
  Isomorfeus.init
7
7
  Isomorfeus::TopLevel.on_ready do
@@ -94,29 +94,7 @@ module Isomorfeus
94
94
  hydrated ? Preact.hydrate(top, element) : Preact.render(top, element)
95
95
  Isomorfeus.top_component = top
96
96
  end
97
- else # execution environment
98
- attr_accessor :ssr_route_path
99
- attr_accessor :transport_ws_url
100
-
101
- def mount!
102
- # nothing, but keep it for compatibility with browser
103
- end
104
-
105
- def render_component_to_string(component_name, props)
106
- component = nil
107
- %x{
108
- if (typeof component_name === 'string' || component_name instanceof String) {
109
- component = component_name.split(".").reduce(function(o, x) {
110
- return (o !== null && typeof o[x] !== "undefined" && o[x] !== null) ? o[x] : null;
111
- }, Opal.global)
112
- } else {
113
- component = component_name;
114
- }
115
- }
116
- component = Isomorfeus.cached_component_class(component_name) unless component
117
- Preact.render_to_string(Preact.create_element(component, `Opal.Hash.$new(props)`))
118
- end
119
- end # execution environment
97
+ end
120
98
  end
121
99
  end
122
100
  end
@@ -0,0 +1,23 @@
1
+ module Isomorfeus
2
+ class TopLevel
3
+ class << self
4
+ attr_accessor :ssr_route_path
5
+ attr_accessor :transport_ws_url
6
+
7
+ def render_component_to_string(component_name, props)
8
+ component = nil
9
+ %x{
10
+ if (typeof component_name === 'string' || component_name instanceof String) {
11
+ component = component_name.split(".").reduce(function(o, x) {
12
+ return (o !== null && typeof o[x] !== "undefined" && o[x] !== null) ? o[x] : null;
13
+ }, Opal.global)
14
+ } else {
15
+ component = component_name;
16
+ }
17
+ }
18
+ component = Isomorfeus.cached_component_class(component_name) unless component
19
+ Preact.render_to_string(Preact.create_element(component, `Opal.Hash.$new(props)`))
20
+ end
21
+ end
22
+ end
23
+ end
@@ -81,6 +81,7 @@ else
81
81
  require 'uri'
82
82
  require 'oj'
83
83
  require 'opal'
84
+ require 'opal/compiler'
84
85
  require 'opal-activesupport'
85
86
  require 'opal-zeitwerk'
86
87
  require 'isomorfeus-speednode'
@@ -1,3 +1,3 @@
1
1
  module Preact
2
- VERSION = '10.6.36'
2
+ VERSION = '10.6.37'
3
3
  end
data/lib/preact.rb CHANGED
@@ -196,11 +196,12 @@ module Preact
196
196
  };
197
197
 
198
198
  self.internal_render = function(component, props, string_child, block) {
199
+ const oper = Opal.global.Preact;
199
200
  const operabu = self.render_buffer;
200
201
  let native_props;
201
202
  if (props && props !== nil) { native_props = self.to_native_preact_props(props); }
202
203
  if (string_child) {
203
- operabu[operabu.length - 1].push(Opal.global.Preact.createElement(component, native_props, string_child));
204
+ operabu[operabu.length - 1].push(oper.createElement(component, native_props, string_child));
204
205
  } else if (block && block !== nil) {
205
206
  operabu.push([]);
206
207
  // console.log("internal_render pushed", Opal.Preact.render_buffer, Opal.Preact.render_buffer.toString());
@@ -208,9 +209,9 @@ module Preact
208
209
  if (block_result && block_result !== nil) { Opal.Preact.render_block_result(block_result); }
209
210
  // console.log("internal_render popping", Opal.Preact.render_buffer, Opal.Preact.render_buffer.toString());
210
211
  let children = operabu.pop();
211
- operabu[operabu.length - 1].push(Opal.global.Preact.createElement.apply(this, [component, native_props].concat(children)));
212
+ operabu[operabu.length - 1].push(oper.createElement.apply(this, [component, native_props].concat(children)));
212
213
  } else {
213
- operabu[operabu.length - 1].push(Opal.global.Preact.createElement(component, native_props));
214
+ operabu[operabu.length - 1].push(oper.createElement(component, native_props));
214
215
  }
215
216
  };
216
217
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: isomorfeus-preact
3
3
  version: !ruby/object:Gem::Version
4
- version: 10.6.36
4
+ version: 10.6.37
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-02-16 00:00:00.000000000 Z
11
+ date: 2022-02-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -86,42 +86,42 @@ dependencies:
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.14.12
89
+ version: 0.14.14
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
94
  - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: 0.14.12
96
+ version: 0.14.14
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: isomorfeus-redux
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - "~>"
102
102
  - !ruby/object:Gem::Version
103
- version: 4.1.17
103
+ version: 4.1.18
104
104
  type: :runtime
105
105
  prerelease: false
106
106
  version_requirements: !ruby/object:Gem::Requirement
107
107
  requirements:
108
108
  - - "~>"
109
109
  - !ruby/object:Gem::Version
110
- version: 4.1.17
110
+ version: 4.1.18
111
111
  - !ruby/object:Gem::Dependency
112
112
  name: isomorfeus-speednode
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
115
  - - "~>"
116
116
  - !ruby/object:Gem::Version
117
- version: 0.4.9
117
+ version: 0.5.2
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
122
  - - "~>"
123
123
  - !ruby/object:Gem::Version
124
- version: 0.4.9
124
+ version: 0.5.2
125
125
  - !ruby/object:Gem::Dependency
126
126
  name: dalli
127
127
  requirement: !ruby/object:Gem::Requirement
@@ -232,7 +232,9 @@ files:
232
232
  - lib/isomorfeus/preact_view_helper.rb
233
233
  - lib/isomorfeus/props/validate_hash_proxy.rb
234
234
  - lib/isomorfeus/props/validator.rb
235
+ - lib/isomorfeus/ssr.rb
235
236
  - lib/isomorfeus/top_level.rb
237
+ - lib/isomorfeus/top_level_ssr.rb
236
238
  - lib/isomorfeus_preact/lucid_app/api.rb
237
239
  - lib/isomorfeus_preact/lucid_app/base.rb
238
240
  - lib/isomorfeus_preact/lucid_app/mixin.rb