sibujs 3.2.2 → 3.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.
Files changed (60) hide show
  1. package/dist/browser.cjs +217 -27
  2. package/dist/browser.js +5 -5
  3. package/dist/build.cjs +236 -105
  4. package/dist/build.js +14 -14
  5. package/dist/cdn.global.js +7 -7
  6. package/dist/{chunk-5N74TKLD.js → chunk-37BUKSLH.js} +1 -1
  7. package/dist/{chunk-BGNLPNGV.js → chunk-4UUMSLSL.js} +4 -4
  8. package/dist/{chunk-2UPRY23K.js → chunk-5VGSK6D2.js} +1 -1
  9. package/dist/{chunk-OYLPZO4N.js → chunk-6LTFHJQG.js} +4 -4
  10. package/dist/{chunk-VOCE4NNK.js → chunk-AMIKDMLP.js} +5 -5
  11. package/dist/{chunk-LMLD24FC.js → chunk-COY6PUD2.js} +7 -1
  12. package/dist/{chunk-YFDGQWDA.js → chunk-F7FXQ3QS.js} +1 -1
  13. package/dist/{chunk-V2MTG5FT.js → chunk-IKLYI3RF.js} +33 -16
  14. package/dist/{chunk-HMJFCBRR.js → chunk-L3GAGWCC.js} +10 -1
  15. package/dist/{chunk-X67UYC74.js → chunk-LU2MQXQQ.js} +14 -24
  16. package/dist/{chunk-4JCAUOLN.js → chunk-M5KBNOSJ.js} +22 -12
  17. package/dist/{chunk-FDY42FIU.js → chunk-MHBCEJQO.js} +2 -2
  18. package/dist/{chunk-RLUJL2MV.js → chunk-NHKQKKZU.js} +6 -7
  19. package/dist/{chunk-HXMS4SNP.js → chunk-R3QEDXFS.js} +2 -2
  20. package/dist/{chunk-NPIEEKPT.js → chunk-RYMOSG5B.js} +6 -6
  21. package/dist/{chunk-H6PCHJZQ.js → chunk-SLMFA3ZZ.js} +11 -3
  22. package/dist/{chunk-Z2FWAE4B.js → chunk-TEFZT5PJ.js} +84 -16
  23. package/dist/{chunk-7XDYVJLE.js → chunk-ULLTNDRA.js} +6 -6
  24. package/dist/{chunk-GOUM4JCT.js → chunk-VOVVTOEA.js} +2 -2
  25. package/dist/{chunk-FOI23UJL.js → chunk-WL7BIR6O.js} +1 -1
  26. package/dist/{chunk-JYXOEYI4.js → chunk-WW6DAGGR.js} +5 -5
  27. package/dist/{chunk-C427DVQF.js → chunk-WZG2SZOT.js} +22 -5
  28. package/dist/{chunk-NFYWLRUO.js → chunk-XH2RTYEQ.js} +3 -3
  29. package/dist/{chunk-2C4E3HBM.js → chunk-Z37APKBV.js} +5 -5
  30. package/dist/{chunk-RDRSWYNP.js → chunk-ZUVLC7TM.js} +1 -1
  31. package/dist/data.cjs +168 -24
  32. package/dist/data.js +8 -8
  33. package/dist/devtools.cjs +252 -32
  34. package/dist/devtools.js +7 -7
  35. package/dist/ecosystem.cjs +205 -64
  36. package/dist/ecosystem.js +10 -10
  37. package/dist/extras.cjs +245 -112
  38. package/dist/extras.js +24 -24
  39. package/dist/index.cjs +236 -105
  40. package/dist/index.d.cts +72 -8
  41. package/dist/index.d.ts +72 -8
  42. package/dist/index.js +14 -14
  43. package/dist/motion.cjs +336 -14
  44. package/dist/motion.js +4 -4
  45. package/dist/patterns.cjs +168 -24
  46. package/dist/patterns.js +6 -6
  47. package/dist/performance.cjs +305 -32
  48. package/dist/performance.js +8 -8
  49. package/dist/plugins.cjs +268 -69
  50. package/dist/plugins.js +12 -12
  51. package/dist/{ssr-2QDQ27EV.js → ssr-6D67RAVB.js} +3 -3
  52. package/dist/ssr.cjs +205 -63
  53. package/dist/ssr.js +11 -11
  54. package/dist/testing.cjs +415 -12
  55. package/dist/testing.js +16 -10
  56. package/dist/ui.cjs +248 -36
  57. package/dist/ui.js +9 -9
  58. package/dist/widgets.cjs +176 -26
  59. package/dist/widgets.js +8 -8
  60. package/package.json +1 -1
