isomorfeus-preact 10.6.48 → 10.6.49
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/browser/history.rb +31 -0
- data/lib/isomorfeus/preact/config.rb +1 -0
- data/lib/isomorfeus/preact_view_helper.rb +19 -24
- data/lib/isomorfeus/ssr.rb +49 -30
- data/lib/isomorfeus/top_level.rb +8 -2
- data/lib/isomorfeus-preact.rb +4 -1
- data/lib/isomorfeus_preact/preact/function_component/api.rb +12 -7
- data/lib/preact/component/api.rb +12 -7
- data/lib/preact/component/callbacks.rb +30 -23
- data/lib/preact/version.rb +1 -1
- data/lib/preact.rb +3 -3
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ac176b7d030eed4294beeb72b72652408b2270d22a0bb9a840b2e7e6e54a503e
|
4
|
+
data.tar.gz: 02d28d07b2ea5051493bd26a986299ddc26bce85dfbef06a2693a2b5680065e9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f88f2d320dd5e3cb866607e91de65ddeb565df8aab74162d72d0c8b239c95548db9612df2c62948011646677469707682ebdfa71fc7d9c53775d1cd0083f70f
|
7
|
+
data.tar.gz: 691d9f6cd7e681cdbc402bcb16448f77c742ae0021bbb6f409d896042df6e3e3563d8c772bcbb6cac3ba82aa4f2bea88d8d6f0358dc8bd4dad29b03554317d1d
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Browser
|
2
|
+
class History
|
3
|
+
include Native::Wrapper
|
4
|
+
|
5
|
+
alias_native :back
|
6
|
+
alias_native :forward
|
7
|
+
alias_native :go
|
8
|
+
|
9
|
+
native_reader :length
|
10
|
+
|
11
|
+
def push_state(state, title = '', url = `null`)
|
12
|
+
`#@native.pushState(#{state.to_n}, #{title}, #{url})`
|
13
|
+
end
|
14
|
+
|
15
|
+
def replace_state(state, title = '', url = `null`)
|
16
|
+
`#@native.replaceState(#{state.to_n}, #{title}, #{url})`
|
17
|
+
end
|
18
|
+
|
19
|
+
def scroll_restoration
|
20
|
+
`#@native.scrollRestoration`
|
21
|
+
end
|
22
|
+
|
23
|
+
def scroll_restoration=(s)
|
24
|
+
`#@native.scrollRestoration = #{s}`
|
25
|
+
end
|
26
|
+
|
27
|
+
def state
|
28
|
+
::Hash.new(`#@native.state`)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -51,7 +51,7 @@ module Isomorfeus
|
|
51
51
|
# build javascript for rendering first pass
|
52
52
|
# it will initialize buffers to guard against leaks, maybe caused by previous exceptions
|
53
53
|
javascript = <<~JAVASCRIPT
|
54
|
-
return Opal.Isomorfeus.SSR.first_pass('#{Thread.current[:isomorfeus_session_id]}', '#{Isomorfeus.env}', '#{props[:locale]}', '#{props[:location]}', '#{
|
54
|
+
return Opal.Isomorfeus.SSR.first_pass('#{Thread.current[:isomorfeus_session_id]}', '#{Isomorfeus.env}', '#{props[:locale]}', '#{props[:location]}', '#{transport_ws_url}', '#{component_name}', #{Oj.dump(props, mode: :strict)})
|
55
55
|
JAVASCRIPT
|
56
56
|
|
57
57
|
finished = false
|
@@ -65,13 +65,14 @@ module Isomorfeus
|
|
65
65
|
end
|
66
66
|
|
67
67
|
if has_transport
|
68
|
+
sleep 0.001 # give node a chance connecting to ruby by allowing other threads to run
|
68
69
|
# wait for first pass to finish
|
69
70
|
first_pass_finished, need_further_pass, exception = ctx.eval_script(key: :first_pass_check)
|
70
71
|
Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
|
71
72
|
unless first_pass_finished
|
72
73
|
start_time = Time.now
|
73
74
|
while !first_pass_finished
|
74
|
-
break if (Time.now - start_time) > 10
|
75
|
+
# break if (Time.now - start_time) > 10
|
75
76
|
sleep 0.005
|
76
77
|
first_pass_finished, need_further_pass, exception = ctx.eval_script(key: :first_pass_check)
|
77
78
|
Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
|
@@ -79,13 +80,13 @@ module Isomorfeus
|
|
79
80
|
end
|
80
81
|
|
81
82
|
# wait for transport to settle
|
82
|
-
|
83
|
-
if
|
83
|
+
still_busy = ctx.eval_script(key: :still_busy)
|
84
|
+
if still_busy
|
84
85
|
start_time = Time.now
|
85
|
-
while
|
86
|
+
while still_busy
|
86
87
|
break if (Time.now - start_time) > 5
|
87
88
|
sleep 0.005
|
88
|
-
|
89
|
+
still_busy = ctx.eval_script(key: :still_busy)
|
89
90
|
end
|
90
91
|
end
|
91
92
|
end
|
@@ -95,26 +96,22 @@ module Isomorfeus
|
|
95
96
|
Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
|
96
97
|
else
|
97
98
|
start_time = Time.now
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
:store_busy
|
102
|
-
end
|
99
|
+
javascript = <<~JAVASCRIPT
|
100
|
+
return Opal.Isomorfeus.SSR.further_pass('#{component_name}', #{Oj.dump(props, mode: :strict)})
|
101
|
+
JAVASCRIPT
|
103
102
|
while need_further_pass
|
104
103
|
# execute further render passes
|
105
|
-
javascript = <<~JAVASCRIPT
|
106
|
-
return Opal.Isomorfeus.SSR.further_pass('#{component_name}', #{Oj.dump(props, mode: :strict)})
|
107
|
-
JAVASCRIPT
|
108
104
|
pass += 1
|
109
105
|
rendered_tree, application_state, @ssr_styles, @ssr_response_status, need_further_pass, exception = ctx.exec(javascript)
|
110
106
|
Isomorfeus.raise_error(message: "Server Side Rendering: #{exception['message']}", stack: exception['stack']) if exception
|
111
|
-
if need_further_pass
|
112
|
-
|
113
|
-
|
107
|
+
if need_further_pass
|
108
|
+
sleep 0.001 # give other threads a chance
|
109
|
+
# break if (Time.now - start_time) > 5
|
110
|
+
still_busy = ctx.eval_script(key: :still_busy)
|
114
111
|
while still_busy
|
115
|
-
break if (Time.now - start_time) > 5
|
112
|
+
# break if (Time.now - start_time) > 5
|
116
113
|
sleep 0.005
|
117
|
-
still_busy = ctx.eval_script(key:
|
114
|
+
still_busy = ctx.eval_script(key: :still_busy)
|
118
115
|
end
|
119
116
|
break if pass >= max_passes
|
120
117
|
else
|
@@ -177,21 +174,19 @@ module Isomorfeus
|
|
177
174
|
ctx = Isomorfeus.ssr_contexts[thread_id_asset]
|
178
175
|
ctx.exec(top_level_mod)
|
179
176
|
ctx.exec(ssr_mod)
|
180
|
-
ctx.add_script(key: :first_pass_check, source: '
|
177
|
+
ctx.add_script(key: :first_pass_check, source: 'Opal.Isomorfeus.SSR.first_pass_check()')
|
181
178
|
ctx.add_script(key: :first_pass_result, source: 'Opal.Isomorfeus.SSR.first_pass_result()')
|
182
179
|
ctx.add_script(key: :still_busy, source: 'Opal.Isomorfeus.SSR.still_busy()')
|
183
|
-
ctx.add_script(key: :store_busy, source: 'Opal.Isomorfeus.SSR.store_busy()')
|
184
|
-
ctx.add_script(key: :transport_busy, source: 'global.Opal.Isomorfeus.Transport["$busy?"]()')
|
185
180
|
ctx.add_script(key: :transport_disconnect, source: 'global.Opal.Isomorfeus.SSR.$disconnect_transport()')
|
186
181
|
end
|
187
182
|
end
|
188
183
|
|
189
184
|
def ssr_mod
|
190
|
-
@_ssr_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'ssr.rb'))))
|
185
|
+
@_ssr_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'ssr.rb'))), { use_strict: true })
|
191
186
|
end
|
192
187
|
|
193
188
|
def top_level_mod
|
194
|
-
@_top_level_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'top_level_ssr.rb'))))
|
189
|
+
@_top_level_mod ||= Opal.compile(File.read(File.expand_path(File.join(File.dirname(__FILE__), 'top_level_ssr.rb'))), { use_strict: true })
|
195
190
|
end
|
196
191
|
end
|
197
192
|
end
|
data/lib/isomorfeus/ssr.rb
CHANGED
@@ -1,72 +1,91 @@
|
|
1
1
|
module Isomorfeus
|
2
2
|
module SSR
|
3
3
|
%x{
|
4
|
-
self.first_pass = function(session_id, env, locale, location,
|
5
|
-
global.Opal.Preact
|
6
|
-
global.Opal.
|
7
|
-
|
4
|
+
self.first_pass = function(session_id, env, locale, location, transport_ws_url, component_name, props) {
|
5
|
+
const oper = global.Opal.Preact;
|
6
|
+
const opi = global.Opal.Isomorfeus;
|
7
|
+
oper.render_buffer = [];
|
8
|
+
oper.active_components = [];
|
9
|
+
oper.active_redux_components = [];
|
8
10
|
global.FirstPassFinished = false;
|
9
11
|
global.NeedFurtherPass = false;
|
10
12
|
global.RenderedTree = '';
|
11
13
|
global.Exception = false;
|
12
14
|
global.IsomorfeusSessionId = session_id;
|
13
|
-
global.HasTransport = (typeof
|
14
|
-
|
15
|
-
if (typeof
|
16
|
-
|
17
|
-
|
18
|
-
|
15
|
+
global.HasTransport = (typeof opi.Transport !== 'undefined');
|
16
|
+
opi['$env='](env);
|
17
|
+
if (typeof opi["$current_locale="] === 'function') { opi["$current_locale="](locale); }
|
18
|
+
opi['$force_init!']();
|
19
|
+
opi['$ssr_response_status='](200);
|
20
|
+
opi.TopLevel['$ssr_route_path='](location);
|
19
21
|
if (global.HasTransport) {
|
20
|
-
|
21
|
-
|
22
|
+
opi.TopLevel["$transport_ws_url="](transport_ws_url);
|
23
|
+
let $$1;
|
24
|
+
global.Opal.send(opi.Transport.$promise_connect(global.IsomorfeusSessionId), 'then', [], ($$1 = function(){
|
22
25
|
try {
|
23
|
-
global.RenderedTree =
|
26
|
+
global.RenderedTree = opi.TopLevel.$render_component_to_string(component_name, props);
|
24
27
|
global.NeedFurtherPass = self.still_busy();
|
25
28
|
global.FirstPassFinished = true;
|
26
29
|
} catch (e) {
|
27
30
|
global.Exception = e;
|
31
|
+
global.FirstPassFinished = true;
|
28
32
|
global.NeedFurtherPass = false;
|
29
33
|
}
|
30
34
|
}, $$1.$$s = this, $$1.$$arity = 0, $$1))
|
35
|
+
global.NeedFurtherPass = true;
|
31
36
|
} else {
|
32
37
|
try {
|
33
|
-
global.RenderedTree =
|
38
|
+
global.RenderedTree = opi.TopLevel.$render_component_to_string(component_name, props);
|
34
39
|
global.NeedFurtherPass = self.store_busy();
|
35
40
|
} catch (e) {
|
36
41
|
global.Exception = e;
|
42
|
+
global.FirstPassFinished = true;
|
37
43
|
global.NeedFurtherPass = false;
|
38
44
|
}
|
39
45
|
};
|
40
|
-
return [global.HasTransport, global.NeedFurtherPass,
|
46
|
+
return [global.HasTransport, global.NeedFurtherPass, self.get_exception()];
|
47
|
+
}
|
48
|
+
|
49
|
+
self.first_pass_check = function() {
|
50
|
+
return [global.FirstPassFinished, global.NeedFurtherPass, self.get_exception()];
|
41
51
|
}
|
42
52
|
|
43
53
|
self.first_pass_result = function() {
|
44
|
-
|
45
|
-
let application_state =
|
46
|
-
|
47
|
-
return [global.RenderedTree, application_state, ssr_styles,
|
54
|
+
const opi = global.Opal.Isomorfeus;
|
55
|
+
let application_state = opi.store.native.getState();
|
56
|
+
let ssr_styles = global?.NanoCSSInstance?.raw;
|
57
|
+
return [global.RenderedTree, application_state, ssr_styles, opi['$ssr_response_status'](), self.get_exception()];
|
48
58
|
}
|
49
59
|
|
50
60
|
self.further_pass = function(component_name, props) {
|
51
|
-
global.Opal.Preact
|
52
|
-
global.Opal.
|
53
|
-
|
61
|
+
const oper = global.Opal.Preact;
|
62
|
+
const opi = global.Opal.Isomorfeus;
|
63
|
+
oper.render_buffer = [];
|
64
|
+
oper.active_components = [];
|
65
|
+
oper.active_redux_components = [];
|
66
|
+
global.NeedFurtherPass = false;
|
54
67
|
global.Exception = false;
|
55
|
-
let
|
56
|
-
let
|
68
|
+
let application_state = null;
|
69
|
+
let rendered_tree = null;
|
70
|
+
let ssr_styles = null;
|
57
71
|
try {
|
58
|
-
rendered_tree =
|
72
|
+
rendered_tree = opi.TopLevel.$render_component_to_string(component_name, props);
|
73
|
+
application_state = opi.store.native.getState();
|
74
|
+
ssr_styles = global?.NanoCSSInstance?.raw;
|
75
|
+
global.NeedFurtherPass = self.still_busy();
|
59
76
|
} catch (e) {
|
60
77
|
global.Exception = e;
|
61
78
|
}
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
79
|
+
return [rendered_tree, application_state, ssr_styles, opi['$ssr_response_status'](), global.NeedFurtherPass, self.get_exception()];
|
80
|
+
}
|
81
|
+
|
82
|
+
self.get_exception = function() {
|
83
|
+
if (global.Exception) { return { message: global.Exception.message, stack: global.Exception.stack }; }
|
84
|
+
return false;
|
66
85
|
}
|
67
86
|
|
68
87
|
self.still_busy = function(){
|
69
|
-
if (global.Opal.Isomorfeus
|
88
|
+
if (global.Opal.Isomorfeus?.Transport?.["$busy?"]?.()) { return true; }
|
70
89
|
return self.store_busy();
|
71
90
|
}
|
72
91
|
|
data/lib/isomorfeus/top_level.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
module Isomorfeus
|
2
2
|
class TopLevel
|
3
3
|
class << self
|
4
|
+
attr_accessor :hydrated
|
5
|
+
attr_accessor :first_pass
|
6
|
+
|
4
7
|
if on_browser?
|
5
8
|
def mount!
|
6
9
|
Isomorfeus.init
|
@@ -27,7 +30,7 @@ module Isomorfeus
|
|
27
30
|
props_json = root_element.JS.getAttribute('data-iso-props')
|
28
31
|
props = `Opal.Hash.$new(JSON.parse(props_json))`
|
29
32
|
raw_hydrated = root_element.JS.getAttribute('data-iso-hydrated')
|
30
|
-
hydrated = (raw_hydrated && raw_hydrated == "true")
|
33
|
+
self.hydrated = (raw_hydrated && raw_hydrated == "true")
|
31
34
|
%x{
|
32
35
|
if (global.ServerSideRenderingStateJSON) {
|
33
36
|
var state = global.ServerSideRenderingStateJSON;
|
@@ -41,10 +44,13 @@ module Isomorfeus
|
|
41
44
|
}
|
42
45
|
Isomorfeus.execute_init_after_store_classes
|
43
46
|
begin
|
44
|
-
|
47
|
+
self.first_pass = true
|
48
|
+
result = Isomorfeus::TopLevel.mount_component(component, props, root_element, self.hydrated)
|
49
|
+
self.first_pass = false
|
45
50
|
@tried_another_time = false
|
46
51
|
result
|
47
52
|
rescue Exception => e
|
53
|
+
self.first_pass = false
|
48
54
|
if !@tried_another_time
|
49
55
|
@tried_another_time = true
|
50
56
|
`console.warn("Deferring mount: " + #{e.message})`
|
data/lib/isomorfeus-preact.rb
CHANGED
@@ -8,10 +8,13 @@ if RUBY_ENGINE == 'opal'
|
|
8
8
|
require 'browser/event_target'
|
9
9
|
require 'browser/delegate_native'
|
10
10
|
require 'browser/element' # depends on 'preact'
|
11
|
+
require 'browser/history'
|
11
12
|
end
|
12
13
|
|
13
14
|
require 'isomorfeus/preact/config'
|
14
|
-
|
15
|
+
if on_browser? && `window?.history`
|
16
|
+
Isomorfeus.browser_history = Browser::History.new(`window.history`)
|
17
|
+
end
|
15
18
|
# allow mounting of components
|
16
19
|
require 'isomorfeus/top_level'
|
17
20
|
|
@@ -74,26 +74,31 @@ module Preact::FunctionComponent::Api
|
|
74
74
|
end
|
75
75
|
|
76
76
|
def get_preact_element(arg, &block)
|
77
|
+
`let operabu = Opal.Preact.render_buffer`
|
77
78
|
if block_given?
|
78
79
|
# execute block, fetch last element from buffer
|
79
80
|
%x{
|
80
|
-
let last_buffer_length =
|
81
|
-
let last_buffer_element =
|
81
|
+
let last_buffer_length = operabu[operabu.length - 1].length;
|
82
|
+
let last_buffer_element = operabu[operabu.length - 1][last_buffer_length - 1];
|
82
83
|
block.$call();
|
83
|
-
// console.log("get_preact_element popping",
|
84
|
-
let new_element =
|
84
|
+
// console.log("get_preact_element popping", operabu, operabu.toString())
|
85
|
+
let new_element = operabu[operabu.length - 1].pop();
|
85
86
|
if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any Preact element!")} }
|
86
87
|
return new_element;
|
87
88
|
}
|
88
89
|
else
|
89
90
|
# element was rendered before being passed as arg
|
90
91
|
# fetch last element from buffer
|
91
|
-
# `console.log("get_preact_element popping",
|
92
|
-
`
|
92
|
+
# `console.log("get_preact_element popping", operabu, operabu.toString())`
|
93
|
+
`operabu[operabu.length - 1].pop()`
|
93
94
|
end
|
94
95
|
end
|
95
96
|
alias gpe get_preact_element
|
96
97
|
|
98
|
+
def history
|
99
|
+
Isomorfeus.browser_history
|
100
|
+
end
|
101
|
+
|
97
102
|
def render_preact_element(el)
|
98
103
|
# push el to buffer
|
99
104
|
`Opal.Preact.render_buffer[Opal.Preact.render_buffer.length - 1].push(el)`
|
@@ -105,7 +110,7 @@ module Preact::FunctionComponent::Api
|
|
105
110
|
def method_ref(method_symbol, *args)
|
106
111
|
method_key = "#{method_symbol}#{args}"
|
107
112
|
%x{
|
108
|
-
if (#{self}.method_refs
|
113
|
+
if (#{self}.method_refs?.[#{method_key}]) { return #{self}.method_refs[#{method_key}]; }
|
109
114
|
if (!#{self}.method_refs) { #{self}.method_refs = {}; }
|
110
115
|
#{self}.method_refs[#{method_key}] = { m: #{method(method_symbol)}, a: args };
|
111
116
|
return #{self}.method_refs[#{method_key}];
|
data/lib/preact/component/api.rb
CHANGED
@@ -66,30 +66,35 @@ module Preact::Component::Api
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def get_preact_element(arg, &block)
|
69
|
+
`const operabu = Opal.Preact.render_buffer`
|
69
70
|
if block_given?
|
70
71
|
# execute block, fetch last element from buffer
|
71
72
|
%x{
|
72
|
-
let last_buffer_length =
|
73
|
-
let last_buffer_element =
|
73
|
+
let last_buffer_length = operabu[operabu.length - 1].length;
|
74
|
+
let last_buffer_element = operabu[operabu.length - 1][last_buffer_length - 1];
|
74
75
|
block.$call();
|
75
|
-
// console.log("get_preact_element popping",
|
76
|
-
let new_element =
|
76
|
+
// console.log("get_preact_element popping", operabu, operabu.toString())
|
77
|
+
let new_element = operabu[operabu.length - 1].pop();
|
77
78
|
if (last_buffer_element === new_element) { #{Isomorfeus.raise_error(message: "Block did not create any Preact element!")} }
|
78
79
|
return new_element;
|
79
80
|
}
|
80
81
|
else
|
81
82
|
# element was rendered before being passed as arg
|
82
83
|
# fetch last element from buffer
|
83
|
-
# `console.log("get_preact_element popping",
|
84
|
-
`
|
84
|
+
# `console.log("get_preact_element popping", operabu, operabu.toString())`
|
85
|
+
`operabu[operabu.length - 1].pop()`
|
85
86
|
end
|
86
87
|
end
|
87
88
|
alias gpe get_preact_element
|
88
89
|
|
90
|
+
def history
|
91
|
+
Isomorfeus.browser_history
|
92
|
+
end
|
93
|
+
|
89
94
|
def method_ref(method_symbol, *args)
|
90
95
|
method_key = "#{method_symbol}#{args}"
|
91
96
|
%x{
|
92
|
-
if (#@native.method_refs
|
97
|
+
if (#@native.method_refs?.[#{method_key}]) { return #@native.method_refs[#{method_key}]; }
|
93
98
|
if (!#@native.method_refs) { #@native.method_refs = {}; }
|
94
99
|
#@native.method_refs[#{method_key}] = { m: #{method(method_symbol)}, a: args };
|
95
100
|
return #@native.method_refs[#{method_key}];
|
@@ -5,11 +5,12 @@ module Preact::Component::Callbacks
|
|
5
5
|
# TODO convert error
|
6
6
|
%x{
|
7
7
|
var fun = function(error) {
|
8
|
-
Opal.Preact
|
8
|
+
const oper = Opal.Preact;
|
9
|
+
oper.register_active_component(this);
|
9
10
|
try {
|
10
11
|
#{`this.__ruby_instance`.instance_exec(`error`, &block)};
|
11
12
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
12
|
-
|
13
|
+
oper.unregister_active_component(this);
|
13
14
|
}
|
14
15
|
if (self.lucid_preact_component) { self.lucid_preact_component.prototype.componentDidCatch = fun; }
|
15
16
|
else { self.preact_component.prototype.componentDidCatch = fun; }
|
@@ -20,22 +21,24 @@ module Preact::Component::Callbacks
|
|
20
21
|
def component_did_mount(&block)
|
21
22
|
%x{
|
22
23
|
let fun = function() {
|
23
|
-
Opal.Preact
|
24
|
+
const oper = Opal.Preact;
|
25
|
+
oper.register_active_component(this);
|
24
26
|
try {
|
25
27
|
#{`this.__ruby_instance`.instance_exec(&block)};
|
26
28
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
27
|
-
|
29
|
+
oper.unregister_active_component(this);
|
28
30
|
}
|
29
31
|
if (self.lucid_preact_component) {
|
30
|
-
|
31
|
-
|
32
|
-
|
32
|
+
let proto = self.lucid_preact_component.prototype;
|
33
|
+
if (proto.componentDidMount) {
|
34
|
+
proto.componentDidMountTwo = proto.componentDidMount;
|
35
|
+
proto.componentDidMountOne = fun;
|
33
36
|
fun = function() {
|
34
37
|
this.componentDidMountOne();
|
35
38
|
this.componentDidMountTwo();
|
36
39
|
}
|
37
40
|
}
|
38
|
-
|
41
|
+
proto.componentDidMount = fun;
|
39
42
|
} else { self.preact_component.prototype.componentDidMount = fun; }
|
40
43
|
}
|
41
44
|
end
|
@@ -43,13 +46,14 @@ module Preact::Component::Callbacks
|
|
43
46
|
def component_did_update(&block)
|
44
47
|
%x{
|
45
48
|
var fun = function(prev_props, prev_state, snapshot) {
|
46
|
-
Opal.Preact
|
49
|
+
const oper = Opal.Preact;
|
50
|
+
oper.register_active_component(this);
|
47
51
|
try {
|
48
|
-
#{`this.__ruby_instance`.instance_exec(`
|
49
|
-
|
50
|
-
|
52
|
+
#{`this.__ruby_instance`.instance_exec(`oper.Props.$new({props: prev_props})`,
|
53
|
+
`oper.State.$new({state: prev_state})`,
|
54
|
+
`snapshot`, &block)};
|
51
55
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
52
|
-
|
56
|
+
oper.unregister_active_component(this);
|
53
57
|
}
|
54
58
|
if (self.lucid_preact_component) { self.lucid_preact_component.prototype.componentDidUpdate = fun; }
|
55
59
|
else { self.preact_component.prototype.componentDidUpdate = fun; }
|
@@ -59,12 +63,13 @@ module Preact::Component::Callbacks
|
|
59
63
|
def component_will_unmount(&block)
|
60
64
|
%x{
|
61
65
|
var fun = function() {
|
66
|
+
const oper = Opal.Preact;
|
62
67
|
if (typeof this.unsubscriber === "function") { this.unsubscriber(); };
|
63
|
-
|
68
|
+
oper.register_active_component(this);
|
64
69
|
try {
|
65
70
|
#{`this.__ruby_instance`.instance_exec(&block)};
|
66
71
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
67
|
-
|
72
|
+
oper.unregister_active_component(this);
|
68
73
|
}
|
69
74
|
if (self.lucid_preact_component) { self.lucid_preact_component.prototype.componentWillUnmount = fun; }
|
70
75
|
else { self.preact_component.prototype.componentWillUnmount = fun; }
|
@@ -75,12 +80,13 @@ module Preact::Component::Callbacks
|
|
75
80
|
def get_derived_state_from_props(&block)
|
76
81
|
%x{
|
77
82
|
var fun = function(props, state) {
|
78
|
-
Opal.Preact
|
83
|
+
const oper = Opal.Preact;
|
84
|
+
oper.register_active_component(this);
|
79
85
|
try {
|
80
|
-
var result = #{`this.__ruby_instance`.instance_exec(`
|
81
|
-
`
|
86
|
+
var result = #{`this.__ruby_instance`.instance_exec(`oper.Props.$new({props: props})`,
|
87
|
+
`oper.State.$new({state: state})`, &block)};
|
82
88
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
83
|
-
|
89
|
+
oper.unregister_active_component(this);
|
84
90
|
if (typeof result.$to_n === 'function') { result = result.$to_n() }
|
85
91
|
if (result === nil) { return null; }
|
86
92
|
return result;
|
@@ -93,12 +99,13 @@ module Preact::Component::Callbacks
|
|
93
99
|
def get_snapshot_before_update(&block)
|
94
100
|
%x{
|
95
101
|
var fun = function(prev_props, prev_state) {
|
96
|
-
Opal.Preact
|
102
|
+
const oper = Opal.Preact;
|
103
|
+
oper.register_active_component(this);
|
97
104
|
try {
|
98
|
-
var result = #{`this.__ruby_instance`.instance_exec(`
|
99
|
-
`
|
105
|
+
var result = #{`this.__ruby_instance`.instance_exec(`oper.Props.$new({props: prev_props})`,
|
106
|
+
`oper.State.$new({state: prev_state})`, &block)};
|
100
107
|
} catch (e) { console.error(e.message === Opal.nil ? 'error at' : e.message, e.stack); }
|
101
|
-
|
108
|
+
oper.unregister_active_component(this);
|
102
109
|
if (result === nil) { return null; }
|
103
110
|
return result;
|
104
111
|
}
|
data/lib/preact/version.rb
CHANGED
data/lib/preact.rb
CHANGED
@@ -145,12 +145,12 @@ module Preact
|
|
145
145
|
let method_name = '$' + value;
|
146
146
|
if (typeof active_component[method_name] === "function") {
|
147
147
|
// got a ruby instance
|
148
|
-
if (active_component.native
|
149
|
-
else if (active_component.method_refs
|
148
|
+
if (active_component.native?.method_refs?.[value]) { method_ref = active_component.native.method_refs[value]; } // ruby instance with native
|
149
|
+
else if (active_component.method_refs?.[value]) { method_ref = active_component.method_refs[value]; } // ruby function component
|
150
150
|
else { method_ref = active_component.$method_ref(value); } // create the ref
|
151
151
|
} else if (typeof active_component.__ruby_instance[method_name] === "function") {
|
152
152
|
// got a native instance
|
153
|
-
if (active_component.method_refs
|
153
|
+
if (active_component.method_refs?.[value]) { method_ref = active_component.method_refs[value]; }
|
154
154
|
else { method_ref = active_component.__ruby_instance.$method_ref(value); } // create ref for native
|
155
155
|
}
|
156
156
|
if (method_ref) {
|
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.
|
4
|
+
version: 10.6.49
|
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-
|
11
|
+
date: 2022-02-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: concurrent-ruby
|
@@ -222,6 +222,7 @@ files:
|
|
222
222
|
- lib/browser/event.rb
|
223
223
|
- lib/browser/event_target.rb
|
224
224
|
- lib/browser/file_list.rb
|
225
|
+
- lib/browser/history.rb
|
225
226
|
- lib/browser/iterable.rb
|
226
227
|
- lib/isomorfeus-preact.rb
|
227
228
|
- lib/isomorfeus/preact/config.rb
|