sibujs 1.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1630 -0
- package/dist/browser.cjs +815 -0
- package/dist/browser.d.cts +174 -0
- package/dist/browser.d.ts +174 -0
- package/dist/browser.js +458 -0
- package/dist/build.cjs +4970 -0
- package/dist/build.d.cts +630 -0
- package/dist/build.d.ts +630 -0
- package/dist/build.js +2478 -0
- package/dist/cdn.global.js +115 -0
- package/dist/chunk-27QC4FPL.js +67 -0
- package/dist/chunk-2ABBWCGC.js +65 -0
- package/dist/chunk-2MUNQYZ7.js +26 -0
- package/dist/chunk-2PSPKNUI.js +1711 -0
- package/dist/chunk-35CDLDX5.js +1758 -0
- package/dist/chunk-36MU4CFV.js +41 -0
- package/dist/chunk-3FIQOFI6.js +182 -0
- package/dist/chunk-3GHNC2BN.js +28 -0
- package/dist/chunk-3HLWWEPU.js +909 -0
- package/dist/chunk-3IVI3J54.js +252 -0
- package/dist/chunk-3KZ72WNW.js +944 -0
- package/dist/chunk-4AU64SQV.js +182 -0
- package/dist/chunk-4MOK7HAR.js +84 -0
- package/dist/chunk-4QK6FBDH.js +1429 -0
- package/dist/chunk-566Z7HXB.js +737 -0
- package/dist/chunk-5CRBB7XP.js +358 -0
- package/dist/chunk-5G67D3IZ.js +168 -0
- package/dist/chunk-5NCPAWBE.js +99 -0
- package/dist/chunk-5O2RKXR3.js +1444 -0
- package/dist/chunk-6BTBDO6A.js +633 -0
- package/dist/chunk-6IWEHW57.js +43 -0
- package/dist/chunk-6JGMNCD6.js +282 -0
- package/dist/chunk-6QRLJNXR.js +1425 -0
- package/dist/chunk-7HM5UE5T.js +270 -0
- package/dist/chunk-7JOLTGUH.js +58 -0
- package/dist/chunk-7MCWJCQK.js +909 -0
- package/dist/chunk-7RIIFP3E.js +1758 -0
- package/dist/chunk-7UASYN3G.js +254 -0
- package/dist/chunk-7W2WYHDI.js +741 -0
- package/dist/chunk-7Y35RDSJ.js +872 -0
- package/dist/chunk-A65GFJBL.js +65 -0
- package/dist/chunk-AD6ZIEDK.js +67 -0
- package/dist/chunk-AK5Y72F3.js +1426 -0
- package/dist/chunk-APOMMWH4.js +282 -0
- package/dist/chunk-ARZVTWIQ.js +1750 -0
- package/dist/chunk-AWWBM2BI.js +664 -0
- package/dist/chunk-AX5VEQTY.js +58 -0
- package/dist/chunk-AYTXVOW3.js +1708 -0
- package/dist/chunk-BG4A246G.js +1746 -0
- package/dist/chunk-BNFJJA2L.js +1425 -0
- package/dist/chunk-BPKPBVU5.js +59 -0
- package/dist/chunk-BPKPPSXC.js +282 -0
- package/dist/chunk-BPWKKK7F.js +1711 -0
- package/dist/chunk-CCKX6YTC.js +1735 -0
- package/dist/chunk-CIF5Z3MP.js +58 -0
- package/dist/chunk-CSXYU7IO.js +457 -0
- package/dist/chunk-D6JD4FDC.js +26 -0
- package/dist/chunk-E7NGA7X2.js +59 -0
- package/dist/chunk-EEPPJKAE.js +443 -0
- package/dist/chunk-EJMYGAGQ.js +717 -0
- package/dist/chunk-EL6Z5MDY.js +55 -0
- package/dist/chunk-EP7VRLEB.js +41 -0
- package/dist/chunk-ETMEC6FH.js +99 -0
- package/dist/chunk-EZ2WHYVL.js +65 -0
- package/dist/chunk-EZRVMSZK.js +67 -0
- package/dist/chunk-F2TRGINX.js +254 -0
- package/dist/chunk-F5JCIH3Q.js +642 -0
- package/dist/chunk-FGK3JKMN.js +909 -0
- package/dist/chunk-FQWPKSTD.js +1437 -0
- package/dist/chunk-FWHVLMCI.js +26 -0
- package/dist/chunk-GBEYQRO2.js +303 -0
- package/dist/chunk-GBLES3NK.js +248 -0
- package/dist/chunk-GQVGUQW6.js +1436 -0
- package/dist/chunk-HCV2T76T.js +457 -0
- package/dist/chunk-HS7ZKVPR.js +182 -0
- package/dist/chunk-HXDVV7HZ.js +909 -0
- package/dist/chunk-IB23VMO3.js +1746 -0
- package/dist/chunk-IEMZ7RTT.js +99 -0
- package/dist/chunk-IPGRSN42.js +1750 -0
- package/dist/chunk-IVMOK2QN.js +1750 -0
- package/dist/chunk-JCLGQO7T.js +443 -0
- package/dist/chunk-JDXL7KDB.js +1436 -0
- package/dist/chunk-JIIFW636.js +270 -0
- package/dist/chunk-JWGEEH7H.js +944 -0
- package/dist/chunk-K2BESAG7.js +1688 -0
- package/dist/chunk-K2U5YGF4.js +877 -0
- package/dist/chunk-K45FQ4Y4.js +175 -0
- package/dist/chunk-K7BPE427.js +1432 -0
- package/dist/chunk-KL3266RS.js +26 -0
- package/dist/chunk-KNN4P7DZ.js +84 -0
- package/dist/chunk-KP2DZH5Q.js +254 -0
- package/dist/chunk-KZHAJSQR.js +1636 -0
- package/dist/chunk-LBKGHMQV.js +1750 -0
- package/dist/chunk-LBTEPL7A.js +1731 -0
- package/dist/chunk-LEBBPTDB.js +1444 -0
- package/dist/chunk-LLH63WVQ.js +98 -0
- package/dist/chunk-LWVR2C4G.js +1711 -0
- package/dist/chunk-M3MDTVV2.js +896 -0
- package/dist/chunk-M5GNLDEO.js +303 -0
- package/dist/chunk-MFHVGKET.js +267 -0
- package/dist/chunk-MGWSG3PM.js +358 -0
- package/dist/chunk-MJNB47HB.js +19 -0
- package/dist/chunk-MLKGABMK.js +9 -0
- package/dist/chunk-MQWTY3JY.js +944 -0
- package/dist/chunk-MZZOQHNI.js +642 -0
- package/dist/chunk-NIHWGZS4.js +1426 -0
- package/dist/chunk-NSVVHQK5.js +41 -0
- package/dist/chunk-NVI2WE7D.js +443 -0
- package/dist/chunk-O7QBO3PH.js +58 -0
- package/dist/chunk-OAUPQBO2.js +270 -0
- package/dist/chunk-OB2LMD7C.js +297 -0
- package/dist/chunk-OHEYBWQU.js +58 -0
- package/dist/chunk-OI6OXUHJ.js +443 -0
- package/dist/chunk-OX2VMRMV.js +633 -0
- package/dist/chunk-P4FYE5TX.js +866 -0
- package/dist/chunk-P5KFWM4H.js +98 -0
- package/dist/chunk-PUMLE7RJ.js +1711 -0
- package/dist/chunk-Q4MFANBF.js +282 -0
- package/dist/chunk-QLEKZMMU.js +282 -0
- package/dist/chunk-RGGNGVO3.js +98 -0
- package/dist/chunk-RKJDRVV6.js +443 -0
- package/dist/chunk-S5BHU353.js +43 -0
- package/dist/chunk-SHQUSFH7.js +1426 -0
- package/dist/chunk-SMB4DBMD.js +182 -0
- package/dist/chunk-SNYHQP3D.js +743 -0
- package/dist/chunk-T24L3TBF.js +1717 -0
- package/dist/chunk-TAQNSOKT.js +692 -0
- package/dist/chunk-TDNY4SUA.js +41 -0
- package/dist/chunk-TNNF56IQ.js +1750 -0
- package/dist/chunk-TR7E6LYX.js +457 -0
- package/dist/chunk-URWUFH45.js +98 -0
- package/dist/chunk-UUSIH3XH.js +1429 -0
- package/dist/chunk-UYFNXLKR.js +1436 -0
- package/dist/chunk-V6F7KUWD.js +270 -0
- package/dist/chunk-VCZLXRMR.js +254 -0
- package/dist/chunk-VDHXSSBT.js +1426 -0
- package/dist/chunk-VM4QMKVK.js +254 -0
- package/dist/chunk-VWGYKYL2.js +737 -0
- package/dist/chunk-VX2OFBJN.js +1426 -0
- package/dist/chunk-VXVIE6DG.js +84 -0
- package/dist/chunk-W4OH7HG4.js +40 -0
- package/dist/chunk-WBVJX4GZ.js +98 -0
- package/dist/chunk-WDU2ZV4I.js +1426 -0
- package/dist/chunk-X6VUCICU.js +457 -0
- package/dist/chunk-XAY7FM7Y.js +618 -0
- package/dist/chunk-XJZ5Z2CM.js +642 -0
- package/dist/chunk-XKVFQTJJ.js +254 -0
- package/dist/chunk-XRLFASCY.js +22 -0
- package/dist/chunk-XYU6TZOW.js +182 -0
- package/dist/chunk-Y745CBVB.js +944 -0
- package/dist/chunk-YLBJSXYY.js +944 -0
- package/dist/chunk-YQJIKVPZ.js +1429 -0
- package/dist/chunk-YRM2VCZF.js +457 -0
- package/dist/chunk-YS33KBVJ.js +944 -0
- package/dist/chunk-Z27DZPDG.js +41 -0
- package/dist/chunk-ZXQ5NAEN.js +32 -0
- package/dist/contracts-B552GopR.d.cts +245 -0
- package/dist/contracts-B552GopR.d.ts +245 -0
- package/dist/contracts-Bg1ECISC.d.cts +245 -0
- package/dist/contracts-Bg1ECISC.d.ts +245 -0
- package/dist/contracts-CMriKJ6P.d.cts +245 -0
- package/dist/contracts-CMriKJ6P.d.ts +245 -0
- package/dist/contracts-DOrhwbke.d.cts +245 -0
- package/dist/contracts-DOrhwbke.d.ts +245 -0
- package/dist/data.cjs +1373 -0
- package/dist/data.d.cts +434 -0
- package/dist/data.d.ts +434 -0
- package/dist/data.js +945 -0
- package/dist/devtools.cjs +1357 -0
- package/dist/devtools.d.cts +473 -0
- package/dist/devtools.d.ts +473 -0
- package/dist/devtools.js +1084 -0
- package/dist/ecosystem.cjs +1046 -0
- package/dist/ecosystem.d.cts +247 -0
- package/dist/ecosystem.d.ts +247 -0
- package/dist/ecosystem.js +369 -0
- package/dist/extras.cjs +8457 -0
- package/dist/extras.d.cts +2356 -0
- package/dist/extras.d.ts +2356 -0
- package/dist/extras.js +5152 -0
- package/dist/index.cjs +2648 -0
- package/dist/index.d.cts +869 -0
- package/dist/index.d.ts +869 -0
- package/dist/index.js +386 -0
- package/dist/motion.cjs +604 -0
- package/dist/motion.d.cts +146 -0
- package/dist/motion.d.ts +146 -0
- package/dist/motion.js +346 -0
- package/dist/patterns.cjs +815 -0
- package/dist/patterns.d.cts +163 -0
- package/dist/patterns.d.ts +163 -0
- package/dist/patterns.js +296 -0
- package/dist/performance.cjs +927 -0
- package/dist/performance.d.cts +416 -0
- package/dist/performance.d.ts +416 -0
- package/dist/performance.js +654 -0
- package/dist/plugins.cjs +2487 -0
- package/dist/plugins.d.cts +393 -0
- package/dist/plugins.d.ts +393 -0
- package/dist/plugins.js +1504 -0
- package/dist/signal-BnWpq6WB.d.cts +5 -0
- package/dist/signal-BnWpq6WB.d.ts +5 -0
- package/dist/src/components/ErrorBoundary.d.ts +15 -0
- package/dist/src/components/ErrorBoundary.js +119 -0
- package/dist/src/core/catch.d.ts +11 -0
- package/dist/src/core/catch.js +28 -0
- package/dist/src/core/each.d.ts +13 -0
- package/dist/src/core/each.js +68 -0
- package/dist/src/core/for.d.ts +12 -0
- package/dist/src/core/for.js +67 -0
- package/dist/src/core/html.d.ts +137 -0
- package/dist/src/core/html.js +155 -0
- package/dist/src/core/htmlIf.d.ts +11 -0
- package/dist/src/core/htmlIf.js +18 -0
- package/dist/src/core/lazy.d.ts +7 -0
- package/dist/src/core/lazy.js +16 -0
- package/dist/src/core/mount.d.ts +7 -0
- package/dist/src/core/mount.js +12 -0
- package/dist/src/core/slots.d.ts +3 -0
- package/dist/src/core/slots.js +3 -0
- package/dist/src/core/suspense.d.ts +10 -0
- package/dist/src/core/suspense.js +33 -0
- package/dist/src/core/tagFactory.d.ts +13 -0
- package/dist/src/core/tagFactory.js +86 -0
- package/dist/src/core/test.d.ts +11 -0
- package/dist/src/core/test.js +28 -0
- package/dist/src/core/types.d.ts +2 -0
- package/dist/src/core/types.js +1 -0
- package/dist/src/core/useComputed.d.ts +6 -0
- package/dist/src/core/useComputed.js +30 -0
- package/dist/src/core/useEffect.d.ts +6 -0
- package/dist/src/core/useEffect.js +23 -0
- package/dist/src/core/useState.d.ts +10 -0
- package/dist/src/core/useState.js +34 -0
- package/dist/src/core/useStore.d.ts +19 -0
- package/dist/src/core/useStore.js +53 -0
- package/dist/src/core/useWatch.d.ts +8 -0
- package/dist/src/core/useWatch.js +23 -0
- package/dist/src/plugins/i18n.d.ts +6 -0
- package/dist/src/plugins/i18n.js +16 -0
- package/dist/src/plugins/router.d.ts +188 -0
- package/dist/src/plugins/router.js +1178 -0
- package/dist/src/reactivity/bindAttribute.d.ts +5 -0
- package/dist/src/reactivity/bindAttribute.js +31 -0
- package/dist/src/reactivity/bindChildNode.d.ts +10 -0
- package/dist/src/reactivity/bindChildNode.js +46 -0
- package/dist/src/reactivity/bindTextNode.d.ts +10 -0
- package/dist/src/reactivity/bindTextNode.js +27 -0
- package/dist/src/reactivity/signal.d.ts +3 -0
- package/dist/src/reactivity/signal.js +1 -0
- package/dist/src/reactivity/track.d.ts +18 -0
- package/dist/src/reactivity/track.js +73 -0
- package/dist/src/reactivity/useComputed.d.ts +6 -0
- package/dist/src/reactivity/useComputed.js +30 -0
- package/dist/src/reactivity/useEffect.d.ts +6 -0
- package/dist/src/reactivity/useEffect.js +23 -0
- package/dist/src/reactivity/useState.d.ts +10 -0
- package/dist/src/reactivity/useState.js +34 -0
- package/dist/src/reactivity/useStore.d.ts +19 -0
- package/dist/src/reactivity/useStore.js +53 -0
- package/dist/src/reactivity/useWatch.d.ts +8 -0
- package/dist/src/reactivity/useWatch.js +23 -0
- package/dist/src/utils/sanitize.d.ts +1 -0
- package/dist/src/utils/sanitize.js +8 -0
- package/dist/ssr-27FOM46T.js +35 -0
- package/dist/ssr-GFUTTSJD.js +22 -0
- package/dist/ssr-K7DCR6BZ.js +35 -0
- package/dist/ssr-O6LFMRFP.js +35 -0
- package/dist/ssr-QZEVGMMK.js +35 -0
- package/dist/ssr-SGVBCAGC.js +35 -0
- package/dist/ssr-UB2IXCYX.js +35 -0
- package/dist/ssr-XBZQNV4O.js +22 -0
- package/dist/ssr-Y76FSXDU.js +35 -0
- package/dist/ssr-YQJ4AYBD.js +35 -0
- package/dist/ssr.cjs +1757 -0
- package/dist/ssr.d.cts +478 -0
- package/dist/ssr.d.ts +478 -0
- package/dist/ssr.js +743 -0
- package/dist/tagFactory-CZPO4RXF.d.cts +34 -0
- package/dist/tagFactory-CZPO4RXF.d.ts +34 -0
- package/dist/tagFactory-CgImPVMY.d.cts +22 -0
- package/dist/tagFactory-CgImPVMY.d.ts +22 -0
- package/dist/tagFactory-Cw1iv5if.d.cts +22 -0
- package/dist/tagFactory-Cw1iv5if.d.ts +22 -0
- package/dist/tagFactory-DeAXq9ef.d.cts +30 -0
- package/dist/tagFactory-DeAXq9ef.d.ts +30 -0
- package/dist/tagFactory-SkY0a7L1.d.cts +22 -0
- package/dist/tagFactory-SkY0a7L1.d.ts +22 -0
- package/dist/testing.cjs +1919 -0
- package/dist/testing.d.cts +491 -0
- package/dist/testing.d.ts +491 -0
- package/dist/testing.js +1862 -0
- package/dist/ui.cjs +1497 -0
- package/dist/ui.d.cts +264 -0
- package/dist/ui.d.ts +264 -0
- package/dist/ui.js +900 -0
- package/dist/widgets.cjs +919 -0
- package/dist/widgets.d.cts +165 -0
- package/dist/widgets.d.ts +165 -0
- package/dist/widgets.js +545 -0
- package/package.json +134 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import {
|
|
2
|
+
notifySubscribers,
|
|
3
|
+
recordDependency,
|
|
4
|
+
track
|
|
5
|
+
} from "./chunk-MZZOQHNI.js";
|
|
6
|
+
|
|
7
|
+
// src/core/useEffect.ts
|
|
8
|
+
function useEffect(effectFn) {
|
|
9
|
+
let cleanupHandle = () => {
|
|
10
|
+
};
|
|
11
|
+
const subscriber = () => {
|
|
12
|
+
cleanupHandle();
|
|
13
|
+
cleanupHandle = track(effectFn, subscriber);
|
|
14
|
+
};
|
|
15
|
+
cleanupHandle = track(effectFn, subscriber);
|
|
16
|
+
return () => {
|
|
17
|
+
cleanupHandle();
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// src/core/useComputed.ts
|
|
22
|
+
function useComputed(getter) {
|
|
23
|
+
let value = getter();
|
|
24
|
+
const computedSignal = {};
|
|
25
|
+
const recompute = () => {
|
|
26
|
+
const next = getter();
|
|
27
|
+
if (Object.is(next, value)) return;
|
|
28
|
+
value = next;
|
|
29
|
+
notifySubscribers(computedSignal);
|
|
30
|
+
};
|
|
31
|
+
track(recompute);
|
|
32
|
+
return function computedGetter() {
|
|
33
|
+
recordDependency(computedSignal);
|
|
34
|
+
return value;
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export {
|
|
39
|
+
useEffect,
|
|
40
|
+
useComputed
|
|
41
|
+
};
|
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
import {
|
|
2
|
+
sbDerived
|
|
3
|
+
} from "./chunk-A65GFJBL.js";
|
|
4
|
+
import {
|
|
5
|
+
sbEffect
|
|
6
|
+
} from "./chunk-7JOLTGUH.js";
|
|
7
|
+
import {
|
|
8
|
+
sbSignal
|
|
9
|
+
} from "./chunk-GBEYQRO2.js";
|
|
10
|
+
|
|
11
|
+
// src/core/patterns/machine.ts
|
|
12
|
+
function sbMachine(config) {
|
|
13
|
+
const [state, setState] = sbSignal(config.initial);
|
|
14
|
+
const [context, setContext] = sbSignal(config.context || {});
|
|
15
|
+
const initialDef = config.states[config.initial];
|
|
16
|
+
if (initialDef?.entry) {
|
|
17
|
+
initialDef.entry(context());
|
|
18
|
+
}
|
|
19
|
+
function send(event) {
|
|
20
|
+
const currentState = state();
|
|
21
|
+
const stateDef = config.states[currentState];
|
|
22
|
+
if (!stateDef?.on) return;
|
|
23
|
+
const transition = stateDef.on[event];
|
|
24
|
+
if (!transition) return;
|
|
25
|
+
let target;
|
|
26
|
+
let guard;
|
|
27
|
+
let action;
|
|
28
|
+
if (typeof transition === "string") {
|
|
29
|
+
target = transition;
|
|
30
|
+
} else {
|
|
31
|
+
target = transition.target;
|
|
32
|
+
guard = transition.guard;
|
|
33
|
+
action = transition.action;
|
|
34
|
+
}
|
|
35
|
+
const ctx = context();
|
|
36
|
+
if (guard && !guard(ctx)) return;
|
|
37
|
+
if (stateDef.exit) {
|
|
38
|
+
stateDef.exit(ctx);
|
|
39
|
+
}
|
|
40
|
+
if (action) {
|
|
41
|
+
const patch = action(ctx);
|
|
42
|
+
setContext({ ...ctx, ...patch });
|
|
43
|
+
}
|
|
44
|
+
setState(target);
|
|
45
|
+
const targetDef = config.states[target];
|
|
46
|
+
if (targetDef?.entry) {
|
|
47
|
+
targetDef.entry(context());
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function matches(s) {
|
|
51
|
+
return state() === s;
|
|
52
|
+
}
|
|
53
|
+
function can(event) {
|
|
54
|
+
const currentState = state();
|
|
55
|
+
const stateDef = config.states[currentState];
|
|
56
|
+
if (!stateDef?.on) return false;
|
|
57
|
+
const transition = stateDef.on[event];
|
|
58
|
+
if (!transition) return false;
|
|
59
|
+
if (typeof transition === "string") return true;
|
|
60
|
+
if (transition.guard) {
|
|
61
|
+
return transition.guard(context());
|
|
62
|
+
}
|
|
63
|
+
return true;
|
|
64
|
+
}
|
|
65
|
+
return { state, context, send, matches, can };
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/core/patterns/persist.ts
|
|
69
|
+
function sbPersisted(key, initial, options = {}) {
|
|
70
|
+
const storage = options.session ? sessionStorage : localStorage;
|
|
71
|
+
const serialize = options.serialize || JSON.stringify;
|
|
72
|
+
const deserialize = options.deserialize || JSON.parse;
|
|
73
|
+
let restored = initial;
|
|
74
|
+
try {
|
|
75
|
+
const raw = storage.getItem(key);
|
|
76
|
+
if (raw !== null) {
|
|
77
|
+
const parsed = deserialize(raw);
|
|
78
|
+
restored = options.validate && !options.validate(parsed) ? initial : parsed;
|
|
79
|
+
}
|
|
80
|
+
} catch {
|
|
81
|
+
}
|
|
82
|
+
const [value, setValue] = sbSignal(restored);
|
|
83
|
+
sbEffect(() => {
|
|
84
|
+
const current = value();
|
|
85
|
+
try {
|
|
86
|
+
storage.setItem(key, serialize(current));
|
|
87
|
+
} catch {
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
return [value, setValue];
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// src/core/patterns/optimistic.ts
|
|
94
|
+
function sbOptimistic(initialValue) {
|
|
95
|
+
const [value, setValue] = sbSignal(initialValue);
|
|
96
|
+
const [_pending, setPending] = sbSignal(false);
|
|
97
|
+
async function addOptimistic(optimisticValue, asyncAction) {
|
|
98
|
+
const previousValue = value();
|
|
99
|
+
setValue(optimisticValue);
|
|
100
|
+
setPending(true);
|
|
101
|
+
try {
|
|
102
|
+
const result = await asyncAction();
|
|
103
|
+
setValue(result);
|
|
104
|
+
} catch {
|
|
105
|
+
setValue(previousValue);
|
|
106
|
+
} finally {
|
|
107
|
+
setPending(false);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
return [value, addOptimistic];
|
|
111
|
+
}
|
|
112
|
+
function sbOptimisticList(initialValue) {
|
|
113
|
+
const [items, setItems] = sbSignal([...initialValue]);
|
|
114
|
+
async function addOptimistic(item, asyncAction) {
|
|
115
|
+
const prev = items();
|
|
116
|
+
setItems([...prev, item]);
|
|
117
|
+
try {
|
|
118
|
+
const result = await asyncAction();
|
|
119
|
+
setItems([...prev, result]);
|
|
120
|
+
} catch {
|
|
121
|
+
setItems(prev);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
async function removeOptimistic(predicate, asyncAction) {
|
|
125
|
+
const prev = items();
|
|
126
|
+
setItems(prev.filter((item) => !predicate(item)));
|
|
127
|
+
try {
|
|
128
|
+
await asyncAction();
|
|
129
|
+
} catch {
|
|
130
|
+
setItems(prev);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
async function updateOptimistic(predicate, update, asyncAction) {
|
|
134
|
+
const prev = items();
|
|
135
|
+
setItems(prev.map((item) => predicate(item) ? { ...item, ...update } : item));
|
|
136
|
+
try {
|
|
137
|
+
const result = await asyncAction();
|
|
138
|
+
setItems(prev.map((item) => predicate(item) ? result : item));
|
|
139
|
+
} catch {
|
|
140
|
+
setItems(prev);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return { items, addOptimistic, removeOptimistic, updateOptimistic };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// src/core/patterns/timeTravel.ts
|
|
147
|
+
function sbTimeline(initial, maxHistory = 100) {
|
|
148
|
+
const [history, setHistory] = sbSignal([initial]);
|
|
149
|
+
const [index, setIndex] = sbSignal(0);
|
|
150
|
+
const value = sbDerived(() => history()[index()]);
|
|
151
|
+
const canUndo = sbDerived(() => index() > 0);
|
|
152
|
+
const canRedo = sbDerived(() => index() < history().length - 1);
|
|
153
|
+
function set(next) {
|
|
154
|
+
const current = value();
|
|
155
|
+
const newValue = typeof next === "function" ? next(current) : next;
|
|
156
|
+
if (Object.is(newValue, current)) return;
|
|
157
|
+
const hist = history();
|
|
158
|
+
const idx = index();
|
|
159
|
+
const newHistory = hist.slice(0, idx + 1);
|
|
160
|
+
newHistory.push(newValue);
|
|
161
|
+
if (newHistory.length > maxHistory) {
|
|
162
|
+
newHistory.shift();
|
|
163
|
+
setHistory(newHistory);
|
|
164
|
+
setIndex(newHistory.length - 1);
|
|
165
|
+
} else {
|
|
166
|
+
setHistory(newHistory);
|
|
167
|
+
setIndex(idx + 1);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
function undo() {
|
|
171
|
+
if (canUndo()) {
|
|
172
|
+
setIndex(index() - 1);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
function redo() {
|
|
176
|
+
if (canRedo()) {
|
|
177
|
+
setIndex(index() + 1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function reset() {
|
|
181
|
+
setHistory([initial]);
|
|
182
|
+
setIndex(0);
|
|
183
|
+
}
|
|
184
|
+
function jumpTo(targetIndex) {
|
|
185
|
+
const hist = history();
|
|
186
|
+
if (targetIndex >= 0 && targetIndex < hist.length) {
|
|
187
|
+
setIndex(targetIndex);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return { value, set, undo, redo, canUndo, canRedo, history, index, reset, jumpTo };
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// src/core/patterns/globalStore.ts
|
|
194
|
+
function createGlobalStore(config) {
|
|
195
|
+
const initialState = { ...config.state };
|
|
196
|
+
const [getState, setState] = sbSignal({ ...initialState });
|
|
197
|
+
const listeners = /* @__PURE__ */ new Set();
|
|
198
|
+
const middlewares = config.middleware || [];
|
|
199
|
+
function dispatch(action, payload) {
|
|
200
|
+
const actionFn = config.actions[action];
|
|
201
|
+
if (!actionFn) throw new Error(`Unknown action: ${String(action)}`);
|
|
202
|
+
const execute = () => {
|
|
203
|
+
const current = getState();
|
|
204
|
+
const patch = actionFn(current, payload);
|
|
205
|
+
setState({ ...current, ...patch });
|
|
206
|
+
const newState = getState();
|
|
207
|
+
for (const listener of listeners) {
|
|
208
|
+
listener(newState);
|
|
209
|
+
}
|
|
210
|
+
};
|
|
211
|
+
if (middlewares.length === 0) {
|
|
212
|
+
execute();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
let index = 0;
|
|
216
|
+
const next = () => {
|
|
217
|
+
if (index < middlewares.length) {
|
|
218
|
+
const mw = middlewares[index++];
|
|
219
|
+
mw(getState(), String(action), payload, next);
|
|
220
|
+
} else {
|
|
221
|
+
execute();
|
|
222
|
+
}
|
|
223
|
+
};
|
|
224
|
+
next();
|
|
225
|
+
}
|
|
226
|
+
function select(selector) {
|
|
227
|
+
return sbDerived(() => selector(getState()));
|
|
228
|
+
}
|
|
229
|
+
function subscribe(callback) {
|
|
230
|
+
listeners.add(callback);
|
|
231
|
+
return () => listeners.delete(callback);
|
|
232
|
+
}
|
|
233
|
+
function reset() {
|
|
234
|
+
setState({ ...initialState });
|
|
235
|
+
for (const listener of listeners) {
|
|
236
|
+
listener(getState());
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return { getState, select, dispatch, subscribe, reset };
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// src/core/patterns/primitives.ts
|
|
243
|
+
function createSignal(value) {
|
|
244
|
+
return sbSignal(value);
|
|
245
|
+
}
|
|
246
|
+
function createMemo(fn) {
|
|
247
|
+
return sbDerived(fn);
|
|
248
|
+
}
|
|
249
|
+
function createEffect(fn) {
|
|
250
|
+
return sbEffect(fn);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// src/core/patterns/hoc.ts
|
|
254
|
+
function withWrapper(WrappedComponent, wrapper) {
|
|
255
|
+
return (props) => wrapper(WrappedComponent, props);
|
|
256
|
+
}
|
|
257
|
+
function withDefaults(component, defaults) {
|
|
258
|
+
return (props) => component({ ...defaults, ...props });
|
|
259
|
+
}
|
|
260
|
+
function compose(...wrappers) {
|
|
261
|
+
return (component) => wrappers.reduceRight((comp, wrapper) => wrapper(comp), component);
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
// src/core/patterns/composable.ts
|
|
265
|
+
function createComposable(setup) {
|
|
266
|
+
return setup;
|
|
267
|
+
}
|
|
268
|
+
function RenderProp(props) {
|
|
269
|
+
return props.render(props.data());
|
|
270
|
+
}
|
|
271
|
+
function withBoundary(name, component) {
|
|
272
|
+
return (props) => {
|
|
273
|
+
const wrapper = document.createElement("div");
|
|
274
|
+
wrapper.setAttribute("data-sibu-boundary", name);
|
|
275
|
+
try {
|
|
276
|
+
const el = component(props);
|
|
277
|
+
wrapper.appendChild(el);
|
|
278
|
+
} catch (error) {
|
|
279
|
+
const errorEl = document.createElement("div");
|
|
280
|
+
errorEl.setAttribute("data-sibu-boundary-error", name);
|
|
281
|
+
errorEl.style.cssText = "color: red; border: 1px solid red; padding: 8px; margin: 4px;";
|
|
282
|
+
errorEl.textContent = `[${name}] ${error instanceof Error ? error.message : String(error)}`;
|
|
283
|
+
wrapper.appendChild(errorEl);
|
|
284
|
+
}
|
|
285
|
+
return wrapper;
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
function createSlots(slots) {
|
|
289
|
+
return {
|
|
290
|
+
renderSlot(name, fallback) {
|
|
291
|
+
const slotFn = slots[name];
|
|
292
|
+
if (slotFn) {
|
|
293
|
+
const result = slotFn();
|
|
294
|
+
if (Array.isArray(result)) {
|
|
295
|
+
const fragment = document.createElement("div");
|
|
296
|
+
fragment.style.display = "contents";
|
|
297
|
+
for (const el of result) fragment.appendChild(el);
|
|
298
|
+
return fragment;
|
|
299
|
+
}
|
|
300
|
+
return result;
|
|
301
|
+
}
|
|
302
|
+
return fallback ? fallback() : null;
|
|
303
|
+
},
|
|
304
|
+
hasSlot(name) {
|
|
305
|
+
return name in slots;
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
// src/core/patterns/componentProps.ts
|
|
311
|
+
function defineComponent(config) {
|
|
312
|
+
const { defaults, setup } = config;
|
|
313
|
+
return (props) => {
|
|
314
|
+
const merged = defaults ? { ...defaults, ...props } : props;
|
|
315
|
+
return setup(merged);
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
function defineSlottedComponent(config) {
|
|
319
|
+
const { defaults, setup } = config;
|
|
320
|
+
return (props) => {
|
|
321
|
+
const merged = defaults ? { ...defaults, ...props } : props;
|
|
322
|
+
return setup(merged);
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
function withProps(component, mapProps) {
|
|
326
|
+
return (props) => component(mapProps(props));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
// src/core/patterns/contracts.ts
|
|
330
|
+
var validators = {
|
|
331
|
+
string: ((value, name) => typeof value === "string" || `${name} must be a string, got ${typeof value}`),
|
|
332
|
+
number: ((value, name) => typeof value === "number" || `${name} must be a number, got ${typeof value}`),
|
|
333
|
+
boolean: ((value, name) => typeof value === "boolean" || `${name} must be a boolean, got ${typeof value}`),
|
|
334
|
+
function: ((value, name) => typeof value === "function" || `${name} must be a function, got ${typeof value}`),
|
|
335
|
+
object: ((value, name) => typeof value === "object" && value !== null || `${name} must be an object`),
|
|
336
|
+
array: ((value, name) => Array.isArray(value) || `${name} must be an array`),
|
|
337
|
+
required: ((value, name) => value != null || `${name} is required`),
|
|
338
|
+
oneOf: (...values) => (value, name) => values.includes(value) || `${name} must be one of: ${values.join(", ")}`,
|
|
339
|
+
instanceOf: (ctor) => (value, name) => value instanceof ctor || `${name} must be an instance of ${ctor.name}`,
|
|
340
|
+
arrayOf: (itemValidator) => (value, name) => {
|
|
341
|
+
if (!Array.isArray(value)) return `${name} must be an array`;
|
|
342
|
+
for (let i = 0; i < value.length; i++) {
|
|
343
|
+
const result = itemValidator(value[i], `${name}[${i}]`);
|
|
344
|
+
if (result !== true) return result;
|
|
345
|
+
}
|
|
346
|
+
return true;
|
|
347
|
+
},
|
|
348
|
+
shape: (schema) => (value, name) => {
|
|
349
|
+
if (typeof value !== "object" || value === null) return `${name} must be an object`;
|
|
350
|
+
for (const [key, validator] of Object.entries(schema)) {
|
|
351
|
+
const result = validator(value[key], `${name}.${key}`);
|
|
352
|
+
if (result !== true) return result;
|
|
353
|
+
}
|
|
354
|
+
return true;
|
|
355
|
+
},
|
|
356
|
+
optional: (validator) => (value, name) => {
|
|
357
|
+
if (value == null) return true;
|
|
358
|
+
return validator(value, name);
|
|
359
|
+
},
|
|
360
|
+
range: (min, max) => (value, name) => {
|
|
361
|
+
if (typeof value !== "number") return `${name} must be a number`;
|
|
362
|
+
return value >= min && value <= max || `${name} must be between ${min} and ${max}`;
|
|
363
|
+
},
|
|
364
|
+
pattern: (regex) => (value, name) => {
|
|
365
|
+
if (typeof value !== "string") return `${name} must be a string`;
|
|
366
|
+
return regex.test(value) || `${name} must match pattern ${regex}`;
|
|
367
|
+
}
|
|
368
|
+
};
|
|
369
|
+
function validateProps(props, schema) {
|
|
370
|
+
const result = { ...props };
|
|
371
|
+
const errors = [];
|
|
372
|
+
const isDev = typeof process === "undefined" || process?.env?.NODE_ENV !== "production";
|
|
373
|
+
for (const [key, def] of Object.entries(schema)) {
|
|
374
|
+
const propDef = typeof def === "function" ? { type: def } : def;
|
|
375
|
+
if (result[key] == null && propDef.default !== void 0) {
|
|
376
|
+
result[key] = typeof propDef.default === "function" ? propDef.default() : propDef.default;
|
|
377
|
+
}
|
|
378
|
+
if (!isDev) continue;
|
|
379
|
+
if (propDef.required && result[key] == null) {
|
|
380
|
+
errors.push(`Prop '${key}' is required`);
|
|
381
|
+
continue;
|
|
382
|
+
}
|
|
383
|
+
if (result[key] == null) continue;
|
|
384
|
+
if (propDef.type) {
|
|
385
|
+
const typeResult = propDef.type(result[key], key);
|
|
386
|
+
if (typeResult !== true) errors.push(typeResult);
|
|
387
|
+
}
|
|
388
|
+
if (propDef.validator) {
|
|
389
|
+
const validResult = propDef.validator(result[key], key);
|
|
390
|
+
if (validResult !== true) errors.push(validResult);
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
if (errors.length > 0 && isDev) {
|
|
394
|
+
console.warn(`[SibuJS] Prop validation errors:
|
|
395
|
+
${errors.map((e) => ` - ${e}`).join("\n")}`);
|
|
396
|
+
}
|
|
397
|
+
return result;
|
|
398
|
+
}
|
|
399
|
+
function defineStrictComponent(config) {
|
|
400
|
+
return (props) => {
|
|
401
|
+
const validated = validateProps(props, config.props);
|
|
402
|
+
return config.setup(validated);
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
function assertType(value, validator, label) {
|
|
406
|
+
if (typeof process !== "undefined" && process?.env?.NODE_ENV === "production") return;
|
|
407
|
+
const result = validator(value, label || "value");
|
|
408
|
+
if (result !== true) {
|
|
409
|
+
throw new TypeError(`[SibuJS Contract] ${result}`);
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
function createGuard(validator) {
|
|
413
|
+
return (value) => {
|
|
414
|
+
return validator(value, "value") === true;
|
|
415
|
+
};
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
export {
|
|
419
|
+
sbMachine,
|
|
420
|
+
sbPersisted,
|
|
421
|
+
sbOptimistic,
|
|
422
|
+
sbOptimisticList,
|
|
423
|
+
sbTimeline,
|
|
424
|
+
createGlobalStore,
|
|
425
|
+
createSignal,
|
|
426
|
+
createMemo,
|
|
427
|
+
createEffect,
|
|
428
|
+
withWrapper,
|
|
429
|
+
withDefaults,
|
|
430
|
+
compose,
|
|
431
|
+
createComposable,
|
|
432
|
+
RenderProp,
|
|
433
|
+
withBoundary,
|
|
434
|
+
createSlots,
|
|
435
|
+
defineComponent,
|
|
436
|
+
defineSlottedComponent,
|
|
437
|
+
withProps,
|
|
438
|
+
validators,
|
|
439
|
+
validateProps,
|
|
440
|
+
defineStrictComponent,
|
|
441
|
+
assertType,
|
|
442
|
+
createGuard
|
|
443
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
devAssert
|
|
3
|
+
} from "./chunk-XRLFASCY.js";
|
|
4
|
+
import {
|
|
5
|
+
track
|
|
6
|
+
} from "./chunk-M5GNLDEO.js";
|
|
7
|
+
|
|
8
|
+
// src/core/ssr-context.ts
|
|
9
|
+
var ssrMode = false;
|
|
10
|
+
function isSSR() {
|
|
11
|
+
return ssrMode;
|
|
12
|
+
}
|
|
13
|
+
function enableSSR() {
|
|
14
|
+
ssrMode = true;
|
|
15
|
+
}
|
|
16
|
+
function disableSSR() {
|
|
17
|
+
ssrMode = false;
|
|
18
|
+
}
|
|
19
|
+
function withSSR(fn) {
|
|
20
|
+
enableSSR();
|
|
21
|
+
try {
|
|
22
|
+
return fn();
|
|
23
|
+
} finally {
|
|
24
|
+
disableSSR();
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// src/core/signals/effect.ts
|
|
29
|
+
function effect(effectFn) {
|
|
30
|
+
devAssert(typeof effectFn === "function", "effect: argument must be a function.");
|
|
31
|
+
if (isSSR()) return () => {
|
|
32
|
+
};
|
|
33
|
+
let runCount = 0;
|
|
34
|
+
let cleanupHandle = () => {
|
|
35
|
+
};
|
|
36
|
+
const hook = globalThis.__SIBU_DEVTOOLS_GLOBAL_HOOK__;
|
|
37
|
+
const subscriber = () => {
|
|
38
|
+
cleanupHandle();
|
|
39
|
+
runCount++;
|
|
40
|
+
if (hook) hook.emit("effect:run", { effectFn, runCount });
|
|
41
|
+
cleanupHandle = track(effectFn, subscriber);
|
|
42
|
+
};
|
|
43
|
+
cleanupHandle = track(effectFn, subscriber);
|
|
44
|
+
runCount = 1;
|
|
45
|
+
if (hook) hook.emit("effect:create", { effectFn });
|
|
46
|
+
return () => {
|
|
47
|
+
if (hook) hook.emit("effect:destroy", { effectFn });
|
|
48
|
+
cleanupHandle();
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export {
|
|
53
|
+
isSSR,
|
|
54
|
+
enableSSR,
|
|
55
|
+
disableSSR,
|
|
56
|
+
withSSR,
|
|
57
|
+
effect
|
|
58
|
+
};
|