sibujs 1.5.0 → 2.0.0

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 (207) hide show
  1. package/dist/browser.cjs +238 -69
  2. package/dist/browser.d.cts +5 -0
  3. package/dist/browser.d.ts +5 -0
  4. package/dist/browser.js +6 -6
  5. package/dist/build.cjs +916 -292
  6. package/dist/build.js +15 -13
  7. package/dist/cdn.global.js +17 -16
  8. package/dist/chunk-2RA7SHDA.js +65 -0
  9. package/dist/chunk-2UPRY23K.js +80 -0
  10. package/dist/chunk-3JHCYHWN.js +125 -0
  11. package/dist/{chunk-VAPYJN4X.js → chunk-3LR7GLWQ.js} +93 -23
  12. package/dist/{chunk-RJ46C3CS.js → chunk-3NSGB5JN.js} +71 -20
  13. package/dist/{chunk-XUEEGU5O.js → chunk-52YJLLRO.js} +16 -4
  14. package/dist/{chunk-XHK6BDAJ.js → chunk-54EDRCEF.js} +25 -8
  15. package/dist/chunk-7JDB7I65.js +1327 -0
  16. package/dist/{chunk-WZSPOOER.js → chunk-CC65Y57T.js} +8 -5
  17. package/dist/{chunk-23VV7YD3.js → chunk-DFPFITST.js} +25 -30
  18. package/dist/{chunk-BGN5ZMP4.js → chunk-GTBNNBJ6.js} +14 -2
  19. package/dist/chunk-HB24TBAF.js +121 -0
  20. package/dist/{chunk-CZUGLNJS.js → chunk-ITX6OO3F.js} +3 -3
  21. package/dist/{chunk-BGTHZHJ5.js → chunk-JA6667UN.js} +188 -44
  22. package/dist/{chunk-7GRNSCFT.js → chunk-JXMMDLBY.js} +306 -183
  23. package/dist/{chunk-3X2YG6YM.js → chunk-JYD2PWXH.js} +59 -28
  24. package/dist/{chunk-SFKNRVCU.js → chunk-KLRMB5ZS.js} +135 -79
  25. package/dist/{chunk-5X6PP2UK.js → chunk-LMLD24FC.js} +2 -2
  26. package/dist/{chunk-M4NLBH4I.js → chunk-LYTCUZ7H.js} +3 -2
  27. package/dist/{chunk-BMPL52BF.js → chunk-MIUAXB7K.js} +118 -66
  28. package/dist/{chunk-JCDUJN2F.js → chunk-ND2664SF.js} +486 -153
  29. package/dist/{chunk-VQDZK23A.js → chunk-O2MNQFLP.js} +181 -66
  30. package/dist/{chunk-NHUC2QWH.js → chunk-R73P76YZ.js} +1 -1
  31. package/dist/{chunk-2BYQDGN3.js → chunk-SAHNHTFC.js} +234 -63
  32. package/dist/chunk-UCS6AMJ7.js +79 -0
  33. package/dist/{chunk-K4G4ZQNR.js → chunk-VLPPXTYG.js} +84 -38
  34. package/dist/{chunk-OUZZEE4S.js → chunk-WOMYAHHI.js} +17 -11
  35. package/dist/{customElement-BL3Uo8dL.d.cts → customElement-CPfIrbvg.d.cts} +14 -10
  36. package/dist/{customElement-BL3Uo8dL.d.ts → customElement-CPfIrbvg.d.ts} +14 -10
  37. package/dist/data.cjs +410 -99
  38. package/dist/data.d.cts +20 -2
  39. package/dist/data.d.ts +20 -2
  40. package/dist/data.js +11 -9
  41. package/dist/devtools.cjs +513 -223
  42. package/dist/devtools.d.cts +1 -1
  43. package/dist/devtools.d.ts +1 -1
  44. package/dist/devtools.js +12 -6
  45. package/dist/ecosystem.cjs +475 -144
  46. package/dist/ecosystem.d.cts +9 -7
  47. package/dist/ecosystem.d.ts +9 -7
  48. package/dist/ecosystem.js +12 -11
  49. package/dist/extras.cjs +3355 -1541
  50. package/dist/extras.d.cts +9 -9
  51. package/dist/extras.d.ts +9 -9
  52. package/dist/extras.js +58 -45
  53. package/dist/index.cjs +920 -292
  54. package/dist/index.d.cts +71 -8
  55. package/dist/index.d.ts +71 -8
  56. package/dist/index.js +28 -16
  57. package/dist/{introspect-BumjnBKr.d.cts → introspect-BWNjNw64.d.cts} +22 -2
  58. package/dist/{introspect-CZrlcaYy.d.ts → introspect-cY2pg9pW.d.ts} +22 -2
  59. package/dist/motion.cjs +77 -34
  60. package/dist/motion.js +4 -4
  61. package/dist/patterns.cjs +335 -69
  62. package/dist/patterns.d.cts +11 -12
  63. package/dist/patterns.d.ts +11 -12
  64. package/dist/patterns.js +7 -7
  65. package/dist/performance.cjs +279 -108
  66. package/dist/performance.d.cts +23 -16
  67. package/dist/performance.d.ts +23 -16
  68. package/dist/performance.js +13 -8
  69. package/dist/plugin-D30wlGW5.d.cts +71 -0
  70. package/dist/plugin-D30wlGW5.d.ts +71 -0
  71. package/dist/plugins.cjs +635 -260
  72. package/dist/plugins.d.cts +10 -3
  73. package/dist/plugins.d.ts +10 -3
  74. package/dist/plugins.js +106 -38
  75. package/dist/{ssr-Do_SiVoL.d.cts → ssr-CrVNy6Pa.d.cts} +9 -15
  76. package/dist/{ssr-Do_SiVoL.d.ts → ssr-CrVNy6Pa.d.ts} +9 -15
  77. package/dist/{ssr-4PBXAOO3.js → ssr-FXD2PPMC.js} +4 -3
  78. package/dist/ssr.cjs +642 -222
  79. package/dist/ssr.d.cts +26 -6
  80. package/dist/ssr.d.ts +26 -6
  81. package/dist/ssr.js +12 -11
  82. package/dist/{tagFactory-DaJ0YWX6.d.cts → tagFactory-S17H2qxu.d.cts} +9 -1
  83. package/dist/{tagFactory-DaJ0YWX6.d.ts → tagFactory-S17H2qxu.d.ts} +9 -1
  84. package/dist/testing.cjs +252 -63
  85. package/dist/testing.d.cts +17 -4
  86. package/dist/testing.d.ts +17 -4
  87. package/dist/testing.js +100 -44
  88. package/dist/ui.cjs +463 -137
  89. package/dist/ui.d.cts +1 -1
  90. package/dist/ui.d.ts +1 -1
  91. package/dist/ui.js +20 -17
  92. package/dist/widgets.cjs +977 -94
  93. package/dist/widgets.d.cts +104 -2
  94. package/dist/widgets.d.ts +104 -2
  95. package/dist/widgets.js +9 -7
  96. package/package.json +8 -2
  97. package/dist/chunk-32DY64NT.js +0 -282
  98. package/dist/chunk-3AIRKM3B.js +0 -1263
  99. package/dist/chunk-3ARAQO7B.js +0 -398
  100. package/dist/chunk-3CRQALYP.js +0 -877
  101. package/dist/chunk-4EI4AG32.js +0 -482
  102. package/dist/chunk-4MYMUBRS.js +0 -21
  103. package/dist/chunk-5ZYQ6KDD.js +0 -154
  104. package/dist/chunk-6BMPXPUW.js +0 -26
  105. package/dist/chunk-6HLLIF3K.js +0 -398
  106. package/dist/chunk-6LSNVCS2.js +0 -937
  107. package/dist/chunk-6SA3QQES.js +0 -61
  108. package/dist/chunk-77L6NL3X.js +0 -1097
  109. package/dist/chunk-7BF6TK55.js +0 -1097
  110. package/dist/chunk-7TQKR4PP.js +0 -294
  111. package/dist/chunk-7V26P53V.js +0 -712
  112. package/dist/chunk-AZ3ISID5.js +0 -298
  113. package/dist/chunk-B7SWRFUT.js +0 -332
  114. package/dist/chunk-BTU3TJDS.js +0 -365
  115. package/dist/chunk-BW3WT46K.js +0 -937
  116. package/dist/chunk-C6KFWOFV.js +0 -616
  117. package/dist/chunk-CHF5OHIA.js +0 -61
  118. package/dist/chunk-CHJ27IGK.js +0 -26
  119. package/dist/chunk-CMBFNA7L.js +0 -27
  120. package/dist/chunk-DAHRH4ON.js +0 -331
  121. package/dist/chunk-DKOHBI74.js +0 -924
  122. package/dist/chunk-DTCOOBMX.js +0 -725
  123. package/dist/chunk-EBGIRKQY.js +0 -616
  124. package/dist/chunk-EUZND3CB.js +0 -27
  125. package/dist/chunk-EVCZO745.js +0 -365
  126. package/dist/chunk-EWFVA3TJ.js +0 -282
  127. package/dist/chunk-F3FA4F32.js +0 -292
  128. package/dist/chunk-FGOEVHY3.js +0 -60
  129. package/dist/chunk-G3BOQPVO.js +0 -365
  130. package/dist/chunk-GCOK2LC3.js +0 -282
  131. package/dist/chunk-GJPXRJ45.js +0 -37
  132. package/dist/chunk-HGMJFBC7.js +0 -654
  133. package/dist/chunk-JAKHTMQU.js +0 -1000
  134. package/dist/chunk-JCI5M6U6.js +0 -956
  135. package/dist/chunk-K5ZUMYVS.js +0 -89
  136. package/dist/chunk-KQPDEVVS.js +0 -398
  137. package/dist/chunk-L6JRBDNS.js +0 -60
  138. package/dist/chunk-LA6KQEDU.js +0 -712
  139. package/dist/chunk-MB6QFH3I.js +0 -2776
  140. package/dist/chunk-MDVXJWFN.js +0 -304
  141. package/dist/chunk-MEZVEBPN.js +0 -2008
  142. package/dist/chunk-MK4ERFYL.js +0 -2249
  143. package/dist/chunk-MLKGABMK.js +0 -9
  144. package/dist/chunk-MQ5GOYPH.js +0 -2249
  145. package/dist/chunk-MYRV7VDM.js +0 -742
  146. package/dist/chunk-N6IZB6KJ.js +0 -567
  147. package/dist/chunk-NEKUBFPT.js +0 -60
  148. package/dist/chunk-NMRUZALC.js +0 -1097
  149. package/dist/chunk-NYVAC6P5.js +0 -37
  150. package/dist/chunk-NZIIMDWI.js +0 -84
  151. package/dist/chunk-OF7UZIVB.js +0 -725
  152. package/dist/chunk-P3XWXJZU.js +0 -282
  153. package/dist/chunk-P6W3STU4.js +0 -2249
  154. package/dist/chunk-PBHF5WKN.js +0 -616
  155. package/dist/chunk-PDZQY43A.js +0 -616
  156. package/dist/chunk-PTQJDMRT.js +0 -146
  157. package/dist/chunk-PZEGYCF5.js +0 -61
  158. package/dist/chunk-QBMDLBU2.js +0 -975
  159. package/dist/chunk-QWZG56ET.js +0 -2744
  160. package/dist/chunk-RQGQSLQK.js +0 -725
  161. package/dist/chunk-SDLZDHKP.js +0 -107
  162. package/dist/chunk-TDGZL5CU.js +0 -365
  163. package/dist/chunk-TNQWPPE6.js +0 -37
  164. package/dist/chunk-TSOKIX5Z.js +0 -654
  165. package/dist/chunk-UHNL42EF.js +0 -2730
  166. package/dist/chunk-UNXCEF6S.js +0 -21
  167. package/dist/chunk-V2XTI523.js +0 -347
  168. package/dist/chunk-VAU366PN.js +0 -2241
  169. package/dist/chunk-VMVDTCXB.js +0 -712
  170. package/dist/chunk-VQNQZCWJ.js +0 -61
  171. package/dist/chunk-VRW3FULF.js +0 -725
  172. package/dist/chunk-WADYRCO2.js +0 -304
  173. package/dist/chunk-WILQZRO4.js +0 -282
  174. package/dist/chunk-WR5D4EGH.js +0 -26
  175. package/dist/chunk-WUHJISPP.js +0 -298
  176. package/dist/chunk-XYU6TZOW.js +0 -182
  177. package/dist/chunk-Y6GP4QGG.js +0 -276
  178. package/dist/chunk-YECR7UIA.js +0 -347
  179. package/dist/chunk-YUTWTI4B.js +0 -654
  180. package/dist/chunk-Z65KYU7I.js +0 -26
  181. package/dist/chunk-Z6POF5YC.js +0 -975
  182. package/dist/chunk-ZBJP6WFL.js +0 -482
  183. package/dist/chunk-ZD6OAMTH.js +0 -277
  184. package/dist/chunk-ZWKZCBO6.js +0 -317
  185. package/dist/contracts-DDrwxvJ-.d.cts +0 -245
  186. package/dist/contracts-DDrwxvJ-.d.ts +0 -245
  187. package/dist/contracts-DOrhwbke.d.cts +0 -245
  188. package/dist/contracts-DOrhwbke.d.ts +0 -245
  189. package/dist/contracts-xo5ckdRP.d.cts +0 -240
  190. package/dist/contracts-xo5ckdRP.d.ts +0 -240
  191. package/dist/customElement-BKQfbSZQ.d.cts +0 -262
  192. package/dist/customElement-BKQfbSZQ.d.ts +0 -262
  193. package/dist/customElement-D2DJp_xn.d.cts +0 -313
  194. package/dist/customElement-D2DJp_xn.d.ts +0 -313
  195. package/dist/customElement-yz8uyk-0.d.cts +0 -308
  196. package/dist/customElement-yz8uyk-0.d.ts +0 -308
  197. package/dist/introspect-Cb0zgpi2.d.cts +0 -477
  198. package/dist/introspect-Y2xNXGSf.d.ts +0 -477
  199. package/dist/plugin-Bek4RhJY.d.cts +0 -43
  200. package/dist/plugin-Bek4RhJY.d.ts +0 -43
  201. package/dist/ssr-3RXHP5ES.js +0 -38
  202. package/dist/ssr-6GIMY5MX.js +0 -38
  203. package/dist/ssr-BA6sxxUd.d.cts +0 -135
  204. package/dist/ssr-BA6sxxUd.d.ts +0 -135
  205. package/dist/ssr-WKUPVSSK.js +0 -36
  206. package/dist/tagFactory-Dl8QCLga.d.cts +0 -23
  207. package/dist/tagFactory-Dl8QCLga.d.ts +0 -23
