micra.js 2.2.1 → 2.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/micra.js CHANGED
@@ -1,4 +1,4 @@
1
- /* Micra.js v2.2.1 — https://github.com/micra-js/micra — MIT */
1
+ /* Micra.js v2.3.1 — https://github.com/micra-js/micra — MIT */
2
2
  "use strict";
3
3
  var Micra = (() => {
4
4
  var __defProp = Object.defineProperty;
@@ -227,8 +227,9 @@ var Micra = (() => {
227
227
  set.delete(handler);
228
228
  if (set.size === 0) _bus.delete(event);
229
229
  }
230
- function emit(event, payload) {
230
+ function emit(event, ...args) {
231
231
  var _a;
232
+ const payload = args[0];
232
233
  (_a = _bus.get(event)) == null ? void 0 : _a.forEach((h) => {
233
234
  try {
234
235
  h(payload);
@@ -252,13 +253,14 @@ var Micra = (() => {
252
253
  }
253
254
  function createScheduler(render) {
254
255
  let pending = false;
256
+ const flush = () => {
257
+ pending = false;
258
+ render();
259
+ };
255
260
  return function schedule() {
256
261
  if (pending) return;
257
262
  pending = true;
258
- Promise.resolve().then(() => {
259
- pending = false;
260
- render();
261
- });
263
+ queueMicrotask(flush);
262
264
  };
263
265
  }
264
266
 
@@ -324,7 +326,7 @@ var Micra = (() => {
324
326
  const desired = stateVal == null ? "" : String(stateVal);
325
327
  if (html.value !== desired) html.value = desired;
326
328
  }
327
- function applyDirectives(scan, state, rawState, _instance) {
329
+ function applyDirectives(scan, state, rawState) {
328
330
  for (const b of scan.if) applyIf(b, state);
329
331
  for (const b of scan.text) applyText(b.el, b.expr, state);
330
332
  for (const b of scan.html) applyHtml(b.el, b.expr, state);
@@ -535,20 +537,6 @@ var Micra = (() => {
535
537
  }
536
538
  return scan;
537
539
  }
538
- function scanFragment(frag) {
539
- const scan = emptyScan();
540
- const walker = document.createTreeWalker(
541
- frag,
542
- NodeFilter.SHOW_ELEMENT,
543
- NESTED_COMPONENT_FILTER
544
- );
545
- let node = walker.nextNode();
546
- while (node) {
547
- classify(node, scan);
548
- node = walker.nextNode();
549
- }
550
- return scan;
551
- }
552
540
 
553
541
  // src/dom/each.ts
554
542
  function renderList(templates, state, rawState, instance, triggerKey) {
@@ -579,10 +567,28 @@ var Micra = (() => {
579
567
  if (keyAttr) {
580
568
  renderKeyed(tmpl, items, keyAttr, marker, keyMap, state, rawState, instance, canSkipUnchanged);
581
569
  } else {
582
- renderNoKey(tmpl, items, marker, state, rawState, instance);
570
+ renderNoKey(tmpl, items, marker, state, rawState, instance, canSkipUnchanged);
583
571
  }
584
572
  }
585
573
  }
574
+ function createRowNode(tmpl, state, instance) {
575
+ const frag = tmpl.content.cloneNode(true);
576
+ let node;
577
+ if (frag.childNodes.length === 1) {
578
+ node = frag.firstElementChild;
579
+ } else {
580
+ node = document.createElement("micra-each-item");
581
+ node.style.display = "contents";
582
+ node.append(frag);
583
+ }
584
+ const rowScan = scanComponent(node);
585
+ node.__micraScan = rowScan;
586
+ node._itemState = Object.create(state);
587
+ bindDataOn(rowScan.on, instance);
588
+ bindAtEvents(rowScan.atEvents, instance);
589
+ bindModels(rowScan.model, instance);
590
+ return node;
591
+ }
586
592
  function renderKeyed(tmpl, items, keyAttr, marker, keyMap, state, rawState, instance, canSkipUnchanged) {
587
593
  var _a;
588
594
  const nextKeys = /* @__PURE__ */ new Set();
@@ -602,22 +608,8 @@ var Micra = (() => {
602
608
  nextKeys.add(key);
603
609
  let node = keyMap.get(key);
604
610
  if (!node) {
605
- const frag = tmpl.content.cloneNode(true);
606
- if (frag.childNodes.length === 1) {
607
- node = frag.firstElementChild;
608
- } else {
609
- node = document.createElement("micra-each-item");
610
- node.style.display = "contents";
611
- node.append(frag);
612
- }
613
- node.__micraKey = key;
611
+ node = createRowNode(tmpl, state, instance);
614
612
  keyMap.set(key, node);
615
- const rowScan2 = scanComponent(node);
616
- node.__micraScan = rowScan2;
617
- bindDataOn(rowScan2.on, instance);
618
- bindAtEvents(rowScan2.atEvents, instance);
619
- bindModels(rowScan2.model, instance);
620
- node._itemState = Object.create(state);
621
613
  } else if (canSkipUnchanged && node.__micraItem === item && node.__micraIndex === index) {
622
614
  nextNodes.push(node);
623
615
  continue;
@@ -629,7 +621,7 @@ var Micra = (() => {
629
621
  itemState.index = index;
630
622
  itemState.$index = index;
631
623
  const rowScan = (_a = node.__micraScan) != null ? _a : node.__micraScan = scanComponent(node);
632
- applyDirectives(rowScan, itemState, rawState, instance);
624
+ applyDirectives(rowScan, itemState, rawState);
633
625
  nextNodes.push(node);
634
626
  }
635
627
  for (const [key, node] of keyMap) {
@@ -695,29 +687,50 @@ var Micra = (() => {
695
687
  anchor = node;
696
688
  }
697
689
  }
698
- function renderNoKey(tmpl, items, marker, state, rawState, instance) {
699
- tmpl.__micraList.forEach((n) => n.remove());
700
- tmpl.__micraList = [];
701
- const frag = document.createDocumentFragment();
702
- for (const [index, item] of items.entries()) {
703
- const clone = tmpl.content.cloneNode(true);
704
- const itemState = Object.assign(
705
- Object.create(state),
706
- { item, index, $index: index }
707
- );
708
- const fragScan = scanFragment(clone);
709
- applyDirectives(fragScan, itemState, rawState, instance);
710
- bindDataOn(fragScan.on, instance);
711
- bindAtEvents(fragScan.atEvents, instance);
712
- bindModels(fragScan.model, instance);
713
- const nodes = Array.from(clone.childNodes);
714
- nodes.forEach((n) => {
715
- n.__micraEach = true;
716
- frag.append(n);
717
- });
718
- tmpl.__micraList.push(...nodes);
719
- }
720
- marker.after(frag);
690
+ function renderNoKey(tmpl, items, marker, state, rawState, instance, canSkipUnchanged) {
691
+ const prevList = tmpl.__micraList;
692
+ const prevLen = prevList.length;
693
+ const nextLen = items.length;
694
+ const reuseLen = nextLen < prevLen ? nextLen : prevLen;
695
+ const nextList = new Array(nextLen);
696
+ for (let i = 0; i < reuseLen; i++) {
697
+ const node = prevList[i];
698
+ const item = items[i];
699
+ if (canSkipUnchanged && node.__micraItem === item && node.__micraIndex === i) {
700
+ nextList[i] = node;
701
+ continue;
702
+ }
703
+ node.__micraItem = item;
704
+ node.__micraIndex = i;
705
+ const itemState = node._itemState;
706
+ itemState.item = item;
707
+ itemState.index = i;
708
+ itemState.$index = i;
709
+ applyDirectives(node.__micraScan, itemState, rawState);
710
+ nextList[i] = node;
711
+ }
712
+ for (let i = nextLen; i < prevLen; i++) {
713
+ prevList[i].remove();
714
+ }
715
+ if (nextLen > prevLen) {
716
+ const frag = document.createDocumentFragment();
717
+ for (let i = prevLen; i < nextLen; i++) {
718
+ const node = createRowNode(tmpl, state, instance);
719
+ const item = items[i];
720
+ const itemState = node._itemState;
721
+ itemState.item = item;
722
+ itemState.index = i;
723
+ itemState.$index = i;
724
+ node.__micraItem = item;
725
+ node.__micraIndex = i;
726
+ applyDirectives(node.__micraScan, itemState, rawState);
727
+ nextList[i] = node;
728
+ frag.append(node);
729
+ }
730
+ const anchor = prevLen > 0 ? nextList[prevLen - 1] : marker;
731
+ anchor.after(frag);
732
+ }
733
+ tmpl.__micraList = nextList;
721
734
  }
722
735
 
723
736
  // src/dom/refs.ts
@@ -809,7 +822,7 @@ var Micra = (() => {
809
822
  try {
810
823
  const mRoot2 = root;
811
824
  const scan = (_a2 = mRoot2.__micraScan) != null ? _a2 : mRoot2.__micraScan = scanComponent(root);
812
- applyDirectives(scan, exprState, rawState, instance);
825
+ applyDirectives(scan, exprState, rawState);
813
826
  renderList(scan.each, exprState, rawState, instance, triggerKey);
814
827
  bindDataOn(scan.on, instance);
815
828
  bindAtEvents(scan.atEvents, instance);