@marko/runtime-tags 6.1.9 → 6.1.11

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.
@@ -56,7 +56,9 @@ export declare enum PendingRenderProp {
56
56
  Key = "a",
57
57
  Scope = "b",
58
58
  Signal = "c",
59
- Value = "d"
59
+ Value = "d",
60
+ Gen = "e",
61
+ Pending = "f"
60
62
  }
61
63
  export declare enum ClosureSignalProp {
62
64
  ScopeInstancesAccessor = "a",
@@ -56,7 +56,9 @@ export declare enum PendingRenderProp {
56
56
  Key = "key",
57
57
  Scope = "scope",
58
58
  Signal = "signal",
59
- Value = "value"
59
+ Value = "value",
60
+ Gen = "gen",
61
+ Pending = "pending"
60
62
  }
61
63
  export declare enum ClosureSignalProp {
62
64
  ScopeInstancesAccessor = "scopeInstancesAccessor",
@@ -7,5 +7,6 @@ export declare const toDelimitedString: (val: unknown, delimiter: string, string
7
7
  export declare function isEventHandler(name: string): name is `on${string}`;
8
8
  export declare function getEventHandlerName(name: `on${string}`): string;
9
9
  export declare function isVoid(value: unknown): value is false | null | undefined;
10
+ export declare function isNotVoid(value: unknown): boolean;
10
11
  export declare function normalizeDynamicRenderer<Renderer>(value: any): Renderer | string | undefined;
11
12
  export declare const decodeAccessor: (num: number) => string;
package/dist/debug/dom.js CHANGED
@@ -125,6 +125,9 @@ function isEventHandler(name) {
125
125
  function getEventHandlerName(name) {
126
126
  return name[2] === "-" ? name.slice(3) : name.slice(2).toLowerCase();
127
127
  }
128
+ function isNotVoid(value) {
129
+ return value != null && value !== false;
130
+ }
128
131
  function normalizeDynamicRenderer(value) {
129
132
  if (value) {
130
133
  if (typeof value === "string") return value;
@@ -765,7 +768,7 @@ let inputType = "";
765
768
  const controllableDelegate = /* @__PURE__ */ createDelegator();
766
769
  function _attr_input_checked_default(scope, nodeAccessor, checked) {
767
770
  const el = scope[nodeAccessor];
768
- const normalizedChecked = normalizeBoolProp(checked);
771
+ const normalizedChecked = isNotVoid(checked);
769
772
  if (el.defaultChecked !== normalizedChecked) {
770
773
  const restoreValue = scope["#Creating"] ? normalizedChecked : el.checked;
771
774
  el.defaultChecked = normalizedChecked;
@@ -774,7 +777,7 @@ function _attr_input_checked_default(scope, nodeAccessor, checked) {
774
777
  }
775
778
  function _attr_input_checked(scope, nodeAccessor, checked, checkedChange) {
776
779
  const el = scope[nodeAccessor];
777
- const normalizedChecked = normalizeBoolProp(checked);
780
+ const normalizedChecked = isNotVoid(checked);
778
781
  scope["ControlledHandler:" + nodeAccessor] = checkedChange;
779
782
  scope["ControlledType:" + nodeAccessor] = checkedChange ? 0 : 5;
780
783
  if (checkedChange && !scope["#Creating"]) el.checked = normalizedChecked;
@@ -796,19 +799,19 @@ function _attr_input_checkedValue_default(scope, nodeAccessor, checkedValue, val
796
799
  const multiple = Array.isArray(checkedValue);
797
800
  const normalizedValue = normalizeStrProp(value);
798
801
  const normalizedCheckedValue = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue);
799
- _attr(scope[nodeAccessor], "value", normalizedValue);
802
+ _attr(scope[nodeAccessor], "value", value);
800
803
  _attr_input_checked_default(scope, nodeAccessor, multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue);
801
804
  }
802
805
  function _attr_input_checkedValue(scope, nodeAccessor, checkedValue, checkedValueChange, value) {
803
806
  const el = scope[nodeAccessor];
804
807
  const multiple = Array.isArray(checkedValue);
805
- const normalizedValue = normalizeStrProp(value);
806
808
  const normalizedCheckedValue = scope["ControlledValue:" + nodeAccessor] = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue);
807
- _attr(el, "value", normalizedValue);
808
809
  scope["ControlledHandler:" + nodeAccessor] = checkedValueChange;
809
810
  scope["ControlledType:" + nodeAccessor] = checkedValueChange ? 1 : 5;
810
- if (checkedValueChange && !scope["#Creating"]) el.checked = multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue;
811
- else _attr_input_checkedValue_default(scope, nodeAccessor, normalizedCheckedValue, normalizedValue);
811
+ if (checkedValueChange && !scope["#Creating"]) {
812
+ el.checked = multiple ? normalizedCheckedValue.includes(normalizeStrProp(value)) : normalizeStrProp(value) === normalizedCheckedValue;
813
+ _attr(el, "value", value);
814
+ } else _attr_input_checkedValue_default(scope, nodeAccessor, checkedValue, value);
812
815
  }
813
816
  function _attr_input_checkedValue_script(scope, nodeAccessor) {
814
817
  const el = scope[nodeAccessor];
@@ -829,7 +832,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
829
832
  }
830
833
  function _attr_input_value_default(scope, nodeAccessor, value) {
831
834
  const el = scope[nodeAccessor];
832
- const normalizedValue = normalizeStrProp(value);
835
+ const normalizedValue = normalizeAttrValue(value) || "";
833
836
  if (el.defaultValue !== normalizedValue) {
834
837
  const restoreValue = scope["#Creating"] ? normalizedValue : el.value;
835
838
  el.defaultValue = normalizedValue;
@@ -838,7 +841,7 @@ function _attr_input_value_default(scope, nodeAccessor, value) {
838
841
  }
839
842
  function _attr_input_value(scope, nodeAccessor, value, valueChange) {
840
843
  const el = scope[nodeAccessor];
841
- const normalizedValue = normalizeStrProp(value);
844
+ const normalizedValue = normalizeAttrValue(value) || "";
842
845
  scope["ControlledHandler:" + nodeAccessor] = valueChange;
843
846
  scope["ControlledValue:" + nodeAccessor] = normalizedValue;
844
847
  scope["ControlledType:" + nodeAccessor] = valueChange ? 2 : 5;
@@ -932,10 +935,10 @@ function getSelectValue(el, multiple) {
932
935
  return multiple ? Array.from(el.selectedOptions, (opt) => opt.value) : el.value;
933
936
  }
934
937
  function _attr_details_or_dialog_open_default(scope, nodeAccessor, open) {
935
- if (scope["#Creating"]) scope[nodeAccessor].open = normalizeBoolProp(open);
938
+ if (scope["#Creating"]) scope[nodeAccessor].open = isNotVoid(open);
936
939
  }
937
940
  function _attr_details_or_dialog_open(scope, nodeAccessor, open, openChange) {
938
- const normalizedOpen = scope["ControlledValue:" + nodeAccessor] = normalizeBoolProp(open);
941
+ const normalizedOpen = scope["ControlledValue:" + nodeAccessor] = isNotVoid(open);
939
942
  scope["ControlledHandler:" + nodeAccessor] = openChange;
940
943
  scope["ControlledType:" + nodeAccessor] = openChange ? 4 : 5;
941
944
  if (openChange && !scope["#Creating"]) scope[nodeAccessor].open = normalizedOpen;
@@ -987,9 +990,6 @@ function hasFormElementChanged(el) {
987
990
  function normalizeStrProp(value) {
988
991
  return normalizeAttrValue(value) || "";
989
992
  }
990
- function normalizeBoolProp(value) {
991
- return value != null && value !== false;
992
- }
993
993
  function updateList(arr, val, push) {
994
994
  const index = arr.indexOf(val);
995
995
  return (push ? !~index && [...arr, val] : ~index && arr.slice(0, index).concat(arr.slice(index + 1))) || arr;
@@ -1165,7 +1165,7 @@ function normalizeClientRender(value) {
1165
1165
  else throw new Error(`Invalid \`content\` attribute. Received ${typeof value}`);
1166
1166
  }
1167
1167
  function normalizeAttrValue(value) {
1168
- if (value || value === 0) return value === true ? "" : value + "";
1168
+ if (isNotVoid(value)) return value === true ? "" : value + "";
1169
1169
  }
1170
1170
  function _lifecycle(scope, thisObj, index = 0) {
1171
1171
  const accessor = "Lifecycle:" + index;
@@ -1550,9 +1550,8 @@ function byFirstArg(name) {
1550
1550
  }
1551
1551
  //#endregion
1552
1552
  //#region src/dom/queue.ts
1553
+ let runId = 1;
1553
1554
  let pendingRenders = [];
1554
- let pendingRendersLookup = {};
1555
- let asyncRendersLookup;
1556
1555
  const caughtError = /* @__PURE__ */ new WeakSet();
1557
1556
  const placeholderShown = /* @__PURE__ */ new WeakSet();
1558
1557
  let pendingEffects = [];
@@ -1560,18 +1559,22 @@ let pendingScopes = [];
1560
1559
  let rendering;
1561
1560
  const scopeKeyOffset = 1e3;
1562
1561
  function queueRender(scope, signal, signalKey, value, scopeKey = scope["#Id"]) {
1563
- const key = scopeKey * scopeKeyOffset + signalKey;
1564
- let render = signalKey >= 0 && pendingRendersLookup[key];
1565
- if (render) render["value"] = value;
1566
- else {
1567
- queuePendingRender(render = {
1568
- ["key"]: key,
1562
+ let render;
1563
+ if (signalKey >= 0 && (render = scope[signalKey + scopeKeyOffset])) {
1564
+ render["value"] = value;
1565
+ if (render["gen"] === runId || catchEnabled && render["pending"]) return;
1566
+ render["gen"] = runId;
1567
+ } else {
1568
+ render = {
1569
+ ["key"]: scopeKey * scopeKeyOffset + signalKey,
1569
1570
  ["scope"]: scope,
1570
1571
  ["signal"]: signal,
1571
- ["value"]: value
1572
- });
1573
- signalKey >= 0 && (pendingRendersLookup[key] = render);
1572
+ ["value"]: value,
1573
+ ["gen"]: runId
1574
+ };
1575
+ if (signalKey >= 0) scope[signalKey + scopeKeyOffset] = render;
1574
1576
  }
1577
+ queuePendingRender(render);
1575
1578
  }
1576
1579
  function queuePendingRender(render) {
1577
1580
  let i = pendingRenders.push(render) - 1;
@@ -1589,13 +1592,12 @@ function queueEffect(scope, fn) {
1589
1592
  }
1590
1593
  function run() {
1591
1594
  const effects = pendingEffects;
1592
- asyncRendersLookup = {};
1593
1595
  try {
1594
1596
  rendering = 1;
1595
1597
  runRenders();
1596
1598
  } finally {
1597
- pendingRendersLookup = asyncRendersLookup;
1598
- asyncRendersLookup = rendering = 0;
1599
+ runId++;
1600
+ rendering = 0;
1599
1601
  pendingRenders = [];
1600
1602
  pendingEffects = [];
1601
1603
  }
@@ -1608,19 +1610,15 @@ function queueAsyncRender(scope, signal, value) {
1608
1610
  function prepareEffects(fn) {
1609
1611
  const prevRenders = pendingRenders;
1610
1612
  const prevEffects = pendingEffects;
1611
- const prevLookup = asyncRendersLookup;
1612
1613
  const preparedEffects = pendingEffects = [];
1613
1614
  pendingRenders = [];
1614
- asyncRendersLookup = pendingRendersLookup;
1615
- pendingRendersLookup = {};
1616
1615
  try {
1617
1616
  rendering = 1;
1618
1617
  fn();
1619
1618
  runRenders();
1620
1619
  } finally {
1620
+ runId++;
1621
1621
  rendering = 0;
1622
- pendingRendersLookup = asyncRendersLookup;
1623
- asyncRendersLookup = prevLookup;
1624
1622
  pendingRenders = prevRenders;
1625
1623
  pendingEffects = prevEffects;
1626
1624
  }
@@ -1690,11 +1688,12 @@ function _enable_catch() {
1690
1688
  let branch = render["scope"]["#ClosestBranch"];
1691
1689
  while (branch) {
1692
1690
  if (branch["#PendingRenders"]) {
1693
- asyncRendersLookup[render["key"]] = render;
1691
+ render["pending"] = 1;
1694
1692
  return branch["#PendingRenders"].push(render);
1695
1693
  }
1696
1694
  branch = branch["#ParentBranch"];
1697
1695
  }
1696
+ render["pending"] = 0;
1698
1697
  runRender(render);
1699
1698
  } catch (error) {
1700
1699
  renderCatch(render["scope"], error);
@@ -123,6 +123,9 @@ function isEventHandler(name) {
123
123
  function getEventHandlerName(name) {
124
124
  return name[2] === "-" ? name.slice(3) : name.slice(2).toLowerCase();
125
125
  }
126
+ function isNotVoid(value) {
127
+ return value != null && value !== false;
128
+ }
126
129
  function normalizeDynamicRenderer(value) {
127
130
  if (value) {
128
131
  if (typeof value === "string") return value;
@@ -763,7 +766,7 @@ let inputType = "";
763
766
  const controllableDelegate = /* @__PURE__ */ createDelegator();
764
767
  function _attr_input_checked_default(scope, nodeAccessor, checked) {
765
768
  const el = scope[nodeAccessor];
766
- const normalizedChecked = normalizeBoolProp(checked);
769
+ const normalizedChecked = isNotVoid(checked);
767
770
  if (el.defaultChecked !== normalizedChecked) {
768
771
  const restoreValue = scope["#Creating"] ? normalizedChecked : el.checked;
769
772
  el.defaultChecked = normalizedChecked;
@@ -772,7 +775,7 @@ function _attr_input_checked_default(scope, nodeAccessor, checked) {
772
775
  }
773
776
  function _attr_input_checked(scope, nodeAccessor, checked, checkedChange) {
774
777
  const el = scope[nodeAccessor];
775
- const normalizedChecked = normalizeBoolProp(checked);
778
+ const normalizedChecked = isNotVoid(checked);
776
779
  scope["ControlledHandler:" + nodeAccessor] = checkedChange;
777
780
  scope["ControlledType:" + nodeAccessor] = checkedChange ? 0 : 5;
778
781
  if (checkedChange && !scope["#Creating"]) el.checked = normalizedChecked;
@@ -794,19 +797,19 @@ function _attr_input_checkedValue_default(scope, nodeAccessor, checkedValue, val
794
797
  const multiple = Array.isArray(checkedValue);
795
798
  const normalizedValue = normalizeStrProp(value);
796
799
  const normalizedCheckedValue = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue);
797
- _attr(scope[nodeAccessor], "value", normalizedValue);
800
+ _attr(scope[nodeAccessor], "value", value);
798
801
  _attr_input_checked_default(scope, nodeAccessor, multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue);
799
802
  }
800
803
  function _attr_input_checkedValue(scope, nodeAccessor, checkedValue, checkedValueChange, value) {
801
804
  const el = scope[nodeAccessor];
802
805
  const multiple = Array.isArray(checkedValue);
803
- const normalizedValue = normalizeStrProp(value);
804
806
  const normalizedCheckedValue = scope["ControlledValue:" + nodeAccessor] = multiple ? checkedValue.map(normalizeStrProp) : normalizeStrProp(checkedValue);
805
- _attr(el, "value", normalizedValue);
806
807
  scope["ControlledHandler:" + nodeAccessor] = checkedValueChange;
807
808
  scope["ControlledType:" + nodeAccessor] = checkedValueChange ? 1 : 5;
808
- if (checkedValueChange && !scope["#Creating"]) el.checked = multiple ? normalizedCheckedValue.includes(normalizedValue) : normalizedValue === normalizedCheckedValue;
809
- else _attr_input_checkedValue_default(scope, nodeAccessor, normalizedCheckedValue, normalizedValue);
809
+ if (checkedValueChange && !scope["#Creating"]) {
810
+ el.checked = multiple ? normalizedCheckedValue.includes(normalizeStrProp(value)) : normalizeStrProp(value) === normalizedCheckedValue;
811
+ _attr(el, "value", value);
812
+ } else _attr_input_checkedValue_default(scope, nodeAccessor, checkedValue, value);
810
813
  }
811
814
  function _attr_input_checkedValue_script(scope, nodeAccessor) {
812
815
  const el = scope[nodeAccessor];
@@ -827,7 +830,7 @@ function _attr_input_checkedValue_script(scope, nodeAccessor) {
827
830
  }
828
831
  function _attr_input_value_default(scope, nodeAccessor, value) {
829
832
  const el = scope[nodeAccessor];
830
- const normalizedValue = normalizeStrProp(value);
833
+ const normalizedValue = normalizeAttrValue(value) || "";
831
834
  if (el.defaultValue !== normalizedValue) {
832
835
  const restoreValue = scope["#Creating"] ? normalizedValue : el.value;
833
836
  el.defaultValue = normalizedValue;
@@ -836,7 +839,7 @@ function _attr_input_value_default(scope, nodeAccessor, value) {
836
839
  }
837
840
  function _attr_input_value(scope, nodeAccessor, value, valueChange) {
838
841
  const el = scope[nodeAccessor];
839
- const normalizedValue = normalizeStrProp(value);
842
+ const normalizedValue = normalizeAttrValue(value) || "";
840
843
  scope["ControlledHandler:" + nodeAccessor] = valueChange;
841
844
  scope["ControlledValue:" + nodeAccessor] = normalizedValue;
842
845
  scope["ControlledType:" + nodeAccessor] = valueChange ? 2 : 5;
@@ -930,10 +933,10 @@ function getSelectValue(el, multiple) {
930
933
  return multiple ? Array.from(el.selectedOptions, (opt) => opt.value) : el.value;
931
934
  }
932
935
  function _attr_details_or_dialog_open_default(scope, nodeAccessor, open) {
933
- if (scope["#Creating"]) scope[nodeAccessor].open = normalizeBoolProp(open);
936
+ if (scope["#Creating"]) scope[nodeAccessor].open = isNotVoid(open);
934
937
  }
935
938
  function _attr_details_or_dialog_open(scope, nodeAccessor, open, openChange) {
936
- const normalizedOpen = scope["ControlledValue:" + nodeAccessor] = normalizeBoolProp(open);
939
+ const normalizedOpen = scope["ControlledValue:" + nodeAccessor] = isNotVoid(open);
937
940
  scope["ControlledHandler:" + nodeAccessor] = openChange;
938
941
  scope["ControlledType:" + nodeAccessor] = openChange ? 4 : 5;
939
942
  if (openChange && !scope["#Creating"]) scope[nodeAccessor].open = normalizedOpen;
@@ -985,9 +988,6 @@ function hasFormElementChanged(el) {
985
988
  function normalizeStrProp(value) {
986
989
  return normalizeAttrValue(value) || "";
987
990
  }
988
- function normalizeBoolProp(value) {
989
- return value != null && value !== false;
990
- }
991
991
  function updateList(arr, val, push) {
992
992
  const index = arr.indexOf(val);
993
993
  return (push ? !~index && [...arr, val] : ~index && arr.slice(0, index).concat(arr.slice(index + 1))) || arr;
@@ -1163,7 +1163,7 @@ function normalizeClientRender(value) {
1163
1163
  else throw new Error(`Invalid \`content\` attribute. Received ${typeof value}`);
1164
1164
  }
1165
1165
  function normalizeAttrValue(value) {
1166
- if (value || value === 0) return value === true ? "" : value + "";
1166
+ if (isNotVoid(value)) return value === true ? "" : value + "";
1167
1167
  }
1168
1168
  function _lifecycle(scope, thisObj, index = 0) {
1169
1169
  const accessor = "Lifecycle:" + index;
@@ -1548,9 +1548,8 @@ function byFirstArg(name) {
1548
1548
  }
1549
1549
  //#endregion
1550
1550
  //#region src/dom/queue.ts
1551
+ let runId = 1;
1551
1552
  let pendingRenders = [];
1552
- let pendingRendersLookup = {};
1553
- let asyncRendersLookup;
1554
1553
  const caughtError = /* @__PURE__ */ new WeakSet();
1555
1554
  const placeholderShown = /* @__PURE__ */ new WeakSet();
1556
1555
  let pendingEffects = [];
@@ -1558,18 +1557,22 @@ let pendingScopes = [];
1558
1557
  let rendering;
1559
1558
  const scopeKeyOffset = 1e3;
1560
1559
  function queueRender(scope, signal, signalKey, value, scopeKey = scope["#Id"]) {
1561
- const key = scopeKey * scopeKeyOffset + signalKey;
1562
- let render = signalKey >= 0 && pendingRendersLookup[key];
1563
- if (render) render["value"] = value;
1564
- else {
1565
- queuePendingRender(render = {
1566
- ["key"]: key,
1560
+ let render;
1561
+ if (signalKey >= 0 && (render = scope[signalKey + scopeKeyOffset])) {
1562
+ render["value"] = value;
1563
+ if (render["gen"] === runId || catchEnabled && render["pending"]) return;
1564
+ render["gen"] = runId;
1565
+ } else {
1566
+ render = {
1567
+ ["key"]: scopeKey * scopeKeyOffset + signalKey,
1567
1568
  ["scope"]: scope,
1568
1569
  ["signal"]: signal,
1569
- ["value"]: value
1570
- });
1571
- signalKey >= 0 && (pendingRendersLookup[key] = render);
1570
+ ["value"]: value,
1571
+ ["gen"]: runId
1572
+ };
1573
+ if (signalKey >= 0) scope[signalKey + scopeKeyOffset] = render;
1572
1574
  }
1575
+ queuePendingRender(render);
1573
1576
  }
1574
1577
  function queuePendingRender(render) {
1575
1578
  let i = pendingRenders.push(render) - 1;
@@ -1587,13 +1590,12 @@ function queueEffect(scope, fn) {
1587
1590
  }
1588
1591
  function run() {
1589
1592
  const effects = pendingEffects;
1590
- asyncRendersLookup = {};
1591
1593
  try {
1592
1594
  rendering = 1;
1593
1595
  runRenders();
1594
1596
  } finally {
1595
- pendingRendersLookup = asyncRendersLookup;
1596
- asyncRendersLookup = rendering = 0;
1597
+ runId++;
1598
+ rendering = 0;
1597
1599
  pendingRenders = [];
1598
1600
  pendingEffects = [];
1599
1601
  }
@@ -1606,19 +1608,15 @@ function queueAsyncRender(scope, signal, value) {
1606
1608
  function prepareEffects(fn) {
1607
1609
  const prevRenders = pendingRenders;
1608
1610
  const prevEffects = pendingEffects;
1609
- const prevLookup = asyncRendersLookup;
1610
1611
  const preparedEffects = pendingEffects = [];
1611
1612
  pendingRenders = [];
1612
- asyncRendersLookup = pendingRendersLookup;
1613
- pendingRendersLookup = {};
1614
1613
  try {
1615
1614
  rendering = 1;
1616
1615
  fn();
1617
1616
  runRenders();
1618
1617
  } finally {
1618
+ runId++;
1619
1619
  rendering = 0;
1620
- pendingRendersLookup = asyncRendersLookup;
1621
- asyncRendersLookup = prevLookup;
1622
1620
  pendingRenders = prevRenders;
1623
1621
  pendingEffects = prevEffects;
1624
1622
  }
@@ -1688,11 +1686,12 @@ function _enable_catch() {
1688
1686
  let branch = render["scope"]["#ClosestBranch"];
1689
1687
  while (branch) {
1690
1688
  if (branch["#PendingRenders"]) {
1691
- asyncRendersLookup[render["key"]] = render;
1689
+ render["pending"] = 1;
1692
1690
  return branch["#PendingRenders"].push(render);
1693
1691
  }
1694
1692
  branch = branch["#ParentBranch"];
1695
1693
  }
1694
+ render["pending"] = 0;
1696
1695
  runRender(render);
1697
1696
  } catch (error) {
1698
1697
  renderCatch(render["scope"], error);
@@ -844,9 +844,10 @@ function writeArrayBuffer(state, val) {
844
844
  }
845
845
  function writeTypedArray(state, val, ref) {
846
846
  if (val.byteOffset || state.refs.has(val.buffer)) {
847
+ const needsLength = val.byteOffset + val.byteLength < val.buffer.byteLength;
847
848
  state.buf.push("new " + val.constructor.name + "(");
848
849
  writeProp(state, val.buffer, ref, "buffer");
849
- state.buf.push(val.byteOffset ? "," + val.byteOffset + ")" : ")");
850
+ state.buf.push((val.byteOffset || needsLength ? "," + val.byteOffset + (needsLength ? "," + val.length : "") : "") + ")");
850
851
  } else {
851
852
  state.refs.set(val.buffer, new Reference(ref, "buffer", state.flush, null));
852
853
  state.buf.push("new " + val.constructor.name + (val.length === 0 ? "" : "(" + (hasOnlyZeros(val) ? val.length : typedArrayToInitString(val)) + ")"));
@@ -900,11 +901,12 @@ function writeFormData(state, val) {
900
901
  sep = ",";
901
902
  }
902
903
  if (sep === "[") state.buf.push("new FormData");
903
- else state.buf.push(valStr + "].reduce((f,v,i,a)=>i%2&&f.append(v,a[i+1])||f,new FormData)");
904
+ else state.buf.push(valStr + "].reduce((f,v,i,a)=>i%2&&f.append(a[i-1],v)||f,new FormData)");
904
905
  return true;
905
906
  }
906
907
  function writeRequest(state, val, ref) {
907
908
  let sep = "";
909
+ let bodySerialized = false;
908
910
  const hasBody = val.body && !val.bodyUsed && val.duplex === "half";
909
911
  state.buf.push("new Request(" + quote(val.url, 0));
910
912
  if (hasBody) {
@@ -912,6 +914,7 @@ function writeRequest(state, val, ref) {
912
914
  if (writeProp(state, val.body, ref, "body")) {
913
915
  state.buf.push(",duplex:\"half\"");
914
916
  sep = ",";
917
+ bodySerialized = true;
915
918
  } else state.buf.pop();
916
919
  }
917
920
  let options = "";
@@ -954,7 +957,7 @@ function writeRequest(state, val, ref) {
954
957
  sep = ",";
955
958
  }
956
959
  if (val.referrerPolicy) options += sep + "referrerPolicy:" + quote(val.referrerPolicy, 0);
957
- state.buf.push(hasBody ? options + "})" : options ? ",{" + options + "})" : ")");
960
+ state.buf.push(bodySerialized ? options + "})" : options ? ",{" + options + "})" : ")");
958
961
  return true;
959
962
  }
960
963
  function writeResponse(state, val, ref) {
@@ -1341,6 +1344,9 @@ function getEventHandlerName(name) {
1341
1344
  function isVoid(value) {
1342
1345
  return value == null || value === false;
1343
1346
  }
1347
+ function isNotVoid(value) {
1348
+ return value != null && value !== false;
1349
+ }
1344
1350
  function normalizeDynamicRenderer(value) {
1345
1351
  if (value) {
1346
1352
  if (typeof value === "string") return value;
@@ -2381,7 +2387,7 @@ function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2381
2387
  }
2382
2388
  function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2383
2389
  if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange);
2384
- return normalizeBoolAttrValue(checked) ? " checked" : "";
2390
+ return isNotVoid(checked) ? " checked" : "";
2385
2391
  }
2386
2392
  function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2387
2393
  const valueAttr = _attr("value", value);
@@ -2400,8 +2406,8 @@ function getCheckedValueRef(checkedValue) {
2400
2406
  }
2401
2407
  }
2402
2408
  function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2403
- const normalizedOpen = normalizeBoolAttrValue(open);
2404
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen, openChange);
2409
+ const normalizedOpen = isNotVoid(open);
2410
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2405
2411
  return normalizedOpen ? " open" : "";
2406
2412
  }
2407
2413
  function _attr_nonce() {
@@ -2418,17 +2424,17 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2418
2424
  case "input":
2419
2425
  assertExclusiveAttrs(data);
2420
2426
  if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2421
- else if (data.checkedValue || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2427
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2422
2428
  else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
2423
2429
  else break;
2424
2430
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2425
2431
  break;
2426
2432
  case "select":
2427
2433
  case "textarea":
2428
- if (data.value || data.valueChange) skip = /^value(?:Change)?$|[\s/>"'=]/;
2434
+ if ("value" in data || data.valueChange) skip = /^value(?:Change)?$|[\s/>"'=]/;
2429
2435
  break;
2430
2436
  case "option":
2431
- if (data.value) {
2437
+ if ("value" in data) {
2432
2438
  result += _attr_option_value(data.value);
2433
2439
  skip = /^value$|[\s/>"'=]/;
2434
2440
  }
@@ -2531,9 +2537,6 @@ function normalizedValueMatches(a, b) {
2531
2537
  function normalizeStrAttrValue(value) {
2532
2538
  return value && value !== true || value === 0 ? value + "" : "";
2533
2539
  }
2534
- function normalizeBoolAttrValue(value) {
2535
- if (value != null && value !== false) return true;
2536
- }
2537
2540
  //#endregion
2538
2541
  //#region src/html/dynamic-tag.ts
2539
2542
  const voidElementsReg = /^(?:area|b(?:ase|r)|col|embed|hr|i(?:mg|nput)|link|meta|param|source|track|wbr)$/;
@@ -842,9 +842,10 @@ function writeArrayBuffer(state, val) {
842
842
  }
843
843
  function writeTypedArray(state, val, ref) {
844
844
  if (val.byteOffset || state.refs.has(val.buffer)) {
845
+ const needsLength = val.byteOffset + val.byteLength < val.buffer.byteLength;
845
846
  state.buf.push("new " + val.constructor.name + "(");
846
847
  writeProp(state, val.buffer, ref, "buffer");
847
- state.buf.push(val.byteOffset ? "," + val.byteOffset + ")" : ")");
848
+ state.buf.push((val.byteOffset || needsLength ? "," + val.byteOffset + (needsLength ? "," + val.length : "") : "") + ")");
848
849
  } else {
849
850
  state.refs.set(val.buffer, new Reference(ref, "buffer", state.flush, null));
850
851
  state.buf.push("new " + val.constructor.name + (val.length === 0 ? "" : "(" + (hasOnlyZeros(val) ? val.length : typedArrayToInitString(val)) + ")"));
@@ -898,11 +899,12 @@ function writeFormData(state, val) {
898
899
  sep = ",";
899
900
  }
900
901
  if (sep === "[") state.buf.push("new FormData");
901
- else state.buf.push(valStr + "].reduce((f,v,i,a)=>i%2&&f.append(v,a[i+1])||f,new FormData)");
902
+ else state.buf.push(valStr + "].reduce((f,v,i,a)=>i%2&&f.append(a[i-1],v)||f,new FormData)");
902
903
  return true;
903
904
  }
904
905
  function writeRequest(state, val, ref) {
905
906
  let sep = "";
907
+ let bodySerialized = false;
906
908
  const hasBody = val.body && !val.bodyUsed && val.duplex === "half";
907
909
  state.buf.push("new Request(" + quote(val.url, 0));
908
910
  if (hasBody) {
@@ -910,6 +912,7 @@ function writeRequest(state, val, ref) {
910
912
  if (writeProp(state, val.body, ref, "body")) {
911
913
  state.buf.push(",duplex:\"half\"");
912
914
  sep = ",";
915
+ bodySerialized = true;
913
916
  } else state.buf.pop();
914
917
  }
915
918
  let options = "";
@@ -952,7 +955,7 @@ function writeRequest(state, val, ref) {
952
955
  sep = ",";
953
956
  }
954
957
  if (val.referrerPolicy) options += sep + "referrerPolicy:" + quote(val.referrerPolicy, 0);
955
- state.buf.push(hasBody ? options + "})" : options ? ",{" + options + "})" : ")");
958
+ state.buf.push(bodySerialized ? options + "})" : options ? ",{" + options + "})" : ")");
956
959
  return true;
957
960
  }
958
961
  function writeResponse(state, val, ref) {
@@ -1339,6 +1342,9 @@ function getEventHandlerName(name) {
1339
1342
  function isVoid(value) {
1340
1343
  return value == null || value === false;
1341
1344
  }
1345
+ function isNotVoid(value) {
1346
+ return value != null && value !== false;
1347
+ }
1342
1348
  function normalizeDynamicRenderer(value) {
1343
1349
  if (value) {
1344
1350
  if (typeof value === "string") return value;
@@ -2379,7 +2385,7 @@ function _attr_input_value(scopeId, nodeAccessor, value, valueChange) {
2379
2385
  }
2380
2386
  function _attr_input_checked(scopeId, nodeAccessor, checked, checkedChange) {
2381
2387
  if (checkedChange) writeControlledScope(0, scopeId, nodeAccessor, void 0, checkedChange);
2382
- return normalizeBoolAttrValue(checked) ? " checked" : "";
2388
+ return isNotVoid(checked) ? " checked" : "";
2383
2389
  }
2384
2390
  function _attr_input_checkedValue(scopeId, nodeAccessor, checkedValue, checkedValueChange, value) {
2385
2391
  const valueAttr = _attr("value", value);
@@ -2398,8 +2404,8 @@ function getCheckedValueRef(checkedValue) {
2398
2404
  }
2399
2405
  }
2400
2406
  function _attr_details_or_dialog_open(scopeId, nodeAccessor, open, openChange) {
2401
- const normalizedOpen = normalizeBoolAttrValue(open);
2402
- if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen, openChange);
2407
+ const normalizedOpen = isNotVoid(open);
2408
+ if (openChange) writeControlledScope(4, scopeId, nodeAccessor, normalizedOpen || void 0, openChange);
2403
2409
  return normalizedOpen ? " open" : "";
2404
2410
  }
2405
2411
  function _attr_nonce() {
@@ -2416,17 +2422,17 @@ function _attrs(data, nodeAccessor, scopeId, tagName) {
2416
2422
  case "input":
2417
2423
  assertExclusiveAttrs(data);
2418
2424
  if (data.checkedChange) result += _attr_input_checked(scopeId, nodeAccessor, data.checked, data.checkedChange);
2419
- else if (data.checkedValue || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2425
+ else if ("checkedValue" in data || data.checkedValueChange) result += _attr_input_checkedValue(scopeId, nodeAccessor, data.checkedValue, data.checkedValueChange, data.value);
2420
2426
  else if (data.valueChange) result += _attr_input_value(scopeId, nodeAccessor, data.value, data.valueChange);
2421
2427
  else break;
2422
2428
  skip = /^(?:value|checked(?:Value)?)(?:Change)?$|[\s/>"'=]/;
2423
2429
  break;
2424
2430
  case "select":
2425
2431
  case "textarea":
2426
- if (data.value || data.valueChange) skip = /^value(?:Change)?$|[\s/>"'=]/;
2432
+ if ("value" in data || data.valueChange) skip = /^value(?:Change)?$|[\s/>"'=]/;
2427
2433
  break;
2428
2434
  case "option":
2429
- if (data.value) {
2435
+ if ("value" in data) {
2430
2436
  result += _attr_option_value(data.value);
2431
2437
  skip = /^value$|[\s/>"'=]/;
2432
2438
  }
@@ -2529,9 +2535,6 @@ function normalizedValueMatches(a, b) {
2529
2535
  function normalizeStrAttrValue(value) {
2530
2536
  return value && value !== true || value === 0 ? value + "" : "";
2531
2537
  }
2532
- function normalizeBoolAttrValue(value) {
2533
- if (value != null && value !== false) return true;
2534
- }
2535
2538
  //#endregion
2536
2539
  //#region src/html/dynamic-tag.ts
2537
2540
  const voidElementsReg = /^(?:area|b(?:ase|r)|col|embed|hr|i(?:mg|nput)|link|meta|param|source|track|wbr)$/;
@@ -6,6 +6,8 @@ export type PendingRender = {
6
6
  [PendingRenderProp.Scope]: Scope;
7
7
  [PendingRenderProp.Signal]: Signal<any, any>;
8
8
  [PendingRenderProp.Value]: unknown;
9
+ [PendingRenderProp.Gen]: number;
10
+ [PendingRenderProp.Pending]?: 0 | 1;
9
11
  };
10
12
  export declare const caughtError: WeakSet<unknown[]>;
11
13
  export declare const placeholderShown: WeakSet<unknown[]>;