tutuca 0.9.63 → 0.9.65
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/dist/tutuca-cli.js +1190 -1166
- package/dist/tutuca-dev.js +434 -399
- package/dist/tutuca-dev.min.js +2 -2
- package/dist/tutuca-extra.js +419 -392
- package/dist/tutuca-extra.min.js +2 -2
- package/dist/tutuca.js +419 -392
- package/dist/tutuca.min.js +2 -2
- package/package.json +1 -1
- package/skill/tutuca/core.md +28 -5
- package/skill/tutuca/testing.md +6 -3
package/dist/tutuca.js
CHANGED
|
@@ -5528,6 +5528,337 @@ class RequestHandler {
|
|
|
5528
5528
|
}
|
|
5529
5529
|
}
|
|
5530
5530
|
|
|
5531
|
+
// src/vdom.js
|
|
5532
|
+
var isHtmlAttribute = (propName) => propName[4] === "-" && (propName[0] === "d" || propName[0] === "a");
|
|
5533
|
+
var HTML_NS = "http://www.w3.org/1999/xhtml";
|
|
5534
|
+
var isNamespaced = (node) => {
|
|
5535
|
+
const ns = node.namespaceURI;
|
|
5536
|
+
return ns !== null && ns !== HTML_NS;
|
|
5537
|
+
};
|
|
5538
|
+
function applyProperties(node, props, previous) {
|
|
5539
|
+
const namespaced = isNamespaced(node);
|
|
5540
|
+
for (const propName in props) {
|
|
5541
|
+
const propValue = props[propName];
|
|
5542
|
+
if (propValue === undefined)
|
|
5543
|
+
removeProperty(node, propName, previous);
|
|
5544
|
+
else if (propName === "dangerouslySetInnerHTML")
|
|
5545
|
+
node.innerHTML = propValue.__html ?? "";
|
|
5546
|
+
else if (propName === "className")
|
|
5547
|
+
node.setAttribute("class", propValue);
|
|
5548
|
+
else if (namespaced || isHtmlAttribute(propName))
|
|
5549
|
+
node.setAttribute(propName, propValue);
|
|
5550
|
+
else
|
|
5551
|
+
node[propName] = propValue;
|
|
5552
|
+
}
|
|
5553
|
+
}
|
|
5554
|
+
function removeProperty(node, propName, previous) {
|
|
5555
|
+
const previousValue = previous[propName];
|
|
5556
|
+
if (propName === "dangerouslySetInnerHTML")
|
|
5557
|
+
node.replaceChildren();
|
|
5558
|
+
else if (propName === "className")
|
|
5559
|
+
node.removeAttribute("class");
|
|
5560
|
+
else if (propName === "htmlFor")
|
|
5561
|
+
node.removeAttribute("for");
|
|
5562
|
+
else if (isNamespaced(node) || typeof previousValue === "string" || isHtmlAttribute(propName))
|
|
5563
|
+
node.removeAttribute(propName);
|
|
5564
|
+
else
|
|
5565
|
+
node[propName] = null;
|
|
5566
|
+
}
|
|
5567
|
+
|
|
5568
|
+
class VBase {
|
|
5569
|
+
}
|
|
5570
|
+
var getKey = (child) => child instanceof VNode2 ? child.key : undefined;
|
|
5571
|
+
var isIterable = (obj) => obj != null && typeof obj !== "string" && typeof obj[Symbol.iterator] === "function";
|
|
5572
|
+
function childsEqual(a, b) {
|
|
5573
|
+
if (a === b)
|
|
5574
|
+
return true;
|
|
5575
|
+
for (let i = 0;i < a.length; i++)
|
|
5576
|
+
if (!a[i].isEqualTo(b[i]))
|
|
5577
|
+
return false;
|
|
5578
|
+
return true;
|
|
5579
|
+
}
|
|
5580
|
+
function appendChildNodes(parent, childs, opts) {
|
|
5581
|
+
for (const child of childs)
|
|
5582
|
+
parent.appendChild(child.toDom(opts));
|
|
5583
|
+
}
|
|
5584
|
+
function addChild(normalizedChildren, child) {
|
|
5585
|
+
if (child == null)
|
|
5586
|
+
return;
|
|
5587
|
+
if (isIterable(child)) {
|
|
5588
|
+
for (const c of child)
|
|
5589
|
+
addChild(normalizedChildren, c);
|
|
5590
|
+
} else if (child instanceof VBase) {
|
|
5591
|
+
if (child instanceof VFragment)
|
|
5592
|
+
normalizedChildren.push(...child.childs);
|
|
5593
|
+
else
|
|
5594
|
+
normalizedChildren.push(child);
|
|
5595
|
+
} else
|
|
5596
|
+
normalizedChildren.push(new VText(child));
|
|
5597
|
+
}
|
|
5598
|
+
|
|
5599
|
+
class VText extends VBase {
|
|
5600
|
+
constructor(text) {
|
|
5601
|
+
super();
|
|
5602
|
+
this.text = String(text);
|
|
5603
|
+
}
|
|
5604
|
+
get nodeType() {
|
|
5605
|
+
return 3;
|
|
5606
|
+
}
|
|
5607
|
+
isEqualTo(other) {
|
|
5608
|
+
return other instanceof VText && this.text === other.text;
|
|
5609
|
+
}
|
|
5610
|
+
toDom(opts) {
|
|
5611
|
+
return opts.document.createTextNode(this.text);
|
|
5612
|
+
}
|
|
5613
|
+
}
|
|
5614
|
+
|
|
5615
|
+
class VComment extends VBase {
|
|
5616
|
+
constructor(text) {
|
|
5617
|
+
super();
|
|
5618
|
+
this.text = text;
|
|
5619
|
+
}
|
|
5620
|
+
get nodeType() {
|
|
5621
|
+
return 8;
|
|
5622
|
+
}
|
|
5623
|
+
isEqualTo(other) {
|
|
5624
|
+
return other instanceof VComment && this.text === other.text;
|
|
5625
|
+
}
|
|
5626
|
+
toDom(opts) {
|
|
5627
|
+
return opts.document.createComment(this.text);
|
|
5628
|
+
}
|
|
5629
|
+
}
|
|
5630
|
+
|
|
5631
|
+
class VFragment extends VBase {
|
|
5632
|
+
constructor(childs) {
|
|
5633
|
+
super();
|
|
5634
|
+
this.childs = [];
|
|
5635
|
+
addChild(this.childs, childs);
|
|
5636
|
+
}
|
|
5637
|
+
get nodeType() {
|
|
5638
|
+
return 11;
|
|
5639
|
+
}
|
|
5640
|
+
isEqualTo(other) {
|
|
5641
|
+
if (!(other instanceof VFragment) || this.childs.length !== other.childs.length)
|
|
5642
|
+
return false;
|
|
5643
|
+
return childsEqual(this.childs, other.childs);
|
|
5644
|
+
}
|
|
5645
|
+
toDom(opts) {
|
|
5646
|
+
const fragment = opts.document.createDocumentFragment();
|
|
5647
|
+
appendChildNodes(fragment, this.childs, opts);
|
|
5648
|
+
return fragment;
|
|
5649
|
+
}
|
|
5650
|
+
}
|
|
5651
|
+
|
|
5652
|
+
class VNode2 extends VBase {
|
|
5653
|
+
constructor(tag, attrs, childs, key, namespace) {
|
|
5654
|
+
super();
|
|
5655
|
+
this.tag = tag;
|
|
5656
|
+
this.attrs = attrs ?? {};
|
|
5657
|
+
this.childs = childs ?? [];
|
|
5658
|
+
this.key = key != null ? String(key) : undefined;
|
|
5659
|
+
this.namespace = typeof namespace === "string" ? namespace : null;
|
|
5660
|
+
}
|
|
5661
|
+
get nodeType() {
|
|
5662
|
+
return 1;
|
|
5663
|
+
}
|
|
5664
|
+
isSameKind(other) {
|
|
5665
|
+
return this.tag === other.tag && this.namespace === other.namespace && this.key === other.key;
|
|
5666
|
+
}
|
|
5667
|
+
isEqualTo(other) {
|
|
5668
|
+
if (this === other)
|
|
5669
|
+
return true;
|
|
5670
|
+
if (!(other instanceof VNode2) || !this.isSameKind(other) || this.childs.length !== other.childs.length) {
|
|
5671
|
+
return false;
|
|
5672
|
+
}
|
|
5673
|
+
if (this.attrs !== other.attrs) {
|
|
5674
|
+
for (const key in this.attrs)
|
|
5675
|
+
if (this.attrs[key] !== other.attrs[key])
|
|
5676
|
+
return false;
|
|
5677
|
+
for (const key in other.attrs)
|
|
5678
|
+
if (!Object.hasOwn(this.attrs, key))
|
|
5679
|
+
return false;
|
|
5680
|
+
}
|
|
5681
|
+
return childsEqual(this.childs, other.childs);
|
|
5682
|
+
}
|
|
5683
|
+
toDom(opts) {
|
|
5684
|
+
const doc = opts.document;
|
|
5685
|
+
const node = this.namespace === null ? doc.createElement(this.tag) : doc.createElementNS(this.namespace, this.tag);
|
|
5686
|
+
if (this.tag === "SELECT" && "value" in this.attrs) {
|
|
5687
|
+
const { value, ...rest } = this.attrs;
|
|
5688
|
+
applyProperties(node, rest, {});
|
|
5689
|
+
appendChildNodes(node, this.childs, opts);
|
|
5690
|
+
applyProperties(node, { value }, {});
|
|
5691
|
+
} else {
|
|
5692
|
+
applyProperties(node, this.attrs, {});
|
|
5693
|
+
appendChildNodes(node, this.childs, opts);
|
|
5694
|
+
}
|
|
5695
|
+
return node;
|
|
5696
|
+
}
|
|
5697
|
+
}
|
|
5698
|
+
function diffProps(a, b) {
|
|
5699
|
+
if (a === b)
|
|
5700
|
+
return null;
|
|
5701
|
+
let diff = null;
|
|
5702
|
+
for (const aKey in a) {
|
|
5703
|
+
if (!Object.hasOwn(b, aKey)) {
|
|
5704
|
+
diff ??= {};
|
|
5705
|
+
diff[aKey] = undefined;
|
|
5706
|
+
} else if (a[aKey] !== b[aKey]) {
|
|
5707
|
+
diff ??= {};
|
|
5708
|
+
diff[aKey] = b[aKey];
|
|
5709
|
+
}
|
|
5710
|
+
}
|
|
5711
|
+
for (const bKey in b) {
|
|
5712
|
+
if (!Object.hasOwn(a, bKey)) {
|
|
5713
|
+
diff ??= {};
|
|
5714
|
+
diff[bKey] = b[bKey];
|
|
5715
|
+
}
|
|
5716
|
+
}
|
|
5717
|
+
return diff;
|
|
5718
|
+
}
|
|
5719
|
+
function morphNode(domNode, source, target, opts) {
|
|
5720
|
+
if (source === target || source.isEqualTo(target))
|
|
5721
|
+
return domNode;
|
|
5722
|
+
const type = source.nodeType;
|
|
5723
|
+
if (type === target.nodeType) {
|
|
5724
|
+
if (type === 3 || type === 8) {
|
|
5725
|
+
domNode.data = target.text;
|
|
5726
|
+
return domNode;
|
|
5727
|
+
}
|
|
5728
|
+
if (type === 1 && source.isSameKind(target)) {
|
|
5729
|
+
const propsDiff = diffProps(source.attrs, target.attrs);
|
|
5730
|
+
const isSelect = source.tag === "SELECT";
|
|
5731
|
+
if (propsDiff) {
|
|
5732
|
+
if (isSelect && "value" in propsDiff) {
|
|
5733
|
+
const { value: _v, ...rest } = propsDiff;
|
|
5734
|
+
applyProperties(domNode, rest, source.attrs);
|
|
5735
|
+
} else
|
|
5736
|
+
applyProperties(domNode, propsDiff, source.attrs);
|
|
5737
|
+
}
|
|
5738
|
+
if (!target.attrs.dangerouslySetInnerHTML)
|
|
5739
|
+
morphChildren(domNode, source.childs, target.childs, opts);
|
|
5740
|
+
if (isSelect && target.attrs.value !== undefined)
|
|
5741
|
+
applyProperties(domNode, { value: target.attrs.value }, source.attrs);
|
|
5742
|
+
return domNode;
|
|
5743
|
+
}
|
|
5744
|
+
if (type === 11) {
|
|
5745
|
+
morphChildren(domNode, source.childs, target.childs, opts);
|
|
5746
|
+
return domNode;
|
|
5747
|
+
}
|
|
5748
|
+
}
|
|
5749
|
+
const newNode = target.toDom(opts);
|
|
5750
|
+
domNode.parentNode?.replaceChild(newNode, domNode);
|
|
5751
|
+
return newNode;
|
|
5752
|
+
}
|
|
5753
|
+
function morphChildren(parentDom, oldChilds, newChilds, opts) {
|
|
5754
|
+
if (oldChilds.length === 0) {
|
|
5755
|
+
appendChildNodes(parentDom, newChilds, opts);
|
|
5756
|
+
return;
|
|
5757
|
+
}
|
|
5758
|
+
if (newChilds.length === 0) {
|
|
5759
|
+
parentDom.replaceChildren();
|
|
5760
|
+
return;
|
|
5761
|
+
}
|
|
5762
|
+
if (oldChilds.length === newChilds.length) {
|
|
5763
|
+
let hasKey = false;
|
|
5764
|
+
for (let i = 0;i < oldChilds.length; i++) {
|
|
5765
|
+
if (getKey(oldChilds[i]) != null || getKey(newChilds[i]) != null) {
|
|
5766
|
+
hasKey = true;
|
|
5767
|
+
break;
|
|
5768
|
+
}
|
|
5769
|
+
}
|
|
5770
|
+
if (!hasKey) {
|
|
5771
|
+
let dom = parentDom.firstChild;
|
|
5772
|
+
for (let i = 0;i < oldChilds.length; i++) {
|
|
5773
|
+
const next = dom.nextSibling;
|
|
5774
|
+
morphNode(dom, oldChilds[i], newChilds[i], opts);
|
|
5775
|
+
dom = next;
|
|
5776
|
+
}
|
|
5777
|
+
return;
|
|
5778
|
+
}
|
|
5779
|
+
}
|
|
5780
|
+
const domNodes = Array.from(parentDom.childNodes);
|
|
5781
|
+
const oldKeyMap = Object.create(null);
|
|
5782
|
+
for (let i = 0;i < oldChilds.length; i++) {
|
|
5783
|
+
const key = getKey(oldChilds[i]);
|
|
5784
|
+
if (key != null)
|
|
5785
|
+
oldKeyMap[key] = i;
|
|
5786
|
+
}
|
|
5787
|
+
const used = new Uint8Array(oldChilds.length);
|
|
5788
|
+
let unkeyedCursor = 0;
|
|
5789
|
+
for (let j = 0;j < newChilds.length; j++) {
|
|
5790
|
+
const newChild = newChilds[j];
|
|
5791
|
+
const newKey = getKey(newChild);
|
|
5792
|
+
let oldIdx = -1;
|
|
5793
|
+
if (newKey != null) {
|
|
5794
|
+
if (newKey in oldKeyMap && !used[oldKeyMap[newKey]])
|
|
5795
|
+
oldIdx = oldKeyMap[newKey];
|
|
5796
|
+
} else {
|
|
5797
|
+
while (unkeyedCursor < oldChilds.length) {
|
|
5798
|
+
if (!used[unkeyedCursor] && getKey(oldChilds[unkeyedCursor]) == null) {
|
|
5799
|
+
oldIdx = unkeyedCursor++;
|
|
5800
|
+
break;
|
|
5801
|
+
}
|
|
5802
|
+
unkeyedCursor++;
|
|
5803
|
+
}
|
|
5804
|
+
}
|
|
5805
|
+
if (oldIdx >= 0) {
|
|
5806
|
+
used[oldIdx] = 1;
|
|
5807
|
+
const newDom = morphNode(domNodes[oldIdx], oldChilds[oldIdx], newChild, opts);
|
|
5808
|
+
const ref = parentDom.childNodes[j] ?? null;
|
|
5809
|
+
if (newDom !== ref)
|
|
5810
|
+
parentDom.insertBefore(newDom, ref);
|
|
5811
|
+
} else {
|
|
5812
|
+
const ref = parentDom.childNodes[j] ?? null;
|
|
5813
|
+
parentDom.insertBefore(newChild.toDom(opts), ref);
|
|
5814
|
+
}
|
|
5815
|
+
}
|
|
5816
|
+
for (let i = oldChilds.length - 1;i >= 0; i--)
|
|
5817
|
+
if (!used[i] && domNodes[i].parentNode === parentDom)
|
|
5818
|
+
parentDom.removeChild(domNodes[i]);
|
|
5819
|
+
}
|
|
5820
|
+
function render(vnode, container, options, prev) {
|
|
5821
|
+
const isFragment = vnode instanceof VFragment;
|
|
5822
|
+
if (prev && prev.vnode instanceof VFragment === isFragment) {
|
|
5823
|
+
const oldDom = isFragment ? container : prev.dom;
|
|
5824
|
+
const newDom = morphNode(oldDom, prev.vnode, vnode, options);
|
|
5825
|
+
return { vnode, dom: isFragment ? container : newDom };
|
|
5826
|
+
}
|
|
5827
|
+
const domNode = vnode.toDom(options);
|
|
5828
|
+
container.replaceChildren(domNode);
|
|
5829
|
+
return { vnode, dom: isFragment ? container : domNode };
|
|
5830
|
+
}
|
|
5831
|
+
function h(tagName, properties, children, namespace) {
|
|
5832
|
+
const props = {};
|
|
5833
|
+
let key;
|
|
5834
|
+
if (properties) {
|
|
5835
|
+
for (const propName in properties) {
|
|
5836
|
+
const propVal = properties[propName];
|
|
5837
|
+
switch (propName) {
|
|
5838
|
+
case "key":
|
|
5839
|
+
key = propVal;
|
|
5840
|
+
break;
|
|
5841
|
+
case "namespace":
|
|
5842
|
+
namespace = namespace ?? propVal;
|
|
5843
|
+
break;
|
|
5844
|
+
case "class":
|
|
5845
|
+
props.className = propVal;
|
|
5846
|
+
break;
|
|
5847
|
+
case "for":
|
|
5848
|
+
props.htmlFor = propVal;
|
|
5849
|
+
break;
|
|
5850
|
+
default:
|
|
5851
|
+
props[propName] = isHtmlAttribute(propName) ? String(propVal) : propVal;
|
|
5852
|
+
}
|
|
5853
|
+
}
|
|
5854
|
+
}
|
|
5855
|
+
const c = tagName.charCodeAt(0);
|
|
5856
|
+
const tag = namespace == null && c >= 97 && c <= 122 ? tagName.toUpperCase() : tagName;
|
|
5857
|
+
const normalizedChildren = [];
|
|
5858
|
+
addChild(normalizedChildren, children);
|
|
5859
|
+
return new VNode2(tag, props, normalizedChildren, key, namespace);
|
|
5860
|
+
}
|
|
5861
|
+
|
|
5531
5862
|
// src/anode.js
|
|
5532
5863
|
function resolveDynProducer(comp, dynName) {
|
|
5533
5864
|
const dyn = comp?.dynamic?.[dynName];
|
|
@@ -5628,16 +5959,17 @@ class ChildsNode extends BaseNode {
|
|
|
5628
5959
|
}
|
|
5629
5960
|
|
|
5630
5961
|
class DomNode extends ChildsNode {
|
|
5631
|
-
constructor(tagName, attrs, childs) {
|
|
5962
|
+
constructor(tagName, attrs, childs, namespace = null) {
|
|
5632
5963
|
super(childs);
|
|
5633
5964
|
this.tagName = tagName;
|
|
5634
5965
|
this.attrs = attrs;
|
|
5966
|
+
this.namespace = namespace;
|
|
5635
5967
|
}
|
|
5636
5968
|
render(stack, rx) {
|
|
5637
5969
|
const childNodes = new Array(this.childs.length);
|
|
5638
5970
|
for (let i = 0;i < childNodes.length; i++)
|
|
5639
5971
|
childNodes[i] = this.childs[i]?.render?.(stack, rx) ?? null;
|
|
5640
|
-
return rx.renderTag(this.tagName, this.attrs.eval(stack), childNodes);
|
|
5972
|
+
return rx.renderTag(this.tagName, this.attrs.eval(stack), childNodes, this.namespace);
|
|
5641
5973
|
}
|
|
5642
5974
|
setDataAttr(key, val) {
|
|
5643
5975
|
this.attrs.setDataAttr(key, val);
|
|
@@ -5718,7 +6050,9 @@ class ANode extends BaseNode {
|
|
|
5718
6050
|
if (textChild)
|
|
5719
6051
|
childs.unshift(new RenderTextNode(null, textChild));
|
|
5720
6052
|
const domChilds = tag !== "PRE" ? condenseChildsWhites(childs) : childs;
|
|
5721
|
-
|
|
6053
|
+
const ns = node.namespaceURI;
|
|
6054
|
+
const namespace = ns && ns !== HTML_NS ? ns : null;
|
|
6055
|
+
return wrap(new DomNode(tag, nAttrs, domChilds, namespace), px, wrappers);
|
|
5722
6056
|
}
|
|
5723
6057
|
return new CommentNode(`Error: InvalidTagName ${tag}`);
|
|
5724
6058
|
} finally {
|
|
@@ -6049,7 +6383,7 @@ class IterInfo {
|
|
|
6049
6383
|
}
|
|
6050
6384
|
}
|
|
6051
6385
|
var filterAlwaysTrue = (_v, _k, _seq) => true;
|
|
6052
|
-
var nullLoopWith = (seq) => ({ seq });
|
|
6386
|
+
var nullLoopWith = (seq) => ({ iterData: { seq } });
|
|
6053
6387
|
var X_OP_CONSUMED = {
|
|
6054
6388
|
slot: new Set,
|
|
6055
6389
|
text: new Set,
|
|
@@ -6856,403 +7190,78 @@ class Task {
|
|
|
6856
7190
|
});
|
|
6857
7191
|
this.isCompleted = false;
|
|
6858
7192
|
}
|
|
6859
|
-
addDep(task) {
|
|
6860
|
-
console.assert(!this.isCompleted, "addDep for completed task", this, task);
|
|
6861
|
-
this.deps.push(task);
|
|
6862
|
-
task.promise.then((_) => this._check());
|
|
6863
|
-
}
|
|
6864
|
-
complete(val) {
|
|
6865
|
-
this.val = val;
|
|
6866
|
-
this._check();
|
|
6867
|
-
}
|
|
6868
|
-
_check() {
|
|
6869
|
-
if (this.deps.every((task) => task.isCompleted)) {
|
|
6870
|
-
this.isCompleted = true;
|
|
6871
|
-
this.resolve(this);
|
|
6872
|
-
}
|
|
6873
|
-
}
|
|
6874
|
-
}
|
|
6875
|
-
|
|
6876
|
-
class Dispatcher {
|
|
6877
|
-
constructor(path, transactor, parentTransaction) {
|
|
6878
|
-
this.path = path;
|
|
6879
|
-
this.transactor = transactor;
|
|
6880
|
-
this.parent = parentTransaction;
|
|
6881
|
-
}
|
|
6882
|
-
get at() {
|
|
6883
|
-
return new PathChanges(this);
|
|
6884
|
-
}
|
|
6885
|
-
send(name, args, opts) {
|
|
6886
|
-
return this.sendAtPath(this.path, name, args, opts);
|
|
6887
|
-
}
|
|
6888
|
-
bubble(name, args, opts) {
|
|
6889
|
-
return this.send(name, args, { skipSelf: true, bubbles: true, ...opts });
|
|
6890
|
-
}
|
|
6891
|
-
sendAtPath(path, name, args, opts) {
|
|
6892
|
-
return this.transactor.pushSend(path, name, args, opts, this.parent);
|
|
6893
|
-
}
|
|
6894
|
-
request(name, args, opts) {
|
|
6895
|
-
return this.requestAtPath(this.path, name, args, opts);
|
|
6896
|
-
}
|
|
6897
|
-
requestAtPath(path, name, args, opts) {
|
|
6898
|
-
return this.transactor.pushRequest(path, name, args, opts, this.parent);
|
|
6899
|
-
}
|
|
6900
|
-
lookupTypeFor(name, inst) {
|
|
6901
|
-
return this.transactor.comps.getCompFor(inst).scope.lookupComponent(name);
|
|
6902
|
-
}
|
|
6903
|
-
}
|
|
6904
|
-
|
|
6905
|
-
class EventContext extends Dispatcher {
|
|
6906
|
-
get name() {
|
|
6907
|
-
return this.parent?.name ?? null;
|
|
6908
|
-
}
|
|
6909
|
-
get targetPath() {
|
|
6910
|
-
return this.parent.targetPath;
|
|
6911
|
-
}
|
|
6912
|
-
stopPropagation() {
|
|
6913
|
-
return this.parent.stopPropagation();
|
|
6914
|
-
}
|
|
6915
|
-
}
|
|
6916
|
-
|
|
6917
|
-
class PathChanges extends PathBuilder {
|
|
6918
|
-
constructor(dispatcher) {
|
|
6919
|
-
super();
|
|
6920
|
-
this.dispatcher = dispatcher;
|
|
6921
|
-
}
|
|
6922
|
-
send(name, args, opts) {
|
|
6923
|
-
return this.dispatcher.sendAtPath(this.buildPath(), name, args, opts);
|
|
6924
|
-
}
|
|
6925
|
-
bubble(name, args, opts) {
|
|
6926
|
-
return this.send(name, args, { skipSelf: true, bubbles: true, ...opts });
|
|
6927
|
-
}
|
|
6928
|
-
buildPath() {
|
|
6929
|
-
return this.dispatcher.path.concat(this.pathChanges);
|
|
6930
|
-
}
|
|
6931
|
-
}
|
|
6932
|
-
|
|
6933
|
-
// src/vdom.js
|
|
6934
|
-
var isHtmlAttribute = (propName) => propName[4] === "-" && (propName[0] === "d" || propName[0] === "a");
|
|
6935
|
-
function applyProperties(node, props, previous) {
|
|
6936
|
-
for (const propName in props) {
|
|
6937
|
-
const propValue = props[propName];
|
|
6938
|
-
if (propValue === undefined)
|
|
6939
|
-
removeProperty(node, propName, previous);
|
|
6940
|
-
else if (isHtmlAttribute(propName))
|
|
6941
|
-
node.setAttribute(propName, propValue);
|
|
6942
|
-
else if (propName === "dangerouslySetInnerHTML")
|
|
6943
|
-
node.innerHTML = propValue.__html ?? "";
|
|
6944
|
-
else if (propName === "className")
|
|
6945
|
-
node.setAttribute("class", propValue);
|
|
6946
|
-
else
|
|
6947
|
-
node[propName] = propValue;
|
|
6948
|
-
}
|
|
6949
|
-
}
|
|
6950
|
-
function removeProperty(node, propName, previous) {
|
|
6951
|
-
const previousValue = previous[propName];
|
|
6952
|
-
if (propName === "dangerouslySetInnerHTML")
|
|
6953
|
-
node.replaceChildren();
|
|
6954
|
-
else if (propName === "className")
|
|
6955
|
-
node.removeAttribute("class");
|
|
6956
|
-
else if (propName === "htmlFor")
|
|
6957
|
-
node.removeAttribute("for");
|
|
6958
|
-
else if (typeof previousValue === "string" || isHtmlAttribute(propName))
|
|
6959
|
-
node.removeAttribute(propName);
|
|
6960
|
-
else
|
|
6961
|
-
node[propName] = null;
|
|
6962
|
-
}
|
|
6963
|
-
|
|
6964
|
-
class VBase {
|
|
6965
|
-
}
|
|
6966
|
-
var getKey = (child) => child instanceof VNode2 ? child.key : undefined;
|
|
6967
|
-
var isIterable = (obj) => obj != null && typeof obj !== "string" && typeof obj[Symbol.iterator] === "function";
|
|
6968
|
-
function childsEqual(a, b) {
|
|
6969
|
-
if (a === b)
|
|
6970
|
-
return true;
|
|
6971
|
-
for (let i = 0;i < a.length; i++)
|
|
6972
|
-
if (!a[i].isEqualTo(b[i]))
|
|
6973
|
-
return false;
|
|
6974
|
-
return true;
|
|
6975
|
-
}
|
|
6976
|
-
function appendChildNodes(parent, childs, opts) {
|
|
6977
|
-
for (const child of childs)
|
|
6978
|
-
parent.appendChild(child.toDom(opts));
|
|
6979
|
-
}
|
|
6980
|
-
function addChild(normalizedChildren, child) {
|
|
6981
|
-
if (child == null)
|
|
6982
|
-
return;
|
|
6983
|
-
if (isIterable(child)) {
|
|
6984
|
-
for (const c of child)
|
|
6985
|
-
addChild(normalizedChildren, c);
|
|
6986
|
-
} else if (child instanceof VBase) {
|
|
6987
|
-
if (child instanceof VFragment)
|
|
6988
|
-
normalizedChildren.push(...child.childs);
|
|
6989
|
-
else
|
|
6990
|
-
normalizedChildren.push(child);
|
|
6991
|
-
} else
|
|
6992
|
-
normalizedChildren.push(new VText(child));
|
|
6993
|
-
}
|
|
6994
|
-
|
|
6995
|
-
class VText extends VBase {
|
|
6996
|
-
constructor(text) {
|
|
6997
|
-
super();
|
|
6998
|
-
this.text = String(text);
|
|
6999
|
-
}
|
|
7000
|
-
get nodeType() {
|
|
7001
|
-
return 3;
|
|
7002
|
-
}
|
|
7003
|
-
isEqualTo(other) {
|
|
7004
|
-
return other instanceof VText && this.text === other.text;
|
|
7005
|
-
}
|
|
7006
|
-
toDom(opts) {
|
|
7007
|
-
return opts.document.createTextNode(this.text);
|
|
7008
|
-
}
|
|
7009
|
-
}
|
|
7010
|
-
|
|
7011
|
-
class VComment extends VBase {
|
|
7012
|
-
constructor(text) {
|
|
7013
|
-
super();
|
|
7014
|
-
this.text = text;
|
|
7015
|
-
}
|
|
7016
|
-
get nodeType() {
|
|
7017
|
-
return 8;
|
|
7018
|
-
}
|
|
7019
|
-
isEqualTo(other) {
|
|
7020
|
-
return other instanceof VComment && this.text === other.text;
|
|
7021
|
-
}
|
|
7022
|
-
toDom(opts) {
|
|
7023
|
-
return opts.document.createComment(this.text);
|
|
7024
|
-
}
|
|
7025
|
-
}
|
|
7026
|
-
|
|
7027
|
-
class VFragment extends VBase {
|
|
7028
|
-
constructor(childs) {
|
|
7029
|
-
super();
|
|
7030
|
-
this.childs = [];
|
|
7031
|
-
addChild(this.childs, childs);
|
|
7032
|
-
}
|
|
7033
|
-
get nodeType() {
|
|
7034
|
-
return 11;
|
|
7035
|
-
}
|
|
7036
|
-
isEqualTo(other) {
|
|
7037
|
-
if (!(other instanceof VFragment) || this.childs.length !== other.childs.length)
|
|
7038
|
-
return false;
|
|
7039
|
-
return childsEqual(this.childs, other.childs);
|
|
7193
|
+
addDep(task) {
|
|
7194
|
+
console.assert(!this.isCompleted, "addDep for completed task", this, task);
|
|
7195
|
+
this.deps.push(task);
|
|
7196
|
+
task.promise.then((_) => this._check());
|
|
7040
7197
|
}
|
|
7041
|
-
|
|
7042
|
-
|
|
7043
|
-
|
|
7044
|
-
|
|
7198
|
+
complete(val) {
|
|
7199
|
+
this.val = val;
|
|
7200
|
+
this._check();
|
|
7201
|
+
}
|
|
7202
|
+
_check() {
|
|
7203
|
+
if (this.deps.every((task) => task.isCompleted)) {
|
|
7204
|
+
this.isCompleted = true;
|
|
7205
|
+
this.resolve(this);
|
|
7206
|
+
}
|
|
7045
7207
|
}
|
|
7046
7208
|
}
|
|
7047
7209
|
|
|
7048
|
-
class
|
|
7049
|
-
constructor(
|
|
7050
|
-
|
|
7051
|
-
this.
|
|
7052
|
-
this.
|
|
7053
|
-
this.childs = childs ?? [];
|
|
7054
|
-
this.key = key != null ? String(key) : undefined;
|
|
7055
|
-
this.namespace = typeof namespace === "string" ? namespace : null;
|
|
7210
|
+
class Dispatcher {
|
|
7211
|
+
constructor(path, transactor, parentTransaction) {
|
|
7212
|
+
this.path = path;
|
|
7213
|
+
this.transactor = transactor;
|
|
7214
|
+
this.parent = parentTransaction;
|
|
7056
7215
|
}
|
|
7057
|
-
get
|
|
7058
|
-
return
|
|
7216
|
+
get at() {
|
|
7217
|
+
return new PathChanges(this);
|
|
7059
7218
|
}
|
|
7060
|
-
|
|
7061
|
-
return this.
|
|
7219
|
+
send(name, args, opts) {
|
|
7220
|
+
return this.sendAtPath(this.path, name, args, opts);
|
|
7062
7221
|
}
|
|
7063
|
-
|
|
7064
|
-
|
|
7065
|
-
return true;
|
|
7066
|
-
if (!(other instanceof VNode2) || !this.isSameKind(other) || this.childs.length !== other.childs.length) {
|
|
7067
|
-
return false;
|
|
7068
|
-
}
|
|
7069
|
-
if (this.attrs !== other.attrs) {
|
|
7070
|
-
for (const key in this.attrs)
|
|
7071
|
-
if (this.attrs[key] !== other.attrs[key])
|
|
7072
|
-
return false;
|
|
7073
|
-
for (const key in other.attrs)
|
|
7074
|
-
if (!Object.hasOwn(this.attrs, key))
|
|
7075
|
-
return false;
|
|
7076
|
-
}
|
|
7077
|
-
return childsEqual(this.childs, other.childs);
|
|
7222
|
+
bubble(name, args, opts) {
|
|
7223
|
+
return this.send(name, args, { skipSelf: true, bubbles: true, ...opts });
|
|
7078
7224
|
}
|
|
7079
|
-
|
|
7080
|
-
|
|
7081
|
-
const node = this.namespace === null ? doc.createElement(this.tag) : doc.createElementNS(this.namespace, this.tag);
|
|
7082
|
-
if (this.tag === "SELECT" && "value" in this.attrs) {
|
|
7083
|
-
const { value, ...rest } = this.attrs;
|
|
7084
|
-
applyProperties(node, rest, {});
|
|
7085
|
-
appendChildNodes(node, this.childs, opts);
|
|
7086
|
-
applyProperties(node, { value }, {});
|
|
7087
|
-
} else {
|
|
7088
|
-
applyProperties(node, this.attrs, {});
|
|
7089
|
-
appendChildNodes(node, this.childs, opts);
|
|
7090
|
-
}
|
|
7091
|
-
return node;
|
|
7225
|
+
sendAtPath(path, name, args, opts) {
|
|
7226
|
+
return this.transactor.pushSend(path, name, args, opts, this.parent);
|
|
7092
7227
|
}
|
|
7093
|
-
|
|
7094
|
-
|
|
7095
|
-
if (a === b)
|
|
7096
|
-
return null;
|
|
7097
|
-
let diff = null;
|
|
7098
|
-
for (const aKey in a) {
|
|
7099
|
-
if (!Object.hasOwn(b, aKey)) {
|
|
7100
|
-
diff ??= {};
|
|
7101
|
-
diff[aKey] = undefined;
|
|
7102
|
-
} else if (a[aKey] !== b[aKey]) {
|
|
7103
|
-
diff ??= {};
|
|
7104
|
-
diff[aKey] = b[aKey];
|
|
7105
|
-
}
|
|
7228
|
+
request(name, args, opts) {
|
|
7229
|
+
return this.requestAtPath(this.path, name, args, opts);
|
|
7106
7230
|
}
|
|
7107
|
-
|
|
7108
|
-
|
|
7109
|
-
diff ??= {};
|
|
7110
|
-
diff[bKey] = b[bKey];
|
|
7111
|
-
}
|
|
7231
|
+
requestAtPath(path, name, args, opts) {
|
|
7232
|
+
return this.transactor.pushRequest(path, name, args, opts, this.parent);
|
|
7112
7233
|
}
|
|
7113
|
-
|
|
7114
|
-
|
|
7115
|
-
function morphNode(domNode, source, target, opts) {
|
|
7116
|
-
if (source === target || source.isEqualTo(target))
|
|
7117
|
-
return domNode;
|
|
7118
|
-
const type = source.nodeType;
|
|
7119
|
-
if (type === target.nodeType) {
|
|
7120
|
-
if (type === 3 || type === 8) {
|
|
7121
|
-
domNode.data = target.text;
|
|
7122
|
-
return domNode;
|
|
7123
|
-
}
|
|
7124
|
-
if (type === 1 && source.isSameKind(target)) {
|
|
7125
|
-
const propsDiff = diffProps(source.attrs, target.attrs);
|
|
7126
|
-
const isSelect = source.tag === "SELECT";
|
|
7127
|
-
if (propsDiff) {
|
|
7128
|
-
if (isSelect && "value" in propsDiff) {
|
|
7129
|
-
const { value: _v, ...rest } = propsDiff;
|
|
7130
|
-
applyProperties(domNode, rest, source.attrs);
|
|
7131
|
-
} else
|
|
7132
|
-
applyProperties(domNode, propsDiff, source.attrs);
|
|
7133
|
-
}
|
|
7134
|
-
if (!target.attrs.dangerouslySetInnerHTML)
|
|
7135
|
-
morphChildren(domNode, source.childs, target.childs, opts);
|
|
7136
|
-
if (isSelect && target.attrs.value !== undefined)
|
|
7137
|
-
applyProperties(domNode, { value: target.attrs.value }, source.attrs);
|
|
7138
|
-
return domNode;
|
|
7139
|
-
}
|
|
7140
|
-
if (type === 11) {
|
|
7141
|
-
morphChildren(domNode, source.childs, target.childs, opts);
|
|
7142
|
-
return domNode;
|
|
7143
|
-
}
|
|
7234
|
+
lookupTypeFor(name, inst) {
|
|
7235
|
+
return this.transactor.comps.getCompFor(inst).scope.lookupComponent(name);
|
|
7144
7236
|
}
|
|
7145
|
-
const newNode = target.toDom(opts);
|
|
7146
|
-
domNode.parentNode?.replaceChild(newNode, domNode);
|
|
7147
|
-
return newNode;
|
|
7148
7237
|
}
|
|
7149
|
-
|
|
7150
|
-
|
|
7151
|
-
|
|
7152
|
-
return;
|
|
7238
|
+
|
|
7239
|
+
class EventContext extends Dispatcher {
|
|
7240
|
+
get name() {
|
|
7241
|
+
return this.parent?.name ?? null;
|
|
7153
7242
|
}
|
|
7154
|
-
|
|
7155
|
-
|
|
7156
|
-
return;
|
|
7243
|
+
get targetPath() {
|
|
7244
|
+
return this.parent.targetPath;
|
|
7157
7245
|
}
|
|
7158
|
-
|
|
7159
|
-
|
|
7160
|
-
for (let i = 0;i < oldChilds.length; i++) {
|
|
7161
|
-
if (getKey(oldChilds[i]) != null || getKey(newChilds[i]) != null) {
|
|
7162
|
-
hasKey = true;
|
|
7163
|
-
break;
|
|
7164
|
-
}
|
|
7165
|
-
}
|
|
7166
|
-
if (!hasKey) {
|
|
7167
|
-
let dom = parentDom.firstChild;
|
|
7168
|
-
for (let i = 0;i < oldChilds.length; i++) {
|
|
7169
|
-
const next = dom.nextSibling;
|
|
7170
|
-
morphNode(dom, oldChilds[i], newChilds[i], opts);
|
|
7171
|
-
dom = next;
|
|
7172
|
-
}
|
|
7173
|
-
return;
|
|
7174
|
-
}
|
|
7246
|
+
stopPropagation() {
|
|
7247
|
+
return this.parent.stopPropagation();
|
|
7175
7248
|
}
|
|
7176
|
-
|
|
7177
|
-
|
|
7178
|
-
|
|
7179
|
-
|
|
7180
|
-
|
|
7181
|
-
|
|
7249
|
+
}
|
|
7250
|
+
|
|
7251
|
+
class PathChanges extends PathBuilder {
|
|
7252
|
+
constructor(dispatcher) {
|
|
7253
|
+
super();
|
|
7254
|
+
this.dispatcher = dispatcher;
|
|
7182
7255
|
}
|
|
7183
|
-
|
|
7184
|
-
|
|
7185
|
-
for (let j = 0;j < newChilds.length; j++) {
|
|
7186
|
-
const newChild = newChilds[j];
|
|
7187
|
-
const newKey = getKey(newChild);
|
|
7188
|
-
let oldIdx = -1;
|
|
7189
|
-
if (newKey != null) {
|
|
7190
|
-
if (newKey in oldKeyMap && !used[oldKeyMap[newKey]])
|
|
7191
|
-
oldIdx = oldKeyMap[newKey];
|
|
7192
|
-
} else {
|
|
7193
|
-
while (unkeyedCursor < oldChilds.length) {
|
|
7194
|
-
if (!used[unkeyedCursor] && getKey(oldChilds[unkeyedCursor]) == null) {
|
|
7195
|
-
oldIdx = unkeyedCursor++;
|
|
7196
|
-
break;
|
|
7197
|
-
}
|
|
7198
|
-
unkeyedCursor++;
|
|
7199
|
-
}
|
|
7200
|
-
}
|
|
7201
|
-
if (oldIdx >= 0) {
|
|
7202
|
-
used[oldIdx] = 1;
|
|
7203
|
-
const newDom = morphNode(domNodes[oldIdx], oldChilds[oldIdx], newChild, opts);
|
|
7204
|
-
const ref = parentDom.childNodes[j] ?? null;
|
|
7205
|
-
if (newDom !== ref)
|
|
7206
|
-
parentDom.insertBefore(newDom, ref);
|
|
7207
|
-
} else {
|
|
7208
|
-
const ref = parentDom.childNodes[j] ?? null;
|
|
7209
|
-
parentDom.insertBefore(newChild.toDom(opts), ref);
|
|
7210
|
-
}
|
|
7256
|
+
send(name, args, opts) {
|
|
7257
|
+
return this.dispatcher.sendAtPath(this.buildPath(), name, args, opts);
|
|
7211
7258
|
}
|
|
7212
|
-
|
|
7213
|
-
|
|
7214
|
-
parentDom.removeChild(domNodes[i]);
|
|
7215
|
-
}
|
|
7216
|
-
function render(vnode, container, options, prev) {
|
|
7217
|
-
const isFragment = vnode instanceof VFragment;
|
|
7218
|
-
if (prev && prev.vnode instanceof VFragment === isFragment) {
|
|
7219
|
-
const oldDom = isFragment ? container : prev.dom;
|
|
7220
|
-
const newDom = morphNode(oldDom, prev.vnode, vnode, options);
|
|
7221
|
-
return { vnode, dom: isFragment ? container : newDom };
|
|
7259
|
+
bubble(name, args, opts) {
|
|
7260
|
+
return this.send(name, args, { skipSelf: true, bubbles: true, ...opts });
|
|
7222
7261
|
}
|
|
7223
|
-
|
|
7224
|
-
|
|
7225
|
-
return { vnode, dom: isFragment ? container : domNode };
|
|
7226
|
-
}
|
|
7227
|
-
function h(tagName, properties, children) {
|
|
7228
|
-
const c = tagName.charCodeAt(0);
|
|
7229
|
-
const tag = c >= 97 && c <= 122 ? tagName.toUpperCase() : tagName;
|
|
7230
|
-
const props = {};
|
|
7231
|
-
let key, namespace;
|
|
7232
|
-
if (properties) {
|
|
7233
|
-
for (const propName in properties) {
|
|
7234
|
-
const propVal = properties[propName];
|
|
7235
|
-
switch (propName) {
|
|
7236
|
-
case "key":
|
|
7237
|
-
key = propVal;
|
|
7238
|
-
break;
|
|
7239
|
-
case "namespace":
|
|
7240
|
-
namespace = propVal;
|
|
7241
|
-
break;
|
|
7242
|
-
case "class":
|
|
7243
|
-
props.className = propVal;
|
|
7244
|
-
break;
|
|
7245
|
-
case "for":
|
|
7246
|
-
props.htmlFor = propVal;
|
|
7247
|
-
break;
|
|
7248
|
-
default:
|
|
7249
|
-
props[propName] = isHtmlAttribute(propName) ? String(propVal) : propVal;
|
|
7250
|
-
}
|
|
7251
|
-
}
|
|
7262
|
+
buildPath() {
|
|
7263
|
+
return this.dispatcher.path.concat(this.pathChanges);
|
|
7252
7264
|
}
|
|
7253
|
-
const normalizedChildren = [];
|
|
7254
|
-
addChild(normalizedChildren, children);
|
|
7255
|
-
return new VNode2(tag, props, normalizedChildren, key, namespace);
|
|
7256
7265
|
}
|
|
7257
7266
|
|
|
7258
7267
|
// src/app.js
|
|
@@ -7651,20 +7660,20 @@ class Renderer {
|
|
|
7651
7660
|
renderEach(stack, iterInfo, node, viewName) {
|
|
7652
7661
|
const { seq, filter, loopWith } = iterInfo.eval(stack);
|
|
7653
7662
|
const r = [];
|
|
7654
|
-
const iterData = loopWith.call(stack.it, seq);
|
|
7663
|
+
const { iterData, start, end } = unpackLoopResult(loopWith.call(stack.it, seq), seq);
|
|
7655
7664
|
getSeqInfo(seq)(seq, (key, value, attrName) => {
|
|
7656
7665
|
if (filter.call(stack.it, key, value, iterData)) {
|
|
7657
7666
|
const dom = this.renderIt(stack.enter(value, { key }, true), node, key, viewName);
|
|
7658
7667
|
this.pushEachEntry(r, node.nodeId, attrName, key, dom);
|
|
7659
7668
|
}
|
|
7660
|
-
});
|
|
7669
|
+
}, start, end);
|
|
7661
7670
|
return r;
|
|
7662
7671
|
}
|
|
7663
7672
|
renderEachWhen(stack, iterInfo, view, nid) {
|
|
7664
7673
|
const { seq, filter, loopWith, enricher } = iterInfo.eval(stack);
|
|
7665
7674
|
const r = [];
|
|
7666
7675
|
const it = stack.it;
|
|
7667
|
-
const iterData = loopWith.call(it, seq);
|
|
7676
|
+
const { iterData, start, end } = unpackLoopResult(loopWith.call(it, seq), seq);
|
|
7668
7677
|
getSeqInfo(seq)(seq, (key, value, attrName) => {
|
|
7669
7678
|
if (filter.call(it, key, value, iterData)) {
|
|
7670
7679
|
const cachePath = enricher ? [view, it, value] : [view, value];
|
|
@@ -7681,7 +7690,7 @@ class Renderer {
|
|
|
7681
7690
|
this.cache.set(cachePath, cacheKey, dom);
|
|
7682
7691
|
}
|
|
7683
7692
|
}
|
|
7684
|
-
});
|
|
7693
|
+
}, start, end);
|
|
7685
7694
|
return r;
|
|
7686
7695
|
}
|
|
7687
7696
|
renderView(view, stack) {
|
|
@@ -7703,14 +7712,32 @@ class Renderer {
|
|
|
7703
7712
|
}
|
|
7704
7713
|
}
|
|
7705
7714
|
var getSeqInfo = (seq) => isIndexed(seq) ? imIndexedIter : isKeyed(seq) ? imKeyedIter : seq?.[SEQ_INFO] ?? unkIter;
|
|
7706
|
-
var
|
|
7707
|
-
let
|
|
7708
|
-
|
|
7709
|
-
|
|
7715
|
+
var normalizeRange = (start, end, size) => {
|
|
7716
|
+
let s = start == null ? 0 : start < 0 ? size + start : start;
|
|
7717
|
+
let e = end == null ? size : end < 0 ? size + end : end;
|
|
7718
|
+
s = s < 0 ? 0 : s > size ? size : s;
|
|
7719
|
+
e = e < 0 ? 0 : e > size ? size : e;
|
|
7720
|
+
return [s, e < s ? s : e];
|
|
7721
|
+
};
|
|
7722
|
+
var unpackLoopResult = (result, seq) => {
|
|
7723
|
+
const r = result ?? {};
|
|
7724
|
+
return { iterData: r.iterData ?? { seq }, start: r.start, end: r.end };
|
|
7710
7725
|
};
|
|
7711
|
-
var
|
|
7712
|
-
|
|
7713
|
-
|
|
7726
|
+
var imIndexedIter = (seq, visit, start, end) => {
|
|
7727
|
+
const [s, e] = normalizeRange(start, end, seq.size);
|
|
7728
|
+
for (let i = s;i < e; i++)
|
|
7729
|
+
visit(i, seq.get(i), "si");
|
|
7730
|
+
};
|
|
7731
|
+
var imKeyedIter = (seq, visit, start, end) => {
|
|
7732
|
+
const [s, e] = normalizeRange(start, end, seq.size);
|
|
7733
|
+
let i = 0;
|
|
7734
|
+
for (const [k, v] of seq.toSeq().entries()) {
|
|
7735
|
+
if (i >= e)
|
|
7736
|
+
break;
|
|
7737
|
+
if (i >= s)
|
|
7738
|
+
visit(k, v, "sk");
|
|
7739
|
+
i++;
|
|
7740
|
+
}
|
|
7714
7741
|
};
|
|
7715
7742
|
var unkIter = () => {};
|
|
7716
7743
|
var SEQ_INFO = Symbol.for("tutuca.seqInfo");
|