xote 4.3.0 → 4.3.1

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.
@@ -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 */