xote 6.1.1 → 6.2.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.
- package/README.md +90 -10
- package/dist/xote.cjs +9 -9
- package/dist/xote.mjs +1485 -1317
- package/dist/xote.umd.js +9 -9
- package/package.json +16 -1
- package/rescript.json +2 -0
- package/src/Html.res +13 -13
- package/src/Html.res.mjs +13 -13
- package/src/Hydration.res +134 -79
- package/src/Hydration.res.mjs +255 -186
- package/src/Node.res +2 -578
- package/src/Node.res.mjs +31 -518
- package/src/Prop.res +16 -0
- package/src/Prop.res.mjs +35 -0
- package/src/ReactiveProp.res +2 -14
- package/src/ReactiveProp.res.mjs +7 -20
- package/src/Route.res +4 -0
- package/src/Route.res.mjs +9 -0
- package/src/Router.res +25 -49
- package/src/Router.res.mjs +22 -34
- package/src/RuntimeAttr.res +21 -0
- package/src/RuntimeAttr.res.mjs +42 -0
- package/src/RuntimeDom.res +95 -0
- package/src/RuntimeDom.res.mjs +101 -0
- package/src/RuntimeHtml.res +27 -0
- package/src/RuntimeHtml.res.mjs +34 -0
- package/src/RuntimeHydrationMarkers.res +24 -0
- package/src/RuntimeHydrationMarkers.res.mjs +68 -0
- package/src/RuntimeJsxProp.res +46 -0
- package/src/RuntimeJsxProp.res.mjs +52 -0
- package/src/RuntimeOwner.res +43 -0
- package/src/RuntimeOwner.res.mjs +51 -0
- package/src/SSR.res +25 -93
- package/src/SSR.res.mjs +59 -126
- package/src/SSRState.res +3 -0
- package/src/SSRState.res.mjs +8 -2
- package/src/View.res +599 -0
- package/src/View.res.mjs +614 -0
- package/src/XoteJSX.res +64 -118
- package/src/XoteJSX.res.mjs +79 -118
package/src/Hydration.res.mjs
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
2
|
|
|
3
|
-
import * as
|
|
3
|
+
import * as View$Xote from "./View.res.mjs";
|
|
4
4
|
import * as Effect$Xote from "./Effect.res.mjs";
|
|
5
5
|
import * as Signal$Xote from "./Signal.res.mjs";
|
|
6
6
|
import * as Stdlib_Dict from "@rescript/runtime/lib/es6/Stdlib_Dict.js";
|
|
7
7
|
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
|
|
8
|
+
import * as RuntimeDom$Xote from "./RuntimeDom.res.mjs";
|
|
8
9
|
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
10
|
+
import * as RuntimeOwner$Xote from "./RuntimeOwner.res.mjs";
|
|
9
11
|
import * as Primitive_exceptions from "@rescript/runtime/lib/es6/Primitive_exceptions.js";
|
|
12
|
+
import * as RuntimeHydrationMarkers$Xote from "./RuntimeHydrationMarkers.res.mjs";
|
|
10
13
|
|
|
11
14
|
function getChildNodes(el) {
|
|
12
15
|
return (Array.from(el.childNodes || []));
|
|
@@ -41,8 +44,8 @@ function extractKey(node) {
|
|
|
41
44
|
return;
|
|
42
45
|
}
|
|
43
46
|
let value = node.nodeValue;
|
|
44
|
-
if (!(value == null) && value.startsWith(
|
|
45
|
-
return value.slice(
|
|
47
|
+
if (!(value == null) && value.startsWith(RuntimeHydrationMarkers$Xote.keyedItemPrefixContent)) {
|
|
48
|
+
return value.slice(RuntimeHydrationMarkers$Xote.keyedItemPrefixContent.length);
|
|
46
49
|
}
|
|
47
50
|
}
|
|
48
51
|
|
|
@@ -135,9 +138,9 @@ function hydrateNode(_node, domNode) {
|
|
|
135
138
|
let children = node.children;
|
|
136
139
|
let events = node.events;
|
|
137
140
|
let attrs = node.attrs;
|
|
138
|
-
let owner =
|
|
139
|
-
|
|
140
|
-
return
|
|
141
|
+
let owner = RuntimeOwner$Xote.createOwner();
|
|
142
|
+
RuntimeOwner$Xote.setOwner(domNode, owner);
|
|
143
|
+
return RuntimeOwner$Xote.runWithOwner(owner, () => {
|
|
141
144
|
attrs.forEach(param => {
|
|
142
145
|
let value = param[1];
|
|
143
146
|
let key = param[0];
|
|
@@ -147,15 +150,15 @@ function hydrateNode(_node, domNode) {
|
|
|
147
150
|
case "SignalValue" :
|
|
148
151
|
let signal = value._0;
|
|
149
152
|
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
150
|
-
|
|
153
|
+
RuntimeDom$Xote.setAttrOrProp(domNode, key, Signal$Xote.get(signal));
|
|
151
154
|
}, undefined);
|
|
152
|
-
return
|
|
155
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer);
|
|
153
156
|
case "Compute" :
|
|
154
157
|
let compute = value._0;
|
|
155
158
|
let disposer$1 = Effect$Xote.runWithDisposer(() => {
|
|
156
|
-
|
|
159
|
+
RuntimeDom$Xote.setAttrOrProp(domNode, key, compute());
|
|
157
160
|
}, undefined);
|
|
158
|
-
return
|
|
161
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer$1);
|
|
159
162
|
}
|
|
160
163
|
});
|
|
161
164
|
events.forEach(param => {
|
|
@@ -168,13 +171,13 @@ function hydrateNode(_node, domNode) {
|
|
|
168
171
|
return;
|
|
169
172
|
case "SignalText" :
|
|
170
173
|
let signal = node._0;
|
|
171
|
-
let owner$1 =
|
|
172
|
-
|
|
173
|
-
return
|
|
174
|
+
let owner$1 = RuntimeOwner$Xote.createOwner();
|
|
175
|
+
RuntimeOwner$Xote.setOwner(domNode, owner$1);
|
|
176
|
+
return RuntimeOwner$Xote.runWithOwner(owner$1, () => {
|
|
174
177
|
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
175
178
|
domNode.textContent = Signal$Xote.get(signal);
|
|
176
179
|
}, undefined);
|
|
177
|
-
|
|
180
|
+
RuntimeOwner$Xote.addDisposer(owner$1, disposer);
|
|
178
181
|
});
|
|
179
182
|
case "Fragment" :
|
|
180
183
|
let walker = make(domNode);
|
|
@@ -182,36 +185,66 @@ function hydrateNode(_node, domNode) {
|
|
|
182
185
|
return;
|
|
183
186
|
case "SignalFragment" :
|
|
184
187
|
let signal$1 = node._0;
|
|
185
|
-
let owner$2 =
|
|
186
|
-
|
|
187
|
-
|
|
188
|
+
let owner$2 = RuntimeOwner$Xote.createOwner();
|
|
189
|
+
RuntimeOwner$Xote.setOwner(domNode, owner$2);
|
|
190
|
+
let keyedItems = {};
|
|
191
|
+
let initialized = {
|
|
192
|
+
contents: false
|
|
193
|
+
};
|
|
194
|
+
return RuntimeOwner$Xote.runWithOwner(owner$2, () => {
|
|
188
195
|
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
189
196
|
let children = Signal$Xote.get(signal$1);
|
|
190
|
-
let
|
|
191
|
-
|
|
192
|
-
(
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
}
|
|
197
|
+
let keyedChildren = View$Xote.Render.getKeyedChildren(children);
|
|
198
|
+
let exit = 0;
|
|
199
|
+
if (keyedChildren !== undefined && initialized.contents) {
|
|
200
|
+
View$Xote.Render.reconcileKeyedChildren(keyedChildren, keyedItems, domNode);
|
|
201
|
+
} else {
|
|
202
|
+
exit = 1;
|
|
203
|
+
}
|
|
204
|
+
if (exit === 1) {
|
|
205
|
+
View$Xote.Render.clearKeyedItems(keyedItems);
|
|
206
|
+
let childNodes = (Array.from(domNode.childNodes || []));
|
|
207
|
+
childNodes.forEach(child => RuntimeOwner$Xote.disposeOwner(Stdlib_Option.getOr(RuntimeOwner$Xote.getOwner(child), RuntimeOwner$Xote.createOwner())));
|
|
208
|
+
domNode.innerHTML = "";
|
|
209
|
+
if (keyedChildren !== undefined) {
|
|
210
|
+
keyedChildren.forEach(keyedChild => {
|
|
211
|
+
let childEl = View$Xote.Render.render(keyedChild.child);
|
|
212
|
+
keyedItems[keyedChild.key] = {
|
|
213
|
+
key: keyedChild.key,
|
|
214
|
+
item: keyedChild.identity,
|
|
215
|
+
element: childEl
|
|
216
|
+
};
|
|
217
|
+
domNode.appendChild(childEl);
|
|
218
|
+
});
|
|
219
|
+
} else {
|
|
220
|
+
children.forEach(child => {
|
|
221
|
+
let childEl = View$Xote.Render.render(child);
|
|
222
|
+
domNode.appendChild(childEl);
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
initialized.contents = true;
|
|
226
|
+
}
|
|
197
227
|
}, undefined);
|
|
198
|
-
|
|
228
|
+
RuntimeOwner$Xote.addDisposer(owner$2, disposer);
|
|
199
229
|
});
|
|
230
|
+
case "Keyed" :
|
|
231
|
+
_node = node.child;
|
|
232
|
+
continue;
|
|
200
233
|
case "LazyComponent" :
|
|
201
|
-
let owner$3 =
|
|
202
|
-
let childNode =
|
|
203
|
-
|
|
234
|
+
let owner$3 = RuntimeOwner$Xote.createOwner();
|
|
235
|
+
let childNode = RuntimeOwner$Xote.runWithOwner(owner$3, node._0);
|
|
236
|
+
RuntimeOwner$Xote.setOwner(domNode, owner$3);
|
|
204
237
|
_node = childNode;
|
|
205
238
|
continue;
|
|
206
239
|
case "KeyedList" :
|
|
207
240
|
let renderItem = node.renderItem;
|
|
208
241
|
let keyFn = node.keyFn;
|
|
209
242
|
let signal$2 = node.signal;
|
|
210
|
-
let owner$4 =
|
|
211
|
-
|
|
212
|
-
let keyedItems = {};
|
|
243
|
+
let owner$4 = RuntimeOwner$Xote.createOwner();
|
|
244
|
+
RuntimeOwner$Xote.setOwner(domNode, owner$4);
|
|
245
|
+
let keyedItems$1 = {};
|
|
213
246
|
let walker$1 = make(domNode);
|
|
214
|
-
skipUntilMarker(walker$1,
|
|
247
|
+
skipUntilMarker(walker$1, RuntimeHydrationMarkers$Xote.keyedListStartContent);
|
|
215
248
|
let parseKeyedItems = () => {
|
|
216
249
|
while (true) {
|
|
217
250
|
let node = walker$1.current;
|
|
@@ -219,8 +252,8 @@ function hydrateNode(_node, domNode) {
|
|
|
219
252
|
return;
|
|
220
253
|
}
|
|
221
254
|
let node$1 = Primitive_option.valFromOption(node);
|
|
222
|
-
if (!isMarkerPrefix(node$1,
|
|
223
|
-
if (isMarker(node$1,
|
|
255
|
+
if (!isMarkerPrefix(node$1, RuntimeHydrationMarkers$Xote.keyedItemPrefixContent)) {
|
|
256
|
+
if (isMarker(node$1, RuntimeHydrationMarkers$Xote.keyedListEndContent)) {
|
|
224
257
|
next(walker$1);
|
|
225
258
|
return;
|
|
226
259
|
} else {
|
|
@@ -229,12 +262,12 @@ function hydrateNode(_node, domNode) {
|
|
|
229
262
|
}
|
|
230
263
|
let key = Stdlib_Option.getOr(extractKey(node$1), "");
|
|
231
264
|
next(walker$1);
|
|
232
|
-
let itemElements = collectUntilMarker(walker$1,
|
|
265
|
+
let itemElements = collectUntilMarker(walker$1, RuntimeHydrationMarkers$Xote.keyedItemEndContent);
|
|
233
266
|
let element = itemElements.find(el => el.nodeType === 1);
|
|
234
267
|
if (element !== undefined) {
|
|
235
268
|
let items = Signal$Xote.peek(signal$2);
|
|
236
269
|
let item = Stdlib_Option.getOr(items.find(i => keyFn(i) === key), {});
|
|
237
|
-
keyedItems[key] = {
|
|
270
|
+
keyedItems$1[key] = {
|
|
238
271
|
key: key,
|
|
239
272
|
item: item,
|
|
240
273
|
element: Primitive_option.valFromOption(element)
|
|
@@ -244,7 +277,7 @@ function hydrateNode(_node, domNode) {
|
|
|
244
277
|
};
|
|
245
278
|
};
|
|
246
279
|
parseKeyedItems();
|
|
247
|
-
return
|
|
280
|
+
return RuntimeOwner$Xote.runWithOwner(owner$4, () => {
|
|
248
281
|
let startAnchor = document.createComment(" keyed-list-start ");
|
|
249
282
|
let endAnchor = document.createComment(" keyed-list-end ");
|
|
250
283
|
let firstChild = domNode.firstChild;
|
|
@@ -261,7 +294,7 @@ function hydrateNode(_node, domNode) {
|
|
|
261
294
|
newKeyMap[keyFn(item)] = item;
|
|
262
295
|
});
|
|
263
296
|
let keysToRemove = [];
|
|
264
|
-
Object.keys(keyedItems).forEach(key => {
|
|
297
|
+
Object.keys(keyedItems$1).forEach(key => {
|
|
265
298
|
let match = newKeyMap[key];
|
|
266
299
|
if (match !== undefined) {
|
|
267
300
|
return;
|
|
@@ -271,11 +304,11 @@ function hydrateNode(_node, domNode) {
|
|
|
271
304
|
}
|
|
272
305
|
});
|
|
273
306
|
keysToRemove.forEach(key => {
|
|
274
|
-
let keyedItem = keyedItems[key];
|
|
307
|
+
let keyedItem = keyedItems$1[key];
|
|
275
308
|
if (keyedItem !== undefined) {
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
Stdlib_Dict.$$delete(keyedItems, key);
|
|
309
|
+
View$Xote.Render.disposeElement(keyedItem.element);
|
|
310
|
+
keyedItem.element.remove();
|
|
311
|
+
Stdlib_Dict.$$delete(keyedItems$1, key);
|
|
279
312
|
return;
|
|
280
313
|
}
|
|
281
314
|
});
|
|
@@ -283,33 +316,33 @@ function hydrateNode(_node, domNode) {
|
|
|
283
316
|
let elementsToReplace = {};
|
|
284
317
|
newItems.forEach(item => {
|
|
285
318
|
let key = keyFn(item);
|
|
286
|
-
let existing = keyedItems[key];
|
|
319
|
+
let existing = keyedItems$1[key];
|
|
287
320
|
if (existing !== undefined) {
|
|
288
321
|
if (existing.item !== item) {
|
|
289
322
|
elementsToReplace[key] = true;
|
|
290
323
|
let node = renderItem(item);
|
|
291
|
-
let element =
|
|
324
|
+
let element = View$Xote.Render.render(node);
|
|
292
325
|
let keyedItem = {
|
|
293
326
|
key: key,
|
|
294
327
|
item: item,
|
|
295
328
|
element: element
|
|
296
329
|
};
|
|
297
330
|
newOrder.push(keyedItem);
|
|
298
|
-
keyedItems[key] = keyedItem;
|
|
331
|
+
keyedItems$1[key] = keyedItem;
|
|
299
332
|
return;
|
|
300
333
|
}
|
|
301
334
|
newOrder.push(existing);
|
|
302
335
|
return;
|
|
303
336
|
}
|
|
304
337
|
let node$1 = renderItem(item);
|
|
305
|
-
let element$1 =
|
|
338
|
+
let element$1 = View$Xote.Render.render(node$1);
|
|
306
339
|
let keyedItem$1 = {
|
|
307
340
|
key: key,
|
|
308
341
|
item: item,
|
|
309
342
|
element: element$1
|
|
310
343
|
};
|
|
311
344
|
newOrder.push(keyedItem$1);
|
|
312
|
-
keyedItems[key] = keyedItem$1;
|
|
345
|
+
keyedItems$1[key] = keyedItem$1;
|
|
313
346
|
});
|
|
314
347
|
let marker = {
|
|
315
348
|
contents: startAnchor.nextSibling
|
|
@@ -330,7 +363,7 @@ function hydrateNode(_node, domNode) {
|
|
|
330
363
|
}
|
|
331
364
|
let needsReplacement = Stdlib_Option.getOr(elementsToReplace[keyedItem.key], false);
|
|
332
365
|
if (needsReplacement) {
|
|
333
|
-
|
|
366
|
+
View$Xote.Render.disposeElement(currentElement);
|
|
334
367
|
domNode.replaceChild(keyedItem.element, currentElement);
|
|
335
368
|
marker.contents = keyedItem.element.nextSibling;
|
|
336
369
|
} else {
|
|
@@ -342,155 +375,188 @@ function hydrateNode(_node, domNode) {
|
|
|
342
375
|
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
343
376
|
reconcile();
|
|
344
377
|
}, undefined);
|
|
345
|
-
|
|
378
|
+
RuntimeOwner$Xote.addDisposer(owner$4, disposer);
|
|
346
379
|
});
|
|
347
380
|
}
|
|
348
381
|
};
|
|
349
382
|
}
|
|
350
383
|
|
|
351
|
-
function hydrateNodeWithWalker(
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
let owner = Node$Xote.Reactivity.createOwner();
|
|
363
|
-
Node$Xote.Reactivity.setOwner(domNode$1, owner);
|
|
364
|
-
return Node$Xote.Reactivity.runWithOwner(owner, () => {
|
|
365
|
-
attrs.forEach(param => {
|
|
366
|
-
let value = param[1];
|
|
367
|
-
let key = param[0];
|
|
368
|
-
switch (value.TAG) {
|
|
369
|
-
case "Static" :
|
|
370
|
-
return;
|
|
371
|
-
case "SignalValue" :
|
|
372
|
-
let signal = value._0;
|
|
373
|
-
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
374
|
-
Node$Xote.DOM.setAttrOrProp(domNode$1, key, Signal$Xote.get(signal));
|
|
375
|
-
}, undefined);
|
|
376
|
-
return Node$Xote.Reactivity.addDisposer(owner, disposer);
|
|
377
|
-
case "Compute" :
|
|
378
|
-
let compute = value._0;
|
|
379
|
-
let disposer$1 = Effect$Xote.runWithDisposer(() => {
|
|
380
|
-
Node$Xote.DOM.setAttrOrProp(domNode$1, key, compute());
|
|
381
|
-
}, undefined);
|
|
382
|
-
return Node$Xote.Reactivity.addDisposer(owner, disposer$1);
|
|
383
|
-
}
|
|
384
|
-
});
|
|
385
|
-
events.forEach(param => {
|
|
386
|
-
domNode$1.addEventListener(param[0], param[1]);
|
|
387
|
-
});
|
|
388
|
-
let childWalker = make(domNode$1);
|
|
389
|
-
children.forEach(child => hydrateNodeWithWalker(child, childWalker));
|
|
390
|
-
});
|
|
391
|
-
case "Text" :
|
|
392
|
-
next(walker);
|
|
393
|
-
return;
|
|
394
|
-
case "SignalText" :
|
|
395
|
-
let signal = node._0;
|
|
396
|
-
skipUntilMarker(walker, "$");
|
|
397
|
-
let textNode = next(walker);
|
|
398
|
-
if (textNode === undefined) {
|
|
399
|
-
return logHydrationWarning("Missing text node for SignalText");
|
|
400
|
-
}
|
|
401
|
-
let textNode$1 = Primitive_option.valFromOption(textNode);
|
|
402
|
-
let owner$1 = Node$Xote.Reactivity.createOwner();
|
|
403
|
-
Node$Xote.Reactivity.setOwner(textNode$1, owner$1);
|
|
404
|
-
Node$Xote.Reactivity.runWithOwner(owner$1, () => {
|
|
405
|
-
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
406
|
-
textNode$1.textContent = Signal$Xote.get(signal);
|
|
407
|
-
}, undefined);
|
|
408
|
-
Node$Xote.Reactivity.addDisposer(owner$1, disposer);
|
|
409
|
-
});
|
|
410
|
-
skipUntilMarker(walker, "/$");
|
|
411
|
-
return;
|
|
412
|
-
case "Fragment" :
|
|
413
|
-
node._0.forEach(child => hydrateNodeWithWalker(child, walker));
|
|
414
|
-
return;
|
|
415
|
-
case "SignalFragment" :
|
|
416
|
-
let signal$1 = node._0;
|
|
417
|
-
skipUntilMarker(walker, "#");
|
|
418
|
-
let contentNodes = collectUntilMarker(walker, "/#");
|
|
419
|
-
let container = document.createElement("div");
|
|
420
|
-
container.setAttribute("style", "display: contents");
|
|
421
|
-
let firstNode = contentNodes[0];
|
|
422
|
-
let parent = firstNode !== undefined ? firstNode.parentNode : undefined;
|
|
423
|
-
contentNodes.forEach(node => {
|
|
424
|
-
container.appendChild(node);
|
|
425
|
-
});
|
|
426
|
-
let match = walker.current;
|
|
427
|
-
if (parent !== undefined) {
|
|
428
|
-
let p = Primitive_option.valFromOption(parent);
|
|
429
|
-
if (match !== undefined) {
|
|
430
|
-
p.insertBefore(container, Primitive_option.valFromOption(match));
|
|
431
|
-
} else {
|
|
432
|
-
p.appendChild(container);
|
|
384
|
+
function hydrateNodeWithWalker(_node, walker) {
|
|
385
|
+
while (true) {
|
|
386
|
+
let node = _node;
|
|
387
|
+
switch (node.TAG) {
|
|
388
|
+
case "Element" :
|
|
389
|
+
let children = node.children;
|
|
390
|
+
let events = node.events;
|
|
391
|
+
let attrs = node.attrs;
|
|
392
|
+
let domNode = next(walker);
|
|
393
|
+
if (domNode === undefined) {
|
|
394
|
+
return logHydrationWarning("Missing DOM element for Element node");
|
|
433
395
|
}
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
396
|
+
let domNode$1 = Primitive_option.valFromOption(domNode);
|
|
397
|
+
let owner = RuntimeOwner$Xote.createOwner();
|
|
398
|
+
RuntimeOwner$Xote.setOwner(domNode$1, owner);
|
|
399
|
+
return RuntimeOwner$Xote.runWithOwner(owner, () => {
|
|
400
|
+
attrs.forEach(param => {
|
|
401
|
+
let value = param[1];
|
|
402
|
+
let key = param[0];
|
|
403
|
+
switch (value.TAG) {
|
|
404
|
+
case "Static" :
|
|
405
|
+
return;
|
|
406
|
+
case "SignalValue" :
|
|
407
|
+
let signal = value._0;
|
|
408
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
409
|
+
RuntimeDom$Xote.setAttrOrProp(domNode$1, key, Signal$Xote.get(signal));
|
|
410
|
+
}, undefined);
|
|
411
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer);
|
|
412
|
+
case "Compute" :
|
|
413
|
+
let compute = value._0;
|
|
414
|
+
let disposer$1 = Effect$Xote.runWithDisposer(() => {
|
|
415
|
+
RuntimeDom$Xote.setAttrOrProp(domNode$1, key, compute());
|
|
416
|
+
}, undefined);
|
|
417
|
+
return RuntimeOwner$Xote.addDisposer(owner, disposer$1);
|
|
418
|
+
}
|
|
446
419
|
});
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
420
|
+
events.forEach(param => {
|
|
421
|
+
domNode$1.addEventListener(param[0], param[1]);
|
|
422
|
+
});
|
|
423
|
+
let childWalker = make(domNode$1);
|
|
424
|
+
children.forEach(child => hydrateNodeWithWalker(child, childWalker));
|
|
425
|
+
});
|
|
426
|
+
case "Text" :
|
|
427
|
+
next(walker);
|
|
428
|
+
return;
|
|
429
|
+
case "SignalText" :
|
|
430
|
+
let signal = node._0;
|
|
431
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.signalTextStartContent);
|
|
432
|
+
let textNode = next(walker);
|
|
433
|
+
if (textNode === undefined) {
|
|
434
|
+
return logHydrationWarning("Missing text node for SignalText");
|
|
435
|
+
}
|
|
436
|
+
let textNode$1 = Primitive_option.valFromOption(textNode);
|
|
437
|
+
let owner$1 = RuntimeOwner$Xote.createOwner();
|
|
438
|
+
RuntimeOwner$Xote.setOwner(textNode$1, owner$1);
|
|
439
|
+
RuntimeOwner$Xote.runWithOwner(owner$1, () => {
|
|
440
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
441
|
+
textNode$1.textContent = Signal$Xote.get(signal);
|
|
442
|
+
}, undefined);
|
|
443
|
+
RuntimeOwner$Xote.addDisposer(owner$1, disposer);
|
|
444
|
+
});
|
|
445
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.signalTextEndContent);
|
|
446
|
+
return;
|
|
447
|
+
case "Fragment" :
|
|
448
|
+
node._0.forEach(child => hydrateNodeWithWalker(child, walker));
|
|
449
|
+
return;
|
|
450
|
+
case "SignalFragment" :
|
|
451
|
+
let signal$1 = node._0;
|
|
452
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.signalFragmentStartContent);
|
|
453
|
+
let contentNodes = collectUntilMarker(walker, RuntimeHydrationMarkers$Xote.signalFragmentEndContent);
|
|
454
|
+
let container = document.createElement("div");
|
|
455
|
+
container.setAttribute("style", "display: contents");
|
|
456
|
+
let firstNode = contentNodes[0];
|
|
457
|
+
let parent = firstNode !== undefined ? firstNode.parentNode : undefined;
|
|
458
|
+
contentNodes.forEach(node => {
|
|
459
|
+
container.appendChild(node);
|
|
460
|
+
});
|
|
461
|
+
let match = walker.current;
|
|
462
|
+
if (parent !== undefined) {
|
|
463
|
+
let p = Primitive_option.valFromOption(parent);
|
|
464
|
+
if (match !== undefined) {
|
|
465
|
+
p.insertBefore(container, Primitive_option.valFromOption(match));
|
|
466
|
+
} else {
|
|
467
|
+
p.appendChild(container);
|
|
466
468
|
}
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
469
|
+
}
|
|
470
|
+
let owner$2 = RuntimeOwner$Xote.createOwner();
|
|
471
|
+
RuntimeOwner$Xote.setOwner(container, owner$2);
|
|
472
|
+
let keyedItems = {};
|
|
473
|
+
let initialized = {
|
|
474
|
+
contents: false
|
|
475
|
+
};
|
|
476
|
+
return RuntimeOwner$Xote.runWithOwner(owner$2, () => {
|
|
477
|
+
let disposer = Effect$Xote.runWithDisposer(() => {
|
|
478
|
+
let children = Signal$Xote.get(signal$1);
|
|
479
|
+
let keyedChildren = View$Xote.Render.getKeyedChildren(children);
|
|
480
|
+
let exit = 0;
|
|
481
|
+
if (keyedChildren !== undefined && initialized.contents) {
|
|
482
|
+
View$Xote.Render.reconcileKeyedChildren(keyedChildren, keyedItems, container);
|
|
472
483
|
} else {
|
|
484
|
+
exit = 1;
|
|
485
|
+
}
|
|
486
|
+
if (exit === 1) {
|
|
487
|
+
View$Xote.Render.clearKeyedItems(keyedItems);
|
|
488
|
+
let childNodes = (Array.from(container.childNodes || []));
|
|
489
|
+
childNodes.forEach(View$Xote.Render.disposeElement);
|
|
490
|
+
container.innerHTML = "";
|
|
491
|
+
if (keyedChildren !== undefined) {
|
|
492
|
+
keyedChildren.forEach(keyedChild => {
|
|
493
|
+
let childEl = View$Xote.Render.render(keyedChild.child);
|
|
494
|
+
keyedItems[keyedChild.key] = {
|
|
495
|
+
key: keyedChild.key,
|
|
496
|
+
item: keyedChild.identity,
|
|
497
|
+
element: childEl
|
|
498
|
+
};
|
|
499
|
+
container.appendChild(childEl);
|
|
500
|
+
});
|
|
501
|
+
} else {
|
|
502
|
+
children.forEach(child => {
|
|
503
|
+
let childEl = View$Xote.Render.render(child);
|
|
504
|
+
container.appendChild(childEl);
|
|
505
|
+
});
|
|
506
|
+
}
|
|
507
|
+
initialized.contents = true;
|
|
508
|
+
}
|
|
509
|
+
}, undefined);
|
|
510
|
+
RuntimeOwner$Xote.addDisposer(owner$2, disposer);
|
|
511
|
+
});
|
|
512
|
+
case "Keyed" :
|
|
513
|
+
_node = node.child;
|
|
514
|
+
continue;
|
|
515
|
+
case "LazyComponent" :
|
|
516
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.lazyComponentStartContent);
|
|
517
|
+
let childNode = node._0();
|
|
518
|
+
hydrateNodeWithWalker(childNode, walker);
|
|
519
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.lazyComponentEndContent);
|
|
520
|
+
return;
|
|
521
|
+
case "KeyedList" :
|
|
522
|
+
let keyFn = node.keyFn;
|
|
523
|
+
let signal$2 = node.signal;
|
|
524
|
+
skipUntilMarker(walker, RuntimeHydrationMarkers$Xote.keyedListStartContent);
|
|
525
|
+
let keyedItems$1 = {};
|
|
526
|
+
let parseKeyedItems = () => {
|
|
527
|
+
while (true) {
|
|
528
|
+
let node = walker.current;
|
|
529
|
+
if (node === undefined) {
|
|
473
530
|
return;
|
|
474
531
|
}
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
532
|
+
let node$1 = Primitive_option.valFromOption(node);
|
|
533
|
+
if (!isMarkerPrefix(node$1, RuntimeHydrationMarkers$Xote.keyedItemPrefixContent)) {
|
|
534
|
+
if (isMarker(node$1, RuntimeHydrationMarkers$Xote.keyedListEndContent)) {
|
|
535
|
+
next(walker);
|
|
536
|
+
return;
|
|
537
|
+
} else {
|
|
538
|
+
return;
|
|
539
|
+
}
|
|
540
|
+
}
|
|
541
|
+
let key = Stdlib_Option.getOr(extractKey(node$1), "");
|
|
542
|
+
next(walker);
|
|
543
|
+
let itemElements = collectUntilMarker(walker, RuntimeHydrationMarkers$Xote.keyedItemEndContent);
|
|
544
|
+
let element = itemElements.find(el => el.nodeType === 1);
|
|
545
|
+
if (element !== undefined) {
|
|
546
|
+
let items = Signal$Xote.peek(signal$2);
|
|
547
|
+
let item = Stdlib_Option.getOr(items.find(i => keyFn(i) === key), {});
|
|
548
|
+
keyedItems$1[key] = {
|
|
549
|
+
key: key,
|
|
550
|
+
item: item,
|
|
551
|
+
element: Primitive_option.valFromOption(element)
|
|
552
|
+
};
|
|
553
|
+
}
|
|
554
|
+
continue;
|
|
555
|
+
};
|
|
490
556
|
};
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
}
|
|
557
|
+
return parseKeyedItems();
|
|
558
|
+
}
|
|
559
|
+
};
|
|
494
560
|
}
|
|
495
561
|
|
|
496
562
|
function hydrate(component, container, optionsOpt) {
|
|
@@ -526,9 +592,12 @@ let DOM;
|
|
|
526
592
|
|
|
527
593
|
let Reactivity;
|
|
528
594
|
|
|
595
|
+
let Markers;
|
|
596
|
+
|
|
529
597
|
export {
|
|
530
598
|
DOM,
|
|
531
599
|
Reactivity,
|
|
600
|
+
Markers,
|
|
532
601
|
DOMWalker,
|
|
533
602
|
HydrationMismatch,
|
|
534
603
|
logHydrationWarning,
|
|
@@ -537,4 +606,4 @@ export {
|
|
|
537
606
|
hydrate,
|
|
538
607
|
hydrateById,
|
|
539
608
|
}
|
|
540
|
-
/*
|
|
609
|
+
/* View-Xote Not a pure module */
|