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.
- package/dist/browser.cjs +238 -69
- package/dist/browser.d.cts +5 -0
- package/dist/browser.d.ts +5 -0
- package/dist/browser.js +6 -6
- package/dist/build.cjs +916 -292
- package/dist/build.js +15 -13
- package/dist/cdn.global.js +17 -16
- package/dist/chunk-2RA7SHDA.js +65 -0
- package/dist/chunk-2UPRY23K.js +80 -0
- package/dist/chunk-3JHCYHWN.js +125 -0
- package/dist/{chunk-VAPYJN4X.js → chunk-3LR7GLWQ.js} +93 -23
- package/dist/{chunk-RJ46C3CS.js → chunk-3NSGB5JN.js} +71 -20
- package/dist/{chunk-XUEEGU5O.js → chunk-52YJLLRO.js} +16 -4
- package/dist/{chunk-XHK6BDAJ.js → chunk-54EDRCEF.js} +25 -8
- package/dist/chunk-7JDB7I65.js +1327 -0
- package/dist/{chunk-WZSPOOER.js → chunk-CC65Y57T.js} +8 -5
- package/dist/{chunk-23VV7YD3.js → chunk-DFPFITST.js} +25 -30
- package/dist/{chunk-BGN5ZMP4.js → chunk-GTBNNBJ6.js} +14 -2
- package/dist/chunk-HB24TBAF.js +121 -0
- package/dist/{chunk-CZUGLNJS.js → chunk-ITX6OO3F.js} +3 -3
- package/dist/{chunk-BGTHZHJ5.js → chunk-JA6667UN.js} +188 -44
- package/dist/{chunk-7GRNSCFT.js → chunk-JXMMDLBY.js} +306 -183
- package/dist/{chunk-3X2YG6YM.js → chunk-JYD2PWXH.js} +59 -28
- package/dist/{chunk-SFKNRVCU.js → chunk-KLRMB5ZS.js} +135 -79
- package/dist/{chunk-5X6PP2UK.js → chunk-LMLD24FC.js} +2 -2
- package/dist/{chunk-M4NLBH4I.js → chunk-LYTCUZ7H.js} +3 -2
- package/dist/{chunk-BMPL52BF.js → chunk-MIUAXB7K.js} +118 -66
- package/dist/{chunk-JCDUJN2F.js → chunk-ND2664SF.js} +486 -153
- package/dist/{chunk-VQDZK23A.js → chunk-O2MNQFLP.js} +181 -66
- package/dist/{chunk-NHUC2QWH.js → chunk-R73P76YZ.js} +1 -1
- package/dist/{chunk-2BYQDGN3.js → chunk-SAHNHTFC.js} +234 -63
- package/dist/chunk-UCS6AMJ7.js +79 -0
- package/dist/{chunk-K4G4ZQNR.js → chunk-VLPPXTYG.js} +84 -38
- package/dist/{chunk-OUZZEE4S.js → chunk-WOMYAHHI.js} +17 -11
- package/dist/{customElement-BL3Uo8dL.d.cts → customElement-CPfIrbvg.d.cts} +14 -10
- package/dist/{customElement-BL3Uo8dL.d.ts → customElement-CPfIrbvg.d.ts} +14 -10
- package/dist/data.cjs +410 -99
- package/dist/data.d.cts +20 -2
- package/dist/data.d.ts +20 -2
- package/dist/data.js +11 -9
- package/dist/devtools.cjs +513 -223
- package/dist/devtools.d.cts +1 -1
- package/dist/devtools.d.ts +1 -1
- package/dist/devtools.js +12 -6
- package/dist/ecosystem.cjs +475 -144
- package/dist/ecosystem.d.cts +9 -7
- package/dist/ecosystem.d.ts +9 -7
- package/dist/ecosystem.js +12 -11
- package/dist/extras.cjs +3355 -1541
- package/dist/extras.d.cts +9 -9
- package/dist/extras.d.ts +9 -9
- package/dist/extras.js +58 -45
- package/dist/index.cjs +920 -292
- package/dist/index.d.cts +71 -8
- package/dist/index.d.ts +71 -8
- package/dist/index.js +28 -16
- package/dist/{introspect-BumjnBKr.d.cts → introspect-BWNjNw64.d.cts} +22 -2
- package/dist/{introspect-CZrlcaYy.d.ts → introspect-cY2pg9pW.d.ts} +22 -2
- package/dist/motion.cjs +77 -34
- package/dist/motion.js +4 -4
- package/dist/patterns.cjs +335 -69
- package/dist/patterns.d.cts +11 -12
- package/dist/patterns.d.ts +11 -12
- package/dist/patterns.js +7 -7
- package/dist/performance.cjs +279 -108
- package/dist/performance.d.cts +23 -16
- package/dist/performance.d.ts +23 -16
- package/dist/performance.js +13 -8
- package/dist/plugin-D30wlGW5.d.cts +71 -0
- package/dist/plugin-D30wlGW5.d.ts +71 -0
- package/dist/plugins.cjs +635 -260
- package/dist/plugins.d.cts +10 -3
- package/dist/plugins.d.ts +10 -3
- package/dist/plugins.js +106 -38
- package/dist/{ssr-Do_SiVoL.d.cts → ssr-CrVNy6Pa.d.cts} +9 -15
- package/dist/{ssr-Do_SiVoL.d.ts → ssr-CrVNy6Pa.d.ts} +9 -15
- package/dist/{ssr-4PBXAOO3.js → ssr-FXD2PPMC.js} +4 -3
- package/dist/ssr.cjs +642 -222
- package/dist/ssr.d.cts +26 -6
- package/dist/ssr.d.ts +26 -6
- package/dist/ssr.js +12 -11
- package/dist/{tagFactory-DaJ0YWX6.d.cts → tagFactory-S17H2qxu.d.cts} +9 -1
- package/dist/{tagFactory-DaJ0YWX6.d.ts → tagFactory-S17H2qxu.d.ts} +9 -1
- package/dist/testing.cjs +252 -63
- package/dist/testing.d.cts +17 -4
- package/dist/testing.d.ts +17 -4
- package/dist/testing.js +100 -44
- package/dist/ui.cjs +463 -137
- package/dist/ui.d.cts +1 -1
- package/dist/ui.d.ts +1 -1
- package/dist/ui.js +20 -17
- package/dist/widgets.cjs +977 -94
- package/dist/widgets.d.cts +104 -2
- package/dist/widgets.d.ts +104 -2
- package/dist/widgets.js +9 -7
- package/package.json +8 -2
- package/dist/chunk-32DY64NT.js +0 -282
- package/dist/chunk-3AIRKM3B.js +0 -1263
- package/dist/chunk-3ARAQO7B.js +0 -398
- package/dist/chunk-3CRQALYP.js +0 -877
- package/dist/chunk-4EI4AG32.js +0 -482
- package/dist/chunk-4MYMUBRS.js +0 -21
- package/dist/chunk-5ZYQ6KDD.js +0 -154
- package/dist/chunk-6BMPXPUW.js +0 -26
- package/dist/chunk-6HLLIF3K.js +0 -398
- package/dist/chunk-6LSNVCS2.js +0 -937
- package/dist/chunk-6SA3QQES.js +0 -61
- package/dist/chunk-77L6NL3X.js +0 -1097
- package/dist/chunk-7BF6TK55.js +0 -1097
- package/dist/chunk-7TQKR4PP.js +0 -294
- package/dist/chunk-7V26P53V.js +0 -712
- package/dist/chunk-AZ3ISID5.js +0 -298
- package/dist/chunk-B7SWRFUT.js +0 -332
- package/dist/chunk-BTU3TJDS.js +0 -365
- package/dist/chunk-BW3WT46K.js +0 -937
- package/dist/chunk-C6KFWOFV.js +0 -616
- package/dist/chunk-CHF5OHIA.js +0 -61
- package/dist/chunk-CHJ27IGK.js +0 -26
- package/dist/chunk-CMBFNA7L.js +0 -27
- package/dist/chunk-DAHRH4ON.js +0 -331
- package/dist/chunk-DKOHBI74.js +0 -924
- package/dist/chunk-DTCOOBMX.js +0 -725
- package/dist/chunk-EBGIRKQY.js +0 -616
- package/dist/chunk-EUZND3CB.js +0 -27
- package/dist/chunk-EVCZO745.js +0 -365
- package/dist/chunk-EWFVA3TJ.js +0 -282
- package/dist/chunk-F3FA4F32.js +0 -292
- package/dist/chunk-FGOEVHY3.js +0 -60
- package/dist/chunk-G3BOQPVO.js +0 -365
- package/dist/chunk-GCOK2LC3.js +0 -282
- package/dist/chunk-GJPXRJ45.js +0 -37
- package/dist/chunk-HGMJFBC7.js +0 -654
- package/dist/chunk-JAKHTMQU.js +0 -1000
- package/dist/chunk-JCI5M6U6.js +0 -956
- package/dist/chunk-K5ZUMYVS.js +0 -89
- package/dist/chunk-KQPDEVVS.js +0 -398
- package/dist/chunk-L6JRBDNS.js +0 -60
- package/dist/chunk-LA6KQEDU.js +0 -712
- package/dist/chunk-MB6QFH3I.js +0 -2776
- package/dist/chunk-MDVXJWFN.js +0 -304
- package/dist/chunk-MEZVEBPN.js +0 -2008
- package/dist/chunk-MK4ERFYL.js +0 -2249
- package/dist/chunk-MLKGABMK.js +0 -9
- package/dist/chunk-MQ5GOYPH.js +0 -2249
- package/dist/chunk-MYRV7VDM.js +0 -742
- package/dist/chunk-N6IZB6KJ.js +0 -567
- package/dist/chunk-NEKUBFPT.js +0 -60
- package/dist/chunk-NMRUZALC.js +0 -1097
- package/dist/chunk-NYVAC6P5.js +0 -37
- package/dist/chunk-NZIIMDWI.js +0 -84
- package/dist/chunk-OF7UZIVB.js +0 -725
- package/dist/chunk-P3XWXJZU.js +0 -282
- package/dist/chunk-P6W3STU4.js +0 -2249
- package/dist/chunk-PBHF5WKN.js +0 -616
- package/dist/chunk-PDZQY43A.js +0 -616
- package/dist/chunk-PTQJDMRT.js +0 -146
- package/dist/chunk-PZEGYCF5.js +0 -61
- package/dist/chunk-QBMDLBU2.js +0 -975
- package/dist/chunk-QWZG56ET.js +0 -2744
- package/dist/chunk-RQGQSLQK.js +0 -725
- package/dist/chunk-SDLZDHKP.js +0 -107
- package/dist/chunk-TDGZL5CU.js +0 -365
- package/dist/chunk-TNQWPPE6.js +0 -37
- package/dist/chunk-TSOKIX5Z.js +0 -654
- package/dist/chunk-UHNL42EF.js +0 -2730
- package/dist/chunk-UNXCEF6S.js +0 -21
- package/dist/chunk-V2XTI523.js +0 -347
- package/dist/chunk-VAU366PN.js +0 -2241
- package/dist/chunk-VMVDTCXB.js +0 -712
- package/dist/chunk-VQNQZCWJ.js +0 -61
- package/dist/chunk-VRW3FULF.js +0 -725
- package/dist/chunk-WADYRCO2.js +0 -304
- package/dist/chunk-WILQZRO4.js +0 -282
- package/dist/chunk-WR5D4EGH.js +0 -26
- package/dist/chunk-WUHJISPP.js +0 -298
- package/dist/chunk-XYU6TZOW.js +0 -182
- package/dist/chunk-Y6GP4QGG.js +0 -276
- package/dist/chunk-YECR7UIA.js +0 -347
- package/dist/chunk-YUTWTI4B.js +0 -654
- package/dist/chunk-Z65KYU7I.js +0 -26
- package/dist/chunk-Z6POF5YC.js +0 -975
- package/dist/chunk-ZBJP6WFL.js +0 -482
- package/dist/chunk-ZD6OAMTH.js +0 -277
- package/dist/chunk-ZWKZCBO6.js +0 -317
- package/dist/contracts-DDrwxvJ-.d.cts +0 -245
- package/dist/contracts-DDrwxvJ-.d.ts +0 -245
- package/dist/contracts-DOrhwbke.d.cts +0 -245
- package/dist/contracts-DOrhwbke.d.ts +0 -245
- package/dist/contracts-xo5ckdRP.d.cts +0 -240
- package/dist/contracts-xo5ckdRP.d.ts +0 -240
- package/dist/customElement-BKQfbSZQ.d.cts +0 -262
- package/dist/customElement-BKQfbSZQ.d.ts +0 -262
- package/dist/customElement-D2DJp_xn.d.cts +0 -313
- package/dist/customElement-D2DJp_xn.d.ts +0 -313
- package/dist/customElement-yz8uyk-0.d.cts +0 -308
- package/dist/customElement-yz8uyk-0.d.ts +0 -308
- package/dist/introspect-Cb0zgpi2.d.cts +0 -477
- package/dist/introspect-Y2xNXGSf.d.ts +0 -477
- package/dist/plugin-Bek4RhJY.d.cts +0 -43
- package/dist/plugin-Bek4RhJY.d.ts +0 -43
- package/dist/ssr-3RXHP5ES.js +0 -38
- package/dist/ssr-6GIMY5MX.js +0 -38
- package/dist/ssr-BA6sxxUd.d.cts +0 -135
- package/dist/ssr-BA6sxxUd.d.ts +0 -135
- package/dist/ssr-WKUPVSSK.js +0 -36
- package/dist/tagFactory-Dl8QCLga.d.cts +0 -23
- package/dist/tagFactory-Dl8QCLga.d.ts +0 -23
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
sanitizeUrl
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-UCS6AMJ7.js";
|
|
4
|
+
import {
|
|
5
|
+
getSSRStore
|
|
6
|
+
} from "./chunk-2RA7SHDA.js";
|
|
4
7
|
import {
|
|
5
8
|
isDev
|
|
6
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-LMLD24FC.js";
|
|
7
10
|
|
|
8
11
|
// src/platform/ssr.ts
|
|
9
12
|
var _isDev = isDev();
|
|
@@ -123,7 +126,7 @@ function hydrate(component, container, options = {}) {
|
|
|
123
126
|
options.onMismatch(first);
|
|
124
127
|
} else if (_isDev) {
|
|
125
128
|
console.warn(
|
|
126
|
-
`[
|
|
129
|
+
`[SibuJS hydration] ${first.message}
|
|
127
130
|
at ${first.path}
|
|
128
131
|
server: ${first.serverValue}
|
|
129
132
|
client: ${first.clientValue}`
|
|
@@ -131,17 +134,9 @@ function hydrate(component, container, options = {}) {
|
|
|
131
134
|
}
|
|
132
135
|
}
|
|
133
136
|
}
|
|
134
|
-
|
|
137
|
+
container.replaceChildren(clientTree);
|
|
135
138
|
container.setAttribute("data-sibu-hydrated", "true");
|
|
136
139
|
}
|
|
137
|
-
function hydrateNode(serverNode, clientNode) {
|
|
138
|
-
if (!serverNode) return;
|
|
139
|
-
const serverChildren = Array.from(serverNode.children);
|
|
140
|
-
const clientChildren = Array.from(clientNode.children);
|
|
141
|
-
for (let i = 0; i < Math.min(serverChildren.length, clientChildren.length); i++) {
|
|
142
|
-
hydrateNode(serverChildren[i], clientChildren[i]);
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
140
|
function collectMismatches(serverNode, clientNode, path, out, max = 5) {
|
|
146
141
|
if (out.length >= max) return;
|
|
147
142
|
const nodePath = path || clientNode?.tagName?.toLowerCase() || "(root)";
|
|
@@ -371,12 +366,16 @@ function renderToReadableStream(element) {
|
|
|
371
366
|
controller.enqueue(value);
|
|
372
367
|
}
|
|
373
368
|
},
|
|
374
|
-
cancel() {
|
|
375
|
-
generator.return(void 0);
|
|
369
|
+
async cancel() {
|
|
370
|
+
await generator.return(void 0);
|
|
376
371
|
}
|
|
377
372
|
});
|
|
378
373
|
}
|
|
374
|
+
var SAFE_ID = /^[A-Za-z0-9_-]+$/;
|
|
379
375
|
function island(id, component) {
|
|
376
|
+
if (!SAFE_ID.test(id)) {
|
|
377
|
+
throw new Error(`[SibuJS SSR] island: id must match [A-Za-z0-9_-]+ (got: ${JSON.stringify(id.slice(0, 32))})`);
|
|
378
|
+
}
|
|
380
379
|
const el = component();
|
|
381
380
|
el.setAttribute("data-sibu-island", id);
|
|
382
381
|
return el;
|
|
@@ -389,8 +388,9 @@ function hydrateIslands(container, islands) {
|
|
|
389
388
|
const factory = islands[id];
|
|
390
389
|
if (typeof factory !== "function") continue;
|
|
391
390
|
const clientTree = factory();
|
|
392
|
-
|
|
393
|
-
|
|
391
|
+
clientTree.setAttribute("data-sibu-island", id);
|
|
392
|
+
clientTree.setAttribute("data-sibu-hydrated", "true");
|
|
393
|
+
marker.replaceWith(clientTree);
|
|
394
394
|
}
|
|
395
395
|
container.setAttribute("data-sibu-hydrated", "partial");
|
|
396
396
|
}
|
|
@@ -407,8 +407,9 @@ function hydrateProgressively(container, islands, options) {
|
|
|
407
407
|
for (const entry of entries) {
|
|
408
408
|
if (entry.isIntersecting) {
|
|
409
409
|
const clientTree = factory();
|
|
410
|
-
|
|
411
|
-
|
|
410
|
+
clientTree.setAttribute("data-sibu-island", id);
|
|
411
|
+
clientTree.setAttribute("data-sibu-hydrated", "true");
|
|
412
|
+
marker.replaceWith(clientTree);
|
|
412
413
|
observer.disconnect();
|
|
413
414
|
break;
|
|
414
415
|
}
|
|
@@ -424,20 +425,37 @@ function hydrateProgressively(container, islands, options) {
|
|
|
424
425
|
for (const cleanup of cleanups) cleanup();
|
|
425
426
|
};
|
|
426
427
|
}
|
|
427
|
-
var suspenseIdCounter = 0;
|
|
428
428
|
function resetSSRState() {
|
|
429
|
-
suspenseIdCounter = 0;
|
|
429
|
+
getSSRStore().suspenseIdCounter = 0;
|
|
430
|
+
}
|
|
431
|
+
function noop() {
|
|
430
432
|
}
|
|
431
433
|
function ssrSuspense(props) {
|
|
432
|
-
const
|
|
434
|
+
const store = getSSRStore();
|
|
435
|
+
const id = `sibu-sus-${store.suspenseIdCounter++}`;
|
|
436
|
+
const timeoutMs = props.timeoutMs ?? 3e4;
|
|
433
437
|
const fallbackEl = props.fallback();
|
|
434
438
|
const wrapper = document.createElement("div");
|
|
435
439
|
wrapper.setAttribute("data-sibu-suspense-id", id);
|
|
436
440
|
wrapper.appendChild(fallbackEl);
|
|
437
|
-
const
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
+
const fallbackHtml = renderToString(fallbackEl);
|
|
442
|
+
let timer;
|
|
443
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
444
|
+
timer = setTimeout(() => reject(new Error(`[SibuJS SSR] ssrSuspense timed out after ${timeoutMs}ms`)), timeoutMs);
|
|
445
|
+
});
|
|
446
|
+
const raced = Promise.race([props.content(), timeoutPromise]);
|
|
447
|
+
const promise = raced.then(
|
|
448
|
+
(resolvedEl) => {
|
|
449
|
+
if (timer) clearTimeout(timer);
|
|
450
|
+
return { id, html: renderToString(resolvedEl) };
|
|
451
|
+
},
|
|
452
|
+
(err) => {
|
|
453
|
+
if (timer) clearTimeout(timer);
|
|
454
|
+
if (_isDev) console.warn("[SibuJS SSR] ssrSuspense rejected:", err);
|
|
455
|
+
return { id, html: fallbackHtml };
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
promise.catch(noop);
|
|
441
459
|
return { element: wrapper, promise };
|
|
442
460
|
}
|
|
443
461
|
var SAFE_SUSPENSE_ID = /^[A-Za-z0-9_-]+$/;
|
|
@@ -465,14 +483,27 @@ var SSR_DATA_ATTR = "__SIBU_SSR_DATA__";
|
|
|
465
483
|
function escapeScriptJson(json) {
|
|
466
484
|
return json.replace(/</g, "\\u003c").replace(/>/g, "\\u003e").replace(/&/g, "\\u0026").replace(/\u2028/g, "\\u2028").replace(/\u2029/g, "\\u2029");
|
|
467
485
|
}
|
|
468
|
-
|
|
469
|
-
|
|
486
|
+
var DEFAULT_MAX_SSR_BYTES = 1024 * 1024;
|
|
487
|
+
function serializeState(state, nonce, options) {
|
|
488
|
+
const rawJson = JSON.stringify(state);
|
|
489
|
+
const maxBytes = options?.maxBytes ?? DEFAULT_MAX_SSR_BYTES;
|
|
490
|
+
const byteLen = typeof TextEncoder !== "undefined" ? new TextEncoder().encode(rawJson).byteLength : Buffer.byteLength(rawJson, "utf8");
|
|
491
|
+
if (byteLen > maxBytes) {
|
|
492
|
+
throw new Error(`[SibuJS SSR] serializeState: payload (${byteLen} bytes) exceeds maxBytes (${maxBytes})`);
|
|
493
|
+
}
|
|
494
|
+
const json = escapeScriptJson(rawJson);
|
|
470
495
|
const nonceAttr = nonce ? ` nonce="${escapeAttr(nonce)}"` : "";
|
|
471
496
|
return `<script${nonceAttr}>window.${SSR_DATA_ATTR}=${json}</script>`;
|
|
472
497
|
}
|
|
473
498
|
function deserializeState(validate) {
|
|
474
499
|
if (typeof window === "undefined") return void 0;
|
|
475
|
-
|
|
500
|
+
if (_isDev && !validate) {
|
|
501
|
+
console.warn(
|
|
502
|
+
"[SibuJS SSR] deserializeState() called without a validate guard \u2014 tampered SSR payloads will not be detected."
|
|
503
|
+
);
|
|
504
|
+
}
|
|
505
|
+
const w = window;
|
|
506
|
+
const raw = w[SSR_DATA_ATTR];
|
|
476
507
|
if (raw === void 0) return void 0;
|
|
477
508
|
if (validate && !validate(raw)) return void 0;
|
|
478
509
|
return raw;
|
|
@@ -1,19 +1,22 @@
|
|
|
1
1
|
import {
|
|
2
|
-
bindAttribute
|
|
2
|
+
bindAttribute
|
|
3
|
+
} from "./chunk-DFPFITST.js";
|
|
4
|
+
import {
|
|
3
5
|
registerDisposer
|
|
4
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-2UPRY23K.js";
|
|
5
7
|
import {
|
|
6
8
|
isUrlAttribute,
|
|
7
9
|
sanitizeCSSValue,
|
|
10
|
+
sanitizeSrcset,
|
|
8
11
|
sanitizeUrl
|
|
9
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-UCS6AMJ7.js";
|
|
10
13
|
import {
|
|
11
14
|
track
|
|
12
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-VLPPXTYG.js";
|
|
13
16
|
import {
|
|
14
17
|
devWarn,
|
|
15
18
|
isDev
|
|
16
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-LMLD24FC.js";
|
|
17
20
|
|
|
18
21
|
// src/reactivity/bindChildNode.ts
|
|
19
22
|
var _isDev = isDev();
|
|
@@ -43,24 +46,29 @@ function bindChildNode(placeholder, getter) {
|
|
|
43
46
|
let newNodes;
|
|
44
47
|
if (Array.isArray(result)) {
|
|
45
48
|
newNodes = [];
|
|
49
|
+
const seen = /* @__PURE__ */ new Set();
|
|
46
50
|
for (let i = 0; i < result.length; i++) {
|
|
47
51
|
const item = result[i];
|
|
48
52
|
if (item == null || typeof item === "boolean") continue;
|
|
49
|
-
|
|
53
|
+
const node = item instanceof Node ? item : document.createTextNode(String(item));
|
|
54
|
+
if (seen.has(node)) {
|
|
55
|
+
if (_isDev)
|
|
56
|
+
devWarn("bindChildNode: duplicate node reference in array \u2014 only the first occurrence is rendered.");
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
seen.add(node);
|
|
60
|
+
newNodes.push(node);
|
|
50
61
|
}
|
|
51
62
|
} else {
|
|
52
63
|
const node = result instanceof Node ? result : document.createTextNode(String(result));
|
|
53
64
|
newNodes = [node];
|
|
54
65
|
}
|
|
55
|
-
|
|
56
|
-
if (
|
|
66
|
+
let reused;
|
|
67
|
+
if (lastNodes.length > 0 && newNodes.length > 0) {
|
|
68
|
+
const lastSet = new Set(lastNodes);
|
|
69
|
+
reused = /* @__PURE__ */ new Set();
|
|
57
70
|
for (let i = 0; i < newNodes.length; i++) {
|
|
58
|
-
|
|
59
|
-
if (newNodes[i] === lastNodes[j]) {
|
|
60
|
-
reused.add(newNodes[i]);
|
|
61
|
-
break;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
71
|
+
if (lastSet.has(newNodes[i])) reused.add(newNodes[i]);
|
|
64
72
|
}
|
|
65
73
|
}
|
|
66
74
|
for (let i = 0; i < lastNodes.length; i++) {
|
|
@@ -86,6 +94,30 @@ function bindChildNode(placeholder, getter) {
|
|
|
86
94
|
|
|
87
95
|
// src/core/rendering/tagFactory.ts
|
|
88
96
|
var SVG_NS = "http://www.w3.org/2000/svg";
|
|
97
|
+
var _isDev2 = isDev();
|
|
98
|
+
var BLOCKED_TAGS = /* @__PURE__ */ new Set(["script", "iframe", "object", "embed", "frame", "frameset"]);
|
|
99
|
+
function validateTagName(tag) {
|
|
100
|
+
const lower = tag.toLowerCase();
|
|
101
|
+
if (BLOCKED_TAGS.has(lower)) {
|
|
102
|
+
throw new Error(`tagFactory: refusing to create <${tag}> \u2014 tag is blocked for security reasons.`);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
var CLOBBER_RISKY_IDS = /* @__PURE__ */ new Set([
|
|
106
|
+
"config",
|
|
107
|
+
"location",
|
|
108
|
+
"history",
|
|
109
|
+
"document",
|
|
110
|
+
"window",
|
|
111
|
+
"navigator",
|
|
112
|
+
"name",
|
|
113
|
+
"top",
|
|
114
|
+
"parent",
|
|
115
|
+
"self",
|
|
116
|
+
"frames"
|
|
117
|
+
]);
|
|
118
|
+
function setProp(el, key, val) {
|
|
119
|
+
el[key] = val;
|
|
120
|
+
}
|
|
89
121
|
var kebabCache = /* @__PURE__ */ new Map();
|
|
90
122
|
function toKebab(prop) {
|
|
91
123
|
let cached = kebabCache.get(prop);
|
|
@@ -210,79 +242,103 @@ function appendChildren(el, nodes) {
|
|
|
210
242
|
}
|
|
211
243
|
}
|
|
212
244
|
}
|
|
213
|
-
var tagFactory = (tag, ns) =>
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
if (
|
|
218
|
-
|
|
219
|
-
|
|
245
|
+
var tagFactory = (tag, ns) => {
|
|
246
|
+
return (first, second) => {
|
|
247
|
+
validateTagName(tag);
|
|
248
|
+
const el = ns ? document.createElementNS(ns, tag) : document.createElement(tag);
|
|
249
|
+
if (first === void 0) return el;
|
|
250
|
+
if (typeof first === "string") {
|
|
251
|
+
if (second !== void 0) {
|
|
252
|
+
el.setAttribute("class", first);
|
|
253
|
+
appendChildren(el, second);
|
|
254
|
+
return el;
|
|
255
|
+
}
|
|
256
|
+
el.textContent = first;
|
|
220
257
|
return el;
|
|
221
258
|
}
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
if (typeof first === "number") {
|
|
226
|
-
el.textContent = String(first);
|
|
227
|
-
return el;
|
|
228
|
-
}
|
|
229
|
-
if (Array.isArray(first) || first instanceof Node || typeof first === "function") {
|
|
230
|
-
appendChildren(el, first);
|
|
231
|
-
return el;
|
|
232
|
-
}
|
|
233
|
-
const props = first;
|
|
234
|
-
const pClass = props.class;
|
|
235
|
-
if (pClass != null) applyClass(el, pClass);
|
|
236
|
-
const pId = props.id;
|
|
237
|
-
if (pId != null) el.id = pId;
|
|
238
|
-
const pNodes = second !== void 0 ? second : props.nodes;
|
|
239
|
-
if (pNodes != null) appendChildren(el, pNodes);
|
|
240
|
-
const pOn = props.on;
|
|
241
|
-
if (pOn) {
|
|
242
|
-
for (const ev in pOn) {
|
|
243
|
-
el.addEventListener(ev, pOn[ev]);
|
|
259
|
+
if (typeof first === "number") {
|
|
260
|
+
el.textContent = String(first);
|
|
261
|
+
return el;
|
|
244
262
|
}
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
263
|
+
if (Array.isArray(first) || first instanceof Node || typeof first === "function") {
|
|
264
|
+
appendChildren(el, first);
|
|
265
|
+
return el;
|
|
266
|
+
}
|
|
267
|
+
const props = first;
|
|
268
|
+
const pClass = props.class;
|
|
269
|
+
if (pClass != null) applyClass(el, pClass);
|
|
270
|
+
const pId = props.id;
|
|
271
|
+
if (pId != null) {
|
|
272
|
+
if (_isDev2 && typeof pId === "string" && CLOBBER_RISKY_IDS.has(pId.toLowerCase())) {
|
|
273
|
+
devWarn(
|
|
274
|
+
`tagFactory: element id="${pId}" matches a common global and may cause DOM clobbering. Avoid setting ids from untrusted input.`
|
|
275
|
+
);
|
|
276
|
+
}
|
|
277
|
+
el.id = pId;
|
|
278
|
+
}
|
|
279
|
+
const pNodes = second !== void 0 ? second : props.nodes;
|
|
280
|
+
if (pNodes != null) appendChildren(el, pNodes);
|
|
281
|
+
const pOn = props.on;
|
|
282
|
+
if (pOn) {
|
|
283
|
+
for (const ev in pOn) {
|
|
284
|
+
const handler = pOn[ev];
|
|
285
|
+
if (typeof handler === "function") {
|
|
286
|
+
el.addEventListener(ev, handler);
|
|
287
|
+
} else if (_isDev2) {
|
|
288
|
+
devWarn(
|
|
289
|
+
`tagFactory: on.${ev} handler is not a function (got ${typeof handler}). Event listener was not attached.`
|
|
290
|
+
);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const pStyle = props.style;
|
|
295
|
+
if (pStyle != null) applyStyle(el, pStyle);
|
|
296
|
+
const pRef = props.ref;
|
|
297
|
+
if (pRef) pRef.current = el;
|
|
298
|
+
for (const key in props) {
|
|
299
|
+
switch (key) {
|
|
300
|
+
case "class":
|
|
301
|
+
case "id":
|
|
302
|
+
case "nodes":
|
|
303
|
+
case "on":
|
|
304
|
+
case "style":
|
|
305
|
+
case "ref":
|
|
306
|
+
case "onElement":
|
|
307
|
+
continue;
|
|
308
|
+
// already handled above / below
|
|
309
|
+
default: {
|
|
310
|
+
const value = props[key];
|
|
311
|
+
if (value == null) continue;
|
|
312
|
+
const lkey = key.toLowerCase();
|
|
313
|
+
if (lkey[0] === "o" && lkey[1] === "n") continue;
|
|
314
|
+
if (typeof value === "function") {
|
|
315
|
+
registerDisposer(el, bindAttribute(el, key, value));
|
|
316
|
+
} else if (typeof value === "boolean") {
|
|
317
|
+
if (key in el && (key === "checked" || key === "disabled" || key === "selected")) {
|
|
318
|
+
setProp(el, key, value);
|
|
319
|
+
} else if (value) {
|
|
320
|
+
el.setAttribute(key, "");
|
|
321
|
+
} else {
|
|
322
|
+
el.removeAttribute(key);
|
|
323
|
+
}
|
|
272
324
|
} else {
|
|
273
|
-
|
|
325
|
+
const str = String(value);
|
|
326
|
+
if (lkey === "srcset") {
|
|
327
|
+
el.setAttribute(key, sanitizeSrcset(str));
|
|
328
|
+
} else if (isUrlAttribute(lkey)) {
|
|
329
|
+
el.setAttribute(key, sanitizeUrl(str));
|
|
330
|
+
} else {
|
|
331
|
+
el.setAttribute(key, str);
|
|
332
|
+
}
|
|
274
333
|
}
|
|
275
|
-
} else {
|
|
276
|
-
const str = String(value);
|
|
277
|
-
el.setAttribute(key, isUrlAttribute(key) ? sanitizeUrl(str) : str);
|
|
278
334
|
}
|
|
279
335
|
}
|
|
280
336
|
}
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
337
|
+
if (props.onElement && typeof props.onElement === "function") {
|
|
338
|
+
props.onElement(el);
|
|
339
|
+
}
|
|
340
|
+
return el;
|
|
341
|
+
};
|
|
286
342
|
};
|
|
287
343
|
|
|
288
344
|
export {
|
|
@@ -11,12 +11,12 @@ function isDev() {
|
|
|
11
11
|
var _isDev = isDev();
|
|
12
12
|
function devAssert(condition, message) {
|
|
13
13
|
if (_isDev && !condition) {
|
|
14
|
-
throw new Error(`[
|
|
14
|
+
throw new Error(`[SibuJS] ${message}`);
|
|
15
15
|
}
|
|
16
16
|
}
|
|
17
17
|
function devWarn(message) {
|
|
18
18
|
if (_isDev) {
|
|
19
|
-
console.warn(`[
|
|
19
|
+
console.warn(`[SibuJS] ${message}`);
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
22
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
renderToString
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-JYD2PWXH.js";
|
|
4
4
|
|
|
5
5
|
// src/plugins/modular.ts
|
|
6
6
|
function createModuleRegistry() {
|
|
@@ -476,7 +476,8 @@ function extractRangeTarget(range) {
|
|
|
476
476
|
function preloadCritical(resources) {
|
|
477
477
|
if (typeof document === "undefined") return;
|
|
478
478
|
for (const resource of resources) {
|
|
479
|
-
const
|
|
479
|
+
const safeHref = typeof CSS !== "undefined" && typeof CSS.escape === "function" ? CSS.escape(resource.href) : resource.href.replace(/["\\]/g, "\\$&");
|
|
480
|
+
const existing = document.querySelector(`link[rel="preload"][href="${safeHref}"]`);
|
|
480
481
|
if (existing) continue;
|
|
481
482
|
const link = document.createElement("link");
|
|
482
483
|
link.rel = "preload";
|