package/dist/browser.cjs CHANGED
@@ -66,12 +66,12 @@ function isDev() {
66
66
  var _isDev = isDev();
67
67
  function devAssert(condition, message) {
68
68
  if (_isDev && !condition) {
69
- throw new Error(`[Sibu] ${message}`);
69
+ throw new Error(`[SibuJS] ${message}`);
70
70
  }
71
71
  }
72
72
  function devWarn(message) {
73
73
  if (_isDev) {
74
- console.warn(`[Sibu] ${message}`);
74
+ console.warn(`[SibuJS] ${message}`);
75
75
  }
76
76
  }
77
77
 
@@ -81,11 +81,11 @@ var subscriberStack = new Array(32);
81
81
  var stackCapacity = 32;
82
82
  var stackTop = -1;
83
83
  var currentSubscriber = null;
84
- var signalSubscribers = /* @__PURE__ */ new WeakMap();
85
84
  var SUBS = "__s";
86
85
  var notifyDepth = 0;
87
86
  var pendingQueue = [];
88
87
  var pendingSet = /* @__PURE__ */ new Set();
88
+ var propagateStack = [];
89
89
  function safeInvoke(sub) {
90
90
  try {
91
91
  sub();
@@ -131,7 +131,6 @@ function recordDependency(signal2) {
131
131
  let subs = signal2[SUBS];
132
132
  if (!subs) {
133
133
  subs = /* @__PURE__ */ new Set();
134
- signalSubscribers.set(signal2, subs);
135
134
  signal2[SUBS] = subs;
136
135
  }
137
136
  subs.add(currentSubscriber);
@@ -153,17 +152,17 @@ function queueSignalNotification(signal2) {
153
152
  }
154
153
  }
155
154
  }
156
- var MAX_DRAIN_ITERATIONS = 1e3;
155
+ var maxDrainIterations = 1e5;
157
156
  function drainNotificationQueue() {
158
157
  if (notifyDepth > 0) return;
159
158
  notifyDepth++;
160
159
  try {
161
160
  let i = 0;
162
161
  while (i < pendingQueue.length) {
163
- if (i >= MAX_DRAIN_ITERATIONS) {
162
+ if (i >= maxDrainIterations) {
164
163
  if (typeof console !== "undefined") {
165
164
  console.error(
166
- `[SibuJS] Notification queue exceeded ${MAX_DRAIN_ITERATIONS} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
165
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
167
166
  );
168
167
  }
169
168
  break;
@@ -172,47 +171,52 @@ function drainNotificationQueue() {
172
171
  i++;
173
172
  }
174
173
  } finally {
175
- pendingQueue.length = 0;
176
- pendingSet.clear();
177
174
  notifyDepth--;
175
+ if (notifyDepth === 0) {
176
+ pendingQueue.length = 0;
177
+ pendingSet.clear();
178
+ }
178
179
  }
179
180
  }
180
181
  function propagateDirty(sub) {
181
182
  sub();
182
- let sig = sub._sig;
183
- while (sig) {
183
+ const rootSig = sub._sig;
184
+ if (!rootSig) return;
185
+ const stack = propagateStack;
186
+ const baseLen = stack.length;
187
+ stack.push(rootSig);
188
+ while (stack.length > baseLen) {
189
+ const sig = stack.pop();
184
190
  const first = sig.__f;
185
191
  if (first) {
186
192
  if (first._c) {
187
193
  const nSig = first._sig;
188
- nSig._d = true;
189
- sig = nSig;
190
- continue;
191
- }
192
- if (!pendingSet.has(first)) {
194
+ if (!nSig._d) {
195
+ nSig._d = true;
196
+ stack.push(nSig);
197
+ }
198
+ } else if (!pendingSet.has(first)) {
193
199
  pendingSet.add(first);
194
200
  pendingQueue.push(first);
195
201
  }
196
- break;
202
+ continue;
197
203
  }
198
204
  const subs = sig[SUBS];
199
- if (!subs) break;
200
- let nextSig;
205
+ if (!subs) continue;
201
206
  for (const s of subs) {
202
207
  if (s._c) {
203
- s();
204
208
  const nSig = s._sig;
205
- if (nSig && !nextSig) {
206
- nextSig = nSig;
207
- } else if (nSig) {
208
- propagateDirty(s);
209
+ if (nSig && !nSig._d) {
210
+ nSig._d = true;
211
+ stack.push(nSig);
212
+ } else if (!nSig) {
213
+ s();
209
214
  }
210
215
  } else if (!pendingSet.has(s)) {
211
216
  pendingSet.add(s);
212
217
  pendingQueue.push(s);
213
218
  }
214
219
  }
215
- sig = nextSig;
216
220
  }
217
221
  }
218
222
  function notifySubscribers(signal2) {
@@ -236,13 +240,23 @@ function notifySubscribers(signal2) {
236
240
  }
237
241
  let i = 0;
238
242
  while (i < pendingQueue.length) {
243
+ if (i >= maxDrainIterations) {
244
+ if (typeof console !== "undefined") {
245
+ console.error(
246
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
247
+ );
248
+ }
249
+ break;
250
+ }
239
251
  safeInvoke(pendingQueue[i]);
240
252
  i++;
241
253
  }
242
254
  } finally {
243
- pendingQueue.length = 0;
244
- pendingSet.clear();
245
255
  notifyDepth--;
256
+ if (notifyDepth === 0) {
257
+ pendingQueue.length = 0;
258
+ pendingSet.clear();
259
+ }
246
260
  }
247
261
  return;
248
262
  }
@@ -262,30 +276,48 @@ function notifySubscribers(signal2) {
262
276
  notifyDepth++;
263
277
  try {
264
278
  let directCount = 0;
279
+ let hasComputedSub = false;
265
280
  for (const sub of subs) {
281
+ if (sub._c) hasComputedSub = true;
266
282
  pendingQueue[directCount++] = sub;
267
283
  }
268
- for (let i2 = 0; i2 < directCount; i2++) {
269
- if (pendingQueue[i2]._c) {
270
- propagateDirty(pendingQueue[i2]);
284
+ if (!hasComputedSub) {
285
+ for (let i2 = 0; i2 < directCount; i2++) {
286
+ safeInvoke(pendingQueue[i2]);
271
287
  }
272
- }
273
- for (let i2 = 0; i2 < directCount; i2++) {
274
- if (!pendingQueue[i2]._c) {
275
- if (!pendingSet.has(pendingQueue[i2])) {
276
- safeInvoke(pendingQueue[i2]);
288
+ } else {
289
+ for (let i2 = 0; i2 < directCount; i2++) {
290
+ if (pendingQueue[i2]._c) {
291
+ propagateDirty(pendingQueue[i2]);
292
+ }
293
+ }
294
+ for (let i2 = 0; i2 < directCount; i2++) {
295
+ const sub = pendingQueue[i2];
296
+ if (!sub._c && !pendingSet.has(sub)) {
297
+ pendingSet.add(sub);
298
+ safeInvoke(sub);
277
299
  }
278
300
  }
279
301
  }
280
302
  let i = directCount;
281
303
  while (i < pendingQueue.length) {
304
+ if (i - directCount >= maxDrainIterations) {
305
+ if (typeof console !== "undefined") {
306
+ console.error(
307
+ `[SibuJS] Notification queue exceeded ${maxDrainIterations} iterations \u2014 likely an effect that writes to a signal it reads. Breaking to prevent infinite loop.`
308
+ );
309
+ }
310
+ break;
311
+ }
282
312
  safeInvoke(pendingQueue[i]);
283
313
  i++;
284
314
  }
285
315
  } finally {
286
- pendingQueue.length = 0;
287
- pendingSet.clear();
288
316
  notifyDepth--;
317
+ if (notifyDepth === 0) {
318
+ pendingQueue.length = 0;
319
+ pendingSet.clear();
320
+ }
289
321
  }
290
322
  }
291
323
  function cleanup(subscriber) {
@@ -296,7 +328,9 @@ function cleanup(subscriber) {
296
328
  if (subs) {
297
329
  subs.delete(subscriber);
298
330
  if (singleDep.__f === subscriber) {
299
- singleDep.__f = void 0;
331
+ singleDep.__f = subs.size === 1 ? subs.values().next().value : void 0;
332
+ } else if (subs.size === 1 && singleDep.__f === void 0) {
333
+ singleDep.__f = subs.values().next().value;
300
334
  }
301
335
  }
302
336
  sub._dep = void 0;
@@ -309,7 +343,9 @@ function cleanup(subscriber) {
309
343
  if (subs) {
310
344
  subs.delete(subscriber);
311
345
  if (signal2.__f === subscriber) {
312
- signal2.__f = void 0;
346
+ signal2.__f = subs.size === 1 ? subs.values().next().value : void 0;
347
+ } else if (subs.size === 1 && signal2.__f === void 0) {
348
+ signal2.__f = subs.values().next().value;
313
349
  }
314
350
  }
315
351
  }
@@ -336,10 +372,13 @@ function enqueueBatchedSignal(signal2) {
336
372
  return true;
337
373
  }
338
374
  function flushBatch() {
339
- for (const signal2 of pendingSignals) {
340
- queueSignalNotification(signal2);
375
+ try {
376
+ for (const signal2 of pendingSignals) {
377
+ queueSignalNotification(signal2);
378
+ }
379
+ } finally {
380
+ pendingSignals.clear();
341
381
  }
342
- pendingSignals.clear();
343
382
  drainNotificationQueue();
344
383
  }
345
384
 
@@ -401,9 +440,28 @@ function media(query) {
401
440
  }
402
441
 
403
442
  // src/core/ssr-context.ts
404
- var ssrMode = false;
443
+ var als = null;
444
+ try {
445
+ if (typeof process !== "undefined" && process.versions && process.versions.node) {
446
+ const req = Function("return typeof require==='function'?require:null")();
447
+ if (req) {
448
+ const mod = req("node:async_hooks");
449
+ als = new mod.AsyncLocalStorage();
450
+ }
451
+ }
452
+ } catch {
453
+ als = null;
454
+ }
455
+ var fallbackStore = { ssr: false, suspenseIdCounter: 0 };
456
+ function getSSRStore() {
457
+ if (als) {
458
+ const s = als.getStore();
459
+ if (s) return s;
460
+ }
461
+ return fallbackStore;
462
+ }
405
463
  function isSSR() {
406
- return ssrMode;
464
+ return getSSRStore().ssr;
407
465
  }
408
466
 
409
467
  // src/core/signals/effect.ts
@@ -413,26 +471,86 @@ function effect(effectFn, options) {
413
471
  if (isSSR()) return () => {
414
472
  };
415
473
  const onError = options?.onError;
474
+ let userCleanups = [];
475
+ const onCleanup = (fn) => {
476
+ userCleanups.push(fn);
477
+ };
478
+ const runUserCleanups = () => {
479
+ if (userCleanups.length === 0) return;
480
+ const list = userCleanups;
481
+ userCleanups = [];
482
+ for (let i = list.length - 1; i >= 0; i--) {
483
+ try {
484
+ list[i]();
485
+ } catch (err) {
486
+ if (typeof console !== "undefined") {
487
+ console.warn("[SibuJS effect] onCleanup threw:", err);
488
+ }
489
+ }
490
+ }
491
+ };
492
+ const invokeBody = () => effectFn(onCleanup);
416
493
  const wrappedFn = onError ? () => {
417
494
  try {
418
- effectFn();
495
+ invokeBody();
419
496
  } catch (err) {
420
497
  onError(err);
421
498
  }
422
- } : effectFn;
499
+ } : invokeBody;
423
500
  let cleanupHandle = () => {
424
501
  };
502
+ let running = false;
425
503
  const subscriber = () => {
426
- cleanupHandle();
427
- cleanupHandle = track(wrappedFn, subscriber);
504
+ if (running) {
505
+ if (_g2.__SIBU_DEV_WARN__ !== false && typeof console !== "undefined") {
506
+ console.warn(
507
+ "[SibuJS] effect re-entered itself while running \u2014 the triggering update will be ignored. Wrap mutual writes in `batch()` or split the effect to avoid this."
508
+ );
509
+ }
510
+ return;
511
+ }
512
+ running = true;
513
+ try {
514
+ runUserCleanups();
515
+ cleanupHandle();
516
+ cleanupHandle = track(wrappedFn, subscriber);
517
+ } finally {
518
+ running = false;
519
+ }
428
520
  };
429
- cleanupHandle = track(wrappedFn, subscriber);
521
+ running = true;
522
+ try {
523
+ cleanupHandle = track(wrappedFn, subscriber);
524
+ } finally {
525
+ running = false;
526
+ }
430
527
  const hook = _g2.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
431
528
  if (hook) hook.emit("effect:create", { effectFn });
529
+ let disposed = false;
432
530
  return () => {
531
+ if (disposed) return;
532
+ disposed = true;
433
533
  const h = _g2.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
434
- if (h) h.emit("effect:destroy", { effectFn });
435
- cleanupHandle();
534
+ if (h) {
535
+ try {
536
+ h.emit("effect:destroy", { effectFn });
537
+ } catch {
538
+ }
539
+ }
540
+ try {
541
+ runUserCleanups();
542
+ } catch (err) {
543
+ if (typeof console !== "undefined") {
544
+ console.warn("[SibuJS effect] onCleanup threw during dispose:", err);
545
+ }
546
+ }
547
+ try {
548
+ cleanupHandle();
549
+ } catch (err) {
550
+ if (typeof console !== "undefined") {
551
+ console.warn("[SibuJS effect] dispose threw:", err);
552
+ }
553
+ }
436
554
  };
437
555
  }
438
556
 
@@ -810,7 +928,10 @@ function dropZone(element, options) {
810
928
  const raw = e.dataTransfer.getData("application/json");
811
929
  if (raw) {
812
930
  try {
813
- transferData = JSON.parse(raw);
931
+ transferData = JSON.parse(
932
+ raw,
933
+ (k, v) => k === "__proto__" || k === "constructor" || k === "prototype" ? void 0 : v
934
+ );
814
935
  } catch {
815
936
  transferData = raw;
816
937
  }
@@ -1190,13 +1311,21 @@ function wakeLock() {
1190
1311
  }
1191
1312
  const onVisibility = () => {
1192
1313
  if (sentinel?.released && !document.hidden) {
1193
- void request();
1314
+ request().catch((err) => {
1315
+ if (typeof console !== "undefined") {
1316
+ console.warn("[SibuJS wakeLock] re-acquire failed:", err);
1317
+ }
1318
+ });
1194
1319
  }
1195
1320
  };
1196
1321
  document.addEventListener("visibilitychange", onVisibility);
1197
1322
  function dispose() {
1198
1323
  document.removeEventListener("visibilitychange", onVisibility);
1199
- void release();
1324
+ release().catch((err) => {
1325
+ if (typeof console !== "undefined") {
1326
+ console.warn("[SibuJS wakeLock] release failed:", err);
1327
+ }
1328
+ });
1200
1329
  }
1201
1330
  return { active, request, release, dispose };
1202
1331
  }
@@ -1392,11 +1521,21 @@ function speech() {
1392
1521
  };
1393
1522
  }
1394
1523
  const synth = window.speechSynthesis;
1395
- const interval = setInterval(() => {
1396
- setSpeaking(synth.speaking);
1397
- setPaused(synth.paused);
1398
- }, 200);
1524
+ let interval = null;
1525
+ function startPolling() {
1526
+ if (interval !== null) return;
1527
+ interval = setInterval(() => {
1528
+ setSpeaking(synth.speaking);
1529
+ setPaused(synth.paused);
1530
+ if (!synth.speaking && !synth.paused) {
1531
+ clearInterval(interval);
1532
+ interval = null;
1533
+ }
1534
+ }, 200);
1535
+ }
1536
+ let disposed = false;
1399
1537
  function speak(text, options = {}) {
1538
+ if (disposed) return;
1400
1539
  const u = new SpeechSynthesisUtterance(text);
1401
1540
  if (options.lang) u.lang = options.lang;
1402
1541
  if (options.rate != null) u.rate = options.rate;
@@ -1407,19 +1546,41 @@ function speech() {
1407
1546
  const match = voices.find((v) => v.name === options.voice);
1408
1547
  if (match) u.voice = match;
1409
1548
  }
1410
- u.addEventListener("start", () => setSpeaking(true));
1411
- u.addEventListener("end", () => {
1412
- setSpeaking(false);
1413
- setPaused(false);
1414
- });
1415
- u.addEventListener("error", () => {
1416
- setSpeaking(false);
1417
- setPaused(false);
1418
- });
1549
+ u.addEventListener(
1550
+ "start",
1551
+ () => {
1552
+ if (!disposed) setSpeaking(true);
1553
+ },
1554
+ { once: true }
1555
+ );
1556
+ u.addEventListener(
1557
+ "end",
1558
+ () => {
1559
+ if (disposed) return;
1560
+ setSpeaking(false);
1561
+ setPaused(false);
1562
+ },
1563
+ { once: true }
1564
+ );
1565
+ u.addEventListener(
1566
+ "error",
1567
+ () => {
1568
+ if (disposed) return;
1569
+ setSpeaking(false);
1570
+ setPaused(false);
1571
+ },
1572
+ { once: true }
1573
+ );
1419
1574
  synth.speak(u);
1575
+ setSpeaking(true);
1576
+ startPolling();
1420
1577
  }
1421
1578
  function dispose() {
1422
- clearInterval(interval);
1579
+ disposed = true;
1580
+ if (interval !== null) {
1581
+ clearInterval(interval);
1582
+ interval = null;
1583
+ }
1423
1584
  synth.cancel();
1424
1585
  }
1425
1586
  return {
@@ -1648,13 +1809,21 @@ function imageLoader(src) {
1648
1809
  };
1649
1810
  img.src = url;
1650
1811
  }
1812
+ let srcEffectTeardown = null;
1651
1813
  if (typeof src === "function") {
1652
- start(src());
1814
+ srcEffectTeardown = effect(() => {
1815
+ const url = src();
1816
+ start(url);
1817
+ });
1653
1818
  } else {
1654
1819
  start(src);
1655
1820
  }
1656
1821
  function dispose() {
1657
1822
  disposed = true;
1823
+ if (srcEffectTeardown) {
1824
+ srcEffectTeardown();
1825
+ srcEffectTeardown = null;
1826
+ }
1658
1827
  if (current) {
1659
1828
  current.onload = null;
1660
1829
  current.onerror = null;
@@ -370,6 +370,11 @@ declare function urlState(): {
370
370
  };
371
371
 
372
372
  /**
373
+ * Note on trust model: `BroadcastChannel` only delivers messages between
374
+ * same-origin browsing contexts (tabs, iframes, workers). We therefore treat
375
+ * incoming payloads as same-origin-trusted and pass them through unmodified.
376
+ * Do not use this transport for cross-origin messaging.
377
+ *
373
378
  * broadcast wraps the BroadcastChannel API as a reactive signal.
374
379
  * Unlike the `storage` event (which only fires for localStorage writes and
375
380
  * sends only the serialized value), a `BroadcastChannel` can send arbitrary
package/dist/browser.d.ts CHANGED
@@ -370,6 +370,11 @@ declare function urlState(): {
370
370
  };
371
371
 
372
372
  /**
373
+ * Note on trust model: `BroadcastChannel` only delivers messages between
374
+ * same-origin browsing contexts (tabs, iframes, workers). We therefore treat
375
+ * incoming payloads as same-origin-trusted and pass them through unmodified.
376
+ * Do not use this transport for cross-origin messaging.
377
+ *
373
378
  * broadcast wraps the BroadcastChannel API as a reactive signal.
374
379
  * Unlike the `storage` event (which only fires for localStorage writes and
375
380
  * sends only the serialized value), a `BroadcastChannel` can send arbitrary
package/dist/browser.js CHANGED
@@ -35,12 +35,12 @@ import {
35
35
  visibility,
36
36
  wakeLock,
37
37
  windowSize
38
- } from "./chunk-RJ46C3CS.js";
39
- import "./chunk-VQNQZCWJ.js";
40
- import "./chunk-EUZND3CB.js";
41
- import "./chunk-NZIIMDWI.js";
42
- import "./chunk-K4G4ZQNR.js";
43
- import "./chunk-5X6PP2UK.js";
38
+ } from "./chunk-3NSGB5JN.js";
39
+ import "./chunk-HB24TBAF.js";
40
+ import "./chunk-2RA7SHDA.js";
41
+ import "./chunk-CC65Y57T.js";
42
+ import "./chunk-VLPPXTYG.js";
43
+ import "./chunk-LMLD24FC.js";
44
44
  export {
45
45
  animationFrame,
46
46
  battery,