xote 4.3.0 → 4.4.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 +5 -5
- package/package.json +6 -2
- package/rescript.json +30 -0
- package/src/Xote.res +23 -0
- package/src/Xote.res.mjs +88 -0
- package/src/Xote__Component.res +495 -0
- package/src/Xote__Component.res.mjs +487 -0
- package/src/Xote__JSX.res +677 -0
- package/src/Xote__JSX.res.mjs +356 -0
- package/src/Xote__Route.res +62 -0
- package/src/Xote__Route.res.mjs +56 -0
- package/src/Xote__Router.res +130 -0
- package/src/Xote__Router.res.mjs +116 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
// Generated by ReScript, PLEASE EDIT WITH CARE
|
|
2
|
+
|
|
3
|
+
import * as Signals from "rescript-signals/src/Signals.res.mjs";
|
|
4
|
+
import * as Core__Dict from "@rescript/core/src/Core__Dict.res.mjs";
|
|
5
|
+
import * as Core__Option from "@rescript/core/src/Core__Option.res.mjs";
|
|
6
|
+
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
|
|
7
|
+
|
|
8
|
+
let DOM = {};
|
|
9
|
+
|
|
10
|
+
let currentOwner = {
|
|
11
|
+
contents: undefined
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
function createOwner() {
|
|
15
|
+
return {
|
|
16
|
+
disposers: [],
|
|
17
|
+
computeds: []
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
function runWithOwner(owner, fn) {
|
|
22
|
+
let previousOwner = currentOwner.contents;
|
|
23
|
+
currentOwner.contents = owner;
|
|
24
|
+
let result = fn();
|
|
25
|
+
currentOwner.contents = previousOwner;
|
|
26
|
+
return result;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
function addDisposer(owner, disposer) {
|
|
30
|
+
owner.disposers.push(disposer);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function disposeOwner(owner) {
|
|
34
|
+
owner.disposers.forEach(disposer => disposer.dispose());
|
|
35
|
+
owner.computeds.forEach(computed => Signals.Computed.dispose(computed));
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function setOwner(element, owner) {
|
|
39
|
+
((element["__xote_owner__"] = owner));
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function getOwner(element) {
|
|
43
|
+
return Primitive_option.fromNullable((element["__xote_owner__"]));
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
let Reactivity = {
|
|
47
|
+
currentOwner: currentOwner,
|
|
48
|
+
createOwner: createOwner,
|
|
49
|
+
runWithOwner: runWithOwner,
|
|
50
|
+
addDisposer: addDisposer,
|
|
51
|
+
disposeOwner: disposeOwner,
|
|
52
|
+
setOwner: setOwner,
|
|
53
|
+
getOwner: getOwner
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
function $$static(key, value) {
|
|
57
|
+
return [
|
|
58
|
+
key,
|
|
59
|
+
{
|
|
60
|
+
TAG: "Static",
|
|
61
|
+
_0: value
|
|
62
|
+
}
|
|
63
|
+
];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function signal(key, signal$1) {
|
|
67
|
+
return [
|
|
68
|
+
key,
|
|
69
|
+
{
|
|
70
|
+
TAG: "SignalValue",
|
|
71
|
+
_0: signal$1
|
|
72
|
+
}
|
|
73
|
+
];
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function computed(key, compute) {
|
|
77
|
+
return [
|
|
78
|
+
key,
|
|
79
|
+
{
|
|
80
|
+
TAG: "Compute",
|
|
81
|
+
_0: compute
|
|
82
|
+
}
|
|
83
|
+
];
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let Attributes = {
|
|
87
|
+
$$static: $$static,
|
|
88
|
+
signal: signal,
|
|
89
|
+
computed: computed
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
function disposeElement(el) {
|
|
93
|
+
let owner = getOwner(el);
|
|
94
|
+
if (owner !== undefined) {
|
|
95
|
+
disposeOwner(owner);
|
|
96
|
+
}
|
|
97
|
+
let childNodes = (Array.from(el.childNodes || []));
|
|
98
|
+
childNodes.forEach(disposeElement);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function render(node) {
|
|
102
|
+
switch (node.TAG) {
|
|
103
|
+
case "Element" :
|
|
104
|
+
let children = node.children;
|
|
105
|
+
let events = node.events;
|
|
106
|
+
let attrs = node.attrs;
|
|
107
|
+
let el = document.createElement(node.tag);
|
|
108
|
+
let owner = {
|
|
109
|
+
disposers: [],
|
|
110
|
+
computeds: []
|
|
111
|
+
};
|
|
112
|
+
setOwner(el, owner);
|
|
113
|
+
runWithOwner(owner, () => {
|
|
114
|
+
attrs.forEach(param => {
|
|
115
|
+
let value = param[1];
|
|
116
|
+
let key = param[0];
|
|
117
|
+
switch (value.TAG) {
|
|
118
|
+
case "Static" :
|
|
119
|
+
el.setAttribute(key, value._0);
|
|
120
|
+
return;
|
|
121
|
+
case "SignalValue" :
|
|
122
|
+
let signal = value._0;
|
|
123
|
+
el.setAttribute(key, Signals.Signal.peek(signal));
|
|
124
|
+
let disposer = Signals.Effect.run(() => {
|
|
125
|
+
el.setAttribute(key, Signals.Signal.get(signal));
|
|
126
|
+
}, undefined);
|
|
127
|
+
return addDisposer(owner, disposer);
|
|
128
|
+
case "Compute" :
|
|
129
|
+
let compute = value._0;
|
|
130
|
+
el.setAttribute(key, compute());
|
|
131
|
+
let disposer$1 = Signals.Effect.run(() => {
|
|
132
|
+
el.setAttribute(key, compute());
|
|
133
|
+
}, undefined);
|
|
134
|
+
return addDisposer(owner, disposer$1);
|
|
135
|
+
}
|
|
136
|
+
});
|
|
137
|
+
events.forEach(param => {
|
|
138
|
+
el.addEventListener(param[0], param[1]);
|
|
139
|
+
});
|
|
140
|
+
children.forEach(child => {
|
|
141
|
+
let childEl = render(child);
|
|
142
|
+
el.appendChild(childEl);
|
|
143
|
+
});
|
|
144
|
+
});
|
|
145
|
+
return el;
|
|
146
|
+
case "Text" :
|
|
147
|
+
return document.createTextNode(node._0);
|
|
148
|
+
case "SignalText" :
|
|
149
|
+
let signal = node._0;
|
|
150
|
+
let textNode = document.createTextNode(Signals.Signal.peek(signal));
|
|
151
|
+
let owner$1 = {
|
|
152
|
+
disposers: [],
|
|
153
|
+
computeds: []
|
|
154
|
+
};
|
|
155
|
+
setOwner(textNode, owner$1);
|
|
156
|
+
runWithOwner(owner$1, () => {
|
|
157
|
+
let disposer = Signals.Effect.run(() => {
|
|
158
|
+
textNode.textContent = Signals.Signal.get(signal);
|
|
159
|
+
}, undefined);
|
|
160
|
+
addDisposer(owner$1, disposer);
|
|
161
|
+
});
|
|
162
|
+
return textNode;
|
|
163
|
+
case "Fragment" :
|
|
164
|
+
let fragment = document.createDocumentFragment();
|
|
165
|
+
node._0.forEach(child => {
|
|
166
|
+
let childEl = render(child);
|
|
167
|
+
fragment.appendChild(childEl);
|
|
168
|
+
});
|
|
169
|
+
return fragment;
|
|
170
|
+
case "SignalFragment" :
|
|
171
|
+
let signal$1 = node._0;
|
|
172
|
+
let owner$2 = {
|
|
173
|
+
disposers: [],
|
|
174
|
+
computeds: []
|
|
175
|
+
};
|
|
176
|
+
let container = document.createElement("div");
|
|
177
|
+
container.setAttribute("style", "display: contents");
|
|
178
|
+
setOwner(container, owner$2);
|
|
179
|
+
runWithOwner(owner$2, () => {
|
|
180
|
+
let disposer = Signals.Effect.run(() => {
|
|
181
|
+
let children = Signals.Signal.get(signal$1);
|
|
182
|
+
let childNodes = (Array.from(container.childNodes || []));
|
|
183
|
+
childNodes.forEach(disposeElement);
|
|
184
|
+
((container.innerHTML = ''));
|
|
185
|
+
children.forEach(child => {
|
|
186
|
+
let childEl = render(child);
|
|
187
|
+
container.appendChild(childEl);
|
|
188
|
+
});
|
|
189
|
+
}, undefined);
|
|
190
|
+
addDisposer(owner$2, disposer);
|
|
191
|
+
});
|
|
192
|
+
return container;
|
|
193
|
+
case "LazyComponent" :
|
|
194
|
+
let owner$3 = {
|
|
195
|
+
disposers: [],
|
|
196
|
+
computeds: []
|
|
197
|
+
};
|
|
198
|
+
let childNode = runWithOwner(owner$3, node._0);
|
|
199
|
+
let el$1 = render(childNode);
|
|
200
|
+
setOwner(el$1, owner$3);
|
|
201
|
+
return el$1;
|
|
202
|
+
case "KeyedList" :
|
|
203
|
+
let renderItem = node.renderItem;
|
|
204
|
+
let keyFn = node.keyFn;
|
|
205
|
+
let signal$2 = node.signal;
|
|
206
|
+
let owner$4 = {
|
|
207
|
+
disposers: [],
|
|
208
|
+
computeds: []
|
|
209
|
+
};
|
|
210
|
+
let startAnchor = document.createComment(" keyed-list-start ");
|
|
211
|
+
let endAnchor = document.createComment(" keyed-list-end ");
|
|
212
|
+
setOwner(startAnchor, owner$4);
|
|
213
|
+
let keyedItems = {};
|
|
214
|
+
let reconcile = () => {
|
|
215
|
+
let parentOpt = endAnchor.parentNode;
|
|
216
|
+
if (parentOpt == null) {
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
let newItems = Signals.Signal.get(signal$2);
|
|
220
|
+
let newKeyMap = {};
|
|
221
|
+
newItems.forEach(item => {
|
|
222
|
+
newKeyMap[keyFn(item)] = item;
|
|
223
|
+
});
|
|
224
|
+
let keysToRemove = [];
|
|
225
|
+
Object.keys(keyedItems).forEach(key => {
|
|
226
|
+
let match = newKeyMap[key];
|
|
227
|
+
if (match !== undefined) {
|
|
228
|
+
return;
|
|
229
|
+
} else {
|
|
230
|
+
keysToRemove.push(key);
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
});
|
|
234
|
+
keysToRemove.forEach(key => {
|
|
235
|
+
let keyedItem = keyedItems[key];
|
|
236
|
+
if (keyedItem !== undefined) {
|
|
237
|
+
disposeElement(keyedItem.element);
|
|
238
|
+
((keyedItem.element.remove()));
|
|
239
|
+
Core__Dict.$$delete(keyedItems, key);
|
|
240
|
+
return;
|
|
241
|
+
}
|
|
242
|
+
});
|
|
243
|
+
let newOrder = [];
|
|
244
|
+
let elementsToReplace = {};
|
|
245
|
+
newItems.forEach(item => {
|
|
246
|
+
let key = keyFn(item);
|
|
247
|
+
let existing = keyedItems[key];
|
|
248
|
+
if (existing !== undefined) {
|
|
249
|
+
if (existing.item !== item) {
|
|
250
|
+
elementsToReplace[key] = true;
|
|
251
|
+
let node = renderItem(item);
|
|
252
|
+
let element = render(node);
|
|
253
|
+
let keyedItem = {
|
|
254
|
+
key: key,
|
|
255
|
+
item: item,
|
|
256
|
+
element: element
|
|
257
|
+
};
|
|
258
|
+
newOrder.push(keyedItem);
|
|
259
|
+
keyedItems[key] = keyedItem;
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
newOrder.push(existing);
|
|
263
|
+
return;
|
|
264
|
+
}
|
|
265
|
+
let node$1 = renderItem(item);
|
|
266
|
+
let element$1 = render(node$1);
|
|
267
|
+
let keyedItem$1 = {
|
|
268
|
+
key: key,
|
|
269
|
+
item: item,
|
|
270
|
+
element: element$1
|
|
271
|
+
};
|
|
272
|
+
newOrder.push(keyedItem$1);
|
|
273
|
+
keyedItems[key] = keyedItem$1;
|
|
274
|
+
});
|
|
275
|
+
let marker = {
|
|
276
|
+
contents: startAnchor.nextSibling
|
|
277
|
+
};
|
|
278
|
+
newOrder.forEach(keyedItem => {
|
|
279
|
+
let currentElement = marker.contents;
|
|
280
|
+
if (currentElement == null) {
|
|
281
|
+
parentOpt.insertBefore(keyedItem.element, endAnchor);
|
|
282
|
+
return;
|
|
283
|
+
}
|
|
284
|
+
if (currentElement === endAnchor) {
|
|
285
|
+
parentOpt.insertBefore(keyedItem.element, endAnchor);
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
if (currentElement === keyedItem.element) {
|
|
289
|
+
marker.contents = currentElement.nextSibling;
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
let needsReplacement = Core__Option.getOr(elementsToReplace[keyedItem.key], false);
|
|
293
|
+
if (needsReplacement) {
|
|
294
|
+
disposeElement(currentElement);
|
|
295
|
+
parentOpt.replaceChild(keyedItem.element, currentElement);
|
|
296
|
+
marker.contents = keyedItem.element.nextSibling;
|
|
297
|
+
} else {
|
|
298
|
+
parentOpt.insertBefore(keyedItem.element, currentElement);
|
|
299
|
+
marker.contents = keyedItem.element.nextSibling;
|
|
300
|
+
}
|
|
301
|
+
});
|
|
302
|
+
};
|
|
303
|
+
let fragment$1 = document.createDocumentFragment();
|
|
304
|
+
fragment$1.appendChild(startAnchor);
|
|
305
|
+
let initialItems = Signals.Signal.peek(signal$2);
|
|
306
|
+
initialItems.forEach(item => {
|
|
307
|
+
let key = keyFn(item);
|
|
308
|
+
let node = renderItem(item);
|
|
309
|
+
let element = render(node);
|
|
310
|
+
let keyedItem = {
|
|
311
|
+
key: key,
|
|
312
|
+
item: item,
|
|
313
|
+
element: element
|
|
314
|
+
};
|
|
315
|
+
keyedItems[key] = keyedItem;
|
|
316
|
+
fragment$1.appendChild(element);
|
|
317
|
+
});
|
|
318
|
+
fragment$1.appendChild(endAnchor);
|
|
319
|
+
runWithOwner(owner$4, () => {
|
|
320
|
+
let disposer = Signals.Effect.run(() => {
|
|
321
|
+
reconcile();
|
|
322
|
+
}, undefined);
|
|
323
|
+
addDisposer(owner$4, disposer);
|
|
324
|
+
});
|
|
325
|
+
return fragment$1;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
let Render = {
|
|
330
|
+
disposeElement: disposeElement,
|
|
331
|
+
render: render
|
|
332
|
+
};
|
|
333
|
+
|
|
334
|
+
function text(content) {
|
|
335
|
+
return {
|
|
336
|
+
TAG: "Text",
|
|
337
|
+
_0: content
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
function textSignal(compute) {
|
|
342
|
+
let signal = Signals.Computed.make(compute, undefined);
|
|
343
|
+
return {
|
|
344
|
+
TAG: "SignalText",
|
|
345
|
+
_0: signal
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
function fragment(children) {
|
|
350
|
+
return {
|
|
351
|
+
TAG: "Fragment",
|
|
352
|
+
_0: children
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
function signalFragment(signal) {
|
|
357
|
+
return {
|
|
358
|
+
TAG: "SignalFragment",
|
|
359
|
+
_0: signal
|
|
360
|
+
};
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
function list(signal, renderItem) {
|
|
364
|
+
let nodesSignal = Signals.Computed.make(() => Signals.Signal.get(signal).map(renderItem), undefined);
|
|
365
|
+
return {
|
|
366
|
+
TAG: "SignalFragment",
|
|
367
|
+
_0: nodesSignal
|
|
368
|
+
};
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
function keyedList(signal, keyFn, renderItem) {
|
|
372
|
+
return {
|
|
373
|
+
TAG: "KeyedList",
|
|
374
|
+
signal: signal,
|
|
375
|
+
keyFn: keyFn,
|
|
376
|
+
renderItem: renderItem
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
function element(tag, attrsOpt, eventsOpt, childrenOpt, param) {
|
|
381
|
+
let attrs = attrsOpt !== undefined ? attrsOpt : [].map(x => x);
|
|
382
|
+
let events = eventsOpt !== undefined ? eventsOpt : [].map(x => x);
|
|
383
|
+
let children = childrenOpt !== undefined ? childrenOpt : [].map(x => x);
|
|
384
|
+
return {
|
|
385
|
+
TAG: "Element",
|
|
386
|
+
tag: tag,
|
|
387
|
+
attrs: attrs,
|
|
388
|
+
events: events,
|
|
389
|
+
children: children
|
|
390
|
+
};
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
function div(attrs, events, children, param) {
|
|
394
|
+
return element("div", attrs, events, children, undefined);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
function span(attrs, events, children, param) {
|
|
398
|
+
return element("span", attrs, events, children, undefined);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
function button(attrs, events, children, param) {
|
|
402
|
+
return element("button", attrs, events, children, undefined);
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function input(attrs, events, param) {
|
|
406
|
+
return element("input", attrs, events, undefined, undefined);
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
function h1(attrs, events, children, param) {
|
|
410
|
+
return element("h1", attrs, events, children, undefined);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function h2(attrs, events, children, param) {
|
|
414
|
+
return element("h2", attrs, events, children, undefined);
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
function h3(attrs, events, children, param) {
|
|
418
|
+
return element("h3", attrs, events, children, undefined);
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
function p(attrs, events, children, param) {
|
|
422
|
+
return element("p", attrs, events, children, undefined);
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
function ul(attrs, events, children, param) {
|
|
426
|
+
return element("ul", attrs, events, children, undefined);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
function li(attrs, events, children, param) {
|
|
430
|
+
return element("li", attrs, events, children, undefined);
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
function a(attrs, events, children, param) {
|
|
434
|
+
return element("a", attrs, events, children, undefined);
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
function mount(node, container) {
|
|
438
|
+
let el = render(node);
|
|
439
|
+
container.appendChild(el);
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
function mountById(node, containerId) {
|
|
443
|
+
let container = document.getElementById(containerId);
|
|
444
|
+
if (container == null) {
|
|
445
|
+
console.error("Container element not found: " + containerId);
|
|
446
|
+
return;
|
|
447
|
+
} else {
|
|
448
|
+
return mount(node, container);
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
let attr = $$static;
|
|
453
|
+
|
|
454
|
+
let signalAttr = signal;
|
|
455
|
+
|
|
456
|
+
let computedAttr = computed;
|
|
457
|
+
|
|
458
|
+
export {
|
|
459
|
+
DOM,
|
|
460
|
+
Reactivity,
|
|
461
|
+
Attributes,
|
|
462
|
+
attr,
|
|
463
|
+
signalAttr,
|
|
464
|
+
computedAttr,
|
|
465
|
+
Render,
|
|
466
|
+
text,
|
|
467
|
+
textSignal,
|
|
468
|
+
fragment,
|
|
469
|
+
signalFragment,
|
|
470
|
+
list,
|
|
471
|
+
keyedList,
|
|
472
|
+
element,
|
|
473
|
+
div,
|
|
474
|
+
span,
|
|
475
|
+
button,
|
|
476
|
+
input,
|
|
477
|
+
h1,
|
|
478
|
+
h2,
|
|
479
|
+
h3,
|
|
480
|
+
p,
|
|
481
|
+
ul,
|
|
482
|
+
li,
|
|
483
|
+
a,
|
|
484
|
+
mount,
|
|
485
|
+
mountById,
|
|
486
|
+
}
|
|
487
|
+
/* Signals Not a pure module */
|