@bquery/bquery 1.6.0 → 1.7.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/README.md +716 -586
- package/dist/a11y/announce.d.ts +43 -0
- package/dist/a11y/announce.d.ts.map +1 -0
- package/dist/a11y/audit.d.ts +42 -0
- package/dist/a11y/audit.d.ts.map +1 -0
- package/dist/a11y/index.d.ts +53 -0
- package/dist/a11y/index.d.ts.map +1 -0
- package/dist/a11y/media-preferences.d.ts +77 -0
- package/dist/a11y/media-preferences.d.ts.map +1 -0
- package/dist/a11y/roving-tab-index.d.ts +38 -0
- package/dist/a11y/roving-tab-index.d.ts.map +1 -0
- package/dist/a11y/skip-link.d.ts +37 -0
- package/dist/a11y/skip-link.d.ts.map +1 -0
- package/dist/a11y/trap-focus.d.ts +49 -0
- package/dist/a11y/trap-focus.d.ts.map +1 -0
- package/dist/a11y/types.d.ts +152 -0
- package/dist/a11y/types.d.ts.map +1 -0
- package/dist/a11y-C5QOVvRn.js +421 -0
- package/dist/a11y-C5QOVvRn.js.map +1 -0
- package/dist/a11y.es.mjs +14 -0
- package/dist/component/component.d.ts.map +1 -1
- package/dist/component/html.d.ts.map +1 -1
- package/dist/component/index.d.ts +2 -1
- package/dist/component/index.d.ts.map +1 -1
- package/dist/component/library.d.ts.map +1 -1
- package/dist/component/scope.d.ts +138 -0
- package/dist/component/scope.d.ts.map +1 -0
- package/dist/component/types.d.ts +53 -1
- package/dist/component/types.d.ts.map +1 -1
- package/dist/component-CuuTijA6.js +684 -0
- package/dist/component-CuuTijA6.js.map +1 -0
- package/dist/component.es.mjs +9 -6
- package/dist/{config-DRmZZno3.js → config-BW35FKuA.js} +4 -4
- package/dist/{config-DRmZZno3.js.map → config-BW35FKuA.js.map} +1 -1
- package/dist/constraints-3lV9yyBw.js +100 -0
- package/dist/constraints-3lV9yyBw.js.map +1 -0
- package/dist/core/collection.d.ts +48 -0
- package/dist/core/collection.d.ts.map +1 -1
- package/dist/core/element.d.ts +92 -0
- package/dist/core/element.d.ts.map +1 -1
- package/dist/core/env.d.ts +18 -0
- package/dist/core/env.d.ts.map +1 -0
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/shared.d.ts +8 -0
- package/dist/core/shared.d.ts.map +1 -1
- package/dist/core/utils/index.d.ts +52 -41
- package/dist/core/utils/index.d.ts.map +1 -1
- package/dist/core-Cjl7GUu8.js +717 -0
- package/dist/core-Cjl7GUu8.js.map +1 -0
- package/dist/core-DnlyjbF2.js +112 -0
- package/dist/core-DnlyjbF2.js.map +1 -0
- package/dist/core.es.mjs +45 -44
- package/dist/custom-directives-7wAShnnd.js +9 -0
- package/dist/custom-directives-7wAShnnd.js.map +1 -0
- package/dist/devtools/devtools.d.ts +212 -0
- package/dist/devtools/devtools.d.ts.map +1 -0
- package/dist/devtools/index.d.ts +20 -0
- package/dist/devtools/index.d.ts.map +1 -0
- package/dist/devtools/types.d.ts +69 -0
- package/dist/devtools/types.d.ts.map +1 -0
- package/dist/devtools-D2fQLhDN.js +122 -0
- package/dist/devtools-D2fQLhDN.js.map +1 -0
- package/dist/devtools.es.mjs +19 -0
- package/dist/dnd/draggable.d.ts +51 -0
- package/dist/dnd/draggable.d.ts.map +1 -0
- package/dist/dnd/droppable.d.ts +38 -0
- package/dist/dnd/droppable.d.ts.map +1 -0
- package/dist/dnd/index.d.ts +47 -0
- package/dist/dnd/index.d.ts.map +1 -0
- package/dist/dnd/sortable.d.ts +43 -0
- package/dist/dnd/sortable.d.ts.map +1 -0
- package/dist/dnd/types.d.ts +250 -0
- package/dist/dnd/types.d.ts.map +1 -0
- package/dist/dnd-B8EgyzaI.js +244 -0
- package/dist/dnd-B8EgyzaI.js.map +1 -0
- package/dist/dnd.es.mjs +6 -0
- package/dist/env-NeVmr4Gf.js +19 -0
- package/dist/env-NeVmr4Gf.js.map +1 -0
- package/dist/forms/create-form.d.ts +49 -0
- package/dist/forms/create-form.d.ts.map +1 -0
- package/dist/forms/index.d.ts +39 -0
- package/dist/forms/index.d.ts.map +1 -0
- package/dist/forms/types.d.ts +139 -0
- package/dist/forms/types.d.ts.map +1 -0
- package/dist/forms/validators.d.ts +179 -0
- package/dist/forms/validators.d.ts.map +1 -0
- package/dist/forms-C3yovgH9.js +141 -0
- package/dist/forms-C3yovgH9.js.map +1 -0
- package/dist/forms.es.mjs +14 -0
- package/dist/full.d.ts +35 -7
- package/dist/full.d.ts.map +1 -1
- package/dist/full.es.mjs +182 -91
- package/dist/full.iife.js +47 -31
- package/dist/full.iife.js.map +1 -1
- package/dist/full.umd.js +47 -31
- package/dist/full.umd.js.map +1 -1
- package/dist/i18n/formatting.d.ts +40 -0
- package/dist/i18n/formatting.d.ts.map +1 -0
- package/dist/i18n/i18n.d.ts +48 -0
- package/dist/i18n/i18n.d.ts.map +1 -0
- package/dist/i18n/index.d.ts +57 -0
- package/dist/i18n/index.d.ts.map +1 -0
- package/dist/i18n/translate.d.ts +83 -0
- package/dist/i18n/translate.d.ts.map +1 -0
- package/dist/i18n/types.d.ts +156 -0
- package/dist/i18n/types.d.ts.map +1 -0
- package/dist/i18n-BnnhTFOS.js +89 -0
- package/dist/i18n-BnnhTFOS.js.map +1 -0
- package/dist/i18n.es.mjs +6 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.es.mjs +227 -136
- package/dist/media/battery.d.ts +35 -0
- package/dist/media/battery.d.ts.map +1 -0
- package/dist/media/breakpoints.d.ts +51 -0
- package/dist/media/breakpoints.d.ts.map +1 -0
- package/dist/media/clipboard.d.ts +30 -0
- package/dist/media/clipboard.d.ts.map +1 -0
- package/dist/media/device-sensors.d.ts +54 -0
- package/dist/media/device-sensors.d.ts.map +1 -0
- package/dist/media/geolocation.d.ts +38 -0
- package/dist/media/geolocation.d.ts.map +1 -0
- package/dist/media/index.d.ts +42 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/media-query.d.ts +36 -0
- package/dist/media/media-query.d.ts.map +1 -0
- package/dist/media/network.d.ts +35 -0
- package/dist/media/network.d.ts.map +1 -0
- package/dist/media/types.d.ts +173 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/viewport.d.ts +32 -0
- package/dist/media/viewport.d.ts.map +1 -0
- package/dist/media-Di2Ta22s.js +340 -0
- package/dist/media-Di2Ta22s.js.map +1 -0
- package/dist/media.es.mjs +12 -0
- package/dist/motion/index.d.ts +7 -3
- package/dist/motion/index.d.ts.map +1 -1
- package/dist/motion/morph.d.ts +27 -0
- package/dist/motion/morph.d.ts.map +1 -0
- package/dist/motion/parallax.d.ts +30 -0
- package/dist/motion/parallax.d.ts.map +1 -0
- package/dist/motion/reduced-motion.d.ts +36 -3
- package/dist/motion/reduced-motion.d.ts.map +1 -1
- package/dist/motion/types.d.ts +58 -0
- package/dist/motion/types.d.ts.map +1 -1
- package/dist/motion/typewriter.d.ts +31 -0
- package/dist/motion/typewriter.d.ts.map +1 -0
- package/dist/motion-qPj_TYGv.js +530 -0
- package/dist/motion-qPj_TYGv.js.map +1 -0
- package/dist/motion.es.mjs +27 -23
- package/dist/{view-C70lA3vf.js → mount-SM07RUa6.js} +166 -160
- package/dist/mount-SM07RUa6.js.map +1 -0
- package/dist/{object-qGpWr6-J.js → object-BCk-1c8T.js} +5 -4
- package/dist/{object-qGpWr6-J.js.map → object-BCk-1c8T.js.map} +1 -1
- package/dist/{platform-Dr9b6fsq.js → platform-CPbCprb6.js} +21 -22
- package/dist/{platform-Dr9b6fsq.js.map → platform-CPbCprb6.js.map} +1 -1
- package/dist/platform.es.mjs +2 -2
- package/dist/plugin/index.d.ts +22 -0
- package/dist/plugin/index.d.ts.map +1 -0
- package/dist/plugin/registry.d.ts +108 -0
- package/dist/plugin/registry.d.ts.map +1 -0
- package/dist/plugin/types.d.ts +110 -0
- package/dist/plugin/types.d.ts.map +1 -0
- package/dist/plugin-cPoOHFLY.js +64 -0
- package/dist/plugin-cPoOHFLY.js.map +1 -0
- package/dist/plugin.es.mjs +9 -0
- package/dist/reactive/computed.d.ts +7 -0
- package/dist/reactive/computed.d.ts.map +1 -1
- package/dist/reactive-Cfv0RK6x.js +233 -0
- package/dist/reactive-Cfv0RK6x.js.map +1 -0
- package/dist/reactive.es.mjs +19 -20
- package/dist/registry-CWf368tT.js +26 -0
- package/dist/registry-CWf368tT.js.map +1 -0
- package/dist/router/bq-link.d.ts +112 -0
- package/dist/router/bq-link.d.ts.map +1 -0
- package/dist/router/constraints.d.ts +9 -0
- package/dist/router/constraints.d.ts.map +1 -0
- package/dist/router/index.d.ts +14 -6
- package/dist/router/index.d.ts.map +1 -1
- package/dist/router/match.d.ts +0 -1
- package/dist/router/match.d.ts.map +1 -1
- package/dist/router/path-pattern.d.ts +14 -0
- package/dist/router/path-pattern.d.ts.map +1 -0
- package/dist/router/query.d.ts.map +1 -1
- package/dist/router/router.d.ts +3 -1
- package/dist/router/router.d.ts.map +1 -1
- package/dist/router/types.d.ts +48 -4
- package/dist/router/types.d.ts.map +1 -1
- package/dist/router/use-route.d.ts +50 -0
- package/dist/router/use-route.d.ts.map +1 -0
- package/dist/router/utils.d.ts +3 -0
- package/dist/router/utils.d.ts.map +1 -1
- package/dist/router-BrthaP_z.js +473 -0
- package/dist/router-BrthaP_z.js.map +1 -0
- package/dist/router.es.mjs +13 -10
- package/dist/{sanitize-Bs2dkMby.js → sanitize-B1V4JswB.js} +2 -1
- package/dist/{sanitize-Bs2dkMby.js.map → sanitize-B1V4JswB.js.map} +1 -1
- package/dist/security/index.d.ts +2 -2
- package/dist/security/index.d.ts.map +1 -1
- package/dist/security.es.mjs +1 -1
- package/dist/ssr/hydrate.d.ts +65 -0
- package/dist/ssr/hydrate.d.ts.map +1 -0
- package/dist/ssr/index.d.ts +59 -0
- package/dist/ssr/index.d.ts.map +1 -0
- package/dist/ssr/render.d.ts +62 -0
- package/dist/ssr/render.d.ts.map +1 -0
- package/dist/ssr/serialize.d.ts +118 -0
- package/dist/ssr/serialize.d.ts.map +1 -0
- package/dist/ssr/types.d.ts +70 -0
- package/dist/ssr/types.d.ts.map +1 -0
- package/dist/ssr-B2qd_WBB.js +248 -0
- package/dist/ssr-B2qd_WBB.js.map +1 -0
- package/dist/ssr.es.mjs +9 -0
- package/dist/store/create-store.d.ts.map +1 -1
- package/dist/store/index.d.ts +1 -1
- package/dist/store/index.d.ts.map +1 -1
- package/dist/store/persisted.d.ts +38 -4
- package/dist/store/persisted.d.ts.map +1 -1
- package/dist/store/types.d.ts +138 -1
- package/dist/store/types.d.ts.map +1 -1
- package/dist/store/utils.d.ts +2 -2
- package/dist/store/utils.d.ts.map +1 -1
- package/dist/store-DWpyH6p5.js +338 -0
- package/dist/store-DWpyH6p5.js.map +1 -0
- package/dist/store.es.mjs +11 -10
- package/dist/storybook/index.d.ts.map +1 -1
- package/dist/storybook.es.mjs +1 -1
- package/dist/storybook.es.mjs.map +1 -1
- package/dist/testing/index.d.ts +23 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/testing.d.ts +156 -0
- package/dist/testing/testing.d.ts.map +1 -0
- package/dist/testing/types.d.ts +134 -0
- package/dist/testing/types.d.ts.map +1 -0
- package/dist/testing-CsqjNUyy.js +224 -0
- package/dist/testing-CsqjNUyy.js.map +1 -0
- package/dist/testing.es.mjs +9 -0
- package/dist/type-guards-Do9DWgNp.js +44 -0
- package/dist/type-guards-Do9DWgNp.js.map +1 -0
- package/dist/untrack-DJVQQ2WM.js +33 -0
- package/dist/untrack-DJVQQ2WM.js.map +1 -0
- package/dist/view/custom-directives.d.ts +20 -0
- package/dist/view/custom-directives.d.ts.map +1 -0
- package/dist/view/evaluate.d.ts.map +1 -1
- package/dist/view/process.d.ts.map +1 -1
- package/dist/view.es.mjs +9 -9
- package/package.json +177 -141
- package/src/a11y/announce.ts +131 -0
- package/src/a11y/audit.ts +314 -0
- package/src/a11y/index.ts +68 -0
- package/src/a11y/media-preferences.ts +255 -0
- package/src/a11y/roving-tab-index.ts +164 -0
- package/src/a11y/skip-link.ts +255 -0
- package/src/a11y/trap-focus.ts +184 -0
- package/src/a11y/types.ts +183 -0
- package/src/component/component.ts +104 -29
- package/src/component/html.ts +5 -5
- package/src/component/index.ts +2 -0
- package/src/component/library.ts +26 -2
- package/src/component/scope.ts +212 -0
- package/src/component/types.ts +94 -40
- package/src/core/collection.ts +707 -628
- package/src/core/element.ts +981 -774
- package/src/core/env.ts +60 -0
- package/src/core/index.ts +49 -48
- package/src/core/shared.ts +62 -13
- package/src/core/utils/index.ts +148 -83
- package/src/devtools/devtools.ts +410 -0
- package/src/devtools/index.ts +48 -0
- package/src/devtools/types.ts +104 -0
- package/src/dnd/draggable.ts +296 -0
- package/src/dnd/droppable.ts +228 -0
- package/src/dnd/index.ts +62 -0
- package/src/dnd/sortable.ts +307 -0
- package/src/dnd/types.ts +293 -0
- package/src/forms/create-form.ts +278 -0
- package/src/forms/index.ts +65 -0
- package/src/forms/types.ts +154 -0
- package/src/forms/validators.ts +265 -0
- package/src/full.ts +253 -2
- package/src/i18n/formatting.ts +67 -0
- package/src/i18n/i18n.ts +200 -0
- package/src/i18n/index.ts +67 -0
- package/src/i18n/translate.ts +182 -0
- package/src/i18n/types.ts +171 -0
- package/src/index.ts +108 -36
- package/src/media/battery.ts +116 -0
- package/src/media/breakpoints.ts +131 -0
- package/src/media/clipboard.ts +80 -0
- package/src/media/device-sensors.ts +158 -0
- package/src/media/geolocation.ts +119 -0
- package/src/media/index.ts +76 -0
- package/src/media/media-query.ts +92 -0
- package/src/media/network.ts +115 -0
- package/src/media/types.ts +177 -0
- package/src/media/viewport.ts +84 -0
- package/src/motion/index.ts +57 -48
- package/src/motion/morph.ts +151 -0
- package/src/motion/parallax.ts +120 -0
- package/src/motion/reduced-motion.ts +66 -17
- package/src/motion/types.ts +271 -208
- package/src/motion/typewriter.ts +164 -0
- package/src/plugin/index.ts +37 -0
- package/src/plugin/registry.ts +269 -0
- package/src/plugin/types.ts +137 -0
- package/src/reactive/computed.ts +130 -92
- package/src/router/bq-link.ts +279 -0
- package/src/router/constraints.ts +201 -0
- package/src/router/index.ts +49 -41
- package/src/router/match.ts +312 -106
- package/src/router/path-pattern.ts +52 -0
- package/src/router/query.ts +38 -35
- package/src/router/router.ts +402 -211
- package/src/router/types.ts +139 -93
- package/src/router/use-route.ts +68 -0
- package/src/router/utils.ts +157 -116
- package/src/security/index.ts +2 -7
- package/src/security/sanitize.ts +70 -70
- package/src/security/trusted-html.ts +71 -71
- package/src/ssr/hydrate.ts +82 -0
- package/src/ssr/index.ts +70 -0
- package/src/ssr/render.ts +508 -0
- package/src/ssr/serialize.ts +296 -0
- package/src/ssr/types.ts +81 -0
- package/src/store/create-store.ts +467 -329
- package/src/store/define-store.ts +49 -49
- package/src/store/index.ts +27 -22
- package/src/store/mapping.ts +74 -74
- package/src/store/persisted.ts +206 -19
- package/src/store/types.ts +157 -2
- package/src/store/utils.ts +135 -141
- package/src/store/watch.ts +53 -53
- package/src/storybook/index.ts +2 -1
- package/src/testing/index.ts +42 -0
- package/src/testing/testing.ts +593 -0
- package/src/testing/types.ts +170 -0
- package/src/view/custom-directives.ts +30 -0
- package/src/view/evaluate.ts +292 -290
- package/src/view/process.ts +108 -92
- package/dist/component-BEQgt5hl.js +0 -600
- package/dist/component-BEQgt5hl.js.map +0 -1
- package/dist/core-BGQJVw0-.js +0 -35
- package/dist/core-BGQJVw0-.js.map +0 -1
- package/dist/core-CCEabVHl.js +0 -648
- package/dist/core-CCEabVHl.js.map +0 -1
- package/dist/effect-AFRW_Plg.js +0 -84
- package/dist/effect-AFRW_Plg.js.map +0 -1
- package/dist/motion-D9TcHxOF.js +0 -415
- package/dist/motion-D9TcHxOF.js.map +0 -1
- package/dist/reactive-DSkct0dO.js +0 -254
- package/dist/reactive-DSkct0dO.js.map +0 -1
- package/dist/router-CbDhl8rS.js +0 -188
- package/dist/router-CbDhl8rS.js.map +0 -1
- package/dist/store-BwDvI45q.js +0 -263
- package/dist/store-BwDvI45q.js.map +0 -1
- package/dist/untrack-B0rVscTc.js +0 -7
- package/dist/untrack-B0rVscTc.js.map +0 -1
- package/dist/view-C70lA3vf.js.map +0 -1
|
@@ -1,329 +1,467 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Store creation logic.
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
type
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import
|
|
17
|
-
import {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Store creation logic.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { isPromise } from '../core/utils/type-guards';
|
|
6
|
+
import {
|
|
7
|
+
batch,
|
|
8
|
+
computed,
|
|
9
|
+
signal,
|
|
10
|
+
untrack,
|
|
11
|
+
type ReadonlySignal,
|
|
12
|
+
type Signal,
|
|
13
|
+
} from '../reactive/index';
|
|
14
|
+
import { notifyDevtoolsStateChange, registerDevtoolsStore } from './devtools';
|
|
15
|
+
import { applyPlugins } from './plugins';
|
|
16
|
+
import { getStore, hasStore, registerStore } from './registry';
|
|
17
|
+
import type {
|
|
18
|
+
ActionContext,
|
|
19
|
+
Getters,
|
|
20
|
+
OnActionCallback,
|
|
21
|
+
Store,
|
|
22
|
+
StoreDefinition,
|
|
23
|
+
StoreSubscriber,
|
|
24
|
+
} from './types';
|
|
25
|
+
import { deepClone, detectNestedMutations, isDev } from './utils';
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Creates a reactive store with state, getters, and actions.
|
|
29
|
+
*
|
|
30
|
+
* @template S - State type
|
|
31
|
+
* @template G - Getters type
|
|
32
|
+
* @template A - Actions type
|
|
33
|
+
* @param definition - Store definition
|
|
34
|
+
* @returns The reactive store instance
|
|
35
|
+
*/
|
|
36
|
+
export const createStore = <
|
|
37
|
+
S extends Record<string, unknown>,
|
|
38
|
+
G extends Record<string, unknown> = Record<string, never>,
|
|
39
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
40
|
+
A extends Record<string, (...args: any[]) => any> = Record<string, never>,
|
|
41
|
+
>(
|
|
42
|
+
definition: StoreDefinition<S, G, A>
|
|
43
|
+
): Store<S, G, A> => {
|
|
44
|
+
const { id, state: stateFactory, getters = {} as Getters<S, G>, actions = {} as A } = definition;
|
|
45
|
+
|
|
46
|
+
// Check for duplicate store IDs
|
|
47
|
+
if (hasStore(id)) {
|
|
48
|
+
console.warn(`bQuery store: Store "${id}" already exists. Returning existing instance.`);
|
|
49
|
+
return getStore(id) as Store<S, G, A>;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Create initial state
|
|
53
|
+
const initialState = stateFactory();
|
|
54
|
+
|
|
55
|
+
// Create signals for each state property
|
|
56
|
+
const stateSignals = new Map<keyof S, Signal<unknown>>();
|
|
57
|
+
for (const key of Object.keys(initialState) as Array<keyof S>) {
|
|
58
|
+
stateSignals.set(key, signal(initialState[key]));
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Subscribers for $subscribe
|
|
62
|
+
const subscribers: Array<StoreSubscriber<S>> = [];
|
|
63
|
+
|
|
64
|
+
// Action lifecycle hooks for $onAction
|
|
65
|
+
const actionListeners: Array<OnActionCallback<S, G, A>> = [];
|
|
66
|
+
|
|
67
|
+
const reportOnActionError = (
|
|
68
|
+
phase: 'listener' | 'after' | 'onError',
|
|
69
|
+
actionName: string,
|
|
70
|
+
error: unknown
|
|
71
|
+
): void => {
|
|
72
|
+
if (!isDev() || typeof console === 'undefined' || typeof console.error !== 'function') return;
|
|
73
|
+
console.error(
|
|
74
|
+
`[bQuery store "${id}"] Error in $onAction ${phase} for action "${actionName}"`,
|
|
75
|
+
error
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const warnedAsyncOnActionListeners = new WeakSet<OnActionCallback<S, G, A>>();
|
|
80
|
+
|
|
81
|
+
const warnAsyncOnActionListener = (
|
|
82
|
+
listener: OnActionCallback<S, G, A>,
|
|
83
|
+
actionName: string
|
|
84
|
+
): void => {
|
|
85
|
+
if (!isDev() || typeof console === 'undefined' || typeof console.warn !== 'function') return;
|
|
86
|
+
if (warnedAsyncOnActionListeners.has(listener)) return;
|
|
87
|
+
warnedAsyncOnActionListeners.add(listener);
|
|
88
|
+
console.warn(
|
|
89
|
+
`[bQuery store "${id}"] Async $onAction listener detected for action "${actionName}". If it awaits, register after()/onError() before the first await; late registrations will not affect the current action.`
|
|
90
|
+
);
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Executes an action observer callback without allowing observer failures to
|
|
95
|
+
* affect the action result. Handles both synchronous exceptions and async
|
|
96
|
+
* rejections, routing all failures through the standard $onAction logger.
|
|
97
|
+
*
|
|
98
|
+
* @internal
|
|
99
|
+
*/
|
|
100
|
+
const runOnActionCallback = (
|
|
101
|
+
phase: 'listener' | 'after' | 'onError',
|
|
102
|
+
actionName: string,
|
|
103
|
+
callback: () => unknown,
|
|
104
|
+
listener?: OnActionCallback<S, G, A>
|
|
105
|
+
): void => {
|
|
106
|
+
try {
|
|
107
|
+
const result = callback();
|
|
108
|
+
if (isPromise(result)) {
|
|
109
|
+
if (phase === 'listener' && listener) {
|
|
110
|
+
warnAsyncOnActionListener(listener, actionName);
|
|
111
|
+
}
|
|
112
|
+
void result.catch((error) => {
|
|
113
|
+
reportOnActionError(phase, actionName, error);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
} catch (error) {
|
|
117
|
+
reportOnActionError(phase, actionName, error);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Gets the current state.
|
|
123
|
+
*
|
|
124
|
+
* For subscriber notifications (where a plain object snapshot is needed),
|
|
125
|
+
* this creates a shallow copy. For internal reads, use stateProxy directly.
|
|
126
|
+
*
|
|
127
|
+
* **Note:** Returns a shallow snapshot. Nested object mutations will NOT
|
|
128
|
+
* trigger reactive updates. This differs from frameworks like Pinia that
|
|
129
|
+
* use deep reactivity. To update nested state, replace the entire object.
|
|
130
|
+
*
|
|
131
|
+
* Uses `untrack()` to prevent accidental dependency tracking when called
|
|
132
|
+
* from within reactive contexts (e.g., `effect()` or `computed()`).
|
|
133
|
+
*
|
|
134
|
+
* @internal
|
|
135
|
+
*/
|
|
136
|
+
const getCurrentState = (): S =>
|
|
137
|
+
untrack(() => {
|
|
138
|
+
return { ...stateProxy };
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Notifies subscribers of state changes.
|
|
143
|
+
* Short-circuits if there are no subscribers and devtools aren't active
|
|
144
|
+
* to avoid unnecessary snapshot overhead.
|
|
145
|
+
* @internal
|
|
146
|
+
*/
|
|
147
|
+
const notifySubscribers = (): void => {
|
|
148
|
+
// Early return if no subscribers and no devtools hook
|
|
149
|
+
const hasDevtools =
|
|
150
|
+
typeof window !== 'undefined' &&
|
|
151
|
+
typeof window.__BQUERY_DEVTOOLS__?.onStateChange === 'function';
|
|
152
|
+
if (subscribers.length === 0 && !hasDevtools) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const currentState = getCurrentState();
|
|
157
|
+
for (const callback of subscribers) {
|
|
158
|
+
callback(currentState);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
notifyDevtoolsStateChange(id, currentState);
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Cached state proxy that lazily reads signal values.
|
|
166
|
+
* Uses a Proxy to avoid creating new objects on each access.
|
|
167
|
+
*
|
|
168
|
+
* **Note:** This returns a shallow snapshot of the state. Nested object
|
|
169
|
+
* mutations will NOT trigger reactive updates. For nested reactivity,
|
|
170
|
+
* replace the entire object or use signals for nested properties.
|
|
171
|
+
*
|
|
172
|
+
* @internal
|
|
173
|
+
*/
|
|
174
|
+
const stateProxy = new Proxy({} as S, {
|
|
175
|
+
get: (_, prop: string | symbol) => {
|
|
176
|
+
const key = prop as keyof S;
|
|
177
|
+
if (stateSignals.has(key)) {
|
|
178
|
+
return stateSignals.get(key)!.value;
|
|
179
|
+
}
|
|
180
|
+
return undefined;
|
|
181
|
+
},
|
|
182
|
+
ownKeys: () => Array.from(stateSignals.keys()) as string[],
|
|
183
|
+
getOwnPropertyDescriptor: (_, prop) => {
|
|
184
|
+
if (stateSignals.has(prop as keyof S)) {
|
|
185
|
+
return { enumerable: true, configurable: true };
|
|
186
|
+
}
|
|
187
|
+
return undefined;
|
|
188
|
+
},
|
|
189
|
+
has: (_, prop) => stateSignals.has(prop as keyof S),
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
// Create computed getters
|
|
193
|
+
const getterComputed = new Map<keyof G, ReadonlySignal<unknown>>();
|
|
194
|
+
|
|
195
|
+
// Build the store proxy
|
|
196
|
+
const store = {} as Store<S, G, A>;
|
|
197
|
+
|
|
198
|
+
// Define state properties with getters/setters
|
|
199
|
+
for (const key of Object.keys(initialState) as Array<keyof S>) {
|
|
200
|
+
Object.defineProperty(store, key, {
|
|
201
|
+
get: () => stateSignals.get(key)!.value,
|
|
202
|
+
set: (value: unknown) => {
|
|
203
|
+
stateSignals.get(key)!.value = value;
|
|
204
|
+
notifySubscribers();
|
|
205
|
+
},
|
|
206
|
+
enumerable: true,
|
|
207
|
+
configurable: false,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Define getters as computed properties
|
|
212
|
+
for (const key of Object.keys(getters) as Array<keyof G>) {
|
|
213
|
+
const getterFn = getters[key];
|
|
214
|
+
|
|
215
|
+
// Create computed that reads from state signals via proxy (more efficient)
|
|
216
|
+
const computedGetter = computed(() => {
|
|
217
|
+
const state = stateProxy;
|
|
218
|
+
// For getter dependencies, pass a proxy that reads from computed getters
|
|
219
|
+
const getterProxy = new Proxy({} as G, {
|
|
220
|
+
get: (_, prop: string | symbol) => {
|
|
221
|
+
const propKey = prop as keyof G;
|
|
222
|
+
if (getterComputed.has(propKey)) {
|
|
223
|
+
return getterComputed.get(propKey)!.value;
|
|
224
|
+
}
|
|
225
|
+
return undefined;
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
return getterFn(state, getterProxy);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
getterComputed.set(key, computedGetter as unknown as ReadonlySignal<unknown>);
|
|
232
|
+
|
|
233
|
+
Object.defineProperty(store, key, {
|
|
234
|
+
get: () => computedGetter.value,
|
|
235
|
+
enumerable: true,
|
|
236
|
+
configurable: false,
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Bind actions to the store context, with $onAction lifecycle support
|
|
241
|
+
for (const key of Object.keys(actions) as Array<keyof A>) {
|
|
242
|
+
const actionFn = actions[key];
|
|
243
|
+
const actionName = key as keyof A & string;
|
|
244
|
+
|
|
245
|
+
// Wrap action to enable 'this' binding and $onAction hooks
|
|
246
|
+
(store as Record<string, unknown>)[actionName] = function (...args: unknown[]) {
|
|
247
|
+
// Create a context that allows 'this.property' access
|
|
248
|
+
const context = new Proxy(store, {
|
|
249
|
+
get: (target, prop) => {
|
|
250
|
+
if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {
|
|
251
|
+
return stateSignals.get(prop as keyof S)!.value;
|
|
252
|
+
}
|
|
253
|
+
return (target as Record<string, unknown>)[prop as string];
|
|
254
|
+
},
|
|
255
|
+
set: (target, prop, value) => {
|
|
256
|
+
if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {
|
|
257
|
+
stateSignals.get(prop as keyof S)!.value = value;
|
|
258
|
+
notifySubscribers();
|
|
259
|
+
return true;
|
|
260
|
+
}
|
|
261
|
+
// Allow non-state property assignments (e.g., temporary variables in actions)
|
|
262
|
+
// by delegating to the target object rather than returning false
|
|
263
|
+
return Reflect.set(target, prop, value);
|
|
264
|
+
},
|
|
265
|
+
});
|
|
266
|
+
|
|
267
|
+
// Run $onAction hooks if any listeners are registered
|
|
268
|
+
if (actionListeners.length === 0) {
|
|
269
|
+
return actionFn.apply(context, args);
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
const afterHooks: Array<(result: unknown) => void> = [];
|
|
273
|
+
const errorHooks: Array<(error: unknown) => void> = [];
|
|
274
|
+
const listenerSnapshot = [...actionListeners];
|
|
275
|
+
|
|
276
|
+
const listenerContext = {
|
|
277
|
+
name: actionName,
|
|
278
|
+
store,
|
|
279
|
+
args: args as Parameters<A[typeof actionName]>,
|
|
280
|
+
after: (callback: (result: Awaited<ReturnType<A[typeof actionName]>>) => void) => {
|
|
281
|
+
afterHooks.push((result) =>
|
|
282
|
+
callback(result as Awaited<ReturnType<A[typeof actionName]>>)
|
|
283
|
+
);
|
|
284
|
+
},
|
|
285
|
+
onError: (callback: (error: unknown) => void) => {
|
|
286
|
+
errorHooks.push(callback);
|
|
287
|
+
},
|
|
288
|
+
} satisfies ActionContext<S, G, A, typeof actionName>;
|
|
289
|
+
|
|
290
|
+
// Notify all action listeners (before phase)
|
|
291
|
+
for (const listener of listenerSnapshot) {
|
|
292
|
+
runOnActionCallback('listener', actionName, () => listener(listenerContext), listener);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
let result: unknown;
|
|
296
|
+
try {
|
|
297
|
+
result = actionFn.apply(context, args);
|
|
298
|
+
} catch (error) {
|
|
299
|
+
for (const hook of errorHooks) {
|
|
300
|
+
runOnActionCallback('onError', actionName, () => hook(error));
|
|
301
|
+
}
|
|
302
|
+
throw error;
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
// Handle async actions (promises)
|
|
306
|
+
if (isPromise(result)) {
|
|
307
|
+
return result.then(
|
|
308
|
+
(resolved) => {
|
|
309
|
+
for (const hook of afterHooks) {
|
|
310
|
+
runOnActionCallback('after', actionName, () => hook(resolved));
|
|
311
|
+
}
|
|
312
|
+
return resolved;
|
|
313
|
+
},
|
|
314
|
+
(error) => {
|
|
315
|
+
for (const hook of errorHooks) {
|
|
316
|
+
runOnActionCallback('onError', actionName, () => hook(error));
|
|
317
|
+
}
|
|
318
|
+
throw error;
|
|
319
|
+
}
|
|
320
|
+
);
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Sync action — run after hooks immediately
|
|
324
|
+
for (const hook of afterHooks) {
|
|
325
|
+
runOnActionCallback('after', actionName, () => hook(result));
|
|
326
|
+
}
|
|
327
|
+
return result;
|
|
328
|
+
};
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
// Add store utility methods
|
|
332
|
+
Object.defineProperties(store, {
|
|
333
|
+
$id: {
|
|
334
|
+
value: id,
|
|
335
|
+
writable: false,
|
|
336
|
+
enumerable: false,
|
|
337
|
+
},
|
|
338
|
+
$reset: {
|
|
339
|
+
value: () => {
|
|
340
|
+
const fresh = stateFactory();
|
|
341
|
+
batch(() => {
|
|
342
|
+
for (const [key, sig] of stateSignals) {
|
|
343
|
+
sig.value = fresh[key];
|
|
344
|
+
}
|
|
345
|
+
});
|
|
346
|
+
notifySubscribers();
|
|
347
|
+
},
|
|
348
|
+
writable: false,
|
|
349
|
+
enumerable: false,
|
|
350
|
+
},
|
|
351
|
+
$subscribe: {
|
|
352
|
+
value: (callback: StoreSubscriber<S>) => {
|
|
353
|
+
subscribers.push(callback);
|
|
354
|
+
return () => {
|
|
355
|
+
const index = subscribers.indexOf(callback);
|
|
356
|
+
if (index > -1) subscribers.splice(index, 1);
|
|
357
|
+
};
|
|
358
|
+
},
|
|
359
|
+
writable: false,
|
|
360
|
+
enumerable: false,
|
|
361
|
+
},
|
|
362
|
+
$onAction: {
|
|
363
|
+
value: (callback: OnActionCallback<S, G, A>) => {
|
|
364
|
+
actionListeners.push(callback);
|
|
365
|
+
return () => {
|
|
366
|
+
const index = actionListeners.indexOf(callback);
|
|
367
|
+
if (index > -1) actionListeners.splice(index, 1);
|
|
368
|
+
};
|
|
369
|
+
},
|
|
370
|
+
writable: false,
|
|
371
|
+
enumerable: false,
|
|
372
|
+
},
|
|
373
|
+
$patch: {
|
|
374
|
+
value: (partial: Partial<S> | ((state: S) => void)) => {
|
|
375
|
+
batch(() => {
|
|
376
|
+
if (typeof partial === 'function') {
|
|
377
|
+
// Capture state before mutation for nested mutation detection
|
|
378
|
+
const devMode = isDev();
|
|
379
|
+
const stateBefore = devMode ? deepClone(getCurrentState()) : null;
|
|
380
|
+
const signalValuesBefore = devMode
|
|
381
|
+
? new Map(Array.from(stateSignals.entries()).map(([k, s]) => [k, s.value]))
|
|
382
|
+
: null;
|
|
383
|
+
|
|
384
|
+
// Mutation function
|
|
385
|
+
const state = getCurrentState();
|
|
386
|
+
partial(state);
|
|
387
|
+
|
|
388
|
+
// Detect nested mutations in development mode
|
|
389
|
+
if (devMode && stateBefore && signalValuesBefore) {
|
|
390
|
+
const mutatedKeys = detectNestedMutations(stateBefore, state, signalValuesBefore);
|
|
391
|
+
if (mutatedKeys.length > 0) {
|
|
392
|
+
console.warn(
|
|
393
|
+
`[bQuery store "${id}"] Nested mutation detected in $patch() for keys: ${mutatedKeys
|
|
394
|
+
.map(String)
|
|
395
|
+
.join(', ')}.\n` +
|
|
396
|
+
'Nested object mutations do not trigger reactive updates because the store uses shallow reactivity.\n' +
|
|
397
|
+
'To fix this, either:\n' +
|
|
398
|
+
' 1. Replace the entire object: state.user = { ...state.user, name: "New" }\n' +
|
|
399
|
+
' 2. Use $patchDeep() for automatic deep cloning\n' +
|
|
400
|
+
'See: https://bquery.dev/guide/store#deep-reactivity'
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {
|
|
406
|
+
if (stateSignals.has(key)) {
|
|
407
|
+
stateSignals.get(key)!.value = value;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
} else {
|
|
411
|
+
// Partial object
|
|
412
|
+
for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {
|
|
413
|
+
if (stateSignals.has(key)) {
|
|
414
|
+
stateSignals.get(key)!.value = value;
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
});
|
|
419
|
+
notifySubscribers();
|
|
420
|
+
},
|
|
421
|
+
writable: false,
|
|
422
|
+
enumerable: false,
|
|
423
|
+
},
|
|
424
|
+
$patchDeep: {
|
|
425
|
+
value: (partial: Partial<S> | ((state: S) => void)) => {
|
|
426
|
+
batch(() => {
|
|
427
|
+
if (typeof partial === 'function') {
|
|
428
|
+
// Deep clone state before mutation to ensure new references
|
|
429
|
+
const state = deepClone(getCurrentState());
|
|
430
|
+
partial(state);
|
|
431
|
+
|
|
432
|
+
for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {
|
|
433
|
+
if (stateSignals.has(key)) {
|
|
434
|
+
stateSignals.get(key)!.value = value;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
} else {
|
|
438
|
+
// Deep clone each value in partial to ensure new references
|
|
439
|
+
for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {
|
|
440
|
+
if (stateSignals.has(key)) {
|
|
441
|
+
stateSignals.get(key)!.value = deepClone(value);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
});
|
|
446
|
+
notifySubscribers();
|
|
447
|
+
},
|
|
448
|
+
writable: false,
|
|
449
|
+
enumerable: false,
|
|
450
|
+
},
|
|
451
|
+
$state: {
|
|
452
|
+
get: () => getCurrentState(),
|
|
453
|
+
enumerable: false,
|
|
454
|
+
},
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// Register store
|
|
458
|
+
registerStore(id, store);
|
|
459
|
+
|
|
460
|
+
// Apply plugins
|
|
461
|
+
applyPlugins(store, definition);
|
|
462
|
+
|
|
463
|
+
// Notify devtools
|
|
464
|
+
registerDevtoolsStore(id, store);
|
|
465
|
+
|
|
466
|
+
return store;
|
|
467
|
+
};
|