isomorfeus-preact 23.9.0.rc5 → 23.9.0.rc7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/isomorfeus/preact/version.rb +1 -1
- data/lib/lucid_component.rb +4 -2
- data/lib/preact.rb +92 -88
- metadata +6 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c22d932de1aa537699c0a55d854520ecdce9f996dbb3570d58d7325142a7179c
|
4
|
+
data.tar.gz: 2eab5445bec1a327075e2b8a3f52503304bafd8502934bc9f229c2c2882c11b6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c231eda6ae7f0d2a0ec1dfaa0ffa57c541291413e19003d311dcf91ecdeb96ab2c020d4c252044fe4f16ed3154906e7ac885746c98400f716b3e2ed201879ff1
|
7
|
+
data.tar.gz: ca134ccee6cb43c27b0461030b07d6f8529e4a9f8ec56d827409cdce5de023b077460ebc7795082288b71b6ba3b932f2e94b10151b88ae0e687f21b6a4edd415
|
data/lib/lucid_component.rb
CHANGED
@@ -86,8 +86,10 @@ class LucidComponent < Preact::Component
|
|
86
86
|
end
|
87
87
|
if ::Isomorfeus.something_loading?
|
88
88
|
STDERR.puts "#{@class_name} component still loading ...\n#{ex.message}\n#{ex.backtrace&.join("\n")}" if ex && ::Isomorfeus.development?
|
89
|
-
|
90
|
-
|
89
|
+
if @while_loading_block
|
90
|
+
::Preact.render_buffer.last.clear
|
91
|
+
block_result = instance_exec(&@while_loading_block)
|
92
|
+
end
|
91
93
|
elsif ex
|
92
94
|
raise ex
|
93
95
|
end
|
data/lib/preact.rb
CHANGED
@@ -2,9 +2,49 @@
|
|
2
2
|
# helpers: hash_get, hash_put
|
3
3
|
|
4
4
|
if RUBY_ENGINE == 'opal'
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
%x{
|
6
|
+
let vnodeId = 0;
|
7
|
+
|
8
|
+
function vnode_eql(me, other) {
|
9
|
+
for(let prop in me) {
|
10
|
+
if (prop === 'props' && !(me[prop]["$=="](other[prop]))) {
|
11
|
+
return false;
|
12
|
+
} else if (me[prop] != other[prop]) {
|
13
|
+
return false;
|
14
|
+
}
|
15
|
+
}
|
16
|
+
return true;
|
17
|
+
}
|
18
|
+
|
19
|
+
class VNode {
|
20
|
+
constructor(type, props, key, ref, original) {
|
21
|
+
this.type = type;
|
22
|
+
this.props = props;
|
23
|
+
this.key = key;
|
24
|
+
this.ref = ref;
|
25
|
+
this._children = null;
|
26
|
+
this._parent = null;
|
27
|
+
this._depth = 0;
|
28
|
+
this._dom = null;
|
29
|
+
this._nextDom = undefined;
|
30
|
+
this._component = null;
|
31
|
+
this._hydrating = null;
|
32
|
+
this._original = (original == null || original == nil) ? ++vnodeId : original;
|
33
|
+
this.constructor = undefined;
|
34
|
+
}
|
35
|
+
"$=="(other) { return vnode_eql(this, other); }
|
36
|
+
"$eql?"(other) { return vnode_eql(this, other); }
|
37
|
+
"$is_a?"(t) { return t === Opal.VNode; }
|
38
|
+
"$type"() { return this.type; }
|
39
|
+
"$props"() { return this.props; }
|
40
|
+
"$key"() { return this.key; }
|
41
|
+
"$ref"() { return this.ref; }
|
42
|
+
}
|
43
|
+
}
|
44
|
+
class VNode < `VNode`
|
45
|
+
def self.new(type, props, key, ref, original)
|
46
|
+
return `new VNode(type, props, key, ref, original)`
|
47
|
+
end
|
8
48
|
end
|
9
49
|
end
|
10
50
|
|
@@ -13,18 +53,9 @@ class Fragment
|
|
13
53
|
@props = props
|
14
54
|
end
|
15
55
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
children = @props[:children]
|
20
|
-
`Opal.Preact.render_buffer.push(children.$$is_array ? children : [children])`
|
21
|
-
nil
|
22
|
-
end
|
23
|
-
else
|
24
|
-
def render
|
25
|
-
::Preact.render_buffer.pop
|
26
|
-
::Preact.render_buffer.push(@props[:children])
|
27
|
-
end
|
56
|
+
def render
|
57
|
+
::Preact.render_buffer.pop
|
58
|
+
::Preact.render_buffer.push(@props[:children])
|
28
59
|
end
|
29
60
|
end
|
30
61
|
|
@@ -34,40 +65,6 @@ module Preact
|
|
34
65
|
|
35
66
|
if RUBY_ENGINE == 'opal'
|
36
67
|
%x{
|
37
|
-
let vnodeId = 0;
|
38
|
-
|
39
|
-
function vnode_eql(me, other) {
|
40
|
-
for(let prop in me) {
|
41
|
-
if (prop === 'props' && !(me[prop]["$=="](other[prop]))) {
|
42
|
-
return false;
|
43
|
-
} else if (me[prop] != other[prop]) {
|
44
|
-
return false;
|
45
|
-
}
|
46
|
-
}
|
47
|
-
return true;
|
48
|
-
}
|
49
|
-
|
50
|
-
class VNode {
|
51
|
-
constructor(type, props, key, ref, original) {
|
52
|
-
this.type = type;
|
53
|
-
this.props = props;
|
54
|
-
this.key = key;
|
55
|
-
this.ref = ref;
|
56
|
-
this._children = null;
|
57
|
-
this._parent = null;
|
58
|
-
this._depth = 0;
|
59
|
-
this._dom = null;
|
60
|
-
this._nextDom = undefined;
|
61
|
-
this._component = null;
|
62
|
-
this._hydrating = null;
|
63
|
-
this._original = (original == null) ? ++vnodeId : original;
|
64
|
-
this.constructor = undefined;
|
65
|
-
}
|
66
|
-
"$=="(other) { return vnode_eql(this, other); }
|
67
|
-
"$eql?"(other) { return vnode_eql(this, other); }
|
68
|
-
"$is_a?"(t) { return t === Opal.VNode; }
|
69
|
-
}
|
70
|
-
|
71
68
|
function _catchError(error, vnode, oldVNode) {
|
72
69
|
let component, ctor, handled;
|
73
70
|
|
@@ -97,12 +94,12 @@ module Preact
|
|
97
94
|
throw error;
|
98
95
|
}
|
99
96
|
|
100
|
-
const
|
97
|
+
const EMPTY_VNODE = new VNode();
|
101
98
|
const EMPTY_ARR = [];
|
102
99
|
const slice = EMPTY_ARR.slice;
|
103
100
|
|
104
101
|
function hash_fetch(hash, key) {
|
105
|
-
let val =
|
102
|
+
let val = hash.get(key);
|
106
103
|
return (val === undefined || val === null) ? nil : val;
|
107
104
|
}
|
108
105
|
|
@@ -297,8 +294,8 @@ module Preact
|
|
297
294
|
) {
|
298
295
|
let i, j, oldVNode, childVNode, newDom, firstChildDom, refs;
|
299
296
|
|
300
|
-
// This is a compression of oldParentVNode!=null && oldParentVNode !=
|
301
|
-
// as
|
297
|
+
// This is a compression of oldParentVNode!=null && oldParentVNode != EMPTY_VNODE && oldParentVNode._children || EMPTY_ARR
|
298
|
+
// as EMPTY_VNODE._children should be `undefined`.
|
302
299
|
let oldChildren = (oldParentVNode && oldParentVNode !== nil && oldParentVNode._children) ? oldParentVNode._children : EMPTY_ARR;
|
303
300
|
|
304
301
|
let oldChildrenLength = oldChildren.length;
|
@@ -307,7 +304,7 @@ module Preact
|
|
307
304
|
for (i = 0; i < renderResult.length; i++) {
|
308
305
|
childVNode = renderResult[i];
|
309
306
|
|
310
|
-
if (childVNode === nil || childVNode == null || typeof childVNode === 'boolean' || childVNode.$$is_boolean) {
|
307
|
+
if (childVNode === nil || childVNode == null || typeof childVNode === 'boolean' || childVNode.$$is_boolean || typeof childVNode === 'number' || childVNode.$$is_number) {
|
311
308
|
childVNode = newParentVNode._children[i] = null;
|
312
309
|
}
|
313
310
|
// If this newVNode is being reused (e.g. <div>{reuse}{reuse}</div>) in the same diff,
|
@@ -333,7 +330,7 @@ module Preact
|
|
333
330
|
} else if (childVNode.$$is_array) {
|
334
331
|
childVNode = newParentVNode._children[i] = new VNode(
|
335
332
|
Opal.Fragment,
|
336
|
-
|
333
|
+
new Map([['children', childVNode]]),
|
337
334
|
null,
|
338
335
|
null,
|
339
336
|
null
|
@@ -357,6 +354,7 @@ module Preact
|
|
357
354
|
if (childVNode === nil || childVNode == null) {
|
358
355
|
continue;
|
359
356
|
}
|
357
|
+
|
360
358
|
childVNode._parent = newParentVNode;
|
361
359
|
childVNode._depth = newParentVNode._depth + 1;
|
362
360
|
|
@@ -392,7 +390,7 @@ module Preact
|
|
392
390
|
}
|
393
391
|
}
|
394
392
|
|
395
|
-
oldVNode = (oldVNode && oldVNode !== nil) ? oldVNode :
|
393
|
+
oldVNode = (oldVNode && oldVNode !== nil) ? oldVNode : EMPTY_VNODE;
|
396
394
|
|
397
395
|
// Morph the old element into the new one, but don't append it to the dom yet
|
398
396
|
diff(
|
@@ -792,7 +790,7 @@ module Preact
|
|
792
790
|
if (newType.declared_props && newType.declared_props !== nil) {
|
793
791
|
#{
|
794
792
|
`newType.declared_props`.each do |prop, value|
|
795
|
-
`if (value.has("default") && !newProps.has(prop)) { newProps.set(prop, value
|
793
|
+
`if (value.has("default") && !newProps.has(prop)) { newProps.set(prop, hash_fetch(value, "default")) }`
|
796
794
|
nil
|
797
795
|
end
|
798
796
|
}
|
@@ -973,7 +971,7 @@ module Preact
|
|
973
971
|
|
974
972
|
c._force = false;
|
975
973
|
|
976
|
-
|
974
|
+
} else if (
|
977
975
|
excessDomChildren == null &&
|
978
976
|
newVNode._original === oldVNode._original
|
979
977
|
) {
|
@@ -1021,8 +1019,6 @@ module Preact
|
|
1021
1019
|
});
|
1022
1020
|
}
|
1023
1021
|
|
1024
|
-
|
1025
|
-
|
1026
1022
|
self.createVNode = function(type, props, key, ref, original) {
|
1027
1023
|
// V8 seems to be better at detecting type shapes if the object is allocated from the same call site
|
1028
1024
|
// Do not inline into createElement and coerceToVNode!
|
@@ -1035,7 +1031,7 @@ module Preact
|
|
1035
1031
|
// element..
|
1036
1032
|
let isHydrating = typeof replaceNode === 'function';
|
1037
1033
|
|
1038
|
-
let reno = (replaceNode !== nil
|
1034
|
+
let reno = (replaceNode && replaceNode !== nil);
|
1039
1035
|
let nohy_reno = (!isHydrating && reno);
|
1040
1036
|
|
1041
1037
|
// To be able to support calling `render()` multiple times on the same
|
@@ -1049,23 +1045,31 @@ module Preact
|
|
1049
1045
|
|
1050
1046
|
let ov = (oldVNode && oldVNode !== nil);
|
1051
1047
|
|
1052
|
-
vnode = (
|
1053
|
-
nohy_reno || parentDom
|
1054
|
-
)._children = self.$create_element(Opal.Fragment, nil, [vnode]);
|
1048
|
+
vnode = (nohy_reno ? replaceNode : parentDom)._children = self.$create_element(Opal.Fragment, nil, [vnode]);
|
1055
1049
|
|
1056
1050
|
// List of effects that need to be called after diffing.
|
1057
1051
|
let commitQueue = [];
|
1052
|
+
|
1053
|
+
// Determine the new vnode tree and store it on the DOM element on
|
1054
|
+
// our custom `_children` property.
|
1058
1055
|
diff(
|
1056
|
+
// parentDom
|
1059
1057
|
parentDom,
|
1060
|
-
//
|
1061
|
-
// our custom `_children` property.
|
1058
|
+
// newVNode
|
1062
1059
|
vnode,
|
1063
|
-
|
1060
|
+
// oldVNode
|
1061
|
+
ov ? oldVNode : EMPTY_VNODE,
|
1062
|
+
// globalContext
|
1064
1063
|
new Map(),
|
1064
|
+
// isSvg
|
1065
1065
|
parentDom.ownerSVGElement !== undefined,
|
1066
|
+
// excessDomChildren
|
1066
1067
|
nohy_reno ? [replaceNode] : ov ? null : parentDom.firstChild ? slice.call(parentDom.childNodes) : null,
|
1068
|
+
// commitQueue
|
1067
1069
|
commitQueue,
|
1070
|
+
// oldDom
|
1068
1071
|
nohy_reno ? replaceNode : ov ? oldVNode._dom : parentDom.firstChild,
|
1072
|
+
// isHydrating
|
1069
1073
|
isHydrating
|
1070
1074
|
);
|
1071
1075
|
|
@@ -1119,7 +1123,7 @@ module Preact
|
|
1119
1123
|
|
1120
1124
|
self.process = function() {
|
1121
1125
|
let queue;
|
1122
|
-
while ((self.
|
1126
|
+
while ((self.rerender_count = self.rerender_queue.length)) {
|
1123
1127
|
queue = self.rerender_queue.sort((a, b) => a._vnode._depth - b._vnode._depth);
|
1124
1128
|
self.rerender_queue = [];
|
1125
1129
|
// Don't update `renderCount` yet. Keep its value non-zero to prevent unnecessary
|
@@ -1129,7 +1133,8 @@ module Preact
|
|
1129
1133
|
});
|
1130
1134
|
}
|
1131
1135
|
}
|
1132
|
-
self.
|
1136
|
+
self.rerender_count = 0;
|
1137
|
+
self.rerender_queue = [];
|
1133
1138
|
}
|
1134
1139
|
else
|
1135
1140
|
IS_NON_DIMENSIONAL = /acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|^--/i.freeze
|
@@ -1153,11 +1158,7 @@ module Preact
|
|
1153
1158
|
|
1154
1159
|
def clone_element(vnode, props = nil, children = nil)
|
1155
1160
|
normalized_props = {}
|
1156
|
-
|
1157
|
-
normalized_props.merge!(`vnode.props`)
|
1158
|
-
else
|
1159
|
-
normalized_props.merge!(vnode.props)
|
1160
|
-
end
|
1161
|
+
normalized_props.merge!(vnode.props)
|
1161
1162
|
|
1162
1163
|
if props
|
1163
1164
|
normalized_props.merge!(props)
|
@@ -1170,11 +1171,7 @@ module Preact
|
|
1170
1171
|
|
1171
1172
|
normalized_props[:children] = children unless children.nil?
|
1172
1173
|
|
1173
|
-
|
1174
|
-
`self.createVNode(vnode.type, normalized_props, #{key || `vnode.key`}, #{ref || `vnode.ref`}, null)`
|
1175
|
-
else
|
1176
|
-
::VNode.new(vnode.type, normalized_props, key || vnode.key, ref || vnode.ref)
|
1177
|
-
end
|
1174
|
+
::VNode.new(vnode.type, normalized_props, key || vnode.key, ref || vnode.ref)
|
1178
1175
|
end
|
1179
1176
|
|
1180
1177
|
def create_context(const_name, default_value = nil)
|
@@ -1191,9 +1188,10 @@ module Preact
|
|
1191
1188
|
if RUBY_ENGINE == 'opal'
|
1192
1189
|
attr_accessor :render_buffer
|
1193
1190
|
attr_accessor :rerender_queue
|
1191
|
+
attr_accessor :rerender_count
|
1194
1192
|
|
1195
1193
|
def is_renderable?(res)
|
1196
|
-
|
1194
|
+
`!!(res && res !== nil && res.$$is_string)`
|
1197
1195
|
end
|
1198
1196
|
|
1199
1197
|
def create_element(type, props = nil, children = nil)
|
@@ -1225,13 +1223,20 @@ module Preact
|
|
1225
1223
|
end
|
1226
1224
|
|
1227
1225
|
%x{
|
1228
|
-
if (children !== nil && children !== null) {
|
1226
|
+
if (children !== nil && children !== null) {
|
1227
|
+
normalized_props.set("children", children.$$is_array ? children : [children]);
|
1228
|
+
} else {
|
1229
|
+
children = normalized_props.get("children");
|
1230
|
+
if (children && !children.$$is_array) {
|
1231
|
+
normalized_props.set("children", [children]);
|
1232
|
+
}
|
1233
|
+
}
|
1229
1234
|
return self.createVNode(type, normalized_props, key, ref, null);
|
1230
1235
|
}
|
1231
1236
|
end
|
1232
1237
|
|
1233
1238
|
def _enqueue_render(c)
|
1234
|
-
if ((`!c._dirty` && (`c._dirty = true`) && (rerender_queue << c) && `!self.
|
1239
|
+
if ((`!c._dirty` && (`c._dirty = true`) && (self.rerender_queue << c) && `!self.rerender_count++`))
|
1235
1240
|
`setTimeout(self.process)`
|
1236
1241
|
end
|
1237
1242
|
end
|
@@ -1246,16 +1251,12 @@ module Preact
|
|
1246
1251
|
nil
|
1247
1252
|
end
|
1248
1253
|
|
1249
|
-
def hydrate(vnode, container_node)
|
1250
|
-
render(vnode, container_node, `self.render`)
|
1251
|
-
end
|
1252
|
-
|
1253
1254
|
def element_or_query_to_n(element_or_query)
|
1254
1255
|
if `!element_or_query || element_or_query === nil`
|
1255
1256
|
return `null`
|
1256
1257
|
elsif `(element_or_query instanceof HTMLElement)`
|
1257
1258
|
return element_or_query
|
1258
|
-
elsif `(typeof element_or_query === 'string')
|
1259
|
+
elsif `(typeof element_or_query === 'string') || element_or_query.$$is_string`
|
1259
1260
|
return `document.body.querySelector(element_or_query)`
|
1260
1261
|
elsif `(typeof element_or_query === 'function')`
|
1261
1262
|
return element_or_query
|
@@ -1266,6 +1267,10 @@ module Preact
|
|
1266
1267
|
end
|
1267
1268
|
end
|
1268
1269
|
|
1270
|
+
def hydrate(vnode, container_node)
|
1271
|
+
render(vnode, container_node, `self.render`)
|
1272
|
+
end
|
1273
|
+
|
1269
1274
|
def render(vnode, container_node, replace_node = nil)
|
1270
1275
|
_init_render
|
1271
1276
|
container_node = element_or_query_to_n(container_node)
|
@@ -1322,4 +1327,3 @@ module Preact
|
|
1322
1327
|
end # RUBY_ENGINE
|
1323
1328
|
end
|
1324
1329
|
end
|
1325
|
-
|
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: 23.9.0.
|
4
|
+
version: 23.9.0.rc7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Biedermann
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2023-09-
|
11
|
+
date: 2023-09-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: oj
|
@@ -78,28 +78,28 @@ dependencies:
|
|
78
78
|
requirements:
|
79
79
|
- - '='
|
80
80
|
- !ruby/object:Gem::Version
|
81
|
-
version: 23.9.0.
|
81
|
+
version: 23.9.0.rc7
|
82
82
|
type: :runtime
|
83
83
|
prerelease: false
|
84
84
|
version_requirements: !ruby/object:Gem::Requirement
|
85
85
|
requirements:
|
86
86
|
- - '='
|
87
87
|
- !ruby/object:Gem::Version
|
88
|
-
version: 23.9.0.
|
88
|
+
version: 23.9.0.rc7
|
89
89
|
- !ruby/object:Gem::Dependency
|
90
90
|
name: isomorfeus-redux
|
91
91
|
requirement: !ruby/object:Gem::Requirement
|
92
92
|
requirements:
|
93
93
|
- - '='
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: 23.9.0.
|
95
|
+
version: 23.9.0.rc7
|
96
96
|
type: :runtime
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - '='
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 23.9.0.
|
102
|
+
version: 23.9.0.rc7
|
103
103
|
- !ruby/object:Gem::Dependency
|
104
104
|
name: benchmark-ips
|
105
105
|
requirement: !ruby/object:Gem::Requirement
|