creo 0.2.5 → 0.2.6
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 +4 -2
- package/dist/functional/key.d.ts +0 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +167 -63
- package/dist/index.js.map +12 -12
- package/dist/internal/internal_view.d.ts +4 -0
- package/dist/public/state.d.ts +6 -0
- package/dist/public/view.d.ts +3 -7
- package/dist/render/html_render.d.ts +7 -0
- package/dist/render/render_interface.d.ts +14 -0
- package/dist/render/string_render.d.ts +0 -2
- package/package.json +1 -1
- package/dist/public/event_handle.d.ts +0 -32
- package/dist/render/canvas_render.d.ts +0 -1
- package/dist/render/stream_render.d.ts +0 -1
- package/dist/structures/indexed_list.d.ts +0 -46
- package/dist/structures/list.d.ts +0 -68
package/README.md
CHANGED
|
@@ -336,8 +336,10 @@ bun test packages/creo/src/ # Run tests
|
|
|
336
336
|
bun run build # Build all packages
|
|
337
337
|
bun run typecheck # Type-check
|
|
338
338
|
|
|
339
|
-
# Run
|
|
340
|
-
cd
|
|
339
|
+
# Run the docs site (with the live recipe playground — simple-todo, advanced-todo, table, chess, etc.):
|
|
340
|
+
cd docs && bun install && bun run dev
|
|
341
|
+
|
|
342
|
+
# Run a standalone example:
|
|
341
343
|
cd examples/router && bun install && bun run dev
|
|
342
344
|
|
|
343
345
|
# Version management:
|
package/dist/functional/key.d.ts
CHANGED
package/dist/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export type { IRender } from "./render/render_interface";
|
|
|
12
12
|
export { HtmlRender } from "./render/html_render";
|
|
13
13
|
export { JsonRender } from "./render/json_render";
|
|
14
14
|
export type { JsonNode } from "./render/json_render";
|
|
15
|
-
export { HtmlStringRender
|
|
15
|
+
export { HtmlStringRender } from "./render/string_render";
|
|
16
16
|
export { Engine, type Scheduler } from "./internal/engine";
|
|
17
17
|
export { type Maybe, type None, type Just, just, withDefault, _ } from "./functional/maybe";
|
|
18
18
|
export type { Key } from "./functional/key";
|
package/dist/index.js
CHANGED
|
@@ -177,6 +177,7 @@ var area = html("area");
|
|
|
177
177
|
class State {
|
|
178
178
|
#current;
|
|
179
179
|
#schedule;
|
|
180
|
+
#pending;
|
|
180
181
|
constructor(initial, schedule) {
|
|
181
182
|
this.#current = initial;
|
|
182
183
|
this.#schedule = schedule;
|
|
@@ -185,30 +186,49 @@ class State {
|
|
|
185
186
|
return this.#current;
|
|
186
187
|
}
|
|
187
188
|
set(value) {
|
|
189
|
+
this.#pending = null;
|
|
188
190
|
this.#current = value;
|
|
189
191
|
this.#schedule();
|
|
190
192
|
}
|
|
191
193
|
update(fn) {
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
194
|
+
if (this.#pending) {
|
|
195
|
+
const next = this.#pending.then((v) => fn(v));
|
|
196
|
+
this.#pending = next;
|
|
197
|
+
next.then((value) => {
|
|
198
|
+
if (this.#pending !== next)
|
|
199
|
+
return;
|
|
200
|
+
this.#pending = null;
|
|
195
201
|
this.#current = value;
|
|
196
202
|
this.#schedule();
|
|
197
203
|
});
|
|
198
|
-
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const result = fn(this.#current);
|
|
207
|
+
if (!(result instanceof Promise)) {
|
|
199
208
|
this.#current = result;
|
|
200
209
|
this.#schedule();
|
|
210
|
+
return;
|
|
201
211
|
}
|
|
212
|
+
const captured = result;
|
|
213
|
+
this.#pending = captured;
|
|
214
|
+
captured.then((value) => {
|
|
215
|
+
if (this.#pending !== captured)
|
|
216
|
+
return;
|
|
217
|
+
this.#pending = null;
|
|
218
|
+
this.#current = value;
|
|
219
|
+
this.#schedule();
|
|
220
|
+
});
|
|
202
221
|
}
|
|
203
222
|
}
|
|
204
223
|
|
|
205
224
|
// src/public/store.ts
|
|
206
|
-
var $store = Symbol("store");
|
|
225
|
+
var $store = Symbol.for("creo.store");
|
|
207
226
|
|
|
208
227
|
class Store {
|
|
209
228
|
[$store] = true;
|
|
210
229
|
#current;
|
|
211
230
|
#subscribers = new Set;
|
|
231
|
+
#pending;
|
|
212
232
|
constructor(initial) {
|
|
213
233
|
this.#current = initial;
|
|
214
234
|
}
|
|
@@ -216,20 +236,38 @@ class Store {
|
|
|
216
236
|
return this.#current;
|
|
217
237
|
}
|
|
218
238
|
set(value) {
|
|
239
|
+
this.#pending = null;
|
|
219
240
|
this.#current = value;
|
|
220
241
|
this.#notify();
|
|
221
242
|
}
|
|
222
243
|
update(fn) {
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
244
|
+
if (this.#pending) {
|
|
245
|
+
const next = this.#pending.then((v) => fn(v));
|
|
246
|
+
this.#pending = next;
|
|
247
|
+
next.then((value) => {
|
|
248
|
+
if (this.#pending !== next)
|
|
249
|
+
return;
|
|
250
|
+
this.#pending = null;
|
|
226
251
|
this.#current = value;
|
|
227
252
|
this.#notify();
|
|
228
253
|
});
|
|
229
|
-
|
|
254
|
+
return;
|
|
255
|
+
}
|
|
256
|
+
const result = fn(this.#current);
|
|
257
|
+
if (!(result instanceof Promise)) {
|
|
230
258
|
this.#current = result;
|
|
231
259
|
this.#notify();
|
|
260
|
+
return;
|
|
232
261
|
}
|
|
262
|
+
const captured = result;
|
|
263
|
+
this.#pending = captured;
|
|
264
|
+
captured.then((value) => {
|
|
265
|
+
if (this.#pending !== captured)
|
|
266
|
+
return;
|
|
267
|
+
this.#pending = null;
|
|
268
|
+
this.#current = value;
|
|
269
|
+
this.#notify();
|
|
270
|
+
});
|
|
233
271
|
}
|
|
234
272
|
subscribe(cb) {
|
|
235
273
|
this.#subscribers.add(cb);
|
|
@@ -262,12 +300,15 @@ function shallowEqual(a2, b2) {
|
|
|
262
300
|
let countA = 0;
|
|
263
301
|
for (const key in a2) {
|
|
264
302
|
countA++;
|
|
265
|
-
if (
|
|
303
|
+
if (a2[key] !== b2[key])
|
|
266
304
|
return false;
|
|
267
305
|
}
|
|
268
306
|
let countB = 0;
|
|
269
|
-
for (const _ in b2)
|
|
307
|
+
for (const _ in b2) {
|
|
270
308
|
countB++;
|
|
309
|
+
if (countB > countA)
|
|
310
|
+
return false;
|
|
311
|
+
}
|
|
271
312
|
return countA === countB;
|
|
272
313
|
}
|
|
273
314
|
|
|
@@ -307,17 +348,6 @@ function lis(arr) {
|
|
|
307
348
|
}
|
|
308
349
|
|
|
309
350
|
// src/internal/engine.ts
|
|
310
|
-
var STATEFUL_DOM_KEYS = ["value", "checked", "selected", "indeterminate", "muted"];
|
|
311
|
-
function hasStatefulDomKey(props) {
|
|
312
|
-
if (props == null || typeof props !== "object")
|
|
313
|
-
return false;
|
|
314
|
-
for (const k of STATEFUL_DOM_KEYS) {
|
|
315
|
-
if (k in props)
|
|
316
|
-
return true;
|
|
317
|
-
}
|
|
318
|
-
return false;
|
|
319
|
-
}
|
|
320
|
-
|
|
321
351
|
class Engine {
|
|
322
352
|
renderer;
|
|
323
353
|
#dirtyQueue = new Set;
|
|
@@ -345,11 +375,17 @@ class Engine {
|
|
|
345
375
|
keyToView: null,
|
|
346
376
|
unsubscribe: null,
|
|
347
377
|
parent,
|
|
348
|
-
scHost: null
|
|
378
|
+
scHost: null,
|
|
379
|
+
pos: -1
|
|
349
380
|
};
|
|
350
381
|
if (slot2) {
|
|
351
|
-
|
|
352
|
-
|
|
382
|
+
if (typeof slot2 === "string") {
|
|
383
|
+
res.sc = [
|
|
384
|
+
this.newView(textViewFn, res, slot2, null, null)
|
|
385
|
+
];
|
|
386
|
+
} else {
|
|
387
|
+
res.sc = this.#collect(slot2, [], res);
|
|
388
|
+
}
|
|
353
389
|
}
|
|
354
390
|
return res;
|
|
355
391
|
}
|
|
@@ -448,11 +484,6 @@ class Engine {
|
|
|
448
484
|
this.#collectFor = beforeParent;
|
|
449
485
|
return collector;
|
|
450
486
|
}
|
|
451
|
-
#stringSlot(content) {
|
|
452
|
-
return () => {
|
|
453
|
-
this.view(textViewFn, content, null, null);
|
|
454
|
-
};
|
|
455
|
-
}
|
|
456
487
|
nextProps(view2, nextProps, nextSlot, preCollectedSc) {
|
|
457
488
|
const prevSc = view2.sc;
|
|
458
489
|
view2.slot = nextSlot;
|
|
@@ -460,16 +491,19 @@ class Engine {
|
|
|
460
491
|
for (const child of preCollectedSc)
|
|
461
492
|
child.parent = view2;
|
|
462
493
|
view2.sc = preCollectedSc;
|
|
463
|
-
} else {
|
|
464
|
-
if (nextSlot) {
|
|
465
|
-
|
|
466
|
-
|
|
494
|
+
} else if (nextSlot) {
|
|
495
|
+
if (typeof nextSlot === "string") {
|
|
496
|
+
view2.sc = [
|
|
497
|
+
this.newView(textViewFn, view2, nextSlot, null, null)
|
|
498
|
+
];
|
|
467
499
|
} else {
|
|
468
|
-
view2.sc =
|
|
500
|
+
view2.sc = this.#collect(nextSlot, [], view2);
|
|
469
501
|
}
|
|
502
|
+
} else {
|
|
503
|
+
view2.sc = null;
|
|
470
504
|
}
|
|
471
505
|
const structChanged = hasScStructuralChange(prevSc, view2.sc);
|
|
472
|
-
const shouldUpdate = view2.body?.shouldUpdate ? view2.body.shouldUpdate(nextProps) : !shallowEqual(view2.props, nextProps) || (view2.flags & F_PRIMITIVE) !== 0 &&
|
|
506
|
+
const shouldUpdate = view2.body?.shouldUpdate ? view2.body.shouldUpdate(nextProps) : !shallowEqual(view2.props, nextProps) || (view2.flags & F_PRIMITIVE) !== 0 && this.renderer.shouldReassert?.(view2, nextProps) === true;
|
|
473
507
|
if (shouldUpdate || structChanged) {
|
|
474
508
|
view2.props = nextProps;
|
|
475
509
|
this.markDirty(view2);
|
|
@@ -521,7 +555,9 @@ class Engine {
|
|
|
521
555
|
}
|
|
522
556
|
if (view2.children == null) {
|
|
523
557
|
view2.children = pendingChildren;
|
|
524
|
-
for (
|
|
558
|
+
for (let i2 = 0;i2 < pendingChildren.length; i2++) {
|
|
559
|
+
const child = pendingChildren[i2];
|
|
560
|
+
child.pos = i2;
|
|
525
561
|
this.initViewBody(child);
|
|
526
562
|
this.markDirty(child);
|
|
527
563
|
if (child.userKey != null) {
|
|
@@ -547,9 +583,11 @@ class Engine {
|
|
|
547
583
|
const old = oldChildren[i2];
|
|
548
584
|
const pend = pending[i2];
|
|
549
585
|
this.#patchOrReplace(view2, oldChildren, i2, old, pend);
|
|
586
|
+
oldChildren[i2].pos = i2;
|
|
550
587
|
}
|
|
551
588
|
for (let i2 = oldLen;i2 < newLen; i2++) {
|
|
552
589
|
oldChildren[i2] = pending[i2];
|
|
590
|
+
pending[i2].pos = i2;
|
|
553
591
|
this.initViewBody(pending[i2]);
|
|
554
592
|
this.markDirty(pending[i2]);
|
|
555
593
|
}
|
|
@@ -589,21 +627,46 @@ class Engine {
|
|
|
589
627
|
view2.keyToView.set(pending[j].userKey, pending[j]);
|
|
590
628
|
}
|
|
591
629
|
}
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
630
|
+
const tailStart2 = oldEnd + 1;
|
|
631
|
+
const tailLen2 = oldChildren.length - tailStart2;
|
|
632
|
+
const insertCount = newEnd - i2 + 1;
|
|
633
|
+
const out2 = new Array(i2 + insertCount + tailLen2);
|
|
634
|
+
for (let j = 0;j < i2; j++) {
|
|
635
|
+
const c = oldChildren[j];
|
|
636
|
+
c.pos = j;
|
|
637
|
+
out2[j] = c;
|
|
638
|
+
}
|
|
639
|
+
for (let j = 0;j < insertCount; j++) {
|
|
640
|
+
const c = pending[i2 + j];
|
|
641
|
+
c.pos = i2 + j;
|
|
642
|
+
out2[i2 + j] = c;
|
|
643
|
+
}
|
|
644
|
+
for (let j = 0;j < tailLen2; j++) {
|
|
645
|
+
const c = oldChildren[tailStart2 + j];
|
|
646
|
+
c.pos = i2 + insertCount + j;
|
|
647
|
+
out2[i2 + insertCount + j] = c;
|
|
648
|
+
}
|
|
649
|
+
view2.children = out2;
|
|
597
650
|
return;
|
|
598
651
|
}
|
|
599
652
|
if (i2 > newEnd) {
|
|
600
653
|
for (let j = i2;j <= oldEnd; j++) {
|
|
601
654
|
this.dispose(oldChildren[j]);
|
|
602
655
|
}
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
656
|
+
const tailStart2 = oldEnd + 1;
|
|
657
|
+
const tailLen2 = oldChildren.length - tailStart2;
|
|
658
|
+
const out2 = new Array(i2 + tailLen2);
|
|
659
|
+
for (let j = 0;j < i2; j++) {
|
|
660
|
+
const c = oldChildren[j];
|
|
661
|
+
c.pos = j;
|
|
662
|
+
out2[j] = c;
|
|
663
|
+
}
|
|
664
|
+
for (let j = 0;j < tailLen2; j++) {
|
|
665
|
+
const c = oldChildren[tailStart2 + j];
|
|
666
|
+
c.pos = i2 + j;
|
|
667
|
+
out2[i2 + j] = c;
|
|
668
|
+
}
|
|
669
|
+
view2.children = out2;
|
|
607
670
|
return;
|
|
608
671
|
}
|
|
609
672
|
const newKeyToIndex = new Map;
|
|
@@ -630,7 +693,14 @@ class Engine {
|
|
|
630
693
|
}
|
|
631
694
|
}
|
|
632
695
|
const stable = lis(newIdxToOldIdx);
|
|
633
|
-
const
|
|
696
|
+
const tailStart = oldEnd + 1;
|
|
697
|
+
const tailLen = oldChildren.length - tailStart;
|
|
698
|
+
const out = new Array(i2 + middleLen + tailLen);
|
|
699
|
+
for (let j = 0;j < i2; j++) {
|
|
700
|
+
const c = oldChildren[j];
|
|
701
|
+
c.pos = j;
|
|
702
|
+
out[j] = c;
|
|
703
|
+
}
|
|
634
704
|
for (let j = middleLen - 1;j >= 0; j--) {
|
|
635
705
|
const newIdx = i2 + j;
|
|
636
706
|
const pendView = pending[newIdx];
|
|
@@ -642,19 +712,25 @@ class Engine {
|
|
|
642
712
|
view2.keyToView = new Map;
|
|
643
713
|
view2.keyToView.set(pendView.userKey, pendView);
|
|
644
714
|
}
|
|
645
|
-
|
|
715
|
+
pendView.pos = i2 + j;
|
|
716
|
+
out[i2 + j] = pendView;
|
|
646
717
|
} else {
|
|
647
718
|
const oldView = oldChildren[newIdxToOldIdx[j]];
|
|
648
719
|
this.#patchOrReplace(view2, oldChildren, newIdxToOldIdx[j], oldView, pendView);
|
|
649
720
|
if (!stable.has(j)) {
|
|
650
721
|
this.markMoved(oldView);
|
|
651
722
|
}
|
|
652
|
-
|
|
723
|
+
const placed = oldChildren[newIdxToOldIdx[j]];
|
|
724
|
+
placed.pos = i2 + j;
|
|
725
|
+
out[i2 + j] = placed;
|
|
653
726
|
}
|
|
654
727
|
}
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
728
|
+
for (let j = 0;j < tailLen; j++) {
|
|
729
|
+
const c = oldChildren[tailStart + j];
|
|
730
|
+
c.pos = i2 + middleLen + j;
|
|
731
|
+
out[i2 + middleLen + j] = c;
|
|
732
|
+
}
|
|
733
|
+
view2.children = out;
|
|
658
734
|
}
|
|
659
735
|
#patchOrReplace(parent, oldChildren, idx, oldView, pendView) {
|
|
660
736
|
if (oldView.viewFn === pendView.viewFn) {
|
|
@@ -992,6 +1068,7 @@ class HtmlRender {
|
|
|
992
1068
|
const domRef = { element, prevProps: null };
|
|
993
1069
|
view2.renderRef = domRef;
|
|
994
1070
|
this.setAttributes(element, props);
|
|
1071
|
+
domRef.prevProps = props;
|
|
995
1072
|
if (view2.children?.length === 1) {
|
|
996
1073
|
const child = view2.children[0];
|
|
997
1074
|
if (child.flags & F_PRIMITIVE && child.viewFn[$primitive] === "text") {
|
|
@@ -1001,6 +1078,9 @@ class HtmlRender {
|
|
|
1001
1078
|
}
|
|
1002
1079
|
}
|
|
1003
1080
|
parentNode.insertBefore(element, refNode);
|
|
1081
|
+
if (props != null && props.autofocus === true && typeof element.focus === "function") {
|
|
1082
|
+
element.focus();
|
|
1083
|
+
}
|
|
1004
1084
|
}
|
|
1005
1085
|
} else {
|
|
1006
1086
|
view2.renderRef = true;
|
|
@@ -1050,6 +1130,28 @@ class HtmlRender {
|
|
|
1050
1130
|
}
|
|
1051
1131
|
view2.renderRef = undefined;
|
|
1052
1132
|
}
|
|
1133
|
+
shouldReassert(view2, nextProps) {
|
|
1134
|
+
if (nextProps == null || typeof nextProps !== "object")
|
|
1135
|
+
return false;
|
|
1136
|
+
const ref = view2.renderRef;
|
|
1137
|
+
if (!ref || ref.element instanceof Text)
|
|
1138
|
+
return false;
|
|
1139
|
+
const el = ref.element;
|
|
1140
|
+
const props = nextProps;
|
|
1141
|
+
for (const key of DOM_PROPERTIES) {
|
|
1142
|
+
if (!(key in props))
|
|
1143
|
+
continue;
|
|
1144
|
+
const live = el[key];
|
|
1145
|
+
const next = props[key];
|
|
1146
|
+
if (typeof next === "boolean" || typeof live === "boolean") {
|
|
1147
|
+
if (Boolean(live) !== Boolean(next))
|
|
1148
|
+
return true;
|
|
1149
|
+
} else if (String(live) !== String(next)) {
|
|
1150
|
+
return true;
|
|
1151
|
+
}
|
|
1152
|
+
}
|
|
1153
|
+
return false;
|
|
1154
|
+
}
|
|
1053
1155
|
findParentDom(view2) {
|
|
1054
1156
|
let parent = view2.parent;
|
|
1055
1157
|
while (parent) {
|
|
@@ -1070,7 +1172,9 @@ class HtmlRender {
|
|
|
1070
1172
|
if (children[children.length - 1] === view2) {
|
|
1071
1173
|
return this.#parentEndAnchor(parent);
|
|
1072
1174
|
}
|
|
1073
|
-
|
|
1175
|
+
let idx = view2.pos;
|
|
1176
|
+
if (idx < 0 || children[idx] !== view2)
|
|
1177
|
+
idx = children.indexOf(view2);
|
|
1074
1178
|
for (let i2 = idx + 1;i2 < children.length; i2++) {
|
|
1075
1179
|
const dom = this.getFirstDomNode(children[i2]);
|
|
1076
1180
|
if (dom)
|
|
@@ -1117,7 +1221,7 @@ class HtmlRender {
|
|
|
1117
1221
|
const creoName = key.slice(2);
|
|
1118
1222
|
const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();
|
|
1119
1223
|
const evObj = element[$EV];
|
|
1120
|
-
if (evObj) {
|
|
1224
|
+
if (evObj && domEvent in evObj) {
|
|
1121
1225
|
evObj[domEvent] = value;
|
|
1122
1226
|
} else {
|
|
1123
1227
|
this.bindEvent(element, key, value);
|
|
@@ -1230,7 +1334,7 @@ class JsonRender {
|
|
|
1230
1334
|
}
|
|
1231
1335
|
const parentNode = view2.parent.renderRef;
|
|
1232
1336
|
if (parentNode) {
|
|
1233
|
-
const idx = view2.
|
|
1337
|
+
const idx = view2.pos;
|
|
1234
1338
|
if (idx >= 0 && idx < parentNode.children.length) {
|
|
1235
1339
|
parentNode.children.splice(idx, 0, node);
|
|
1236
1340
|
} else {
|
|
@@ -1242,11 +1346,13 @@ class JsonRender {
|
|
|
1242
1346
|
if (view2.parent) {
|
|
1243
1347
|
const parentNode = view2.parent.renderRef;
|
|
1244
1348
|
if (parentNode) {
|
|
1245
|
-
const
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1349
|
+
const targetIdx = view2.pos;
|
|
1350
|
+
if (targetIdx >= 0 && parentNode.children[targetIdx] !== existing) {
|
|
1351
|
+
const oldIdx = parentNode.children.indexOf(existing);
|
|
1352
|
+
if (oldIdx !== -1) {
|
|
1353
|
+
parentNode.children.splice(oldIdx, 1);
|
|
1354
|
+
parentNode.children.splice(Math.min(targetIdx, parentNode.children.length), 0, existing);
|
|
1355
|
+
}
|
|
1250
1356
|
}
|
|
1251
1357
|
}
|
|
1252
1358
|
}
|
|
@@ -1368,7 +1474,6 @@ class HtmlStringRender {
|
|
|
1368
1474
|
return result;
|
|
1369
1475
|
}
|
|
1370
1476
|
}
|
|
1371
|
-
var StringRender = HtmlStringRender;
|
|
1372
1477
|
// src/functional/maybe.ts
|
|
1373
1478
|
function just(maybe, errorMessage) {
|
|
1374
1479
|
if (maybe == null) {
|
|
@@ -1504,7 +1609,6 @@ export {
|
|
|
1504
1609
|
abbr,
|
|
1505
1610
|
a,
|
|
1506
1611
|
_,
|
|
1507
|
-
StringRender,
|
|
1508
1612
|
Store,
|
|
1509
1613
|
State,
|
|
1510
1614
|
JsonRender,
|
|
@@ -1514,4 +1618,4 @@ export {
|
|
|
1514
1618
|
$primitive
|
|
1515
1619
|
};
|
|
1516
1620
|
|
|
1517
|
-
//# debugId=
|
|
1621
|
+
//# debugId=403015234A66157064756E2164756E21
|
package/dist/index.js.map
CHANGED
|
@@ -2,24 +2,24 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/internal/internal_view.ts", "../src/public/primitive.ts", "../src/internal/orchestrator.ts", "../src/public/view.ts", "../src/public/primitives/primitives.ts", "../src/public/state.ts", "../src/public/store.ts", "../src/functional/shallow_equal.ts", "../src/functional/lis.ts", "../src/internal/engine.ts", "../src/public/app.ts", "../src/render/html_render.ts", "../src/render/json_render.ts", "../src/render/string_render.ts", "../src/functional/maybe.ts", "../src/functional/assert.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewBody, ViewFn } from \"@/public/view\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Wildcard } from \"./wildcard\";\n\n// ---------------------------------------------------------------------------\n// Bitwise flags\n// ---------------------------------------------------------------------------\n\nexport type BitFlags = number;\nexport const F_PENDING = 1;\nexport const F_DIRTY = 1 << 1;\nexport const F_MOVED = 1 << 2;\nexport const F_PRIMITIVE = 1 << 3;\nexport const F_TEXT_CONTENT = 1 << 4;\nexport const F_DISPOSED = 1 << 5;\n\n// ---------------------------------------------------------------------------\n// ViewRecord — pure data, no methods\n// ---------------------------------------------------------------------------\n\nexport type ViewRecord<\n Props = Wildcard,\n Api = Wildcard,\n RenderRef = Wildcard,\n> = {\n viewFn: ViewFn<Props, Api>;\n userKey: Maybe<Key>;\n props: Props;\n slot: Maybe<SlotContent>;\n // Once ViewRecord moves from Pending to Real state,\n // it will cache the body of the view, so that ViewFn is called once per View Lifecycle\n body: Maybe<ViewBody<Props, Api>>;\n // Provided by higher component slot — we calculate children and keep their refs here\n sc: Maybe<ViewRecord[]>;\n // Each renderer provides its own RenderRef type, associated with how the renderer works\n renderRef: Maybe<RenderRef>;\n\n flags: BitFlags;\n\n children: Maybe<ViewRecord[]>;\n\n keyToView: Maybe<Map<Key, ViewRecord>>;\n unsubscribe: Maybe<(() => void)[]>;\n\n parent: Maybe<ViewRecord>;\n\n /** The primitive whose .children contains the live sc items after reconcile. */\n scHost: Maybe<ViewRecord>;\n};\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Structural change: viewFn, key, or count differs. Does NOT check props. */\nexport function hasScStructuralChange(\n prev: Maybe<ViewRecord[]>,\n next: Maybe<ViewRecord[]>,\n): boolean {\n const prevLen = prev?.length ?? 0;\n const nextLen = next?.length ?? 0;\n if (prevLen === 0 && nextLen === 0) return false;\n if (!prev || !next) return true;\n if (prev.length !== next.length) return true;\n for (let i = 0; i < next.length; i++) {\n if (next[i]!.viewFn !== prev[i]!.viewFn) return true;\n if (next[i]!.userKey !== prev[i]!.userKey) return true;\n }\n return false;\n}\n",
|
|
5
|
+
"import type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewBody, ViewFn } from \"@/public/view\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Wildcard } from \"./wildcard\";\n\n// ---------------------------------------------------------------------------\n// Bitwise flags\n// ---------------------------------------------------------------------------\n\nexport type BitFlags = number;\nexport const F_PENDING = 1;\nexport const F_DIRTY = 1 << 1;\nexport const F_MOVED = 1 << 2;\nexport const F_PRIMITIVE = 1 << 3;\nexport const F_TEXT_CONTENT = 1 << 4;\nexport const F_DISPOSED = 1 << 5;\n\n// ---------------------------------------------------------------------------\n// ViewRecord — pure data, no methods\n// ---------------------------------------------------------------------------\n\nexport type ViewRecord<\n Props = Wildcard,\n Api = Wildcard,\n RenderRef = Wildcard,\n> = {\n viewFn: ViewFn<Props, Api>;\n userKey: Maybe<Key>;\n props: Props;\n slot: Maybe<SlotContent>;\n // Once ViewRecord moves from Pending to Real state,\n // it will cache the body of the view, so that ViewFn is called once per View Lifecycle\n body: Maybe<ViewBody<Props, Api>>;\n // Provided by higher component slot — we calculate children and keep their refs here\n sc: Maybe<ViewRecord[]>;\n // Each renderer provides its own RenderRef type, associated with how the renderer works\n renderRef: Maybe<RenderRef>;\n\n flags: BitFlags;\n\n children: Maybe<ViewRecord[]>;\n\n /** Position in `parent.children`. Maintained by the reconciler so the\n * renderer can find the next-sibling insertion anchor without an O(n)\n * `indexOf` scan. -1 means \"not yet placed by a reconcile pass\". */\n pos: number;\n\n keyToView: Maybe<Map<Key, ViewRecord>>;\n unsubscribe: Maybe<(() => void)[]>;\n\n parent: Maybe<ViewRecord>;\n\n /** The primitive whose .children contains the live sc items after reconcile. */\n scHost: Maybe<ViewRecord>;\n};\n\n// ---------------------------------------------------------------------------\n// Utilities\n// ---------------------------------------------------------------------------\n\n/** Structural change: viewFn, key, or count differs. Does NOT check props. */\nexport function hasScStructuralChange(\n prev: Maybe<ViewRecord[]>,\n next: Maybe<ViewRecord[]>,\n): boolean {\n const prevLen = prev?.length ?? 0;\n const nextLen = next?.length ?? 0;\n if (prevLen === 0 && nextLen === 0) return false;\n if (!prev || !next) return true;\n if (prev.length !== next.length) return true;\n for (let i = 0; i < next.length; i++) {\n if (next[i]!.viewFn !== prev[i]!.viewFn) return true;\n if (next[i]!.userKey !== prev[i]!.userKey) return true;\n }\n return false;\n}\n",
|
|
6
6
|
"import type { Key } from \"@/functional/key\";\nimport type { Slot, ViewBody } from \"./view\";\n\n/**\n * Maps event type { click: (e: X) => void } to\n * handler props { onClick?: (e: X) => void }.\n */\nexport type EventHandlerProps<Events> = {\n [K in keyof Events as `on${Capitalize<string & K>}`]?: Events[K];\n};\n\n/**\n * Props passed when calling a primitive in the render stream.\n * Attrs + on* event handler props + optional key.\n */\nexport type PrimitiveProps<Attrs, Events> = Attrs &\n EventHandlerProps<Events> & { key?: Key };\n\nexport const $primitive = Symbol(\"primitive\");\n\nexport function primitiveViewFn<Props>({\n slot,\n}: {\n slot: Slot;\n}): ViewBody<Props, void> {\n return {\n render() {\n slot();\n },\n };\n}\n",
|
|
7
7
|
"import type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n/**\n * Orchestrator is the high-level class, that handles the oveall operations for the UI engine\n * 1. When View is rendered or updated, orchestrator is responsible of bringing the renderer, virtual dom and engine together\n * 2. Keeps track on current views / stores in the app\n * 3. Keeps track on which views need to be updated, which onces are in updating process\n * 4. Sets the current orchestrator scope (e.g. if the app has several Creo renderers)\n */\nclass Orchestrator {\n #currentEngine: Maybe<Engine>;\n\n setCurrentEngine(engine: Maybe<Engine>) {\n this.#currentEngine = engine;\n }\n\n public currentEngine(): Maybe<Engine> {\n return this.#currentEngine;\n }\n}\n\nexport const orchestrator = new Orchestrator();\n",
|
|
8
|
-
"import type { Key } from \"@/functional/key\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport { orchestrator } from \"@/internal/orchestrator\";\nimport type { Use } from \"./state\";\nimport type { $primitive } from \"./primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\
|
|
8
|
+
"import type { Key } from \"@/functional/key\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport { orchestrator } from \"@/internal/orchestrator\";\nimport type { Use } from \"./state\";\nimport type { $primitive } from \"./primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\ntype ViewBodyBase<Props> = {\n render: () => void;\n onMount?: () => void;\n shouldUpdate?: (nextProps: Props) => boolean;\n onUpdateBefore?: () => void;\n onUpdateAfter?: () => void;\n};\n\nexport type ViewBody<Props, Api> = Api extends void\n ? ViewBodyBase<Props>\n : ViewBodyBase<Props> & { api: Api };\n\n/** Slot callback — passed by the caller at the call site. */\nexport type Slot = () => void;\n\n/** What callers may pass as a slot: a callback or a plain string (rendered as text). */\nexport type SlotContent = Slot | string;\n\nexport type ViewFn<Props, Api> = {\n (ctx: { props: () => Props; use: Use; slot: Slot }): ViewBody<Props, Api>;\n [$primitive]?: string;\n};\n\n/** Resolves to the caller-facing props type. Allows `void` when Props is void or all-optional. */\ntype ViewProps<Props> = Props extends void\n ? { key?: Key } | void\n : {} extends Props\n ? (Props & { key?: Key }) | void\n : Props & { key?: Key };\n\nexport function view<Props = void, Api = void>(\n body: ViewFn<Props, Api>,\n): (props: ViewProps<Props>, slot?: SlotContent) => void {\n return (props: ViewProps<Props>, slot?: SlotContent) => {\n orchestrator\n .currentEngine()!\n .view(\n body as ViewFn<Wildcard, Wildcard>,\n props,\n slot,\n maybeGetUserKey(props),\n );\n };\n}\n\nexport type PublicView<Props, Api> = ReturnType<typeof view<Props, Api>>;\n\nfunction maybeGetUserKey<P>(params: P): Maybe<Key> {\n if (\n params != null &&\n typeof params === \"object\" &&\n \"key\" in params &&\n params.key != null &&\n (typeof params.key === \"string\" || typeof params.key === \"number\")\n ) {\n return params.key;\n }\n}\n",
|
|
9
9
|
"import type { Wildcard } from \"@/internal/wildcard\";\nimport { $primitive, type EventHandlerProps } from \"../primitive\";\nimport {\n view,\n type PublicView,\n type Slot,\n type ViewBody,\n type ViewFn,\n} from \"../view\";\nimport { orchestrator } from \"@/internal/orchestrator\";\n\n// ---------------------------------------------------------------------------\n// Engine-agnostic event data types\n// ---------------------------------------------------------------------------\n\nexport type BaseEventData = {\n stopPropagation: () => void;\n preventDefault: () => void;\n};\n\nexport type PointerEventData = BaseEventData & {\n x: number;\n y: number;\n};\n\nexport type KeyEventData = BaseEventData & {\n key: string;\n code: string;\n};\n\nexport type InputEventData = BaseEventData & {\n value: string;\n checked: boolean;\n};\n\nexport type FocusEventData = BaseEventData;\n\nexport type ScrollEventData = BaseEventData & {\n scrollTop: number;\n scrollLeft: number;\n};\n\nexport type LoadEventData = BaseEventData;\n\nexport type ErrorEventData = BaseEventData & {\n message: string;\n};\n\nexport type ToggleEventData = BaseEventData & {\n open: boolean;\n};\n\nexport type MediaEventData = BaseEventData & {\n muted: boolean;\n paused: boolean;\n volume: number;\n currentTime: number;\n duration: number;\n};\n\n// ---------------------------------------------------------------------------\n// Event maps\n// ---------------------------------------------------------------------------\n\nexport type ContainerEvents = {\n click: (e: PointerEventData) => void;\n dblclick: (e: PointerEventData) => void;\n pointerDown: (e: PointerEventData) => void;\n pointerUp: (e: PointerEventData) => void;\n pointerMove: (e: PointerEventData) => void;\n // Hover (capture-phase, per-target, not double-fired up the tree).\n mouseEnter: (e: PointerEventData) => void;\n mouseLeave: (e: PointerEventData) => void;\n pointerEnter: (e: PointerEventData) => void;\n pointerLeave: (e: PointerEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n focus: (e: FocusEventData) => void;\n blur: (e: FocusEventData) => void;\n // Scroll fires passively at high frequency; preventDefault is a no-op.\n scroll: (e: ScrollEventData) => void;\n load: (e: LoadEventData) => void;\n error: (e: ErrorEventData) => void;\n};\n\nexport type FormEvents = ContainerEvents & {\n input: (e: InputEventData) => void;\n change: (e: InputEventData) => void;\n keyDown: (e: KeyEventData) => void;\n keyUp: (e: KeyEventData) => void;\n};\n\nexport type MediaEvents = ContainerEvents & {\n volumeChange: (e: MediaEventData) => void;\n play: (e: MediaEventData) => void;\n pause: (e: MediaEventData) => void;\n ended: (e: MediaEventData) => void;\n timeUpdate: (e: MediaEventData) => void;\n loadedMetadata: (e: MediaEventData) => void;\n loadedData: (e: MediaEventData) => void;\n canPlay: (e: MediaEventData) => void;\n canPlayThrough: (e: MediaEventData) => void;\n durationChange: (e: MediaEventData) => void;\n rateChange: (e: MediaEventData) => void;\n seeking: (e: MediaEventData) => void;\n seeked: (e: MediaEventData) => void;\n stalled: (e: MediaEventData) => void;\n waiting: (e: MediaEventData) => void;\n};\n\nexport type DisclosureEvents = ContainerEvents & {\n toggle: (e: ToggleEventData) => void;\n};\n\n// ---------------------------------------------------------------------------\n// Common HTML attributes\n// ---------------------------------------------------------------------------\n\nexport type HtmlAttrs = {\n class?: string;\n id?: string;\n style?: string;\n title?: string;\n tabindex?: number;\n hidden?: boolean;\n role?: string;\n draggable?: boolean;\n [attr: string]: unknown;\n};\n\nexport function html<\n Attrs extends HtmlAttrs = HtmlAttrs,\n Events = ContainerEvents,\n>(tag: string): PublicView<Attrs & EventHandlerProps<Events>, void> {\n const fn: ViewFn<Attrs & EventHandlerProps<Events>, void> = <Props>({\n slot,\n }: {\n slot: Slot;\n }): ViewBody<Props, void> => ({\n render() {\n slot();\n },\n });\n fn[$primitive] = tag;\n return view(fn);\n}\n\n// ---------------------------------------------------------------------------\n// Text node — typed as (content: string | number) => void\n// ---------------------------------------------------------------------------\n\nexport const textViewFn: ViewFn<string | number, void> = Object.assign(\n (() => ({ render() {} })) as ViewFn<string | number, void>,\n { [$primitive]: \"text\" as string },\n);\n\nexport function text(content: string | number): void {\n orchestrator.currentEngine()!.view(textViewFn, content, null, null);\n}\n\n// ---------------------------------------------------------------------------\n// Layout / structural\n// ---------------------------------------------------------------------------\n\nexport const div = html(\"div\");\nexport const span = html(\"span\");\nexport const section = html(\"section\");\nexport const article = html(\"article\");\nexport const aside = html(\"aside\");\nexport const nav = html(\"nav\");\nexport const header = html(\"header\");\nexport const footer = html(\"footer\");\nexport const main = html(\"main\");\n\n// ---------------------------------------------------------------------------\n// Text / inline\n// ---------------------------------------------------------------------------\n\nexport const p = html(\"p\");\nexport const h1 = html(\"h1\");\nexport const h2 = html(\"h2\");\nexport const h3 = html(\"h3\");\nexport const h4 = html(\"h4\");\nexport const h5 = html(\"h5\");\nexport const h6 = html(\"h6\");\nexport const pre = html(\"pre\");\nexport const code = html(\"code\");\nexport const em = html(\"em\");\nexport const strong = html(\"strong\");\nexport const small = html(\"small\");\nexport const br = html(\"br\");\nexport const hr = html(\"hr\");\nexport const a = html<\n HtmlAttrs & { href?: string; target?: string },\n ContainerEvents\n>(\"a\");\nexport const blockquote = html(\"blockquote\");\nexport const label = html<HtmlAttrs & { for?: string }, ContainerEvents>(\n \"label\",\n);\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport const ul = html(\"ul\");\nexport const ol = html(\"ol\");\nexport const li = html(\"li\");\n\n// ---------------------------------------------------------------------------\n// Table\n// ---------------------------------------------------------------------------\n\nexport const table = html(\"table\");\nexport const thead = html(\"thead\");\nexport const tbody = html(\"tbody\");\nexport const tfoot = html(\"tfoot\");\nexport const tr = html(\"tr\");\nexport const th = html<\n HtmlAttrs & { colspan?: number; rowspan?: number; scope?: string },\n ContainerEvents\n>(\"th\");\nexport const td = html<\n HtmlAttrs & { colspan?: number; rowspan?: number },\n ContainerEvents\n>(\"td\");\n\n// ---------------------------------------------------------------------------\n// Form\n// ---------------------------------------------------------------------------\n\nexport const form = html<\n HtmlAttrs & { action?: string; method?: string },\n ContainerEvents\n>(\"form\");\n\nexport const button = html<\n HtmlAttrs & { disabled?: boolean; type?: string },\n ContainerEvents\n>(\"button\");\n\nexport const input = html<\n HtmlAttrs & {\n type?: string;\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n checked?: boolean;\n readOnly?: boolean;\n name?: string;\n min?: string;\n max?: string;\n step?: string;\n pattern?: string;\n required?: boolean;\n autofocus?: boolean;\n },\n FormEvents\n>(\"input\");\n\nexport const textarea = html<\n HtmlAttrs & {\n value?: string;\n placeholder?: string;\n disabled?: boolean;\n readOnly?: boolean;\n rows?: number;\n cols?: number;\n name?: string;\n required?: boolean;\n },\n FormEvents\n>(\"textarea\");\n\nexport const select = html<\n HtmlAttrs & {\n value?: string;\n disabled?: boolean;\n name?: string;\n multiple?: boolean;\n required?: boolean;\n },\n FormEvents\n>(\"select\");\n\nexport const option = html<\n HtmlAttrs & { value?: string; selected?: boolean; disabled?: boolean },\n ContainerEvents\n>(\"option\");\n\nexport const fieldset = html<\n HtmlAttrs & { disabled?: boolean },\n ContainerEvents\n>(\"fieldset\");\nexport const legend = html(\"legend\");\n\n// ---------------------------------------------------------------------------\n// Media\n// ---------------------------------------------------------------------------\n\nexport const img = html<\n HtmlAttrs & { src: string; alt?: string; width?: number; height?: number },\n ContainerEvents\n>(\"img\");\n\nexport const video = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n width?: number;\n height?: number;\n },\n MediaEvents\n>(\"video\");\n\nexport const audio = html<\n HtmlAttrs & {\n src?: string;\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n },\n MediaEvents\n>(\"audio\");\n\nexport const canvas = html<\n HtmlAttrs & { width?: number; height?: number },\n ContainerEvents\n>(\"canvas\");\n\nexport const source = html<\n HtmlAttrs & { src?: string; type?: string },\n ContainerEvents\n>(\"source\");\n\n// ---------------------------------------------------------------------------\n// Interactive\n// ---------------------------------------------------------------------------\n\nexport const details = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"details\",\n);\nexport const summary = html(\"summary\");\nexport const dialog = html<HtmlAttrs & { open?: boolean }, DisclosureEvents>(\n \"dialog\",\n);\nexport const menu = html(\"menu\");\n\n// ---------------------------------------------------------------------------\n// Embedded content\n// ---------------------------------------------------------------------------\n\nexport const iframe = html<\n HtmlAttrs & {\n src?: string;\n width?: number;\n height?: number;\n sandbox?: string;\n allow?: string;\n loading?: string;\n referrerpolicy?: string;\n },\n ContainerEvents\n>(\"iframe\");\nexport const embed = html<\n HtmlAttrs & { src?: string; type?: string; width?: number; height?: number },\n ContainerEvents\n>(\"embed\");\nexport const object = html<\n HtmlAttrs & {\n data?: string;\n type?: string;\n width?: number;\n height?: number;\n name?: string;\n },\n ContainerEvents\n>(\"object\");\nexport const picture = html(\"picture\");\nexport const portal = html<HtmlAttrs & { src?: string }, ContainerEvents>(\n \"portal\",\n);\n\n// ---------------------------------------------------------------------------\n// SVG (container only — inner SVG elements use html() ad-hoc)\n// ---------------------------------------------------------------------------\n\nexport const svg = html<\n HtmlAttrs & {\n viewBox?: string;\n xmlns?: string;\n width?: number | string;\n height?: number | string;\n fill?: string;\n },\n ContainerEvents\n>(\"svg\");\n\n// ---------------------------------------------------------------------------\n// Scripting / metadata (rarely used in render, but complete for parity)\n// ---------------------------------------------------------------------------\n\nexport const script = html<\n HtmlAttrs & { src?: string; type?: string; async?: boolean; defer?: boolean },\n ContainerEvents\n>(\"script\");\nexport const noscript = html(\"noscript\");\nexport const template = html(\"template\");\nexport const slot = html<HtmlAttrs & { name?: string }, ContainerEvents>(\n \"slot\",\n);\n\n// ---------------------------------------------------------------------------\n// Sectioning\n// ---------------------------------------------------------------------------\n\nexport const address = html(\"address\");\nexport const hgroup = html(\"hgroup\");\nexport const search = html(\"search\");\n\n// ---------------------------------------------------------------------------\n// Text semantics\n// ---------------------------------------------------------------------------\n\nexport const abbr = html(\"abbr\");\nexport const b = html(\"b\");\nexport const bdi = html(\"bdi\");\nexport const bdo = html<HtmlAttrs & { dir?: string }, ContainerEvents>(\"bdo\");\nexport const cite = html(\"cite\");\nexport const data = html<HtmlAttrs & { value?: string }, ContainerEvents>(\n \"data\",\n);\nexport const dfn = html(\"dfn\");\nexport const i = html(\"i\");\nexport const kbd = html(\"kbd\");\nexport const mark = html(\"mark\");\nexport const q = html<HtmlAttrs & { cite?: string }, ContainerEvents>(\"q\");\nexport const rp = html(\"rp\");\nexport const rt = html(\"rt\");\nexport const ruby = html(\"ruby\");\nexport const s = html(\"s\");\nexport const samp = html(\"samp\");\nexport const sub = html(\"sub\");\nexport const sup = html(\"sup\");\nexport const time = html<HtmlAttrs & { datetime?: string }, ContainerEvents>(\n \"time\",\n);\nexport const u = html(\"u\");\nexport const varEl = html(\"var\");\nexport const wbr = html(\"wbr\");\n\n// ---------------------------------------------------------------------------\n// Demarcating edits\n// ---------------------------------------------------------------------------\n\nexport const del = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"del\");\nexport const ins = html<\n HtmlAttrs & { cite?: string; datetime?: string },\n ContainerEvents\n>(\"ins\");\n\n// ---------------------------------------------------------------------------\n// Table (additional)\n// ---------------------------------------------------------------------------\n\nexport const caption = html(\"caption\");\nexport const colgroup = html<HtmlAttrs & { span?: number }, ContainerEvents>(\n \"colgroup\",\n);\nexport const col = html<HtmlAttrs & { span?: number }, ContainerEvents>(\"col\");\n\n// ---------------------------------------------------------------------------\n// Form (additional)\n// ---------------------------------------------------------------------------\n\nexport const datalist = html(\"datalist\");\nexport const optgroup = html<\n HtmlAttrs & { label?: string; disabled?: boolean },\n ContainerEvents\n>(\"optgroup\");\nexport const output = html<\n HtmlAttrs & { for?: string; name?: string },\n ContainerEvents\n>(\"output\");\nexport const progress = html<\n HtmlAttrs & { value?: number; max?: number },\n ContainerEvents\n>(\"progress\");\nexport const meter = html<\n HtmlAttrs & {\n value?: number;\n min?: number;\n max?: number;\n low?: number;\n high?: number;\n optimum?: number;\n },\n ContainerEvents\n>(\"meter\");\n\n// ---------------------------------------------------------------------------\n// Figure\n// ---------------------------------------------------------------------------\n\nexport const figure = html(\"figure\");\nexport const figcaption = html(\"figcaption\");\n\n// ---------------------------------------------------------------------------\n// Line break opportunity / content\n// ---------------------------------------------------------------------------\n\nexport const dd = html(\"dd\");\nexport const dl = html(\"dl\");\nexport const dt = html(\"dt\");\n\n// ---------------------------------------------------------------------------\n// Media (additional)\n// ---------------------------------------------------------------------------\n\nexport const track = html<\n HtmlAttrs & {\n src?: string;\n kind?: string;\n srclang?: string;\n label?: string;\n default?: boolean;\n },\n ContainerEvents\n>(\"track\");\nexport const map = html<HtmlAttrs & { name?: string }, ContainerEvents>(\"map\");\nexport const area = html<\n HtmlAttrs & {\n alt?: string;\n coords?: string;\n href?: string;\n shape?: string;\n target?: string;\n },\n ContainerEvents\n>(\"area\");\n",
|
|
10
|
-
"import type { MaybePromise } from \"@/functional/maybe_promise\";\n\n/**\n * Reactive value — the shared interface returned by `use()`.\n * Both local state and store bindings implement this.\n */\nexport interface Reactive<T> {\n get(): T;\n set(value: T): void;\n update(fn: (current: T) => MaybePromise<T>): void;\n}\n\n/**\n * A single reactive state slot.\n * Returned by calling use(initial) during view init.\n *\n * const count = use(0);\n * count.get() // read current value\n * count.set(5) // set immediately, schedule render\n * count.update(n => n + 1) // update via fn, schedule render\n */\nexport class State<T> implements Reactive<T> {\n #current: T;\n #schedule: () => void;\n\n constructor(initial: T, schedule: () => void) {\n this.#current = initial;\n this.#schedule = schedule;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#current = value;\n this.#schedule();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n
|
|
11
|
-
"import type { MaybePromise } from \"@/functional/maybe_promise\";\n\nconst $store = Symbol(\"store\");\n\n/**\n * Store — globally visible reactive data.\n *\n * Create a store:\n * const ThemeStore = store.new(\"light\");\n *\n * Set from anywhere:\n * ThemeStore.set(\"dark\"); // updates all subscribers\n *\n * Read from a view:\n * const myView = view(({ use }) => {\n * const theme = use(ThemeStore); // re-renders on change\n * return {\n * render() {\n * div(() => text(`Current theme: ${theme.get()}`));\n * }\n * };\n * });\n */\nexport class Store<T> {\n readonly [$store] = true;\n #current: T;\n #subscribers = new Set<() => void>();\n\n constructor(initial: T) {\n this.#current = initial;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#current = value;\n this.#notify();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n const
|
|
12
|
-
"import type { Wildcard } from \"@/internal/wildcard\";\n\nexport function shallowEqual(a: Wildcard, b: Wildcard): boolean {\n if (a === b) return true;\n\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n //
|
|
10
|
+
"import type { Maybe } from \"@/functional/maybe\";\nimport type { MaybePromise } from \"@/functional/maybe_promise\";\n\n/**\n * Reactive value — the shared interface returned by `use()`.\n * Both local state and store bindings implement this.\n */\nexport interface Reactive<T> {\n get(): T;\n set(value: T): void;\n update(fn: (current: T) => MaybePromise<T>): void;\n}\n\n/**\n * A single reactive state slot.\n * Returned by calling use(initial) during view init.\n *\n * const count = use(0);\n * count.get() // read current value\n * count.set(5) // set immediately, schedule render\n * count.update(n => n + 1) // update via fn, schedule render\n *\n * Async updates chain: a second `update` issued while a previous async\n * update is still in flight runs against the previous update's result,\n * not against the snapshot at issue time. `set` cancels any pending\n * chain — its value becomes authoritative and in-flight links won't\n * commit afterwards.\n */\nexport class State<T> implements Reactive<T> {\n #current: T;\n #schedule: () => void;\n // Tail of the pending async update chain. Subsequent updates queue onto\n // it; `set` clears it to cancel any in-flight resolutions.\n #pending: Maybe<Promise<T>>;\n\n constructor(initial: T, schedule: () => void) {\n this.#current = initial;\n this.#schedule = schedule;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n if (this.#pending) {\n // Queue onto the pending chain so this fn runs against the previous\n // update's result, not against #current at call time.\n const next: Promise<T> = this.#pending.then((v) => fn(v));\n this.#pending = next;\n next.then((value) => {\n // Skip if a later update or `set` moved the tail past us.\n if (this.#pending !== next) return;\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n });\n return;\n }\n\n const result = fn(this.#current);\n if (!(result instanceof Promise)) {\n this.#current = result;\n this.#schedule();\n return;\n }\n\n const captured = result;\n this.#pending = captured;\n captured.then((value) => {\n if (this.#pending !== captured) return;\n this.#pending = null;\n this.#current = value;\n this.#schedule();\n });\n }\n}\n\n/**\n * Use factory bound to a view.\n * Tracks instances by call order (like React hooks).\n *\n * use(store) — subscribe to a Store, returns Store<T> (Reactive<T>)\n * use(initial) — create local State<T> (Reactive<T>)\n */\nexport type Use = {\n <T>(storeOrInitial: import(\"@/public/store\").Store<T>): Reactive<T>;\n <T>(initial: T): Reactive<T>;\n};\n",
|
|
11
|
+
"import type { Maybe } from \"@/functional/maybe\";\nimport type { MaybePromise } from \"@/functional/maybe_promise\";\n\n// Symbol.for so isStore() works across multiple bundles of creo (e.g. when\n// a downstream library brings its own copy). A module-private Symbol() would\n// make `use(storeFromOtherBundle)` silently degrade to a fresh State.\nconst $store = Symbol.for(\"creo.store\");\n\n/**\n * Store — globally visible reactive data.\n *\n * Create a store:\n * const ThemeStore = store.new(\"light\");\n *\n * Set from anywhere:\n * ThemeStore.set(\"dark\"); // updates all subscribers\n *\n * Read from a view:\n * const myView = view(({ use }) => {\n * const theme = use(ThemeStore); // re-renders on change\n * return {\n * render() {\n * div(() => text(`Current theme: ${theme.get()}`));\n * }\n * };\n * });\n */\nexport class Store<T> {\n readonly [$store] = true;\n #current: T;\n #subscribers = new Set<() => void>();\n // Tail of the pending async update chain. Subsequent updates queue onto\n // it; `set` clears it to cancel any in-flight resolutions.\n #pending: Maybe<Promise<T>>;\n\n constructor(initial: T) {\n this.#current = initial;\n }\n\n get(): T {\n return this.#current;\n }\n\n set(value: T): void {\n this.#pending = null;\n this.#current = value;\n this.#notify();\n }\n\n update(fn: (current: T) => MaybePromise<T>): void {\n if (this.#pending) {\n const next: Promise<T> = this.#pending.then((v) => fn(v));\n this.#pending = next;\n next.then((value) => {\n if (this.#pending !== next) return;\n this.#pending = null;\n this.#current = value;\n this.#notify();\n });\n return;\n }\n\n const result = fn(this.#current);\n if (!(result instanceof Promise)) {\n this.#current = result;\n this.#notify();\n return;\n }\n\n const captured = result;\n this.#pending = captured;\n captured.then((value) => {\n if (this.#pending !== captured) return;\n this.#pending = null;\n this.#current = value;\n this.#notify();\n });\n }\n\n subscribe(cb: () => void): () => void {\n this.#subscribers.add(cb);\n return () => {\n this.#subscribers.delete(cb);\n };\n }\n\n #notify(): void {\n for (const sub of this.#subscribers) {\n sub();\n }\n }\n}\n\nexport function isStore(value: unknown): value is Store<unknown> {\n return value != null && typeof value === \"object\" && $store in value;\n}\n\nexport const store = {\n new<T>(initial: T): Store<T> {\n return new Store(initial);\n },\n};\n",
|
|
12
|
+
"import type { Wildcard } from \"@/internal/wildcard\";\n\nexport function shallowEqual(a: Wildcard, b: Wildcard): boolean {\n if (a === b) return true;\n\n if (\n typeof a !== \"object\" ||\n a === null ||\n typeof b !== \"object\" ||\n b === null\n ) {\n return false;\n }\n\n // Single-walk-with-count: avoid Object.keys() allocations and the slower\n // Object.is semantics (NaN/-0 distinctions don't matter for props).\n let countA = 0;\n for (const key in a) {\n countA++;\n if (a[key] !== b[key]) return false;\n }\n\n let countB = 0;\n for (const _ in b) {\n countB++;\n // Early bail: b has at least one key not in a (since all a's keys\n // matched, any extra in b means counts must diverge).\n if (countB > countA) return false;\n }\n\n return countA === countB;\n}\n",
|
|
13
13
|
"/**\n * Longest Increasing Subsequence — O(n log n).\n *\n * Given an array of numbers, returns the Set of *indices* into that array\n * whose elements form the longest strictly increasing subsequence.\n * Entries equal to -1 are skipped (treated as \"not present\").\n *\n * Used by the keyed reconciler to identify the maximal set of children\n * that are already in correct relative order and don't need DOM moves.\n */\nexport function lis(arr: number[]): Set<number> {\n const len = arr.length;\n if (len === 0) return new Set();\n\n // tails[k] = index into arr of the smallest tail element for an IS of length k+1\n const tails: number[] = [];\n // prev[i] = index into arr of the predecessor of arr[i] in the LIS\n const prev = new Array<number>(len).fill(-1);\n\n for (let i = 0; i < len; i++) {\n if (arr[i]! < 0) continue; // skip -1 entries\n\n const val = arr[i]!;\n\n // Binary search for the leftmost tail >= val\n let lo = 0;\n let hi = tails.length;\n while (lo < hi) {\n const mid = (lo + hi) >> 1;\n if (arr[tails[mid]!]! < val) lo = mid + 1;\n else hi = mid;\n }\n\n // lo is the position where val should go\n if (lo > 0) prev[i] = tails[lo - 1]!;\n tails[lo] = i;\n }\n\n // Backtrack from the last element of tails to reconstruct the LIS\n const result = new Set<number>();\n if (tails.length === 0) return result;\n\n let idx = tails[tails.length - 1]!;\n for (let k = tails.length - 1; k >= 0; k--) {\n result.add(idx);\n idx = prev[idx]!;\n }\n\n return result;\n}\n",
|
|
14
|
-
"import type { IRender } from \"@/render/render_interface\";\nimport {\n type ViewRecord,\n hasScStructuralChange,\n F_DIRTY,\n F_MOVED,\n F_PRIMITIVE,\n F_PENDING,\n F_DISPOSED,\n} from \"./internal_view\";\nimport type { Wildcard } from \"./wildcard\";\nimport { type Maybe } from \"@/functional/maybe\";\nimport type { Key } from \"@/functional/key\";\nimport type { Slot, SlotContent, ViewFn } from \"@/public/view\";\nimport { textViewFn } from \"@/public/primitives/primitives\";\nimport { $primitive } from \"@/public/primitive\";\nimport { State, type Reactive } from \"@/public/state\";\nimport { Store, isStore } from \"@/public/store\";\nimport { shallowEqual } from \"@/functional/shallow_equal\";\nimport { lis } from \"@/functional/lis\";\nimport { orchestrator } from \"./orchestrator\";\n\nexport type Scheduler = (callback: () => void) => void;\n\n// Primitive props that map to live DOM properties whose value can drift away\n// from the rendered prop via user input (typing in an input, toggling a\n// checkbox, muting a video). For these keys we cannot trust shallowEqual to\n// mean \"DOM is up to date\" — re-render the primitive so the renderer can\n// re-assert the live property.\nconst STATEFUL_DOM_KEYS = [\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"] as const;\nfunction hasStatefulDomKey(props: unknown): boolean {\n if (props == null || typeof props !== \"object\") return false;\n for (const k of STATEFUL_DOM_KEYS) {\n if (k in (props as object)) return true;\n }\n return false;\n}\n\nexport class Engine {\n #dirtyQueue = new Set<ViewRecord>();\n #collector: Maybe<ViewRecord[]>;\n #collectFor: Maybe<ViewRecord>;\n\n #scheduler: Scheduler;\n #renderScheduled = false;\n #rendering = false;\n\n constructor(\n public renderer: IRender<Wildcard>,\n scheduler?: Scheduler,\n ) {\n this.#scheduler = scheduler ?? ((cb) => queueMicrotask(cb));\n renderer.engine = this;\n }\n\n // -- Record initialization --------------------------------------------------\n newView<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n parent: Maybe<ViewRecord>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord {\n const res: ViewRecord = {\n viewFn,\n userKey,\n props,\n slot,\n // View was not rendered yet, so there is no body\n body: null,\n // slot was not called _yet_, so there is no slot children\n sc: null,\n // there is no renderer _yet_\n renderRef: null,\n\n flags: F_PENDING | (viewFn[$primitive] != null ? F_PRIMITIVE : 0),\n\n children: null,\n\n keyToView: null,\n unsubscribe: null,\n parent,\n scHost: null,\n };\n if (slot) {\n const slotFn = typeof slot === \"string\" ? this.#stringSlot(slot) : slot;\n res.sc = this.#collect(slotFn, [], res);\n }\n return res;\n }\n\n // called when view renders view\n // Saved potential pending view to collector for further reconsilication\n view<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord<Props, Api, RenderRef> {\n const view = this.newView(viewFn, this.#collectFor, props, slot, userKey);\n this.#collector?.push(view);\n return view;\n }\n\n views(views: Maybe<ViewRecord[]>): void {\n if (views) this.#collector?.push(...views);\n }\n\n // ViewRecord already exist, but we still need to initialise the whole record\n initViewBody(view: ViewRecord): void {\n // Only for non initialised views:\n if (!(view.flags & F_PENDING)) return;\n\n view.flags &= ~F_PENDING;\n\n // If view is primitive\n if (view.flags & F_PRIMITIVE) {\n const engine = this;\n view.body = {\n render() {\n engine.views(view.sc);\n },\n };\n return;\n }\n // View is composite\n view.body = view.viewFn({\n props: () => view.props,\n use: <T>(storeOrState: T | Store<T>): Reactive<T> => {\n if (!isStore(storeOrState)) {\n return new State(storeOrState, () => this.markDirty(view));\n }\n const s = storeOrState;\n const unsub = s.subscribe(() => this.markDirty(view));\n if (!view.unsubscribe) view.unsubscribe = [];\n view.unsubscribe.push(unsub);\n return s;\n },\n slot: () => {\n if (!view.sc) return;\n view.scHost = this.#collectFor ?? view;\n for (const child of view.sc) {\n child.parent = this.#collectFor ?? view;\n this.#collector?.push(child);\n }\n },\n });\n }\n\n createRoot(children: () => void, props: Wildcard): ViewRecord {\n orchestrator.setCurrentEngine(this);\n const view = this.newView(\n ({ slot }) => ({\n render() {\n slot();\n },\n }),\n null,\n props,\n children,\n null,\n );\n this.markDirty(view);\n return view;\n }\n\n // -- Dirty tracking ---------------------------------------------------------\n\n markDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_DIRTY) {\n return;\n }\n view.flags |= F_DIRTY;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n markMoved<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_MOVED) {\n return;\n }\n view.flags |= F_MOVED;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n // #removeDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n // view: ViewRecord<Props, Api, RenderRef>,\n // ): void {\n // view.flags &= ~F_DIRTY;\n // view.flags &= ~F_MOVED;\n // this.#dirtyQueue.delete(view);\n // }\n\n schedule(): void {\n if (this.#renderScheduled) return;\n this.#renderScheduled = true;\n this.#scheduler(() => {\n this.#renderScheduled = false;\n this.render();\n });\n }\n\n // -- Collector --------------------------------------------------------------\n\n #collect(\n render: () => void,\n collector: ViewRecord[],\n parent: ViewRecord,\n ): ViewRecord[] {\n const before = this.#collector;\n const beforeParent = this.#collectFor;\n this.#collector = collector;\n this.#collectFor = parent;\n render();\n this.#collector = before;\n this.#collectFor = beforeParent;\n return collector;\n }\n\n /** Convert a string slot into a callback that emits a text ViewRecord. */\n #stringSlot(content: string): Slot {\n return () => {\n this.view(textViewFn as ViewFn<Wildcard, Wildcard>, content, null, null);\n };\n }\n\n // -- Props update -----------------------------------------------------------\n\n nextProps<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n nextProps: Props,\n nextSlot: Maybe<SlotContent>,\n preCollectedSc?: Maybe<ViewRecord[]>,\n ): void {\n const prevSc = view.sc;\n view.slot = nextSlot;\n // Use pre-collected sc if available (avoids re-running the slot function)\n if (preCollectedSc) {\n // Re-parent sc items to this view (they were parented to the pending view)\n for (const child of preCollectedSc) child.parent = view;\n view.sc = preCollectedSc;\n } else {\n if (nextSlot) {\n const slotFn =\n typeof nextSlot === \"string\" ? this.#stringSlot(nextSlot) : nextSlot;\n view.sc = this.#collect(slotFn, [], view);\n } else {\n view.sc = null;\n }\n }\n\n const structChanged = hasScStructuralChange(prevSc, view.sc);\n const shouldUpdate = view.body?.shouldUpdate\n ? view.body.shouldUpdate(nextProps)\n : !shallowEqual(view.props, nextProps) ||\n // Primitive holding a stateful DOM key — DOM may have drifted from\n // the rendered prop; force a re-render so the renderer re-asserts.\n ((view.flags & F_PRIMITIVE) !== 0 && hasStatefulDomKey(nextProps));\n\n if (shouldUpdate || structChanged) {\n // Full re-render: own props or slot structure changed\n view.props = nextProps;\n this.markDirty(view);\n } else if (view.sc && view.scHost?.children) {\n // Composite with stable structure and own props — propagate sc prop changes directly\n this.#propagateScProps(view);\n } else if (view.sc && prevSc) {\n // No scHost (e.g. primitive) — check if any sc child props changed\n for (let i = 0; i < view.sc.length; i++) {\n if (view.sc[i]!.props !== prevSc[i]!.props) {\n this.markDirty(view);\n break;\n }\n }\n }\n }\n\n /** Propagate slot children prop changes directly to live children, skipping parent reconcile. */\n #propagateScProps(owner: ViewRecord): void {\n const host = owner.scHost;\n const sc = owner.sc;\n if (!host?.children || !sc) return;\n\n if (host.keyToView) {\n for (const item of sc) {\n if (item.userKey != null) {\n const live = host.keyToView.get(item.userKey);\n if (live && live.viewFn === item.viewFn) {\n this.nextProps(live, item.props, item.slot);\n }\n }\n }\n } else {\n const len = Math.min(sc.length, host.children.length);\n for (let i = 0; i < len; i++) {\n const live = host.children[i]!;\n if (live.viewFn === sc[i]!.viewFn) {\n this.nextProps(live, sc[i]!.props, sc[i]!.slot);\n }\n }\n }\n }\n\n // -- Reconciliation ---------------------------------------------------------\n\n reconcile(view: ViewRecord): void {\n let pendingChildren: Maybe<ViewRecord[]> = null;\n if (view.body?.render) {\n pendingChildren = this.#collect(view.body.render, [], view);\n }\n\n if (pendingChildren == null || pendingChildren.length === 0) {\n // No children case\n if (view.children) for (const child of view.children) this.dispose(child);\n return;\n }\n\n // We do not have any previous children. In this case, we just insert new items and that's it\n if (view.children == null) {\n view.children = pendingChildren;\n for (const child of pendingChildren) {\n this.initViewBody(child);\n this.markDirty(child);\n if (child.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(child.userKey, child);\n }\n }\n return;\n }\n // Now, we have both view.children & pendingChildren\n // Check if any child is keyed — if so, use keyed algorithm\n const hasKeys = pendingChildren.some((c) => c.userKey != null);\n if (hasKeys) {\n this.#reconcileKeyed(view, view.children, pendingChildren);\n } else {\n this.#reconcileNonKeyed(view, view.children, pendingChildren);\n }\n }\n\n // -- Non-keyed reconciliation ------------------------------------------------\n\n #reconcileNonKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n const oldLen = oldChildren.length;\n const newLen = pending.length;\n const minLen = Math.min(oldLen, newLen);\n\n // Patch overlapping range by position\n for (let i = 0; i < minLen; i++) {\n const old = oldChildren[i]!;\n const pend = pending[i]!;\n this.#patchOrReplace(view, oldChildren, i, old, pend);\n }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[i]!;\n this.initViewBody(pending[i]!);\n this.markDirty(pending[i]!);\n }\n\n // Dispose removed children\n for (let i = newLen; i < oldLen; i++) {\n this.dispose(oldChildren[i]!);\n }\n oldChildren.length = newLen;\n }\n\n // -- Keyed reconciliation\n\n #reconcileKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n let i = 0;\n let oldEnd = oldChildren.length - 1;\n let newEnd = pending.length - 1;\n\n // Phase 1: Head sync — match from start\n while (i <= oldEnd && i <= newEnd) {\n const oldView = oldChildren[i]!;\n const pendView = pending[i]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, i, oldView, pendView);\n i++;\n }\n\n // Phase 2: Tail sync — match from end\n while (oldEnd >= i && newEnd >= i) {\n const oldView = oldChildren[oldEnd]!;\n const pendView = pending[newEnd]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, oldEnd, oldView, pendView);\n oldEnd--;\n newEnd--;\n }\n\n // Phase 3: Simple cases\n if (i > oldEnd) {\n // All remaining pending are insertions\n for (let j = i; j <= newEnd; j++) {\n this.initViewBody(pending[j]!);\n this.markDirty(pending[j]!);\n if (pending[j]!.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pending[j]!.userKey!, pending[j]!);\n }\n }\n // Rebuild children array\n view.children = [\n ...oldChildren.slice(0, i),\n ...pending.slice(i, newEnd + 1),\n ...oldChildren.slice(i, oldEnd + 1), // tail-synced portion is already patched\n ];\n return;\n }\n\n if (i > newEnd) {\n // All remaining old are removals\n for (let j = i; j <= oldEnd; j++) {\n this.dispose(oldChildren[j]!);\n }\n // Rebuild children array: head + tail\n view.children = [\n ...oldChildren.slice(0, i),\n ...oldChildren.slice(oldEnd + 1),\n ];\n return;\n }\n\n // Phase 4: Middle diff\n // Build map: pending key → index in pending\n const newKeyToIndex = new Map<Key, number>();\n for (let j = i; j <= newEnd; j++) {\n const key = pending[j]!.userKey;\n if (key != null) newKeyToIndex.set(key, j);\n }\n\n const middleLen = newEnd - i + 1;\n // newIdxToOldIdx[j] = old index of the view now at pending[i+j], or -1 if new\n const newIdxToOldIdx = new Array<number>(middleLen).fill(-1);\n // Track which old children were matched\n const matched = new Set<number>();\n\n for (let j = i; j <= oldEnd; j++) {\n const oldView = oldChildren[j]!;\n const key = oldView.userKey;\n if (key != null && newKeyToIndex.has(key)) {\n const newIdx = newKeyToIndex.get(key)!;\n newIdxToOldIdx[newIdx - i] = j;\n matched.add(j);\n }\n }\n\n // Dispose unmatched old children\n for (let j = i; j <= oldEnd; j++) {\n if (!matched.has(j)) {\n this.dispose(oldChildren[j]!);\n }\n }\n\n // Compute LIS on the old indices — these views stay in place\n const stable = lis(newIdxToOldIdx);\n\n // Build new children array for the middle portion\n const newChildren: ViewRecord[] = new Array(middleLen);\n for (let j = middleLen - 1; j >= 0; j--) {\n const newIdx = i + j;\n const pendView = pending[newIdx]!;\n\n if (newIdxToOldIdx[j] === -1) {\n // New child — init and mount\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pendView.userKey, pendView);\n }\n newChildren[j] = pendView;\n } else {\n // Matched child — reuse the old view\n const oldView = oldChildren[newIdxToOldIdx[j]!]!;\n this.#patchOrReplace(\n view,\n oldChildren,\n newIdxToOldIdx[j]!,\n oldView,\n pendView,\n );\n if (!stable.has(j)) {\n this.markMoved(oldView);\n }\n newChildren[j] = oldView;\n }\n }\n\n // Rebuild view.children: head + middle + tail\n const head = oldChildren.slice(0, i);\n const tail = oldChildren.slice(oldEnd + 1);\n view.children = [...head, ...newChildren, ...tail];\n }\n\n /** Patch an existing view with pending props, or replace if viewFn changed. */\n #patchOrReplace(\n parent: ViewRecord,\n oldChildren: ViewRecord[],\n idx: number,\n oldView: ViewRecord,\n pendView: ViewRecord,\n ): void {\n if (oldView.viewFn === pendView.viewFn) {\n this.nextProps(oldView, pendView.props, pendView.slot, pendView.sc);\n } else {\n this.dispose(oldView);\n oldChildren[idx] = pendView;\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!parent.keyToView) parent.keyToView = new Map();\n parent.keyToView.set(pendView.userKey, pendView);\n }\n }\n }\n\n // -- Disposal ---------------------------------------------------------------\n\n dispose(view: ViewRecord): void {\n // If this is a primitive with a DOM element, removing it from DOM\n // automatically removes all descendant DOM nodes. Only do virtual\n // cleanup (unsubscribe, key removal, dirty queue) for children.\n const isPrimitiveWithDom = view.flags & F_PRIMITIVE && view.renderRef;\n\n if (view.children) {\n for (const child of view.children) {\n if (isPrimitiveWithDom) {\n this.#disposeVirtual(child);\n } else {\n this.dispose(child);\n }\n }\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n this.renderer.unmount(view);\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n /** Dispose without DOM removal — parent primitive handles DOM cleanup. */\n #disposeVirtual(view: ViewRecord): void {\n if (view.children) {\n for (const child of view.children) this.#disposeVirtual(child);\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n view.renderRef = undefined;\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n // -- Render loop ------------------------------------------------------------\n\n render(): void {\n // Already rendering. Exit.\n if (this.#rendering) return;\n\n // Orchestrator should know which engine is currently active.\n // Inside single task only one engine can be active\n orchestrator.setCurrentEngine(this);\n this.#rendering = true;\n\n try {\n const cbs: (() => void)[] = [];\n for (const view of this.#dirtyQueue) {\n if (view.flags & F_DISPOSED) continue;\n this.initViewBody(view);\n const isNew = !view.renderRef;\n if (!isNew) view.body?.onUpdateBefore?.();\n\n if (view.flags & F_DIRTY) {\n // Full re-render\n this.reconcile(view);\n this.renderer.render(view);\n view.flags &= ~F_DIRTY;\n view.flags &= ~F_MOVED;\n\n if (isNew && view.body?.onMount) {\n const b = view.body;\n cbs.push(() => b.onMount!());\n } else if (!isNew && view.body?.onUpdateAfter) {\n const b = view.body;\n cbs.push(() => b.onUpdateAfter!());\n }\n } else {\n // Move only\n this.renderer.render(view);\n view.flags &= ~F_MOVED;\n }\n }\n\n this.#dirtyQueue.clear();\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n for (const cb of cbs) cb();\n } catch (e) {\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n throw e;\n }\n }\n}\n",
|
|
15
|
-
"import { Engine, type Scheduler } from \"@/internal/engine\";\nimport type { IRender } from \"@/render/render_interface\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\ntype AppOptions = {\n scheduler?: Scheduler;\n};\n\ntype AppHandle = {\n engine: Engine;\n};\n\n/**\n * Create a Creo application.\n *\n * createApp(() => App(), new HtmlRender(el)).mount();\n * createApp(() => App(), new HtmlRender(el), { scheduler: requestAnimationFrame }).mount();\n */\nexport function createApp(\n slot: () => void,\n renderer: IRender<Wildcard>,\n options?: AppOptions,\n) {\n return {\n mount(props?: Wildcard): AppHandle {\n const engine = new Engine(renderer, options?.scheduler)
|
|
16
|
-
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport {\n F_PRIMITIVE,\n F_MOVED,\n F_TEXT_CONTENT,\n} from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// Render refs — stored on view.renderRef\n// ---------------------------------------------------------------------------\n\n/**\n * For primitives: { element, prevProps }\n * For composites: renderRef is set to `true` (just a non-null marker)\n *\n * Discriminated via view.flags & F_PRIMITIVE — no `kind` field needed.\n */\ntype PrimitiveDomRef = {\n element: Element | Text;\n prevProps: Maybe<Record<string, unknown>>;\n};\n\n// ---------------------------------------------------------------------------\n// Event delegation — Inferno-style: one listener per event type on container\n// ---------------------------------------------------------------------------\n\nfunction isEventProp(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 && // 'o'\n key.charCodeAt(1) === 110 && // 'n'\n key.charCodeAt(2) >= 65 && // 'A'\n key.charCodeAt(2) <= 90 // 'Z'\n );\n}\n\nconst DOM_EVENT: Record<string, string> = {\n // Pointer / mouse — bubble.\n Click: \"click\",\n Dblclick: \"dblclick\",\n PointerDown: \"pointerdown\",\n PointerUp: \"pointerup\",\n PointerMove: \"pointermove\",\n // Form — bubble.\n Input: \"input\",\n Change: \"change\",\n // Keyboard — bubble.\n KeyDown: \"keydown\",\n KeyUp: \"keyup\",\n // Focus / blur — don't bubble (capture-phase delegation).\n Focus: \"focus\",\n Blur: \"blur\",\n // Hover — don't bubble; per-target only (no ancestor walk).\n MouseEnter: \"mouseenter\",\n MouseLeave: \"mouseleave\",\n PointerEnter: \"pointerenter\",\n PointerLeave: \"pointerleave\",\n // Scroll / load / error — don't bubble.\n Scroll: \"scroll\",\n Load: \"load\",\n Error: \"error\",\n // Disclosure — don't bubble.\n Toggle: \"toggle\",\n // Media — don't bubble (capture-phase delegation).\n VolumeChange: \"volumechange\",\n Play: \"play\",\n Pause: \"pause\",\n Ended: \"ended\",\n TimeUpdate: \"timeupdate\",\n LoadedMetadata: \"loadedmetadata\",\n LoadedData: \"loadeddata\",\n CanPlay: \"canplay\",\n CanPlayThrough: \"canplaythrough\",\n DurationChange: \"durationchange\",\n RateChange: \"ratechange\",\n Seeking: \"seeking\",\n Seeked: \"seeked\",\n Stalled: \"stalled\",\n Waiting: \"waiting\",\n};\n\nconst $EV = Symbol.for(\"creo.ev\");\n\nconst containerState = new WeakMap<\n HTMLElement,\n {\n counts: Map<string, number>;\n handler: (e: Event) => void;\n }\n>();\n\nfunction getState(container: HTMLElement) {\n let state = containerState.get(container);\n if (!state) {\n state = {\n counts: new Map(),\n handler(e: Event) {\n const domEvent = e.type;\n const noWalk = NO_WALK_EVENTS.has(domEvent);\n let dom = e.target as\n | (HTMLElement & { [$EV]?: Record<string, Function> })\n | null;\n while (dom && dom !== container) {\n const evObj = dom[$EV];\n if (evObj) {\n const handler = evObj[domEvent];\n if (handler) {\n handler(mapEventData(domEvent, e));\n if (e.cancelBubble) return;\n }\n }\n // For mouseenter/leave-style events the browser already dispatches\n // one event per ancestor newly entered — walking up here would\n // double-fire ancestor handlers.\n if (noWalk) return;\n dom = dom.parentElement as typeof dom;\n }\n },\n };\n containerState.set(container, state);\n }\n return state;\n}\n\n// Events that don't bubble — register in the capture phase so delegation\n// at the container still receives them.\nconst CAPTURE_EVENTS = new Set([\n \"focus\",\n \"blur\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n \"scroll\",\n \"load\",\n \"error\",\n \"toggle\",\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\n// Events whose semantics are \"this element specifically\" — the browser\n// dispatches one event per ancestor newly entered, so walking up the tree\n// from target to container would double-fire ancestor handlers. For these,\n// only consult the actual target element.\nconst NO_WALK_EVENTS = new Set([\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\n// Events fired at high frequency where we want passive listeners by default.\nconst PASSIVE_EVENTS = new Set([\"scroll\"]);\n\nfunction listenerOptions(domEvent: string): boolean | AddEventListenerOptions {\n const capture = CAPTURE_EVENTS.has(domEvent);\n if (PASSIVE_EVENTS.has(domEvent)) {\n return { capture, passive: true };\n }\n return capture;\n}\n\nfunction ensureDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count === 0) {\n container.addEventListener(domEvent, state.handler, listenerOptions(domEvent));\n }\n state.counts.set(domEvent, count + 1);\n}\n\nfunction removeDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count <= 1) {\n state.counts.delete(domEvent);\n container.removeEventListener(domEvent, state.handler, listenerOptions(domEvent));\n } else {\n state.counts.set(domEvent, count - 1);\n }\n}\n\nconst POINTER_EVENTS = new Set([\n \"click\",\n \"dblclick\",\n \"pointerdown\",\n \"pointerup\",\n \"pointermove\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\nconst MEDIA_EVENTS = new Set([\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\nfunction mapEventData(domEvent: string, e: Event): Record<string, unknown> {\n let data: Record<string, unknown>;\n if (POINTER_EVENTS.has(domEvent)) {\n const pe = e as PointerEvent;\n data = { x: pe.clientX, y: pe.clientY };\n } else if (domEvent === \"input\" || domEvent === \"change\") {\n const target = e.target as HTMLInputElement;\n data = { value: target.value, checked: !!target.checked };\n } else if (MEDIA_EVENTS.has(domEvent)) {\n const target = e.target as HTMLMediaElement;\n data = {\n muted: !!target.muted,\n paused: !!target.paused,\n volume: target.volume,\n currentTime: target.currentTime,\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n };\n } else if (domEvent === \"scroll\") {\n const target = e.target as Element;\n data = {\n scrollTop: (target as HTMLElement).scrollTop ?? 0,\n scrollLeft: (target as HTMLElement).scrollLeft ?? 0,\n };\n } else if (domEvent === \"error\") {\n const ev = e as ErrorEvent;\n data = { message: ev.message ?? \"\" };\n } else if (domEvent === \"toggle\") {\n const target = e.target as HTMLDetailsElement;\n data = { open: !!target.open };\n } else if (domEvent === \"keydown\" || domEvent === \"keyup\") {\n const ke = e as KeyboardEvent;\n data = { key: ke.key, code: ke.code };\n } else {\n data = {};\n }\n data.stopPropagation = () => e.stopPropagation();\n data.preventDefault = () => e.preventDefault();\n return data;\n}\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst DOM_PROPERTIES = new Set([\n \"value\",\n \"checked\",\n \"selected\",\n \"indeterminate\",\n \"muted\",\n]);\n\n// ---------------------------------------------------------------------------\n// HTML Renderer\n// ---------------------------------------------------------------------------\n\nexport class HtmlRender implements IRender<HTMLElement | Text> {\n engine!: Engine;\n\n constructor(private container: HTMLElement) {}\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.renderRef) {\n // --- Mount ---\n if (view.flags & F_PRIMITIVE) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n const tag = view.viewFn[$primitive]!;\n\n if (tag === \"text\") {\n const textNode = document.createTextNode(String(view.props));\n view.renderRef = { element: textNode, prevProps: null };\n parentNode.insertBefore(textNode, refNode);\n } else {\n const parentIsSvg =\n (parentNode as Element).namespaceURI === SVG_NS;\n const useSvg = tag === \"svg\" || parentIsSvg;\n const element = useSvg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n const props = view.props as Record<string, unknown>;\n const domRef: PrimitiveDomRef = { element, prevProps: null };\n view.renderRef = domRef;\n this.setAttributes(element, props);\n\n // If single text child, use textContent directly\n if (view.children?.length === 1) {\n const child = view.children[0]!;\n if (\n child.flags & F_PRIMITIVE &&\n child.viewFn[$primitive] === \"text\"\n ) {\n element.textContent = String(child.props);\n child.renderRef = { element, prevProps: null };\n child.flags |= F_TEXT_CONTENT;\n }\n }\n\n parentNode.insertBefore(element, refNode);\n }\n } else {\n // Composite: no DOM — just mark as mounted\n view.renderRef = true;\n }\n return;\n }\n\n // --- Update ---\n\n if (view.flags & F_MOVED) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n if (view.flags & F_PRIMITIVE) {\n const ref = view.renderRef as PrimitiveDomRef;\n parentNode.insertBefore(ref.element, refNode);\n } else {\n this.moveDomNodes(view, parentNode, refNode);\n }\n }\n\n if (!(view.flags & F_PRIMITIVE)) return;\n\n const ref = view.renderRef as PrimitiveDomRef;\n\n // Text node in textContent mode — update parent's textContent\n if (view.flags & F_TEXT_CONTENT) {\n const parentEl = ref.element as Element;\n const nextText = String(view.props);\n if (parentEl.textContent !== nextText) {\n parentEl.textContent = nextText;\n }\n return;\n }\n\n if (ref.element instanceof Text) {\n const nextText = String(view.props);\n if (ref.element.textContent !== nextText) {\n ref.element.textContent = nextText;\n }\n return;\n }\n\n const nextProps = view.props as Record<string, unknown>;\n const el = ref.element as Element;\n if (!ref.prevProps) {\n this.setAttributes(el, nextProps);\n } else if (ref.prevProps !== nextProps) {\n this.diffAttributes(el, ref.prevProps, nextProps);\n }\n ref.prevProps = nextProps;\n }\n\n unmount(view: ViewRecord): void {\n if (view.flags & F_PRIMITIVE) {\n this.removeDomNodes(view);\n }\n view.renderRef = undefined;\n }\n\n // -- Internal: DOM tree navigation ------------------------------------------\n\n private findParentDom(view: ViewRecord): Node {\n let parent = view.parent;\n while (parent) {\n if (parent.flags & F_PRIMITIVE) {\n const ref = parent.renderRef as Maybe<PrimitiveDomRef>;\n if (ref && !(ref.element instanceof Text)) return ref.element;\n }\n parent = parent.parent;\n }\n return this.container;\n }\n\n private findInsertionPoint(view: ViewRecord): Node | null {\n const parent = view.parent;\n if (!parent?.children) return null;\n\n const children = parent.children;\n\n // Fast path: last child\n if (children[children.length - 1] === view) {\n return this.#parentEndAnchor(parent);\n }\n\n const idx = children.indexOf(view);\n for (let i = idx + 1; i < children.length; i++) {\n const dom = this.getFirstDomNode(children[i]!);\n if (dom) return dom;\n }\n\n return this.#parentEndAnchor(parent);\n }\n\n #parentEndAnchor(parent: ViewRecord): Node | null {\n if (parent.flags & F_PRIMITIVE) return null; // append to element\n // Composite: walk up\n return this.findInsertionPoint(parent);\n }\n\n // -- Internal: attributes + delegated events --------------------------------\n\n private setAttributes(\n element: Element,\n props: Record<string, unknown>,\n ) {\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n if (isEventProp(key)) {\n this.bindEvent(element, key, value as Function);\n continue;\n }\n this.setAttribute(element, key, value);\n }\n }\n\n private diffAttributes(\n element: Element,\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n ) {\n for (const key in prev) {\n if (key === \"key\") continue;\n if (!(key in next) || next[key] == null) {\n if (isEventProp(key)) {\n this.unbindEvent(element, key);\n } else {\n this.removeAttribute(element, key);\n }\n }\n }\n\n for (const key in next) {\n const value = next[key];\n if (key === \"key\" || value == null) continue;\n // Re-assert DOM properties even if prevProps matches: the live DOM\n // value can drift from prevProps via user input (typing in an input,\n // toggling a checkbox) without our state ever changing.\n if (prev[key] === value && !DOM_PROPERTIES.has(key)) continue;\n if (isEventProp(key)) {\n const creoName = key.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj) {\n evObj[domEvent] = value as Function;\n } else {\n this.bindEvent(element, key, value as Function);\n }\n } else {\n this.setAttribute(element, key, value);\n }\n }\n }\n\n private bindEvent(\n element: Element,\n prop: string,\n handler: Function,\n ): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj: Record<string, Function> =\n (element as any)[$EV] ?? ((element as any)[$EV] = {});\n evObj[domEvent] = handler;\n ensureDelegated(this.container, domEvent);\n }\n\n private unbindEvent(element: Element, prop: string): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as Record<string, Function> | undefined;\n if (evObj) {\n delete evObj[domEvent];\n }\n removeDelegated(this.container, domEvent);\n }\n\n private setAttribute(element: Element, key: string, value: unknown) {\n if (key === \"class\") {\n // className is a settable string on HTMLElement but readonly (SVGAnimatedString)\n // on SVG — use setAttribute which works for both.\n element.setAttribute(\"class\", String(value));\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = String(value);\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = value;\n } else if (typeof value === \"boolean\") {\n if (value) element.setAttribute(key, \"\");\n else element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n\n private removeAttribute(element: Element, key: string) {\n if (key === \"class\") {\n element.removeAttribute(\"class\");\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = \"\";\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = key === \"value\" ? \"\" : false;\n } else {\n element.removeAttribute(key);\n }\n }\n\n // -- Internal: DOM navigation -----------------------------------------------\n\n private getFirstDomNode(view: ViewRecord): Node | null {\n if (!view.renderRef) return null;\n if (view.flags & F_PRIMITIVE) return (view.renderRef as PrimitiveDomRef).element;\n if (view.children) {\n for (const child of view.children) {\n const dom = this.getFirstDomNode(child);\n if (dom) return dom;\n }\n }\n return null;\n }\n\n private moveDomNodes(\n view: ViewRecord,\n parentNode: Node,\n insertBefore: Node | null,\n ): void {\n if (!view.renderRef) return;\n if (view.flags & F_PRIMITIVE) {\n parentNode.insertBefore((view.renderRef as PrimitiveDomRef).element, insertBefore);\n } else if (view.children) {\n for (const child of view.children) {\n this.moveDomNodes(child, parentNode, insertBefore);\n }\n }\n }\n\n private removeDomNodes(view: ViewRecord) {\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || !(view.flags & F_PRIMITIVE)) return;\n // F_TEXT_CONTENT: ref.element is the PARENT's element (optimization),\n // not this text view's own node. Clear the parent's textContent so\n // incoming siblings mount into an empty host, but never remove the\n // parent — the parent owns its own lifecycle.\n if (view.flags & F_TEXT_CONTENT) {\n (ref.element as Element).textContent = \"\";\n return;\n }\n const evObj = (ref.element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj) {\n for (const domEvent in evObj) {\n removeDelegated(this.container, domEvent);\n }\n delete (ref.element as any)[$EV];\n }\n ref.element.parentNode?.removeChild(ref.element);\n }\n}\n",
|
|
17
|
-
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// JSON node — the output type\n// ---------------------------------------------------------------------------\n\nexport type JsonNode = {\n type: string;\n props: Record<string, unknown>;\n children: JsonNode[];\n key?: string | number;\n};\n\n// ---------------------------------------------------------------------------\n// JSON Renderer\n// ---------------------------------------------------------------------------\n\nexport class JsonRender implements IRender<JsonNode> {\n /** The root JSON node after mount. */\n root: Maybe<JsonNode>;\n\n engine!: Engine;\n constructor() {\n this.root = null;\n }\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n const existing = view.renderRef as Maybe<JsonNode>;\n\n if (!existing) {\n // Mount\n const node = this.buildNode(view);\n if (!view.parent) {\n this.root = node;\n return;\n }\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n //
|
|
18
|
-
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// Self-closing HTML tags (no closing tag)\nconst VOID_TAGS = new Set([\n \"br\", \"hr\", \"img\", \"input\", \"source\", \"track\", \"embed\",\n \"area\", \"col\", \"wbr\",\n]);\n\n// Attributes that are set as DOM properties, not HTML attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"]);\n\n// Event handler prefix detection\nfunction isEventProp(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 && // 'o'\n key.charCodeAt(1) === 110 && // 'n'\n key.charCodeAt(2) >= 65 && // 'A'\n key.charCodeAt(2) <= 90 // 'Z'\n );\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/**\n * HtmlStringRender — pull-based string renderer.\n * render/unmount are no-ops. Call renderToString() to\n * get the current HTML string from the VDOM.\n *\n * Output matches HtmlRender's DOM serialization (innerHTML).\n */\nexport class HtmlStringRender implements IRender<string> {\n private root: Maybe<ViewRecord> = null;\n\n engine!: Engine;\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.parent) {\n this.root = view;\n }\n }\n\n unmount(_view: ViewRecord): void {}\n\n // -- Public -----------------------------------------------------------------\n\n renderToString(): string {\n if (!this.root) return \"\";\n return this.buildString(this.root);\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildString(rec: ViewRecord): string {\n const tag = rec.viewFn[$primitive];\n\n if (tag != null) {\n if (tag === \"text\") {\n return escapeHtml(String(rec.props));\n }\n const attrs = this.buildAttrs(rec.props as Record<string, unknown>);\n if (VOID_TAGS.has(tag)) {\n return `<${tag}${attrs}>`;\n }\n return `<${tag}${attrs}>${this.buildChildren(rec)}</${tag}>`;\n }\n\n // Composite — transparent, just render children\n return this.buildChildren(rec);\n }\n\n private buildAttrs(props: Record<string, unknown>): string {\n let result = \"\";\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n // Skip event handlers — they don't appear in HTML\n if (isEventProp(key)) continue;\n // Skip DOM-only properties (value, checked, etc.)\n if (DOM_PROPERTIES.has(key)) continue;\n\n if (key === \"style\") {\n // Normalize style to match DOM's cssText (trailing semicolon)\n let css = String(value);\n css = css.trim();\n if (css && !css.endsWith(\";\")) css += \";\";\n result += ` style=\"${escapeAttr(css)}\"`;\n continue;\n }\n if (typeof value === \"boolean\") {\n if (value) result += ` ${key}=\"\"`;\n // false booleans are omitted\n } else {\n const attrName = key === \"class\" ? \"class\" : key;\n result += ` ${attrName}=\"${escapeAttr(String(value))}\"`;\n }\n }\n return result;\n }\n\n private buildChildren(rec: ViewRecord): string {\n if (!rec.children) return \"\";\n let result = \"\";\n for (const child of rec.children) {\n result += this.buildString(child);\n }\n return result;\n }\n}\n
|
|
14
|
+
"import type { IRender } from \"@/render/render_interface\";\nimport {\n type ViewRecord,\n hasScStructuralChange,\n F_DIRTY,\n F_MOVED,\n F_PRIMITIVE,\n F_PENDING,\n F_DISPOSED,\n} from \"./internal_view\";\nimport type { Wildcard } from \"./wildcard\";\nimport { type Maybe } from \"@/functional/maybe\";\nimport type { Key } from \"@/functional/key\";\nimport type { SlotContent, ViewFn } from \"@/public/view\";\nimport { textViewFn } from \"@/public/primitives/primitives\";\nimport { $primitive } from \"@/public/primitive\";\nimport { State, type Reactive } from \"@/public/state\";\nimport { Store, isStore } from \"@/public/store\";\nimport { shallowEqual } from \"@/functional/shallow_equal\";\nimport { lis } from \"@/functional/lis\";\nimport { orchestrator } from \"./orchestrator\";\n\nexport type Scheduler = (callback: () => void) => void;\n\nexport class Engine {\n #dirtyQueue = new Set<ViewRecord>();\n #collector: Maybe<ViewRecord[]>;\n #collectFor: Maybe<ViewRecord>;\n\n #scheduler: Scheduler;\n #renderScheduled = false;\n #rendering = false;\n\n constructor(\n public renderer: IRender<Wildcard>,\n scheduler?: Scheduler,\n ) {\n this.#scheduler = scheduler ?? ((cb) => queueMicrotask(cb));\n renderer.engine = this;\n }\n\n // -- Record initialization --------------------------------------------------\n newView<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n parent: Maybe<ViewRecord>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord {\n const res: ViewRecord = {\n viewFn,\n userKey,\n props,\n slot,\n // View was not rendered yet, so there is no body\n body: null,\n // slot was not called _yet_, so there is no slot children\n sc: null,\n // there is no renderer _yet_\n renderRef: null,\n\n flags: F_PENDING | (viewFn[$primitive] != null ? F_PRIMITIVE : 0),\n\n children: null,\n\n keyToView: null,\n unsubscribe: null,\n parent,\n scHost: null,\n pos: -1,\n };\n if (slot) {\n if (typeof slot === \"string\") {\n // String slot — inline a single text ViewRecord. Avoids both the\n // throwaway closure and a collector trip per view.\n res.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n res,\n slot,\n null,\n null,\n ),\n ];\n } else {\n res.sc = this.#collect(slot, [], res);\n }\n }\n return res;\n }\n\n // called when view renders view\n // Saved potential pending view to collector for further reconsilication\n view<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n viewFn: ViewFn<Props, Api>,\n props: Props,\n slot: Maybe<SlotContent>,\n userKey: Maybe<Key>,\n ): ViewRecord<Props, Api, RenderRef> {\n const view = this.newView(viewFn, this.#collectFor, props, slot, userKey);\n this.#collector?.push(view);\n return view;\n }\n\n views(views: Maybe<ViewRecord[]>): void {\n if (views) this.#collector?.push(...views);\n }\n\n // ViewRecord already exist, but we still need to initialise the whole record\n initViewBody(view: ViewRecord): void {\n // Only for non initialised views:\n if (!(view.flags & F_PENDING)) return;\n\n view.flags &= ~F_PENDING;\n\n // If view is primitive\n if (view.flags & F_PRIMITIVE) {\n const engine = this;\n view.body = {\n render() {\n engine.views(view.sc);\n },\n };\n return;\n }\n // View is composite\n view.body = view.viewFn({\n props: () => view.props,\n use: <T>(storeOrState: T | Store<T>): Reactive<T> => {\n if (!isStore(storeOrState)) {\n return new State(storeOrState, () => this.markDirty(view));\n }\n const s = storeOrState;\n const unsub = s.subscribe(() => this.markDirty(view));\n if (!view.unsubscribe) view.unsubscribe = [];\n view.unsubscribe.push(unsub);\n return s;\n },\n slot: () => {\n if (!view.sc) return;\n view.scHost = this.#collectFor ?? view;\n for (const child of view.sc) {\n child.parent = this.#collectFor ?? view;\n this.#collector?.push(child);\n }\n },\n });\n }\n\n createRoot(children: () => void, props: Wildcard): ViewRecord {\n orchestrator.setCurrentEngine(this);\n const view = this.newView(\n ({ slot }) => ({\n render() {\n slot();\n },\n }),\n null,\n props,\n children,\n null,\n );\n this.markDirty(view);\n return view;\n }\n\n // -- Dirty tracking ---------------------------------------------------------\n\n markDirty<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_DIRTY) {\n return;\n }\n view.flags |= F_DIRTY;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n markMoved<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n ): void {\n if (view.flags & F_DISPOSED) return;\n if (view.flags & F_MOVED) {\n return;\n }\n view.flags |= F_MOVED;\n this.#dirtyQueue.add(view);\n this.schedule();\n }\n\n schedule(): void {\n if (this.#renderScheduled) return;\n this.#renderScheduled = true;\n this.#scheduler(() => {\n this.#renderScheduled = false;\n this.render();\n });\n }\n\n // -- Collector --------------------------------------------------------------\n\n #collect(\n render: () => void,\n collector: ViewRecord[],\n parent: ViewRecord,\n ): ViewRecord[] {\n const before = this.#collector;\n const beforeParent = this.#collectFor;\n this.#collector = collector;\n this.#collectFor = parent;\n render();\n this.#collector = before;\n this.#collectFor = beforeParent;\n return collector;\n }\n\n // -- Props update -----------------------------------------------------------\n\n nextProps<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard>(\n view: ViewRecord<Props, Api, RenderRef>,\n nextProps: Props,\n nextSlot: Maybe<SlotContent>,\n preCollectedSc?: Maybe<ViewRecord[]>,\n ): void {\n const prevSc = view.sc;\n view.slot = nextSlot;\n // Use pre-collected sc if available (avoids re-running the slot function)\n if (preCollectedSc) {\n // Re-parent sc items to this view (they were parented to the pending view)\n for (const child of preCollectedSc) child.parent = view;\n view.sc = preCollectedSc;\n } else if (nextSlot) {\n if (typeof nextSlot === \"string\") {\n view.sc = [\n this.newView(\n textViewFn as ViewFn<Wildcard, Wildcard>,\n view,\n nextSlot,\n null,\n null,\n ),\n ];\n } else {\n view.sc = this.#collect(nextSlot, [], view);\n }\n } else {\n view.sc = null;\n }\n\n const structChanged = hasScStructuralChange(prevSc, view.sc);\n const shouldUpdate = view.body?.shouldUpdate\n ? view.body.shouldUpdate(nextProps)\n : !shallowEqual(view.props, nextProps) ||\n // Primitive whose live output may have drifted from props (e.g. user\n // typed in <input value=…>) — let the renderer decide whether a\n // re-assertion is actually needed.\n ((view.flags & F_PRIMITIVE) !== 0 &&\n this.renderer.shouldReassert?.(view, nextProps) === true);\n\n if (shouldUpdate || structChanged) {\n // Full re-render: own props or slot structure changed\n view.props = nextProps;\n this.markDirty(view);\n } else if (view.sc && view.scHost?.children) {\n // Composite with stable structure and own props — propagate sc prop changes directly\n this.#propagateScProps(view);\n } else if (view.sc && prevSc) {\n // No scHost (e.g. primitive) — check if any sc child props changed\n for (let i = 0; i < view.sc.length; i++) {\n if (view.sc[i]!.props !== prevSc[i]!.props) {\n this.markDirty(view);\n break;\n }\n }\n }\n }\n\n /** Propagate slot children prop changes directly to live children, skipping parent reconcile. */\n #propagateScProps(owner: ViewRecord): void {\n const host = owner.scHost;\n const sc = owner.sc;\n if (!host?.children || !sc) return;\n\n if (host.keyToView) {\n for (const item of sc) {\n if (item.userKey != null) {\n const live = host.keyToView.get(item.userKey);\n if (live && live.viewFn === item.viewFn) {\n this.nextProps(live, item.props, item.slot);\n }\n }\n }\n } else {\n const len = Math.min(sc.length, host.children.length);\n for (let i = 0; i < len; i++) {\n const live = host.children[i]!;\n if (live.viewFn === sc[i]!.viewFn) {\n this.nextProps(live, sc[i]!.props, sc[i]!.slot);\n }\n }\n }\n }\n\n // -- Reconciliation ---------------------------------------------------------\n\n reconcile(view: ViewRecord): void {\n let pendingChildren: Maybe<ViewRecord[]> = null;\n if (view.body?.render) {\n pendingChildren = this.#collect(view.body.render, [], view);\n }\n\n if (pendingChildren == null || pendingChildren.length === 0) {\n // No children case\n if (view.children) for (const child of view.children) this.dispose(child);\n return;\n }\n\n // We do not have any previous children. In this case, we just insert new items and that's it\n if (view.children == null) {\n view.children = pendingChildren;\n for (let i = 0; i < pendingChildren.length; i++) {\n const child = pendingChildren[i]!;\n child.pos = i;\n this.initViewBody(child);\n this.markDirty(child);\n if (child.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(child.userKey, child);\n }\n }\n return;\n }\n // Now, we have both view.children & pendingChildren\n // Check if any child is keyed — if so, use keyed algorithm\n const hasKeys = pendingChildren.some((c) => c.userKey != null);\n if (hasKeys) {\n this.#reconcileKeyed(view, view.children, pendingChildren);\n } else {\n this.#reconcileNonKeyed(view, view.children, pendingChildren);\n }\n }\n\n // -- Non-keyed reconciliation ------------------------------------------------\n\n #reconcileNonKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n const oldLen = oldChildren.length;\n const newLen = pending.length;\n const minLen = Math.min(oldLen, newLen);\n\n // Patch overlapping range by position\n for (let i = 0; i < minLen; i++) {\n const old = oldChildren[i]!;\n const pend = pending[i]!;\n this.#patchOrReplace(view, oldChildren, i, old, pend);\n oldChildren[i]!.pos = i;\n }\n\n // Mount new children\n for (let i = oldLen; i < newLen; i++) {\n oldChildren[i] = pending[i]!;\n pending[i]!.pos = i;\n this.initViewBody(pending[i]!);\n this.markDirty(pending[i]!);\n }\n\n // Dispose removed children\n for (let i = newLen; i < oldLen; i++) {\n this.dispose(oldChildren[i]!);\n }\n oldChildren.length = newLen;\n }\n\n // -- Keyed reconciliation\n\n #reconcileKeyed(\n view: ViewRecord,\n oldChildren: ViewRecord[],\n pending: ViewRecord[],\n ): void {\n let i = 0;\n let oldEnd = oldChildren.length - 1;\n let newEnd = pending.length - 1;\n\n // Phase 1: Head sync — match from start\n while (i <= oldEnd && i <= newEnd) {\n const oldView = oldChildren[i]!;\n const pendView = pending[i]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, i, oldView, pendView);\n i++;\n }\n\n // Phase 2: Tail sync — match from end\n while (oldEnd >= i && newEnd >= i) {\n const oldView = oldChildren[oldEnd]!;\n const pendView = pending[newEnd]!;\n if (oldView.userKey !== pendView.userKey) break;\n this.#patchOrReplace(view, oldChildren, oldEnd, oldView, pendView);\n oldEnd--;\n newEnd--;\n }\n\n // Phase 3: Simple cases\n if (i > oldEnd) {\n // All remaining pending are insertions\n for (let j = i; j <= newEnd; j++) {\n this.initViewBody(pending[j]!);\n this.markDirty(pending[j]!);\n if (pending[j]!.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pending[j]!.userKey!, pending[j]!);\n }\n }\n // Rebuild children: head (already patched) + insertions + tail.\n // Pre-sized array, indexed write — no intermediate slices/spreads.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const insertCount = newEnd - i + 1;\n const out = new Array<ViewRecord>(i + insertCount + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < insertCount; j++) {\n const c = pending[i + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + insertCount + j;\n out[i + insertCount + j] = c;\n }\n view.children = out;\n return;\n }\n\n if (i > newEnd) {\n // All remaining old are removals\n for (let j = i; j <= oldEnd; j++) {\n this.dispose(oldChildren[j]!);\n }\n // Rebuild children array: head + tail. Pre-sized indexed write.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + j;\n out[i + j] = c;\n }\n view.children = out;\n return;\n }\n\n // Phase 4: Middle diff\n // Build map: pending key → index in pending\n const newKeyToIndex = new Map<Key, number>();\n for (let j = i; j <= newEnd; j++) {\n const key = pending[j]!.userKey;\n if (key != null) newKeyToIndex.set(key, j);\n }\n\n const middleLen = newEnd - i + 1;\n // newIdxToOldIdx[j] = old index of the view now at pending[i+j], or -1 if new\n const newIdxToOldIdx = new Array<number>(middleLen).fill(-1);\n // Track which old children were matched\n const matched = new Set<number>();\n\n for (let j = i; j <= oldEnd; j++) {\n const oldView = oldChildren[j]!;\n const key = oldView.userKey;\n if (key != null && newKeyToIndex.has(key)) {\n const newIdx = newKeyToIndex.get(key)!;\n newIdxToOldIdx[newIdx - i] = j;\n matched.add(j);\n }\n }\n\n // Dispose unmatched old children\n for (let j = i; j <= oldEnd; j++) {\n if (!matched.has(j)) {\n this.dispose(oldChildren[j]!);\n }\n }\n\n // Compute LIS on the old indices — these views stay in place\n const stable = lis(newIdxToOldIdx);\n\n // Build view.children directly: head + middle + tail. Pre-sized,\n // indexed write — no intermediate `newChildren` array, no slices.\n const tailStart = oldEnd + 1;\n const tailLen = oldChildren.length - tailStart;\n const out = new Array<ViewRecord>(i + middleLen + tailLen);\n for (let j = 0; j < i; j++) {\n const c = oldChildren[j]!;\n c.pos = j;\n out[j] = c;\n }\n for (let j = middleLen - 1; j >= 0; j--) {\n const newIdx = i + j;\n const pendView = pending[newIdx]!;\n\n if (newIdxToOldIdx[j] === -1) {\n // New child — init and mount\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!view.keyToView) view.keyToView = new Map();\n view.keyToView.set(pendView.userKey, pendView);\n }\n pendView.pos = i + j;\n out[i + j] = pendView;\n } else {\n // Matched child — reuse the old view\n const oldView = oldChildren[newIdxToOldIdx[j]!]!;\n this.#patchOrReplace(\n view,\n oldChildren,\n newIdxToOldIdx[j]!,\n oldView,\n pendView,\n );\n if (!stable.has(j)) {\n this.markMoved(oldView);\n }\n // Use whatever ended up in oldChildren after the patch (may be\n // pendView if viewFn changed and #patchOrReplace replaced it).\n const placed = oldChildren[newIdxToOldIdx[j]!]!;\n placed.pos = i + j;\n out[i + j] = placed;\n }\n }\n for (let j = 0; j < tailLen; j++) {\n const c = oldChildren[tailStart + j]!;\n c.pos = i + middleLen + j;\n out[i + middleLen + j] = c;\n }\n view.children = out;\n }\n\n /** Patch an existing view with pending props, or replace if viewFn changed. */\n #patchOrReplace(\n parent: ViewRecord,\n oldChildren: ViewRecord[],\n idx: number,\n oldView: ViewRecord,\n pendView: ViewRecord,\n ): void {\n if (oldView.viewFn === pendView.viewFn) {\n this.nextProps(oldView, pendView.props, pendView.slot, pendView.sc);\n } else {\n this.dispose(oldView);\n oldChildren[idx] = pendView;\n this.initViewBody(pendView);\n this.markDirty(pendView);\n if (pendView.userKey != null) {\n if (!parent.keyToView) parent.keyToView = new Map();\n parent.keyToView.set(pendView.userKey, pendView);\n }\n }\n }\n\n // -- Disposal ---------------------------------------------------------------\n\n dispose(view: ViewRecord): void {\n // If this is a primitive with a DOM element, removing it from DOM\n // automatically removes all descendant DOM nodes. Only do virtual\n // cleanup (unsubscribe, key removal, dirty queue) for children.\n const isPrimitiveWithDom = view.flags & F_PRIMITIVE && view.renderRef;\n\n if (view.children) {\n for (const child of view.children) {\n if (isPrimitiveWithDom) {\n this.#disposeVirtual(child);\n } else {\n this.dispose(child);\n }\n }\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n this.renderer.unmount(view);\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n /** Dispose without DOM removal — parent primitive handles DOM cleanup. */\n #disposeVirtual(view: ViewRecord): void {\n if (view.children) {\n for (const child of view.children) this.#disposeVirtual(child);\n }\n if (view.unsubscribe) for (const unsub of view.unsubscribe) unsub();\n if (view.userKey != null) view.parent?.keyToView?.delete(view.userKey);\n view.renderRef = undefined;\n this.#dirtyQueue.delete(view);\n view.flags |= F_DISPOSED;\n view.flags &= ~(F_DIRTY | F_MOVED);\n }\n\n // -- Render loop ------------------------------------------------------------\n\n render(): void {\n // Already rendering. Exit.\n if (this.#rendering) return;\n\n // Orchestrator should know which engine is currently active.\n // Inside single task only one engine can be active\n orchestrator.setCurrentEngine(this);\n this.#rendering = true;\n\n try {\n const cbs: (() => void)[] = [];\n for (const view of this.#dirtyQueue) {\n if (view.flags & F_DISPOSED) continue;\n this.initViewBody(view);\n const isNew = !view.renderRef;\n if (!isNew) view.body?.onUpdateBefore?.();\n\n if (view.flags & F_DIRTY) {\n // Full re-render\n this.reconcile(view);\n this.renderer.render(view);\n view.flags &= ~F_DIRTY;\n view.flags &= ~F_MOVED;\n\n if (isNew && view.body?.onMount) {\n const b = view.body;\n cbs.push(() => b.onMount!());\n } else if (!isNew && view.body?.onUpdateAfter) {\n const b = view.body;\n cbs.push(() => b.onUpdateAfter!());\n }\n } else {\n // Move only\n this.renderer.render(view);\n view.flags &= ~F_MOVED;\n }\n }\n\n this.#dirtyQueue.clear();\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n for (const cb of cbs) cb();\n } catch (e) {\n orchestrator.setCurrentEngine(null);\n this.#rendering = false;\n throw e;\n }\n }\n}\n",
|
|
15
|
+
"import { Engine, type Scheduler } from \"@/internal/engine\";\nimport type { IRender } from \"@/render/render_interface\";\nimport type { Wildcard } from \"@/internal/wildcard\";\n\ntype AppOptions = {\n scheduler?: Scheduler;\n};\n\ntype AppHandle = {\n engine: Engine;\n};\n\n/**\n * Create a Creo application.\n *\n * createApp(() => App(), new HtmlRender(el)).mount();\n * createApp(() => App(), new HtmlRender(el), { scheduler: requestAnimationFrame }).mount();\n */\nexport function createApp(\n slot: () => void,\n renderer: IRender<Wildcard>,\n options?: AppOptions,\n) {\n return {\n mount(props?: Wildcard): AppHandle {\n const engine = new Engine(renderer, options?.scheduler);\n engine.createRoot(slot, props ?? {});\n engine.render();\n return { engine };\n },\n };\n}\n",
|
|
16
|
+
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE, F_MOVED, F_TEXT_CONTENT } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Wildcard } from \"@/internal/wildcard\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// Render refs — stored on view.renderRef\n// ---------------------------------------------------------------------------\n\n/**\n * For primitives: { element, prevProps }\n * For composites: renderRef is set to `true` (just a non-null marker)\n *\n * Discriminated via view.flags & F_PRIMITIVE — no `kind` field needed.\n */\ntype PrimitiveDomRef = {\n element: Element | Text;\n prevProps: Maybe<Record<string, unknown>>;\n};\n\n// ---------------------------------------------------------------------------\n// Event delegation — Inferno-style: one listener per event type on container\n// ---------------------------------------------------------------------------\n\nfunction isEventProp(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 && // 'o'\n key.charCodeAt(1) === 110 && // 'n'\n key.charCodeAt(2) >= 65 && // 'A'\n key.charCodeAt(2) <= 90 // 'Z'\n );\n}\n\nconst DOM_EVENT: Record<string, string> = {\n // Pointer / mouse — bubble.\n Click: \"click\",\n Dblclick: \"dblclick\",\n PointerDown: \"pointerdown\",\n PointerUp: \"pointerup\",\n PointerMove: \"pointermove\",\n // Form — bubble.\n Input: \"input\",\n Change: \"change\",\n // Keyboard — bubble.\n KeyDown: \"keydown\",\n KeyUp: \"keyup\",\n // Focus / blur — don't bubble (capture-phase delegation).\n Focus: \"focus\",\n Blur: \"blur\",\n // Hover — don't bubble; per-target only (no ancestor walk).\n MouseEnter: \"mouseenter\",\n MouseLeave: \"mouseleave\",\n PointerEnter: \"pointerenter\",\n PointerLeave: \"pointerleave\",\n // Scroll / load / error — don't bubble.\n Scroll: \"scroll\",\n Load: \"load\",\n Error: \"error\",\n // Disclosure — don't bubble.\n Toggle: \"toggle\",\n // Media — don't bubble (capture-phase delegation).\n VolumeChange: \"volumechange\",\n Play: \"play\",\n Pause: \"pause\",\n Ended: \"ended\",\n TimeUpdate: \"timeupdate\",\n LoadedMetadata: \"loadedmetadata\",\n LoadedData: \"loadeddata\",\n CanPlay: \"canplay\",\n CanPlayThrough: \"canplaythrough\",\n DurationChange: \"durationchange\",\n RateChange: \"ratechange\",\n Seeking: \"seeking\",\n Seeked: \"seeked\",\n Stalled: \"stalled\",\n Waiting: \"waiting\",\n};\n\nconst $EV = Symbol.for(\"creo.ev\");\n\nconst containerState = new WeakMap<\n HTMLElement,\n {\n counts: Map<string, number>;\n handler: (e: Event) => void;\n }\n>();\n\nfunction getState(container: HTMLElement) {\n let state = containerState.get(container);\n if (!state) {\n state = {\n counts: new Map(),\n handler(e: Event) {\n const domEvent = e.type;\n const noWalk = NO_WALK_EVENTS.has(domEvent);\n let dom = e.target as\n | (HTMLElement & { [$EV]?: Record<string, Function> })\n | null;\n while (dom && dom !== container) {\n const evObj = dom[$EV];\n if (evObj) {\n const handler = evObj[domEvent];\n if (handler) {\n handler(mapEventData(domEvent, e));\n if (e.cancelBubble) return;\n }\n }\n // For mouseenter/leave-style events the browser already dispatches\n // one event per ancestor newly entered — walking up here would\n // double-fire ancestor handlers.\n if (noWalk) return;\n dom = dom.parentElement as typeof dom;\n }\n },\n };\n containerState.set(container, state);\n }\n return state;\n}\n\n// Events that don't bubble — register in the capture phase so delegation\n// at the container still receives them.\nconst CAPTURE_EVENTS = new Set([\n \"focus\",\n \"blur\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n \"scroll\",\n \"load\",\n \"error\",\n \"toggle\",\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\n// Events whose semantics are \"this element specifically\" — the browser\n// dispatches one event per ancestor newly entered, so walking up the tree\n// from target to container would double-fire ancestor handlers. For these,\n// only consult the actual target element.\nconst NO_WALK_EVENTS = new Set([\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\n// Events fired at high frequency where we want passive listeners by default.\nconst PASSIVE_EVENTS = new Set([\"scroll\"]);\n\nfunction listenerOptions(domEvent: string): boolean | AddEventListenerOptions {\n const capture = CAPTURE_EVENTS.has(domEvent);\n if (PASSIVE_EVENTS.has(domEvent)) {\n return { capture, passive: true };\n }\n return capture;\n}\n\nfunction ensureDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count === 0) {\n container.addEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n }\n state.counts.set(domEvent, count + 1);\n}\n\nfunction removeDelegated(container: HTMLElement, domEvent: string): void {\n const state = getState(container);\n const count = state.counts.get(domEvent) ?? 0;\n if (count <= 1) {\n state.counts.delete(domEvent);\n container.removeEventListener(\n domEvent,\n state.handler,\n listenerOptions(domEvent),\n );\n } else {\n state.counts.set(domEvent, count - 1);\n }\n}\n\nconst POINTER_EVENTS = new Set([\n \"click\",\n \"dblclick\",\n \"pointerdown\",\n \"pointerup\",\n \"pointermove\",\n \"mouseenter\",\n \"mouseleave\",\n \"pointerenter\",\n \"pointerleave\",\n]);\n\nconst MEDIA_EVENTS = new Set([\n \"volumechange\",\n \"play\",\n \"pause\",\n \"ended\",\n \"timeupdate\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"durationchange\",\n \"ratechange\",\n \"seeking\",\n \"seeked\",\n \"stalled\",\n \"waiting\",\n]);\n\nfunction mapEventData(domEvent: string, e: Event): Record<string, unknown> {\n let data: Record<string, unknown>;\n if (POINTER_EVENTS.has(domEvent)) {\n const pe = e as PointerEvent;\n data = { x: pe.clientX, y: pe.clientY };\n } else if (domEvent === \"input\" || domEvent === \"change\") {\n const target = e.target as HTMLInputElement;\n data = { value: target.value, checked: !!target.checked };\n } else if (MEDIA_EVENTS.has(domEvent)) {\n const target = e.target as HTMLMediaElement;\n data = {\n muted: !!target.muted,\n paused: !!target.paused,\n volume: target.volume,\n currentTime: target.currentTime,\n duration: Number.isFinite(target.duration) ? target.duration : 0,\n };\n } else if (domEvent === \"scroll\") {\n const target = e.target as Element;\n data = {\n scrollTop: (target as HTMLElement).scrollTop ?? 0,\n scrollLeft: (target as HTMLElement).scrollLeft ?? 0,\n };\n } else if (domEvent === \"error\") {\n const ev = e as ErrorEvent;\n data = { message: ev.message ?? \"\" };\n } else if (domEvent === \"toggle\") {\n const target = e.target as HTMLDetailsElement;\n data = { open: !!target.open };\n } else if (domEvent === \"keydown\" || domEvent === \"keyup\") {\n const ke = e as KeyboardEvent;\n data = { key: ke.key, code: ke.code };\n } else {\n data = {};\n }\n data.stopPropagation = () => e.stopPropagation();\n data.preventDefault = () => e.preventDefault();\n return data;\n}\n\nconst SVG_NS = \"http://www.w3.org/2000/svg\";\n\nconst DOM_PROPERTIES = new Set([\n \"value\",\n \"checked\",\n \"selected\",\n \"indeterminate\",\n \"muted\",\n]);\n\n// ---------------------------------------------------------------------------\n// HTML Renderer\n// ---------------------------------------------------------------------------\n\nexport class HtmlRender implements IRender<HTMLElement | Text> {\n engine!: Engine;\n\n constructor(private container: HTMLElement) {}\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.renderRef) {\n // --- Mount ---\n if (view.flags & F_PRIMITIVE) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n const tag = view.viewFn[$primitive]!;\n\n if (tag === \"text\") {\n const textNode = document.createTextNode(String(view.props));\n view.renderRef = { element: textNode, prevProps: null };\n parentNode.insertBefore(textNode, refNode);\n } else {\n const parentIsSvg = (parentNode as Element).namespaceURI === SVG_NS;\n const useSvg = tag === \"svg\" || parentIsSvg;\n const element = useSvg\n ? document.createElementNS(SVG_NS, tag)\n : document.createElement(tag);\n const props = view.props as Record<string, unknown>;\n const domRef: PrimitiveDomRef = { element, prevProps: null };\n view.renderRef = domRef;\n this.setAttributes(element, props);\n domRef.prevProps = props;\n\n // If single text child, use textContent directly\n if (view.children?.length === 1) {\n const child = view.children[0]!;\n if (\n child.flags & F_PRIMITIVE &&\n child.viewFn[$primitive] === \"text\"\n ) {\n element.textContent = String(child.props);\n child.renderRef = { element, prevProps: null };\n child.flags |= F_TEXT_CONTENT;\n }\n }\n\n parentNode.insertBefore(element, refNode);\n\n // The HTML `autofocus` attribute only fires during initial document\n // parse — for dynamically inserted elements browsers ignore it.\n // Match React's behaviour by calling .focus() once after mount.\n if (\n props != null &&\n (props as Record<string, unknown>).autofocus === true &&\n typeof (element as HTMLElement).focus === \"function\"\n ) {\n (element as HTMLElement).focus();\n }\n }\n } else {\n // Composite: no DOM — just mark as mounted\n view.renderRef = true;\n }\n return;\n }\n\n // --- Update ---\n\n if (view.flags & F_MOVED) {\n const parentNode = this.findParentDom(view);\n const refNode = this.findInsertionPoint(view);\n if (view.flags & F_PRIMITIVE) {\n const ref = view.renderRef as PrimitiveDomRef;\n parentNode.insertBefore(ref.element, refNode);\n } else {\n this.moveDomNodes(view, parentNode, refNode);\n }\n }\n\n if (!(view.flags & F_PRIMITIVE)) return;\n\n const ref = view.renderRef as PrimitiveDomRef;\n\n // Text node in textContent mode — update parent's textContent\n if (view.flags & F_TEXT_CONTENT) {\n const parentEl = ref.element as Element;\n const nextText = String(view.props);\n if (parentEl.textContent !== nextText) {\n parentEl.textContent = nextText;\n }\n return;\n }\n\n if (ref.element instanceof Text) {\n const nextText = String(view.props);\n if (ref.element.textContent !== nextText) {\n ref.element.textContent = nextText;\n }\n return;\n }\n\n const nextProps = view.props as Record<string, unknown>;\n const el = ref.element as Element;\n if (!ref.prevProps) {\n this.setAttributes(el, nextProps);\n } else if (ref.prevProps !== nextProps) {\n this.diffAttributes(el, ref.prevProps, nextProps);\n }\n ref.prevProps = nextProps;\n }\n\n unmount(view: ViewRecord): void {\n if (view.flags & F_PRIMITIVE) {\n this.removeDomNodes(view);\n }\n view.renderRef = undefined;\n }\n\n /**\n * Re-render only when a stateful DOM property in `nextProps` actually\n * differs from the live DOM. With this in place a 50-input form whose\n * parent re-renders touches the DOM only for the input the user is\n * actually editing.\n */\n shouldReassert(view: ViewRecord, nextProps: unknown): boolean {\n if (nextProps == null || typeof nextProps !== \"object\") return false;\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || ref.element instanceof Text) return false;\n const el = ref.element as Wildcard;\n const props = nextProps as Record<string, unknown>;\n for (const key of DOM_PROPERTIES) {\n if (!(key in props)) continue;\n const live = el[key];\n const next = props[key];\n // Browser coerces these properties — compare under matching coercion.\n if (typeof next === \"boolean\" || typeof live === \"boolean\") {\n if (Boolean(live) !== Boolean(next)) return true;\n } else if (String(live) !== String(next)) {\n return true;\n }\n }\n return false;\n }\n\n // -- Internal: DOM tree navigation ------------------------------------------\n\n private findParentDom(view: ViewRecord): Node {\n let parent = view.parent;\n while (parent) {\n if (parent.flags & F_PRIMITIVE) {\n const ref = parent.renderRef as Maybe<PrimitiveDomRef>;\n if (ref && !(ref.element instanceof Text)) return ref.element;\n }\n parent = parent.parent;\n }\n return this.container;\n }\n\n private findInsertionPoint(view: ViewRecord): Node | null {\n const parent = view.parent;\n if (!parent?.children) return null;\n\n const children = parent.children;\n\n // Fast path: last child\n if (children[children.length - 1] === view) {\n return this.#parentEndAnchor(parent);\n }\n\n // view.pos is maintained by the reconciler — avoid the O(n) indexOf scan.\n // Fall back to indexOf if pos is unset (-1) or stale (defensive).\n let idx = view.pos;\n if (idx < 0 || children[idx] !== view) idx = children.indexOf(view);\n for (let i = idx + 1; i < children.length; i++) {\n const dom = this.getFirstDomNode(children[i]!);\n if (dom) return dom;\n }\n\n return this.#parentEndAnchor(parent);\n }\n\n #parentEndAnchor(parent: ViewRecord): Node | null {\n if (parent.flags & F_PRIMITIVE) return null; // append to element\n // Composite: walk up\n return this.findInsertionPoint(parent);\n }\n\n // -- Internal: attributes + delegated events --------------------------------\n\n private setAttributes(element: Element, props: Record<string, unknown>) {\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n if (isEventProp(key)) {\n this.bindEvent(element, key, value as Function);\n continue;\n }\n this.setAttribute(element, key, value);\n }\n }\n\n private diffAttributes(\n element: Element,\n prev: Record<string, unknown>,\n next: Record<string, unknown>,\n ) {\n for (const key in prev) {\n if (key === \"key\") continue;\n if (!(key in next) || next[key] == null) {\n if (isEventProp(key)) {\n this.unbindEvent(element, key);\n } else {\n this.removeAttribute(element, key);\n }\n }\n }\n\n for (const key in next) {\n const value = next[key];\n if (key === \"key\" || value == null) continue;\n // Re-assert DOM properties even if prevProps matches: the live DOM\n // value can drift from prevProps via user input (typing in an input,\n // toggling a checkbox) without our state ever changing.\n if (prev[key] === value && !DOM_PROPERTIES.has(key)) continue;\n if (isEventProp(key)) {\n const creoName = key.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj && domEvent in evObj) {\n evObj[domEvent] = value as Function;\n } else {\n this.bindEvent(element, key, value as Function);\n }\n } else {\n this.setAttribute(element, key, value);\n }\n }\n }\n\n private bindEvent(element: Element, prop: string, handler: Function): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj: Record<string, Function> =\n (element as any)[$EV] ?? ((element as any)[$EV] = {});\n evObj[domEvent] = handler;\n ensureDelegated(this.container, domEvent);\n }\n\n private unbindEvent(element: Element, prop: string): void {\n const creoName = prop.slice(2);\n const domEvent = DOM_EVENT[creoName] ?? creoName.toLowerCase();\n const evObj = (element as any)[$EV] as Record<string, Function> | undefined;\n if (evObj) {\n delete evObj[domEvent];\n }\n removeDelegated(this.container, domEvent);\n }\n\n private setAttribute(element: Element, key: string, value: unknown) {\n if (key === \"class\") {\n // className is a settable string on HTMLElement but readonly (SVGAnimatedString)\n // on SVG — use setAttribute which works for both.\n element.setAttribute(\"class\", String(value));\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = String(value);\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = value;\n } else if (typeof value === \"boolean\") {\n if (value) element.setAttribute(key, \"\");\n else element.removeAttribute(key);\n } else {\n element.setAttribute(key, String(value));\n }\n }\n\n private removeAttribute(element: Element, key: string) {\n if (key === \"class\") {\n element.removeAttribute(\"class\");\n } else if (key === \"style\") {\n (element as HTMLElement).style.cssText = \"\";\n } else if (DOM_PROPERTIES.has(key)) {\n (element as Wildcard)[key] = key === \"value\" ? \"\" : false;\n } else {\n element.removeAttribute(key);\n }\n }\n\n // -- Internal: DOM navigation -----------------------------------------------\n\n private getFirstDomNode(view: ViewRecord): Node | null {\n if (!view.renderRef) return null;\n if (view.flags & F_PRIMITIVE)\n return (view.renderRef as PrimitiveDomRef).element;\n if (view.children) {\n for (const child of view.children) {\n const dom = this.getFirstDomNode(child);\n if (dom) return dom;\n }\n }\n return null;\n }\n\n private moveDomNodes(\n view: ViewRecord,\n parentNode: Node,\n insertBefore: Node | null,\n ): void {\n if (!view.renderRef) return;\n if (view.flags & F_PRIMITIVE) {\n parentNode.insertBefore(\n (view.renderRef as PrimitiveDomRef).element,\n insertBefore,\n );\n } else if (view.children) {\n for (const child of view.children) {\n this.moveDomNodes(child, parentNode, insertBefore);\n }\n }\n }\n\n private removeDomNodes(view: ViewRecord) {\n const ref = view.renderRef as Maybe<PrimitiveDomRef>;\n if (!ref || !(view.flags & F_PRIMITIVE)) return;\n // F_TEXT_CONTENT: ref.element is the PARENT's element (optimization),\n // not this text view's own node. Clear the parent's textContent so\n // incoming siblings mount into an empty host, but never remove the\n // parent — the parent owns its own lifecycle.\n if (view.flags & F_TEXT_CONTENT) {\n (ref.element as Element).textContent = \"\";\n return;\n }\n const evObj = (ref.element as any)[$EV] as\n | Record<string, Function>\n | undefined;\n if (evObj) {\n for (const domEvent in evObj) {\n removeDelegated(this.container, domEvent);\n }\n delete (ref.element as any)[$EV];\n }\n ref.element.parentNode?.removeChild(ref.element);\n }\n}\n",
|
|
17
|
+
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// ---------------------------------------------------------------------------\n// JSON node — the output type\n// ---------------------------------------------------------------------------\n\nexport type JsonNode = {\n type: string;\n props: Record<string, unknown>;\n children: JsonNode[];\n key?: string | number;\n};\n\n// ---------------------------------------------------------------------------\n// JSON Renderer\n// ---------------------------------------------------------------------------\n\nexport class JsonRender implements IRender<JsonNode> {\n /** The root JSON node after mount. */\n root: Maybe<JsonNode>;\n\n engine!: Engine;\n constructor() {\n this.root = null;\n }\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n const existing = view.renderRef as Maybe<JsonNode>;\n\n if (!existing) {\n // Mount\n const node = this.buildNode(view);\n if (!view.parent) {\n this.root = node;\n return;\n }\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n // view.pos is maintained by the reconciler — no indexOf scan.\n const idx = view.pos;\n if (idx >= 0 && idx < parentNode.children.length) {\n parentNode.children.splice(idx, 0, node);\n } else {\n parentNode.children.push(node);\n }\n }\n return;\n }\n\n // Update: reposition + patch props\n if (view.parent) {\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n const targetIdx = view.pos;\n // Skip the indexOf scan entirely when the node is already in\n // place (the steady-state for non-moved updates).\n if (targetIdx >= 0 && parentNode.children[targetIdx] !== existing) {\n const oldIdx = parentNode.children.indexOf(existing);\n if (oldIdx !== -1) {\n parentNode.children.splice(oldIdx, 1);\n parentNode.children.splice(\n Math.min(targetIdx, parentNode.children.length),\n 0,\n existing,\n );\n }\n }\n }\n }\n const tag = view.viewFn[$primitive];\n existing.props = tag === \"text\"\n ? { content: view.props }\n : { ...view.props };\n }\n\n unmount(view: ViewRecord): void {\n const childNode = view.renderRef as Maybe<JsonNode>;\n if (!childNode || !view.parent) return;\n const parentNode = view.parent.renderRef as Maybe<JsonNode>;\n if (parentNode) {\n const idx = parentNode.children.indexOf(childNode);\n if (idx !== -1) parentNode.children.splice(idx, 1);\n }\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildNode(view: ViewRecord): JsonNode {\n const tag = view.viewFn[$primitive];\n\n const props = tag === \"text\"\n ? { content: view.props }\n : { ...view.props };\n\n const node: JsonNode = {\n type: tag ?? \"composite\",\n props,\n children: [],\n };\n if (view.userKey != null) node.key = view.userKey;\n view.renderRef = node;\n return node;\n }\n}\n",
|
|
18
|
+
"import type { ViewRecord } from \"@/internal/internal_view\";\nimport { F_PRIMITIVE } from \"@/internal/internal_view\";\nimport type { IRender } from \"./render_interface\";\nimport { $primitive } from \"@/public/primitive\";\nimport type { Maybe } from \"@/functional/maybe\";\nimport type { Engine } from \"@/internal/engine\";\n\n// Self-closing HTML tags (no closing tag)\nconst VOID_TAGS = new Set([\n \"br\", \"hr\", \"img\", \"input\", \"source\", \"track\", \"embed\",\n \"area\", \"col\", \"wbr\",\n]);\n\n// Attributes that are set as DOM properties, not HTML attributes\nconst DOM_PROPERTIES = new Set([\"value\", \"checked\", \"selected\", \"indeterminate\", \"muted\"]);\n\n// Event handler prefix detection\nfunction isEventProp(key: string): boolean {\n return (\n key.charCodeAt(0) === 111 && // 'o'\n key.charCodeAt(1) === 110 && // 'n'\n key.charCodeAt(2) >= 65 && // 'A'\n key.charCodeAt(2) <= 90 // 'Z'\n );\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\nfunction escapeAttr(str: string): string {\n return str\n .replace(/&/g, \"&\")\n .replace(/\"/g, \""\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\");\n}\n\n/**\n * HtmlStringRender — pull-based string renderer.\n * render/unmount are no-ops. Call renderToString() to\n * get the current HTML string from the VDOM.\n *\n * Output matches HtmlRender's DOM serialization (innerHTML).\n */\nexport class HtmlStringRender implements IRender<string> {\n private root: Maybe<ViewRecord> = null;\n\n engine!: Engine;\n\n // -- IRender ----------------------------------------------------------------\n\n render(view: ViewRecord): void {\n if (!view.parent) {\n this.root = view;\n }\n }\n\n unmount(_view: ViewRecord): void {}\n\n // -- Public -----------------------------------------------------------------\n\n renderToString(): string {\n if (!this.root) return \"\";\n return this.buildString(this.root);\n }\n\n // -- Internal ---------------------------------------------------------------\n\n private buildString(rec: ViewRecord): string {\n const tag = rec.viewFn[$primitive];\n\n if (tag != null) {\n if (tag === \"text\") {\n return escapeHtml(String(rec.props));\n }\n const attrs = this.buildAttrs(rec.props as Record<string, unknown>);\n if (VOID_TAGS.has(tag)) {\n return `<${tag}${attrs}>`;\n }\n return `<${tag}${attrs}>${this.buildChildren(rec)}</${tag}>`;\n }\n\n // Composite — transparent, just render children\n return this.buildChildren(rec);\n }\n\n private buildAttrs(props: Record<string, unknown>): string {\n let result = \"\";\n for (const key in props) {\n const value = props[key];\n if (key === \"key\" || value == null) continue;\n // Skip event handlers — they don't appear in HTML\n if (isEventProp(key)) continue;\n // Skip DOM-only properties (value, checked, etc.)\n if (DOM_PROPERTIES.has(key)) continue;\n\n if (key === \"style\") {\n // Normalize style to match DOM's cssText (trailing semicolon)\n let css = String(value);\n css = css.trim();\n if (css && !css.endsWith(\";\")) css += \";\";\n result += ` style=\"${escapeAttr(css)}\"`;\n continue;\n }\n if (typeof value === \"boolean\") {\n if (value) result += ` ${key}=\"\"`;\n // false booleans are omitted\n } else {\n const attrName = key === \"class\" ? \"class\" : key;\n result += ` ${attrName}=\"${escapeAttr(String(value))}\"`;\n }\n }\n return result;\n }\n\n private buildChildren(rec: ViewRecord): string {\n if (!rec.children) return \"\";\n let result = \"\";\n for (const child of rec.children) {\n result += this.buildString(child);\n }\n return result;\n }\n}\n",
|
|
19
19
|
"export type None = null | undefined;\nexport type Just<T> = T;\nexport type Maybe<T> = Just<T> | None;\n\nexport function just<T>(\n maybe: Maybe<T>,\n errorMessage?: string,\n): asserts maybe is Just<T> {\n if (maybe == null) {\n throw new TypeError(\n errorMessage ?? \"Expected Just, received None as Maybe\",\n );\n }\n}\n\nexport function isJust<T>(maybe: Maybe<T>): maybe is Just<T> {\n return maybe != null;\n}\n\nexport function isNone<T>(maybe: Maybe<T>): maybe is None {\n return maybe == null;\n}\n\nexport function withDefault<T, K>(v: Maybe<T>, alternative: K) {\n if (v != null) {\n return v;\n }\n return alternative;\n}\n\nexport const _ = undefined;\n",
|
|
20
20
|
"export function assertNever(x: never): never {\n throw new Error(`Unhandled case: ${x}`)\n}\n"
|
|
21
21
|
],
|
|
22
|
-
"mappings": "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",
|
|
23
|
-
"debugId": "
|
|
22
|
+
"mappings": "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",
|
|
23
|
+
"debugId": "403015234A66157064756E2164756E21",
|
|
24
24
|
"names": []
|
|
25
25
|
}
|
|
@@ -19,6 +19,10 @@ export type ViewRecord<Props = Wildcard, Api = Wildcard, RenderRef = Wildcard> =
|
|
|
19
19
|
renderRef: Maybe<RenderRef>;
|
|
20
20
|
flags: BitFlags;
|
|
21
21
|
children: Maybe<ViewRecord[]>;
|
|
22
|
+
/** Position in `parent.children`. Maintained by the reconciler so the
|
|
23
|
+
* renderer can find the next-sibling insertion anchor without an O(n)
|
|
24
|
+
* `indexOf` scan. -1 means "not yet placed by a reconcile pass". */
|
|
25
|
+
pos: number;
|
|
22
26
|
keyToView: Maybe<Map<Key, ViewRecord>>;
|
|
23
27
|
unsubscribe: Maybe<(() => void)[]>;
|
|
24
28
|
parent: Maybe<ViewRecord>;
|
package/dist/public/state.d.ts
CHANGED
|
@@ -16,6 +16,12 @@ export interface Reactive<T> {
|
|
|
16
16
|
* count.get() // read current value
|
|
17
17
|
* count.set(5) // set immediately, schedule render
|
|
18
18
|
* count.update(n => n + 1) // update via fn, schedule render
|
|
19
|
+
*
|
|
20
|
+
* Async updates chain: a second `update` issued while a previous async
|
|
21
|
+
* update is still in flight runs against the previous update's result,
|
|
22
|
+
* not against the snapshot at issue time. `set` cancels any pending
|
|
23
|
+
* chain — its value becomes authoritative and in-flight links won't
|
|
24
|
+
* commit afterwards.
|
|
19
25
|
*/
|
|
20
26
|
export declare class State<T> implements Reactive<T> {
|
|
21
27
|
#private;
|
package/dist/public/view.d.ts
CHANGED
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import type { Key } from "../functional/key";
|
|
2
2
|
import type { Use } from "./state";
|
|
3
3
|
import type { $primitive } from "./primitive";
|
|
4
|
-
|
|
5
|
-
render: () => void;
|
|
6
|
-
onMount?: () => void;
|
|
7
|
-
shouldUpdate?: (nextProps: Props) => boolean;
|
|
8
|
-
onUpdateBefore?: () => void;
|
|
9
|
-
onUpdateAfter?: () => void;
|
|
10
|
-
} : {
|
|
4
|
+
type ViewBodyBase<Props> = {
|
|
11
5
|
render: () => void;
|
|
12
6
|
onMount?: () => void;
|
|
13
7
|
shouldUpdate?: (nextProps: Props) => boolean;
|
|
14
8
|
onUpdateBefore?: () => void;
|
|
15
9
|
onUpdateAfter?: () => void;
|
|
10
|
+
};
|
|
11
|
+
export type ViewBody<Props, Api> = Api extends void ? ViewBodyBase<Props> : ViewBodyBase<Props> & {
|
|
16
12
|
api: Api;
|
|
17
13
|
};
|
|
18
14
|
/** Slot callback — passed by the caller at the call site. */
|
|
@@ -8,6 +8,13 @@ export declare class HtmlRender implements IRender<HTMLElement | Text> {
|
|
|
8
8
|
constructor(container: HTMLElement);
|
|
9
9
|
render(view: ViewRecord): void;
|
|
10
10
|
unmount(view: ViewRecord): void;
|
|
11
|
+
/**
|
|
12
|
+
* Re-render only when a stateful DOM property in `nextProps` actually
|
|
13
|
+
* differs from the live DOM. With this in place a 50-input form whose
|
|
14
|
+
* parent re-renders touches the DOM only for the input the user is
|
|
15
|
+
* actually editing.
|
|
16
|
+
*/
|
|
17
|
+
shouldReassert(view: ViewRecord, nextProps: unknown): boolean;
|
|
11
18
|
private findParentDom;
|
|
12
19
|
private findInsertionPoint;
|
|
13
20
|
private setAttributes;
|
|
@@ -6,4 +6,18 @@ export interface IRender<Output> {
|
|
|
6
6
|
render(view: ViewRecord): void;
|
|
7
7
|
/** Remove a view's output artifacts. */
|
|
8
8
|
unmount(view: ViewRecord): void;
|
|
9
|
+
/**
|
|
10
|
+
* Optional: returns true if this primitive's live output may have
|
|
11
|
+
* drifted from `nextProps` and needs re-rendering even though
|
|
12
|
+
* `shallowEqual(prev, next)` reports props as unchanged.
|
|
13
|
+
*
|
|
14
|
+
* The DOM renderer uses this to detect user input that changed
|
|
15
|
+
* the live DOM (e.g. typing in `<input value=…>`, toggling a
|
|
16
|
+
* checkbox) without our state ever changing.
|
|
17
|
+
*
|
|
18
|
+
* Called only for primitives whose own props didn't change
|
|
19
|
+
* shallowly — engines should treat absence of this method as
|
|
20
|
+
* "nothing to re-assert".
|
|
21
|
+
*/
|
|
22
|
+
shouldReassert?(view: ViewRecord, nextProps: unknown): boolean;
|
|
9
23
|
}
|
package/package.json
CHANGED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { Wildcard } from "../internal/wildcard";
|
|
2
|
-
type EventCallback = (...args: Wildcard[]) => void;
|
|
3
|
-
/**
|
|
4
|
-
* Delegate that the renderer provides to wire event subscriptions
|
|
5
|
-
* to the actual output (DOM addEventListener, etc.).
|
|
6
|
-
* Set on the EventHandle after the view's output is created.
|
|
7
|
-
*/
|
|
8
|
-
export type EventDelegate = {
|
|
9
|
-
bind(event: string, callback: EventCallback, once?: boolean): void;
|
|
10
|
-
unbind(event: string, callback: EventCallback): void;
|
|
11
|
-
};
|
|
12
|
-
/**
|
|
13
|
-
* Handle returned when calling a primitive in the render stream.
|
|
14
|
-
* Provides on/once/off for event subscription.
|
|
15
|
-
*
|
|
16
|
-
* When a delegate is set (by the renderer after mount), calls are
|
|
17
|
-
* proxied to the renderer — only events the user subscribes to
|
|
18
|
-
* get bound. Before the delegate exists, listeners are stored and
|
|
19
|
-
* flushed once the delegate arrives.
|
|
20
|
-
*/
|
|
21
|
-
export declare class EventHandle<Events> {
|
|
22
|
-
#private;
|
|
23
|
-
on<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
24
|
-
once<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
25
|
-
off<K extends keyof Events>(event: K, callback: Events[K]): void;
|
|
26
|
-
/**
|
|
27
|
-
* Called by the renderer after the view's output is created.
|
|
28
|
-
* Flushes any listeners that were added before the delegate existed.
|
|
29
|
-
*/
|
|
30
|
-
setDelegate(delegate: EventDelegate): void;
|
|
31
|
-
}
|
|
32
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export {};
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* IndexedList — linked list with O(1) identity-based lookup.
|
|
3
|
-
*
|
|
4
|
-
* Combines a doubly-linked list (O(1) insert/delete given a node)
|
|
5
|
-
* with a Map<T, INode<T>> for O(1) lookup by value identity.
|
|
6
|
-
*
|
|
7
|
-
* All mutating operations are O(1):
|
|
8
|
-
* push, delete, has, first, last, clear
|
|
9
|
-
*/
|
|
10
|
-
import { type INode } from "./list";
|
|
11
|
-
import type { Maybe } from "../functional/maybe";
|
|
12
|
-
export declare class IndexedList<T> {
|
|
13
|
-
#private;
|
|
14
|
-
/** Append item to the end. No-op if already present. Returns the node. */
|
|
15
|
-
push(item: T): INode<T>;
|
|
16
|
-
/** Insert item at the front. No-op if already present. */
|
|
17
|
-
unshift(item: T): void;
|
|
18
|
-
/** Insert item after ref. No-op if item already present. */
|
|
19
|
-
insertAfter(ref: T, item: T): void;
|
|
20
|
-
/** Remove item. O(1). */
|
|
21
|
-
delete(item: T): void;
|
|
22
|
-
/** Check membership. O(1). */
|
|
23
|
-
has(item: T): boolean;
|
|
24
|
-
/** Number of items. */
|
|
25
|
-
get length(): number;
|
|
26
|
-
/** Get the first item (head). O(1). */
|
|
27
|
-
first(): Maybe<T>;
|
|
28
|
-
/** Get the last item (tail). O(1). */
|
|
29
|
-
last(): Maybe<T>;
|
|
30
|
-
/** Get the linked-list node for an item. O(1). */
|
|
31
|
-
getNode(item: T): Maybe<INode<T>>;
|
|
32
|
-
/** Positional access. O(n) — prefer getNode + getNext for traversal. */
|
|
33
|
-
at(index: number): Maybe<T>;
|
|
34
|
-
/**
|
|
35
|
-
* Replace item at `pos`, or insert if nothing is there.
|
|
36
|
-
* If `pos >= length`, appends to the end.
|
|
37
|
-
* Returns the node.
|
|
38
|
-
*/
|
|
39
|
-
upsert(pos: number, item: T): INode<T>;
|
|
40
|
-
/** Swap two items in the list. O(1). No-op if either item is missing. */
|
|
41
|
-
swap(a: T, b: T): void;
|
|
42
|
-
/** Reset to empty. O(1). */
|
|
43
|
-
clear(): void;
|
|
44
|
-
/** Iterate values in insertion order. */
|
|
45
|
-
[Symbol.iterator](): IterableIterator<T>;
|
|
46
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Linked list implementation
|
|
3
|
-
*/
|
|
4
|
-
import type { Maybe } from "../functional/maybe";
|
|
5
|
-
declare const $next: unique symbol;
|
|
6
|
-
declare const $prev: unique symbol;
|
|
7
|
-
declare const $owner: unique symbol;
|
|
8
|
-
export interface INode<T> {
|
|
9
|
-
insertNext(value: T): INode<T>;
|
|
10
|
-
insertPrev(value: T): INode<T>;
|
|
11
|
-
v: T;
|
|
12
|
-
delete(): void;
|
|
13
|
-
getNext(): Maybe<INode<T>>;
|
|
14
|
-
getPrev(): Maybe<INode<T>>;
|
|
15
|
-
isFirst(): boolean;
|
|
16
|
-
isLast(): boolean;
|
|
17
|
-
}
|
|
18
|
-
export declare class ListNode<T> implements INode<T> {
|
|
19
|
-
[$owner]: Maybe<IBaseContainer<T>>;
|
|
20
|
-
[$next]: Maybe<ListNode<T>>;
|
|
21
|
-
[$prev]: Maybe<ListNode<T>>;
|
|
22
|
-
v: T;
|
|
23
|
-
constructor(node: T, prev: Maybe<ListNode<T>>, next: Maybe<ListNode<T>>, list: IBaseContainer<T>);
|
|
24
|
-
isFirst(): boolean;
|
|
25
|
-
isLast(): boolean;
|
|
26
|
-
delete(): void;
|
|
27
|
-
clearFields(): void;
|
|
28
|
-
insertNext(value: T): INode<T>;
|
|
29
|
-
insertPrev(value: T): INode<T>;
|
|
30
|
-
getNext(): Maybe<ListNode<T>>;
|
|
31
|
-
getPrev(): Maybe<ListNode<T>>;
|
|
32
|
-
getList(): Maybe<IBaseContainer<T>>;
|
|
33
|
-
}
|
|
34
|
-
interface IBaseContainer<T> {
|
|
35
|
-
delete(node: INode<T>): void;
|
|
36
|
-
insertNext(ref: INode<T>, value: T): INode<T>;
|
|
37
|
-
insertPrev(ref: INode<T>, value: T): INode<T>;
|
|
38
|
-
}
|
|
39
|
-
export interface IList<T> extends Iterable<INode<T>>, IBaseContainer<T> {
|
|
40
|
-
insertStart(value: T): INode<T>;
|
|
41
|
-
insertEnd(value: T): INode<T>;
|
|
42
|
-
at(n: number): Maybe<INode<T>>;
|
|
43
|
-
first(): Maybe<INode<T>>;
|
|
44
|
-
last(): Maybe<INode<T>>;
|
|
45
|
-
readonly size: number;
|
|
46
|
-
[Symbol.iterator](): IterableIterator<INode<T>>;
|
|
47
|
-
}
|
|
48
|
-
export declare class InternalList<T> implements IList<T> {
|
|
49
|
-
#private;
|
|
50
|
-
insertStart(value: T): ListNode<T>;
|
|
51
|
-
delete(node: INode<T>): void;
|
|
52
|
-
at(n: number): Maybe<ListNode<T>>;
|
|
53
|
-
get size(): number;
|
|
54
|
-
/** Reset the list to empty. O(1). */
|
|
55
|
-
clear(): void;
|
|
56
|
-
/** O(1) head access. */
|
|
57
|
-
first(): Maybe<ListNode<T>>;
|
|
58
|
-
/** O(1) tail access. */
|
|
59
|
-
last(): Maybe<ListNode<T>>;
|
|
60
|
-
insertEnd(value: T): ListNode<T>;
|
|
61
|
-
insertNext(ref: INode<T>, value: T): ListNode<T>;
|
|
62
|
-
insertPrev(ref: INode<T>, value: T): ListNode<T>;
|
|
63
|
-
[Symbol.iterator](): Generator<ListNode<T>, void, unknown>;
|
|
64
|
-
}
|
|
65
|
-
export declare class List<T> extends InternalList<T> implements IList<T> {
|
|
66
|
-
static from<T>(arrayLike: Iterable<T>): List<T>;
|
|
67
|
-
}
|
|
68
|
-
export {};
|