package/dist/build.cjs CHANGED
@@ -1207,7 +1207,7 @@ __export(index_exports, {
1207
1207
  registerComponent: () => registerComponent,
1208
1208
  registerDisposer: () => registerDisposer,
1209
1209
  resolveComponent: () => resolveComponent,
1210
- retrack: () => retrack,
1210
+ retrack: () => retrack2,
1211
1211
  rp: () => rp,
1212
1212
  rt: () => rt,
1213
1213
  ruby: () => ruby,
@@ -1218,7 +1218,7 @@ __export(index_exports, {
1218
1218
  section: () => section,
1219
1219
  select: () => select,
1220
1220
  setGlobalErrorHandler: () => setGlobalErrorHandler,
1221
- setMaxDrainIterations: () => setMaxDrainIterations,
1221
+ setMaxDrainIterations: () => setMaxDrainIterations2,
1222
1222
  show: () => show,
1223
1223
  signal: () => signal,
1224
1224
  slot: () => slot,
@@ -1250,7 +1250,7 @@ __export(index_exports, {
1250
1250
  time: () => time,
1251
1251
  title: () => title,
1252
1252
  tr: () => tr,
1253
- track: () => track2,
1253
+ track: () => track3,
1254
1254
  transition: () => transition,
1255
1255
  trapFocus: () => trapFocus,
1256
1256
  trustHTML: () => trustHTML,
@@ -1258,7 +1258,7 @@ __export(index_exports, {
1258
1258
  u: () => u,
1259
1259
  ul: () => ul,
1260
1260
  unregisterComponent: () => unregisterComponent,
1261
- untracked: () => untracked,
1261
+ untracked: () => untracked2,
1262
1262
  use: () => use,
1263
1263
  var_: () => var_,
1264
1264
  video: () => video,
@@ -1270,7 +1270,13 @@ __export(index_exports, {
1270
1270
 
1271
1271
  // src/core/dev.ts
1272
1272
  function isDev() {
1273
- return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production";
1273
+ return typeof globalThis.__SIBU_DEV__ !== "undefined" ? !!globalThis.__SIBU_DEV__ : (
1274
+ // The bare `__SIBU_DEV__` is a bundler define that only exists in
1275
+ // production builds; under the test runner it is always undefined, so
1276
+ // this branch is unreachable here.
1277
+ /* v8 ignore next 2 */
1278
+ typeof __SIBU_DEV__ !== "undefined" ? __SIBU_DEV__ : typeof process !== "undefined" && process.env?.NODE_ENV !== "production"
1279
+ );
1274
1280
  }
1275
1281
  var _isDev = isDev();
1276
1282
  function devAssert(condition, message) {
@@ -1327,7 +1333,9 @@ function sanitizeSrcset(value) {
1327
1333
  }
1328
1334
  return out.join(", ");
1329
1335
  }
1336
+ var CSS_DANGER_GATE = /[(:@\\]/;
1330
1337
  function sanitizeCSSValue(value) {
1338
+ if (!CSS_DANGER_GATE.test(value)) return value;
1331
1339
  const decoded = value.replace(/\\([0-9a-fA-F]{1,6})\s?/g, (_m, hex) => {
1332
1340
  const code2 = Number.parseInt(hex, 16);
1333
1341
  if (!Number.isFinite(code2) || code2 < 0 || code2 > 1114111) return "";
@@ -1360,8 +1368,14 @@ var URL_ATTRIBUTES = /* @__PURE__ */ new Set([
1360
1368
  function isUrlAttribute(attr) {
1361
1369
  return URL_ATTRIBUTES.has(attr.toLowerCase());
1362
1370
  }
1371
+ function sanitizeAttributeString(attr, value) {
1372
+ const lower = attr.toLowerCase();
1373
+ if (lower === "srcset") return sanitizeSrcset(value);
1374
+ if (URL_ATTRIBUTES.has(lower)) return sanitizeUrl(value);
1375
+ return value;
1376
+ }
1363
1377
 
1364
- // src/reactivity/track.ts
1378
+ // src/reactivity/track-core.ts
1365
1379
  var _isDev2 = isDev();
1366
1380
  var POOL_MAX = 4096;
1367
1381
  var nodePool = [];
@@ -1475,6 +1489,9 @@ function resumeTracking() {
1475
1489
  trackingSuspended = false;
1476
1490
  }
1477
1491
  }
1492
+ function isTrackingSuspended() {
1493
+ return trackingSuspended;
1494
+ }
1478
1495
  function untracked(fn) {
1479
1496
  suspendTracking();
1480
1497
  try {
@@ -1592,6 +1609,11 @@ function cleanup(subscriber) {
1592
1609
  var maxSubscriberRepeats = 50;
1593
1610
  var maxDrainIterations = 1e6;
1594
1611
  var drainEpoch = 0;
1612
+ function setMaxSubscriberRepeats(n) {
1613
+ const prev = maxSubscriberRepeats;
1614
+ if (Number.isFinite(n) && n > 0) maxSubscriberRepeats = Math.floor(n);
1615
+ return prev;
1616
+ }
1595
1617
  function setMaxDrainIterations(n) {
1596
1618
  const prev = maxDrainIterations;
1597
1619
  if (Number.isFinite(n) && n > 0) maxDrainIterations = Math.floor(n);
@@ -1745,15 +1767,94 @@ function notifySubscribers(signal2) {
1745
1767
  }
1746
1768
  }
1747
1769
  }
1770
+ function getSubscriberCount(signal2) {
1771
+ return signal2.__sc ?? 0;
1772
+ }
1773
+ function getSubscriberDeps(subscriber) {
1774
+ const sub2 = subscriber;
1775
+ const out = [];
1776
+ let node = sub2.depsHead ?? null;
1777
+ while (node) {
1778
+ if (node.sig) out.push(node.sig);
1779
+ node = node.subNext;
1780
+ }
1781
+ return out;
1782
+ }
1783
+ function forEachSubscriber(signal2, visit) {
1784
+ let node = signal2.subsHead ?? null;
1785
+ while (node) {
1786
+ const s2 = node.sub;
1787
+ if (s2) visit(s2);
1788
+ node = node.sigNext;
1789
+ }
1790
+ }
1748
1791
 
1749
- // src/reactivity/bindAttribute.ts
1792
+ // src/reactivity/track.ts
1750
1793
  var _isDev3 = isDev();
1794
+ var _runtimeVersion = typeof __SIBU_VERSION__ !== "undefined" ? __SIBU_VERSION__ : "dev";
1795
+ var REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.v1");
1796
+ function resolveReactiveApi() {
1797
+ const g2 = globalThis;
1798
+ const existing = g2[REGISTRY_KEY];
1799
+ if (existing) {
1800
+ if (_isDev3 && !existing.__dupWarned) {
1801
+ existing.__dupWarned = true;
1802
+ devWarn(
1803
+ `Multiple instances of the reactive runtime detected on this page (active: ${existing.version}, duplicate: ${_runtimeVersion}). Reactivity still works \u2014 all copies share the first one \u2014 but de-duplicate sibujs in your bundler (e.g. Vite optimizeDeps.exclude: ['sibujs'] or resolve.dedupe: ['sibujs']).`
1804
+ );
1805
+ }
1806
+ return existing;
1807
+ }
1808
+ const local = {
1809
+ suspendTracking,
1810
+ resumeTracking,
1811
+ isTrackingSuspended,
1812
+ untracked,
1813
+ retrack,
1814
+ track,
1815
+ reactiveBinding,
1816
+ recordDependency,
1817
+ cleanup,
1818
+ setMaxSubscriberRepeats,
1819
+ setMaxDrainIterations,
1820
+ drainNotificationQueue,
1821
+ queueSignalNotification,
1822
+ notifySubscribers,
1823
+ getSubscriberCount,
1824
+ getSubscriberDeps,
1825
+ forEachSubscriber,
1826
+ version: _runtimeVersion
1827
+ };
1828
+ g2[REGISTRY_KEY] = local;
1829
+ return local;
1830
+ }
1831
+ var API = resolveReactiveApi();
1832
+ var suspendTracking2 = API.suspendTracking;
1833
+ var resumeTracking2 = API.resumeTracking;
1834
+ var isTrackingSuspended2 = API.isTrackingSuspended;
1835
+ var untracked2 = API.untracked;
1836
+ var retrack2 = API.retrack;
1837
+ var track2 = API.track;
1838
+ var reactiveBinding2 = API.reactiveBinding;
1839
+ var recordDependency2 = API.recordDependency;
1840
+ var cleanup2 = API.cleanup;
1841
+ var setMaxSubscriberRepeats2 = API.setMaxSubscriberRepeats;
1842
+ var setMaxDrainIterations2 = API.setMaxDrainIterations;
1843
+ var drainNotificationQueue2 = API.drainNotificationQueue;
1844
+ var queueSignalNotification2 = API.queueSignalNotification;
1845
+ var notifySubscribers2 = API.notifySubscribers;
1846
+ var getSubscriberCount2 = API.getSubscriberCount;
1847
+ var getSubscriberDeps2 = API.getSubscriberDeps;
1848
+ var forEachSubscriber2 = API.forEachSubscriber;
1849
+
1850
+ // src/reactivity/bindAttribute.ts
1851
+ var _isDev4 = isDev();
1751
1852
  function setProp(el, key, val) {
1752
1853
  el[key] = val;
1753
1854
  }
1754
1855
  function bindAttribute(el, attr, getter) {
1755
1856
  if (isEventHandlerAttr(attr)) {
1756
- if (_isDev3)
1857
+ if (_isDev4)
1757
1858
  devWarn(
1758
1859
  `bindAttribute: refusing to bind event-handler attribute "${attr}". Use on:{ ${attr.slice(2)}: fn } instead.`
1759
1860
  );
@@ -1765,7 +1866,7 @@ function bindAttribute(el, attr, getter) {
1765
1866
  try {
1766
1867
  value = getter();
1767
1868
  } catch (err) {
1768
- if (_isDev3)
1869
+ if (_isDev4)
1769
1870
  devWarn(`bindAttribute: getter for "${attr}" threw: ${err instanceof Error ? err.message : String(err)}`);
1770
1871
  return;
1771
1872
  }
@@ -1783,10 +1884,10 @@ function bindAttribute(el, attr, getter) {
1783
1884
  if ((attr === "value" || attr === "checked") && attr in el) {
1784
1885
  setProp(el, attr, attr === "checked" ? Boolean(value) : str);
1785
1886
  } else {
1786
- el.setAttribute(attr, isUrlAttribute(attr) ? sanitizeUrl(str) : str);
1887
+ el.setAttribute(attr, sanitizeAttributeString(attr, str));
1787
1888
  }
1788
1889
  }
1789
- return reactiveBinding(commit);
1890
+ return reactiveBinding2(commit);
1790
1891
  }
1791
1892
  function bindDynamic(el, nameGetter, valueGetter) {
1792
1893
  let prevName = null;
@@ -1795,14 +1896,14 @@ function bindDynamic(el, nameGetter, valueGetter) {
1795
1896
  try {
1796
1897
  name = typeof nameGetter === "function" ? nameGetter() : nameGetter;
1797
1898
  } catch (err) {
1798
- if (_isDev3) devWarn(`bindDynamic: name getter threw: ${err instanceof Error ? err.message : String(err)}`);
1899
+ if (_isDev4) devWarn(`bindDynamic: name getter threw: ${err instanceof Error ? err.message : String(err)}`);
1799
1900
  return;
1800
1901
  }
1801
1902
  let value;
1802
1903
  try {
1803
1904
  value = typeof valueGetter === "function" ? valueGetter() : valueGetter;
1804
1905
  } catch (err) {
1805
- if (_isDev3) devWarn(`bindDynamic: value getter threw: ${err instanceof Error ? err.message : String(err)}`);
1906
+ if (_isDev4) devWarn(`bindDynamic: value getter threw: ${err instanceof Error ? err.message : String(err)}`);
1806
1907
  return;
1807
1908
  }
1808
1909
  if (isEventHandlerAttr(name)) return;
@@ -1813,11 +1914,11 @@ function bindDynamic(el, nameGetter, valueGetter) {
1813
1914
  if ((name === "value" || name === "checked") && name in el) {
1814
1915
  setProp(el, name, name === "checked" ? Boolean(value) : str);
1815
1916
  } else {
1816
- el.setAttribute(name, isUrlAttribute(name) ? sanitizeUrl(str) : str);
1917
+ el.setAttribute(name, sanitizeAttributeString(name, str));
1817
1918
  }
1818
1919
  prevName = name;
1819
1920
  }
1820
- const teardown = reactiveBinding(commit);
1921
+ const teardown = reactiveBinding2(commit);
1821
1922
  return () => {
1822
1923
  teardown();
1823
1924
  if (prevName !== null) {
@@ -1828,7 +1929,7 @@ function bindDynamic(el, nameGetter, valueGetter) {
1828
1929
 
1829
1930
  // src/core/rendering/dispose.ts
1830
1931
  var elementDisposers = /* @__PURE__ */ new WeakMap();
1831
- var _isDev4 = isDev();
1932
+ var _isDev5 = isDev();
1832
1933
  var activeBindingCount = 0;
1833
1934
  function registerDisposer(node, teardown) {
1834
1935
  let disposers = elementDisposers.get(node);
@@ -1837,7 +1938,7 @@ function registerDisposer(node, teardown) {
1837
1938
  elementDisposers.set(node, disposers);
1838
1939
  }
1839
1940
  disposers.push(teardown);
1840
- if (_isDev4) activeBindingCount++;
1941
+ if (_isDev5) activeBindingCount++;
1841
1942
  }
1842
1943
  function dispose(node) {
1843
1944
  const stack = [node];
@@ -1856,12 +1957,12 @@ function dispose(node) {
1856
1957
  if (disposers) {
1857
1958
  const snapshot = disposers.slice();
1858
1959
  elementDisposers.delete(current);
1859
- if (_isDev4) activeBindingCount -= snapshot.length;
1960
+ if (_isDev5) activeBindingCount -= snapshot.length;
1860
1961
  for (const d of snapshot) {
1861
1962
  try {
1862
1963
  d();
1863
1964
  } catch (err) {
1864
- if (_isDev4 && typeof console !== "undefined") {
1965
+ if (_isDev5 && typeof console !== "undefined") {
1865
1966
  console.warn("[SibuJS] Disposer threw during cleanup:", err);
1866
1967
  }
1867
1968
  }
@@ -1872,12 +1973,12 @@ function dispose(node) {
1872
1973
  if (!added || added.length === 0) break;
1873
1974
  const moreSnapshot = added.slice();
1874
1975
  elementDisposers.delete(current);
1875
- if (_isDev4) activeBindingCount -= moreSnapshot.length;
1976
+ if (_isDev5) activeBindingCount -= moreSnapshot.length;
1876
1977
  for (const d of moreSnapshot) {
1877
1978
  try {
1878
1979
  d();
1879
1980
  } catch (err) {
1880
- if (_isDev4 && typeof console !== "undefined") {
1981
+ if (_isDev5 && typeof console !== "undefined") {
1881
1982
  console.warn("[SibuJS] Disposer threw during cleanup:", err);
1882
1983
  }
1883
1984
  }
@@ -1887,7 +1988,7 @@ function dispose(node) {
1887
1988
  }
1888
1989
  }
1889
1990
  function checkLeaks(warnThreshold = 0) {
1890
- if (!_isDev4) return 0;
1991
+ if (!_isDev5) return 0;
1891
1992
  if (warnThreshold > 0 && activeBindingCount > warnThreshold) {
1892
1993
  devWarn(
1893
1994
  `checkLeaks: ${activeBindingCount} active DOM bindings detected. Expected \u2264${warnThreshold}. This may indicate a component was removed from the DOM without calling dispose().`
@@ -1897,7 +1998,7 @@ function checkLeaks(warnThreshold = 0) {
1897
1998
  }
1898
1999
 
1899
2000
  // src/reactivity/bindChildNode.ts
1900
- var _isDev5 = isDev();
2001
+ var _isDev6 = isDev();
1901
2002
  function bindChildNode(placeholder, getter) {
1902
2003
  let lastNodes = [];
1903
2004
  function commit() {
@@ -1905,7 +2006,7 @@ function bindChildNode(placeholder, getter) {
1905
2006
  try {
1906
2007
  result = getter();
1907
2008
  } catch (err) {
1908
- if (_isDev5) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
2009
+ if (_isDev6) devWarn(`bindChildNode: getter threw: ${err instanceof Error ? err.message : String(err)}`);
1909
2010
  return;
1910
2011
  }
1911
2012
  if (result == null || typeof result === "boolean") {
@@ -1931,7 +2032,7 @@ function bindChildNode(placeholder, getter) {
1931
2032
  if (item == null || typeof item === "boolean") continue;
1932
2033
  const node = item instanceof Node ? item : document.createTextNode(String(item));
1933
2034
  if (seen.has(node)) {
1934
- if (_isDev5)
2035
+ if (_isDev6)
1935
2036
  devWarn("bindChildNode: duplicate node reference in array \u2014 only the first occurrence is rendered.");
1936
2037
  continue;
1937
2038
  }
@@ -1966,18 +2067,15 @@ function bindChildNode(placeholder, getter) {
1966
2067
  }
1967
2068
  lastNodes = newNodes;
1968
2069
  }
1969
- return reactiveBinding(commit);
2070
+ return reactiveBinding2(commit);
1970
2071
  }
1971
2072
 
1972
2073
  // src/core/rendering/tagFactory.ts
1973
2074
  var SVG_NS = "http://www.w3.org/2000/svg";
1974
- var _isDev6 = isDev();
2075
+ var _isDev7 = isDev();
1975
2076
  var BLOCKED_TAGS = /* @__PURE__ */ new Set(["script", "iframe", "object", "embed", "frame", "frameset"]);
1976
- function validateTagName(tag) {
1977
- const lower = tag.toLowerCase();
1978
- if (BLOCKED_TAGS.has(lower)) {
1979
- throw new Error(`tagFactory: refusing to create <${tag}> \u2014 tag is blocked for security reasons.`);
1980
- }
2077
+ function isBlockedTag(tag) {
2078
+ return BLOCKED_TAGS.has(tag.toLowerCase());
1981
2079
  }
1982
2080
  var CLOBBER_RISKY_IDS = /* @__PURE__ */ new Set([
1983
2081
  "config",
@@ -2017,7 +2115,7 @@ function toKebab(prop) {
2017
2115
  }
2018
2116
  function applyStyle(el, style2) {
2019
2117
  if (typeof style2 === "function") {
2020
- const teardown = track(() => {
2118
+ const teardown = track2(() => {
2021
2119
  el.setAttribute("style", style2());
2022
2120
  });
2023
2121
  registerDisposer(el, teardown);
@@ -2033,7 +2131,7 @@ function applyStyle(el, style2) {
2033
2131
  const name = toKebab(prop);
2034
2132
  if (typeof val === "function") {
2035
2133
  const getter = val;
2036
- const teardown = track(() => {
2134
+ const teardown = track2(() => {
2037
2135
  htmlEl.style.setProperty(name, sanitizeCSSValue(String(getter())));
2038
2136
  });
2039
2137
  registerDisposer(el, teardown);
@@ -2048,7 +2146,7 @@ function applyClass(el, cls) {
2048
2146
  return;
2049
2147
  }
2050
2148
  if (typeof cls === "function") {
2051
- const teardown = track(() => {
2149
+ const teardown = track2(() => {
2052
2150
  el.setAttribute("class", cls());
2053
2151
  });
2054
2152
  registerDisposer(el, teardown);
@@ -2075,7 +2173,7 @@ function applyClass(el, cls) {
2075
2173
  }
2076
2174
  el.setAttribute("class", r);
2077
2175
  };
2078
- const teardown = track(update);
2176
+ const teardown = track2(update);
2079
2177
  registerDisposer(el, teardown);
2080
2178
  } else {
2081
2179
  el.setAttribute("class", result);
@@ -2132,8 +2230,11 @@ function appendChildren(el, nodes) {
2132
2230
  }
2133
2231
  }
2134
2232
  var tagFactory = (tag, ns) => {
2233
+ const blocked = isBlockedTag(tag);
2135
2234
  return (first, second) => {
2136
- validateTagName(tag);
2235
+ if (blocked) {
2236
+ throw new Error(`tagFactory: refusing to create <${tag}> \u2014 tag is blocked for security reasons.`);
2237
+ }
2137
2238
  const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);
2138
2239
  if (first === void 0) return el;
2139
2240
  if (typeof first === "string") {
@@ -2142,7 +2243,7 @@ var tagFactory = (tag, ns) => {
2142
2243
  appendChildren(el, second);
2143
2244
  return el;
2144
2245
  }
2145
- if (_isDev6 && looksLikeClassList(first)) {
2246
+ if (_isDev7 && looksLikeClassList(first)) {
2146
2247
  devWarn(
2147
2248
  `tagFactory: lone string "${first}" looks like a class list but is being rendered as TEXT. For a class, use ${tag}({ class: "${first}" }) \u2014 or ${tag}("${first}", children) to set the class AND add children.`
2148
2249
  );
@@ -2163,7 +2264,7 @@ var tagFactory = (tag, ns) => {
2163
2264
  if (pClass != null) applyClass(el, pClass);
2164
2265
  const pId = props.id;
2165
2266
  if (pId != null) {
2166
- if (_isDev6 && typeof pId === "string" && CLOBBER_RISKY_IDS.has(pId.toLowerCase())) {
2267
+ if (_isDev7 && typeof pId === "string" && CLOBBER_RISKY_IDS.has(pId.toLowerCase())) {
2167
2268
  devWarn(
2168
2269
  `tagFactory: element id="${pId}" matches a common global and may cause DOM clobbering. Avoid setting ids from untrusted input.`
2169
2270
  );
@@ -2178,7 +2279,7 @@ var tagFactory = (tag, ns) => {
2178
2279
  const handler = pOn[ev];
2179
2280
  if (typeof handler === "function") {
2180
2281
  el.addEventListener(ev, handler);
2181
- } else if (_isDev6) {
2282
+ } else if (_isDev7) {
2182
2283
  devWarn(
2183
2284
  `tagFactory: on.${ev} handler is not a function (got ${typeof handler}). Event listener was not attached.`
2184
2285
  );
@@ -2203,7 +2304,6 @@ var tagFactory = (tag, ns) => {
2203
2304
  default: {
2204
2305
  const value = props[key];
2205
2306
  if (value == null) continue;
2206
- const lkey = key.toLowerCase();
2207
2307
  if (isEventHandlerAttr(key)) continue;
2208
2308
  if (typeof value === "function") {
2209
2309
  registerDisposer(el, bindAttribute(el, key, value));
@@ -2216,14 +2316,7 @@ var tagFactory = (tag, ns) => {
2216
2316
  el.removeAttribute(key);
2217
2317
  }
2218
2318
  } else {
2219
- const str = String(value);
2220
- if (lkey === "srcset") {
2221
- el.setAttribute(key, sanitizeSrcset(str));
2222
- } else if (isUrlAttribute(lkey)) {
2223
- el.setAttribute(key, sanitizeUrl(str));
2224
- } else {
2225
- el.setAttribute(key, str);
2226
- }
2319
+ el.setAttribute(key, sanitizeAttributeString(key, String(value)));
2227
2320
  }
2228
2321
  }
2229
2322
  }
@@ -2299,7 +2392,7 @@ var area = tagFactory("area");
2299
2392
  var audio = tagFactory("audio");
2300
2393
  var img = tagFactory("img");
2301
2394
  var map = tagFactory("map");
2302
- var track2 = tagFactory("track");
2395
+ var track3 = tagFactory("track");
2303
2396
  var video = tagFactory("video");
2304
2397
  var embed = tagFactory("embed");
2305
2398
  var iframe = tagFactory("iframe");
@@ -2375,7 +2468,7 @@ var marquee = tagFactory("marquee");
2375
2468
  var customElement = (tagName) => tagFactory(tagName);
2376
2469
 
2377
2470
  // src/core/rendering/htm.ts
2378
- var _isDev7 = isDev();
2471
+ var _isDev8 = isDev();
2379
2472
  var RAW_TEXT_TAGS = /* @__PURE__ */ new Set(["script", "style"]);
2380
2473
  var VOID_ELEMENTS3 = /* @__PURE__ */ new Set([
2381
2474
  "area",
@@ -2671,7 +2764,7 @@ function executeElement(tmpl, values) {
2671
2764
  const fn = values[attr.idx];
2672
2765
  if (typeof fn === "function") {
2673
2766
  el.addEventListener(attr.name, fn);
2674
- } else if (_isDev7) {
2767
+ } else if (_isDev8) {
2675
2768
  devWarn(
2676
2769
  `html: on:${attr.name} handler is not a function (got ${typeof fn}). Event listener was not attached.`
2677
2770
  );
@@ -2799,7 +2892,7 @@ function mount(component, container) {
2799
2892
  }
2800
2893
 
2801
2894
  // src/core/rendering/each.ts
2802
- var _isDev8 = isDev();
2895
+ var _isDev9 = isDev();
2803
2896
  function resolveNodeChild(child) {
2804
2897
  if (typeof child === "function") {
2805
2898
  return resolveNodeChild(child());
@@ -2884,7 +2977,7 @@ function each(getArray, render, options) {
2884
2977
  workMap.clear();
2885
2978
  keyIndexMap.clear();
2886
2979
  for (let i2 = 0; i2 < newLen; i2++) {
2887
- if (_isDev8 && keyIndexMap.has(newKeys[i2])) {
2980
+ if (_isDev9 && keyIndexMap.has(newKeys[i2])) {
2888
2981
  devWarn(
2889
2982
  `each: duplicate key "${String(newKeys[i2])}" at index ${i2} (first seen at ${keyIndexMap.get(newKeys[i2])}). Keys must be unique \u2014 duplicates cause rows to be dropped or mis-ordered.`
2890
2983
  );
@@ -2899,12 +2992,12 @@ function each(getArray, render, options) {
2899
2992
  node = existing;
2900
2993
  } else {
2901
2994
  const itemKey = key;
2902
- const itemGetter = () => untracked(() => getArray()[keyIndexMap.get(itemKey)]);
2995
+ const itemGetter = () => untracked2(() => getArray()[keyIndexMap.get(itemKey)]);
2903
2996
  const indexGetter = () => keyIndexMap.get(itemKey);
2904
2997
  try {
2905
2998
  node = resolveNodeChild(render(itemGetter, indexGetter));
2906
2999
  } catch (err) {
2907
- if (_isDev8) {
3000
+ if (_isDev9) {
2908
3001
  devWarn(
2909
3002
  `each: render threw for item at index ${i2} (key="${newKeys[i2]}"): ${err instanceof Error ? err.message : String(err)}`
2910
3003
  );
@@ -2918,7 +3011,7 @@ function each(getArray, render, options) {
2918
3011
  target.dispatchEvent(
2919
3012
  new CustomEvent("sibu:error-propagate", { bubbles: true, detail: { error: errorObj } })
2920
3013
  );
2921
- } else if (_isDev8) {
3014
+ } else if (_isDev9) {
2922
3015
  devWarn(`each: error not surfaced \u2014 anchor detached: ${errorObj.message}`);
2923
3016
  }
2924
3017
  } catch {
@@ -2992,7 +3085,7 @@ function each(getArray, render, options) {
2992
3085
  workMap = tmp;
2993
3086
  initialized = true;
2994
3087
  };
2995
- const untrack = track(update);
3088
+ const untrack = track2(update);
2996
3089
  registerDisposer(anchor, untrack);
2997
3090
  if (!initialized) {
2998
3091
  queueMicrotask(() => {
@@ -3105,7 +3198,7 @@ function DynamicComponent(is) {
3105
3198
  }
3106
3199
  container.replaceChildren(el);
3107
3200
  }
3108
- const untrack = track(render);
3201
+ const untrack = track2(render);
3109
3202
  registerDisposer(container, untrack);
3110
3203
  return container;
3111
3204
  }
@@ -3120,7 +3213,7 @@ function show(condition, element) {
3120
3213
  const update = () => {
3121
3214
  element.style.display = condition() ? "" : "none";
3122
3215
  };
3123
- registerDisposer(element, track(update));
3216
+ registerDisposer(element, track2(update));
3124
3217
  return element;
3125
3218
  }
3126
3219
  function when(condition, thenBranch, elseBranch) {
@@ -3147,7 +3240,7 @@ function when(condition, thenBranch, elseBranch) {
3147
3240
  }
3148
3241
  initialized = true;
3149
3242
  };
3150
- registerDisposer(anchor, track(update));
3243
+ registerDisposer(anchor, track2(update));
3151
3244
  if (!initialized) {
3152
3245
  queueMicrotask(() => {
3153
3246
  if (!initialized && anchor.parentNode) update();
@@ -3182,7 +3275,7 @@ function match(value, cases, fallback) {
3182
3275
  }
3183
3276
  initialized = true;
3184
3277
  };
3185
- registerDisposer(anchor, track(update));
3278
+ registerDisposer(anchor, track2(update));
3186
3279
  if (!initialized) {
3187
3280
  queueMicrotask(() => {
3188
3281
  if (!initialized && anchor.parentNode) update();
@@ -3251,7 +3344,7 @@ function KeepAlive(activeKey, cases, options) {
3251
3344
  currentNode = node;
3252
3345
  initialized = true;
3253
3346
  };
3254
- const untrack = track(update);
3347
+ const untrack = track2(update);
3255
3348
  if (!initialized) {
3256
3349
  queueMicrotask(() => {
3257
3350
  if (!initialized && anchor.parentNode) update();
@@ -3273,9 +3366,9 @@ function KeepAlive(activeKey, cases, options) {
3273
3366
 
3274
3367
  // src/core/rendering/action.ts
3275
3368
  function action(element, actionFn, param2) {
3276
- const cleanup2 = actionFn(element, param2);
3277
- if (typeof cleanup2 === "function") {
3278
- registerDisposer(element, cleanup2);
3369
+ const cleanup3 = actionFn(element, param2);
3370
+ if (typeof cleanup3 === "function") {
3371
+ registerDisposer(element, cleanup3);
3279
3372
  }
3280
3373
  }
3281
3374
  var clickOutside = (element, callback) => {
@@ -3409,7 +3502,7 @@ function __resetIdCounter() {
3409
3502
  // src/reactivity/batch.ts
3410
3503
  var batchDepth = 0;
3411
3504
  var pendingSignals = /* @__PURE__ */ new Set();
3412
- function batch(fn) {
3505
+ function batchImpl(fn) {
3413
3506
  batchDepth++;
3414
3507
  try {
3415
3508
  return fn();
@@ -3420,28 +3513,45 @@ function batch(fn) {
3420
3513
  }
3421
3514
  }
3422
3515
  }
3423
- function enqueueBatchedSignal(signal2) {
3516
+ function enqueueBatchedSignalImpl(signal2) {
3424
3517
  if (batchDepth === 0) return false;
3425
3518
  pendingSignals.add(signal2);
3426
3519
  return true;
3427
3520
  }
3428
- function isBatching() {
3521
+ function isBatchingImpl() {
3429
3522
  return batchDepth > 0;
3430
3523
  }
3431
3524
  function flushBatch() {
3432
3525
  try {
3433
3526
  for (const signal2 of pendingSignals) {
3434
- queueSignalNotification(signal2);
3527
+ queueSignalNotification2(signal2);
3435
3528
  }
3436
3529
  } finally {
3437
3530
  pendingSignals.clear();
3438
3531
  }
3439
- drainNotificationQueue();
3532
+ drainNotificationQueue2();
3440
3533
  }
3534
+ var BATCH_REGISTRY_KEY = /* @__PURE__ */ Symbol.for("sibujs.reactive.batch.v1");
3535
+ function resolveBatchApi() {
3536
+ const g2 = globalThis;
3537
+ const existing = g2[BATCH_REGISTRY_KEY];
3538
+ if (existing) return existing;
3539
+ const local = {
3540
+ batch: batchImpl,
3541
+ enqueueBatchedSignal: enqueueBatchedSignalImpl,
3542
+ isBatching: isBatchingImpl
3543
+ };
3544
+ g2[BATCH_REGISTRY_KEY] = local;
3545
+ return local;
3546
+ }
3547
+ var API2 = resolveBatchApi();
3548
+ var batch = API2.batch;
3549
+ var enqueueBatchedSignal = API2.enqueueBatchedSignal;
3550
+ var isBatching = API2.isBatching;
3441
3551
 
3442
3552
  // src/core/signals/signal.ts
3443
3553
  var _g = globalThis;
3444
- var _isDev9 = isDev();
3554
+ var _isDev10 = isDev();
3445
3555
  function signal(initial, options) {
3446
3556
  const state = {
3447
3557
  value: initial,
@@ -3452,11 +3562,11 @@ function signal(initial, options) {
3452
3562
  __activeNode: null,
3453
3563
  __name: void 0
3454
3564
  };
3455
- const debugName = _isDev9 ? options?.name : void 0;
3565
+ const debugName = _isDev10 ? options?.name : void 0;
3456
3566
  const equalsFn = options?.equals;
3457
3567
  if (debugName) state.__name = debugName;
3458
3568
  function get() {
3459
- recordDependency(state);
3569
+ recordDependency2(state);
3460
3570
  return state.value;
3461
3571
  }
3462
3572
  get.__signal = state;
@@ -3469,15 +3579,15 @@ function signal(initial, options) {
3469
3579
  if (equalsFn(prev, newValue)) return;
3470
3580
  state.value = newValue;
3471
3581
  state.__v++;
3472
- if (_isDev9) {
3582
+ if (_isDev10) {
3473
3583
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3474
3584
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
3475
3585
  }
3476
3586
  if (!enqueueBatchedSignal(state)) {
3477
- notifySubscribers(state);
3587
+ notifySubscribers2(state);
3478
3588
  }
3479
3589
  };
3480
- } else if (_isDev9) {
3590
+ } else if (_isDev10) {
3481
3591
  set = (next) => {
3482
3592
  const prev = state.value;
3483
3593
  const newValue = typeof next === "function" ? next(prev) : next;
@@ -3487,7 +3597,7 @@ function signal(initial, options) {
3487
3597
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3488
3598
  if (hook) hook.emit("signal:update", { signal: state, name: debugName, oldValue: prev, newValue });
3489
3599
  if (!enqueueBatchedSignal(state)) {
3490
- notifySubscribers(state);
3600
+ notifySubscribers2(state);
3491
3601
  }
3492
3602
  };
3493
3603
  } else {
@@ -3498,11 +3608,11 @@ function signal(initial, options) {
3498
3608
  state.value = newValue;
3499
3609
  state.__v++;
3500
3610
  if (!enqueueBatchedSignal(state)) {
3501
- notifySubscribers(state);
3611
+ notifySubscribers2(state);
3502
3612
  }
3503
3613
  };
3504
3614
  }
3505
- if (_isDev9) {
3615
+ if (_isDev10) {
3506
3616
  const hook = _g.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
3507
3617
  if (hook) hook.emit("signal:create", { signal: state, name: debugName, getter: get, initial });
3508
3618
  }
@@ -3591,11 +3701,11 @@ function on(deps, handler) {
3591
3701
  if (first) {
3592
3702
  first = false;
3593
3703
  prev = value;
3594
- untracked(() => handler(value, void 0));
3704
+ untracked2(() => handler(value, void 0));
3595
3705
  } else {
3596
3706
  const p2 = prev;
3597
3707
  prev = value;
3598
- untracked(() => handler(value, p2));
3708
+ untracked2(() => handler(value, p2));
3599
3709
  }
3600
3710
  };
3601
3711
  }
@@ -3617,7 +3727,7 @@ function drainReruns(ctx) {
3617
3727
  do {
3618
3728
  ctx.rerunPending = false;
3619
3729
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
3620
- retrack(ctx.bodyFn, ctx.subscriber);
3730
+ retrack2(ctx.bodyFn, ctx.subscriber);
3621
3731
  } while (ctx.rerunPending && ++reruns <= MAX_RERUNS);
3622
3732
  if (ctx.rerunPending) {
3623
3733
  ctx.rerunPending = false;
@@ -3646,7 +3756,7 @@ function disposeEffect(ctx) {
3646
3756
  }
3647
3757
  }
3648
3758
  try {
3649
- cleanup(ctx.subscriber);
3759
+ cleanup2(ctx.subscriber);
3650
3760
  } catch (err) {
3651
3761
  if (typeof console !== "undefined") {
3652
3762
  console.warn("[SibuJS effect] dispose threw:", err);
@@ -3691,7 +3801,7 @@ function effect(effectFn, options) {
3691
3801
  try {
3692
3802
  ctx.rerunPending = false;
3693
3803
  if (ctx.userCleanups.length > 0) flushUserCleanups(ctx);
3694
- retrack(ctx.bodyFn, sub2);
3804
+ retrack2(ctx.bodyFn, sub2);
3695
3805
  if (ctx.rerunPending) drainReruns(ctx);
3696
3806
  } finally {
3697
3807
  ctx.running = false;
@@ -3707,7 +3817,7 @@ function effect(effectFn, options) {
3707
3817
  ctx.subscriber = sub2;
3708
3818
  ctx.running = true;
3709
3819
  try {
3710
- retrack(ctx.bodyFn, ctx.subscriber);
3820
+ retrack2(ctx.bodyFn, ctx.subscriber);
3711
3821
  if (ctx.rerunPending) drainReruns(ctx);
3712
3822
  } finally {
3713
3823
  ctx.running = false;
@@ -3740,7 +3850,7 @@ function derived(getter, options) {
3740
3850
  cs._d = false;
3741
3851
  cs._init = true;
3742
3852
  };
3743
- track(() => {
3853
+ track2(() => {
3744
3854
  let threw = true;
3745
3855
  try {
3746
3856
  cs._v = getter();
@@ -3759,12 +3869,12 @@ function derived(getter, options) {
3759
3869
  `[SibuJS] Circular dependency detected in derived${debugName ? ` "${debugName}"` : ""}. A derived signal cannot read itself (directly or through a chain).`
3760
3870
  );
3761
3871
  }
3762
- if (trackingSuspended) {
3872
+ if (isTrackingSuspended2()) {
3763
3873
  if (cs._d) {
3764
3874
  const prev = cs._v;
3765
3875
  evaluating = true;
3766
3876
  try {
3767
- retrack(recompute, markDirty);
3877
+ retrack2(recompute, markDirty);
3768
3878
  if (!Object.is(prev, cs._v)) cs.__v++;
3769
3879
  } finally {
3770
3880
  evaluating = false;
@@ -3772,12 +3882,12 @@ function derived(getter, options) {
3772
3882
  }
3773
3883
  return cs._v;
3774
3884
  }
3775
- recordDependency(cs);
3885
+ recordDependency2(cs);
3776
3886
  if (cs._d) {
3777
3887
  const oldValue = cs._v;
3778
3888
  evaluating = true;
3779
3889
  try {
3780
- retrack(recompute, markDirty);
3890
+ retrack2(recompute, markDirty);
3781
3891
  if (!Object.is(oldValue, cs._v)) cs.__v++;
3782
3892
  } finally {
3783
3893
  evaluating = false;
@@ -3813,11 +3923,17 @@ function watch(getter, callback) {
3813
3923
  return;
3814
3924
  }
3815
3925
  if (!Object.is(newValue, oldValue)) {
3816
- callback(newValue, oldValue);
3926
+ const prev = oldValue;
3817
3927
  oldValue = newValue;
3928
+ suspendTracking2();
3929
+ try {
3930
+ callback(newValue, prev);
3931
+ } finally {
3932
+ resumeTracking2();
3933
+ }
3818
3934
  }
3819
3935
  };
3820
- const teardown = track(subscriber);
3936
+ const teardown = track2(subscriber);
3821
3937
  return teardown;
3822
3938
  }
3823
3939
 
@@ -3880,7 +3996,12 @@ function store(initialState) {
3880
3996
  first = false;
3881
3997
  return;
3882
3998
  }
3883
- callback(snapshot);
3999
+ suspendTracking2();
4000
+ try {
4001
+ callback(snapshot);
4002
+ } finally {
4003
+ resumeTracking2();
4004
+ }
3884
4005
  });
3885
4006
  };
3886
4007
  const subscribeKey = (key, callback) => {
@@ -3896,7 +4017,12 @@ function store(initialState) {
3896
4017
  if (!Object.is(current, prev)) {
3897
4018
  const oldPrev = prev;
3898
4019
  prev = current;
3899
- callback(current, oldPrev);
4020
+ suspendTracking2();
4021
+ try {
4022
+ callback(current, oldPrev);
4023
+ } finally {
4024
+ resumeTracking2();
4025
+ }
3900
4026
  }
3901
4027
  });
3902
4028
  };
@@ -3997,11 +4123,11 @@ function reactiveArray(initial = []) {
3997
4123
  function notify() {
3998
4124
  snapshot = null;
3999
4125
  if (!enqueueBatchedSignal(signal2)) {
4000
- notifySubscribers(signal2);
4126
+ notifySubscribers2(signal2);
4001
4127
  }
4002
4128
  }
4003
4129
  function get() {
4004
- recordDependency(signal2);
4130
+ recordDependency2(signal2);
4005
4131
  if (snapshot === null) {
4006
4132
  const copy = data2.slice();
4007
4133
  snapshot = Object.freeze(copy);
@@ -4257,9 +4383,9 @@ function safeCall(cb, hookName) {
4257
4383
  }
4258
4384
  }
4259
4385
  function runMountCallback(callback, hookName, element) {
4260
- const cleanup2 = safeCall(callback, hookName);
4261
- if (typeof cleanup2 === "function" && element) {
4262
- registerDisposer(element, cleanup2);
4386
+ const cleanup3 = safeCall(callback, hookName);
4387
+ if (typeof cleanup3 === "function" && element) {
4388
+ registerDisposer(element, cleanup3);
4263
4389
  }
4264
4390
  }
4265
4391
  var mountWatchers = /* @__PURE__ */ new WeakMap();
@@ -4575,7 +4701,7 @@ function defer(getter) {
4575
4701
  }
4576
4702
  });
4577
4703
  };
4578
- const teardown = track(() => {
4704
+ const teardown = track2(() => {
4579
4705
  latest = getter();
4580
4706
  schedule();
4581
4707
  });
@@ -4727,14 +4853,14 @@ function Suspense({ nodes, fallback }) {
4727
4853
  }
4728
4854
 
4729
4855
  // src/platform/ssr.ts
4730
- var _isDev10 = isDev();
4856
+ var _isDev11 = isDev();
4731
4857
  function trustHTML(html3) {
4732
4858
  return html3;
4733
4859
  }
4734
4860
  var DEFAULT_MAX_SSR_BYTES = 1024 * 1024;
4735
4861
 
4736
4862
  // src/components/ErrorDisplay.ts
4737
- var _isDev11 = isDev();
4863
+ var _isDev12 = isDev();
4738
4864
  var STYLES = `
4739
4865
  .sibu-error-display {
4740
4866
  border: 1px solid var(--sibu-err-border, #e5484d);
@@ -5045,7 +5171,7 @@ function ErrorDisplay(props) {
5045
5171
  injectStyles();
5046
5172
  const severity = props.severity ?? "error";
5047
5173
  const normalized = normalizeError(props.error);
5048
- const showDetails = props.alwaysShowDetails ?? _isDev11;
5174
+ const showDetails = props.alwaysShowDetails ?? _isDev12;
5049
5175
  const headline = props.title ?? normalized.message;
5050
5176
  const timestamp = (/* @__PURE__ */ new Date()).toISOString().replace("T", " ").slice(0, 19);
5051
5177
  const [copyLabel, setCopyLabel] = signal("Copy");
@@ -5446,7 +5572,12 @@ function ErrorBoundary(optionsOrChildren, maybeChildren) {
5446
5572
  } else if (collected.length > 1) {
5447
5573
  const Agg = globalThis.AggregateError;
5448
5574
  handleError(
5449
- Agg ? new Agg(collected, `${collected.length} pre-mount errors caught by ErrorBoundary`) : new Error(collected.map((e) => e.message).join("; "))
5575
+ Agg ? new Agg(collected, `${collected.length} pre-mount errors caught by ErrorBoundary`) : (
5576
+ // AggregateError is ES2021 and present in every supported runtime
5577
+ // (matches the browserslist targets), so this fallback is defensive.
5578
+ /* v8 ignore next */
5579
+ new Error(collected.map((e) => e.message).join("; "))
5580
+ )
5450
5581
  );
5451
5582
  }
5452
5583
  return void 0;