@bquery/bquery 1.4.0 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +586 -527
  2. package/dist/component/component.d.ts +13 -5
  3. package/dist/component/component.d.ts.map +1 -1
  4. package/dist/component/html.d.ts +40 -3
  5. package/dist/component/html.d.ts.map +1 -1
  6. package/dist/component/index.d.ts +4 -2
  7. package/dist/component/index.d.ts.map +1 -1
  8. package/dist/component/library.d.ts +34 -0
  9. package/dist/component/library.d.ts.map +1 -0
  10. package/dist/component/types.d.ts +132 -13
  11. package/dist/component/types.d.ts.map +1 -1
  12. package/dist/component-BEQgt5hl.js +600 -0
  13. package/dist/component-BEQgt5hl.js.map +1 -0
  14. package/dist/component.es.mjs +7 -184
  15. package/dist/config-DRmZZno3.js +40 -0
  16. package/dist/config-DRmZZno3.js.map +1 -0
  17. package/dist/core-BGQJVw0-.js +35 -0
  18. package/dist/core-BGQJVw0-.js.map +1 -0
  19. package/dist/core-CCEabVHl.js +648 -0
  20. package/dist/core-CCEabVHl.js.map +1 -0
  21. package/dist/core.es.mjs +45 -1261
  22. package/dist/effect-AFRW_Plg.js +84 -0
  23. package/dist/effect-AFRW_Plg.js.map +1 -0
  24. package/dist/full.d.ts +8 -8
  25. package/dist/full.d.ts.map +1 -1
  26. package/dist/full.es.mjs +101 -91
  27. package/dist/full.iife.js +173 -3
  28. package/dist/full.iife.js.map +1 -1
  29. package/dist/full.umd.js +173 -3
  30. package/dist/full.umd.js.map +1 -1
  31. package/dist/index.es.mjs +147 -139
  32. package/dist/motion/transition.d.ts +1 -1
  33. package/dist/motion/transition.d.ts.map +1 -1
  34. package/dist/motion/types.d.ts +11 -1
  35. package/dist/motion/types.d.ts.map +1 -1
  36. package/dist/motion-D9TcHxOF.js +415 -0
  37. package/dist/motion-D9TcHxOF.js.map +1 -0
  38. package/dist/motion.es.mjs +25 -361
  39. package/dist/object-qGpWr6-J.js +38 -0
  40. package/dist/object-qGpWr6-J.js.map +1 -0
  41. package/dist/platform/announcer.d.ts +59 -0
  42. package/dist/platform/announcer.d.ts.map +1 -0
  43. package/dist/platform/config.d.ts +92 -0
  44. package/dist/platform/config.d.ts.map +1 -0
  45. package/dist/platform/cookies.d.ts +45 -0
  46. package/dist/platform/cookies.d.ts.map +1 -0
  47. package/dist/platform/index.d.ts +8 -0
  48. package/dist/platform/index.d.ts.map +1 -1
  49. package/dist/platform/meta.d.ts +62 -0
  50. package/dist/platform/meta.d.ts.map +1 -0
  51. package/dist/platform-Dr9b6fsq.js +362 -0
  52. package/dist/platform-Dr9b6fsq.js.map +1 -0
  53. package/dist/platform.es.mjs +11 -248
  54. package/dist/reactive/async-data.d.ts +114 -0
  55. package/dist/reactive/async-data.d.ts.map +1 -0
  56. package/dist/reactive/index.d.ts +2 -2
  57. package/dist/reactive/index.d.ts.map +1 -1
  58. package/dist/reactive/signal.d.ts +2 -0
  59. package/dist/reactive/signal.d.ts.map +1 -1
  60. package/dist/reactive-DSkct0dO.js +254 -0
  61. package/dist/reactive-DSkct0dO.js.map +1 -0
  62. package/dist/reactive.es.mjs +18 -32
  63. package/dist/router-CbDhl8rS.js +188 -0
  64. package/dist/router-CbDhl8rS.js.map +1 -0
  65. package/dist/router.es.mjs +11 -200
  66. package/dist/sanitize-Bs2dkMby.js +313 -0
  67. package/dist/sanitize-Bs2dkMby.js.map +1 -0
  68. package/dist/security/constants.d.ts.map +1 -1
  69. package/dist/security/index.d.ts +4 -2
  70. package/dist/security/index.d.ts.map +1 -1
  71. package/dist/security/sanitize.d.ts +4 -1
  72. package/dist/security/sanitize.d.ts.map +1 -1
  73. package/dist/security/trusted-html.d.ts +53 -0
  74. package/dist/security/trusted-html.d.ts.map +1 -0
  75. package/dist/security.es.mjs +11 -56
  76. package/dist/store/define-store.d.ts +1 -1
  77. package/dist/store/define-store.d.ts.map +1 -1
  78. package/dist/store/mapping.d.ts +1 -1
  79. package/dist/store/mapping.d.ts.map +1 -1
  80. package/dist/store/persisted.d.ts +1 -1
  81. package/dist/store/persisted.d.ts.map +1 -1
  82. package/dist/store/types.d.ts +2 -2
  83. package/dist/store/types.d.ts.map +1 -1
  84. package/dist/store/watch.d.ts +1 -1
  85. package/dist/store/watch.d.ts.map +1 -1
  86. package/dist/store-BwDvI45q.js +263 -0
  87. package/dist/store-BwDvI45q.js.map +1 -0
  88. package/dist/store.es.mjs +12 -25
  89. package/dist/storybook/index.d.ts +37 -0
  90. package/dist/storybook/index.d.ts.map +1 -0
  91. package/dist/storybook.es.mjs +151 -0
  92. package/dist/storybook.es.mjs.map +1 -0
  93. package/dist/untrack-B0rVscTc.js +7 -0
  94. package/dist/untrack-B0rVscTc.js.map +1 -0
  95. package/dist/view-C70lA3vf.js +397 -0
  96. package/dist/view-C70lA3vf.js.map +1 -0
  97. package/dist/view.es.mjs +11 -430
  98. package/package.json +141 -132
  99. package/src/component/component.ts +524 -289
  100. package/src/component/html.ts +153 -53
  101. package/src/component/index.ts +50 -40
  102. package/src/component/library.ts +518 -0
  103. package/src/component/types.ts +256 -85
  104. package/src/core/collection.ts +628 -628
  105. package/src/core/element.ts +774 -774
  106. package/src/core/index.ts +48 -48
  107. package/src/core/utils/function.ts +151 -151
  108. package/src/full.ts +229 -187
  109. package/src/motion/animate.ts +113 -113
  110. package/src/motion/flip.ts +176 -176
  111. package/src/motion/scroll.ts +57 -57
  112. package/src/motion/spring.ts +150 -150
  113. package/src/motion/timeline.ts +246 -246
  114. package/src/motion/transition.ts +97 -51
  115. package/src/motion/types.ts +11 -1
  116. package/src/platform/announcer.ts +208 -0
  117. package/src/platform/config.ts +163 -0
  118. package/src/platform/cookies.ts +165 -0
  119. package/src/platform/index.ts +21 -0
  120. package/src/platform/meta.ts +168 -0
  121. package/src/platform/storage.ts +215 -215
  122. package/src/reactive/async-data.ts +486 -0
  123. package/src/reactive/core.ts +114 -114
  124. package/src/reactive/effect.ts +54 -54
  125. package/src/reactive/index.ts +15 -1
  126. package/src/reactive/internals.ts +122 -122
  127. package/src/reactive/signal.ts +9 -0
  128. package/src/security/constants.ts +3 -1
  129. package/src/security/index.ts +17 -10
  130. package/src/security/sanitize-core.ts +364 -364
  131. package/src/security/sanitize.ts +70 -66
  132. package/src/security/trusted-html.ts +71 -0
  133. package/src/store/define-store.ts +49 -48
  134. package/src/store/mapping.ts +74 -73
  135. package/src/store/persisted.ts +62 -61
  136. package/src/store/types.ts +92 -94
  137. package/src/store/watch.ts +53 -52
  138. package/src/storybook/index.ts +479 -0
  139. package/src/view/evaluate.ts +290 -290
  140. package/dist/batch-x7b2eZST.js +0 -13
  141. package/dist/batch-x7b2eZST.js.map +0 -1
  142. package/dist/component.es.mjs.map +0 -1
  143. package/dist/core-BhpuvPhy.js +0 -170
  144. package/dist/core-BhpuvPhy.js.map +0 -1
  145. package/dist/core.es.mjs.map +0 -1
  146. package/dist/full.es.mjs.map +0 -1
  147. package/dist/index.es.mjs.map +0 -1
  148. package/dist/motion.es.mjs.map +0 -1
  149. package/dist/persisted-DHoi3uEs.js +0 -278
  150. package/dist/persisted-DHoi3uEs.js.map +0 -1
  151. package/dist/platform.es.mjs.map +0 -1
  152. package/dist/reactive.es.mjs.map +0 -1
  153. package/dist/router.es.mjs.map +0 -1
  154. package/dist/sanitize-Cxvxa-DX.js +0 -283
  155. package/dist/sanitize-Cxvxa-DX.js.map +0 -1
  156. package/dist/security.es.mjs.map +0 -1
  157. package/dist/store.es.mjs.map +0 -1
  158. package/dist/type-guards-BdKlYYlS.js +0 -32
  159. package/dist/type-guards-BdKlYYlS.js.map +0 -1
  160. package/dist/untrack-DNnnqdlR.js +0 -6
  161. package/dist/untrack-DNnnqdlR.js.map +0 -1
  162. package/dist/view.es.mjs.map +0 -1
  163. package/dist/watch-DXXv3iAI.js +0 -58
  164. package/dist/watch-DXXv3iAI.js.map +0 -1
@@ -19,5 +19,5 @@ export type WatchStoreOptions<T> = {
19
19
  * @param options - Watch options
20
20
  * @returns Unsubscribe function
21
21
  */
22
- export declare const watchStore: <S extends Record<string, unknown>, G extends Record<string, unknown>, A extends Record<string, (...args: unknown[]) => unknown>, T>(store: Store<S, G, A>, selector: (state: S) => T, callback: (value: T, previous: T | undefined) => void, options?: WatchStoreOptions<T>) => (() => void);
22
+ export declare const watchStore: <S extends Record<string, unknown>, G extends Record<string, unknown>, A extends Record<string, (...args: any[]) => any>, T>(store: Store<S, G, A>, selector: (state: S) => T, callback: (value: T, previous: T | undefined) => void, options?: WatchStoreOptions<T>) => (() => void);
23
23
  //# sourceMappingURL=watch.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/store/watch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC,EACzD,CAAC,EAED,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EACzB,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,UAAS,iBAAiB,CAAC,CAAC,CAAM,KACjC,CAAC,MAAM,IAAI,CAgBb,CAAC"}
1
+ {"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../../src/store/watch.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAGrC,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,oDAAoD;IACpD,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAEjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,CAAC,EACjD,CAAC,EAED,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EACrB,UAAU,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EACzB,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI,EACrD,UAAS,iBAAiB,CAAC,CAAC,CAAM,KACjC,CAAC,MAAM,IAAI,CAgBb,CAAC"}
@@ -0,0 +1,263 @@
1
+ import { d as $, f as S } from "./reactive-DSkct0dO.js";
2
+ import { n as x } from "./core-BGQJVw0-.js";
3
+ import { t as T } from "./untrack-B0rVscTc.js";
4
+ var R = () => {
5
+ if (!(typeof window > "u"))
6
+ return window.__BQUERY_DEVTOOLS__ || (window.__BQUERY_DEVTOOLS__ = { stores: /* @__PURE__ */ new Map() }), window.__BQUERY_DEVTOOLS__;
7
+ }, V = (e, t) => {
8
+ const r = R();
9
+ r && (r.stores.set(e, t), r.onStoreCreated?.(e, t));
10
+ }, B = (e) => {
11
+ typeof window > "u" || !window.__BQUERY_DEVTOOLS__ || window.__BQUERY_DEVTOOLS__.stores.delete(e);
12
+ }, M = (e, t) => {
13
+ typeof window > "u" || window.__BQUERY_DEVTOOLS__?.onStateChange?.(e, t);
14
+ }, j = [], q = (e) => {
15
+ j.push(e);
16
+ }, Q = (e, t) => {
17
+ for (const r of j) {
18
+ const a = r({
19
+ store: e,
20
+ options: t
21
+ });
22
+ a && Object.assign(e, a);
23
+ }
24
+ }, h = /* @__PURE__ */ new Map(), A = (e) => h.has(e), N = (e, t) => {
25
+ h.set(e, t);
26
+ }, E = (e) => h.get(e), z = () => Array.from(h.keys()), F = (e) => {
27
+ h.delete(e), B(e);
28
+ }, D = (e) => e !== null && typeof e == "object" && Object.getPrototypeOf(e) === Object.prototype, v = (e) => {
29
+ if (e === null || typeof e != "object") return e;
30
+ if (Array.isArray(e)) return e.map(v);
31
+ if (e instanceof Date) return new Date(e.getTime());
32
+ if (e instanceof Map) return new Map(Array.from(e.entries()).map(([r, a]) => [r, v(a)]));
33
+ if (e instanceof Set) return new Set(Array.from(e).map(v));
34
+ const t = {};
35
+ for (const r of Object.keys(e)) t[r] = v(e[r]);
36
+ return t;
37
+ }, m = (e, t) => {
38
+ if (e === t) return !0;
39
+ if (e === null || t === null || typeof e != "object" || typeof t != "object") return !1;
40
+ if (e instanceof Date && t instanceof Date) return e.getTime() === t.getTime();
41
+ if (e instanceof Map && t instanceof Map) {
42
+ if (e.size !== t.size) return !1;
43
+ for (const [i, f] of e.entries()) if (!t.has(i) || !m(f, t.get(i))) return !1;
44
+ return !0;
45
+ }
46
+ if (e instanceof Set && t instanceof Set) {
47
+ if (e.size !== t.size) return !1;
48
+ for (const i of e.values()) {
49
+ let f = !1;
50
+ for (const n of t.values()) if (m(i, n)) {
51
+ f = !0;
52
+ break;
53
+ }
54
+ if (!f) return !1;
55
+ }
56
+ return !0;
57
+ }
58
+ if (Array.isArray(e) && Array.isArray(t))
59
+ return e.length !== t.length ? !1 : e.every((i, f) => m(i, t[f]));
60
+ if (Array.isArray(e) !== Array.isArray(t)) return !1;
61
+ const r = Object.keys(e), a = Object.keys(t);
62
+ return r.length !== a.length ? !1 : r.every((i) => m(e[i], t[i]));
63
+ }, U = (e, t, r) => {
64
+ const a = [];
65
+ for (const i of Object.keys(t)) {
66
+ const f = e[i], n = t[i];
67
+ r.get(i) === n && D(f) && D(n) && !m(f, n) && a.push(i);
68
+ }
69
+ return a;
70
+ }, _ = (() => {
71
+ try {
72
+ const e = globalThis.process;
73
+ return !(typeof e < "u" && e.env?.NODE_ENV === "production");
74
+ } catch {
75
+ return !0;
76
+ }
77
+ })(), P = (e) => {
78
+ const { id: t, state: r, getters: a = {}, actions: i = {} } = e;
79
+ if (A(t))
80
+ return console.warn(`bQuery store: Store "${t}" already exists. Returning existing instance.`), E(t);
81
+ const f = r(), n = /* @__PURE__ */ new Map();
82
+ for (const s of Object.keys(f)) n.set(s, x(f[s]));
83
+ const y = [], p = () => T(() => ({ ...b })), w = () => {
84
+ const s = typeof window < "u" && typeof window.__BQUERY_DEVTOOLS__?.onStateChange == "function";
85
+ if (y.length === 0 && !s) return;
86
+ const o = p();
87
+ for (const u of y) u(o);
88
+ M(t, o);
89
+ }, b = new Proxy({}, {
90
+ get: (s, o) => {
91
+ const u = o;
92
+ if (n.has(u)) return n.get(u).value;
93
+ },
94
+ ownKeys: () => Array.from(n.keys()),
95
+ getOwnPropertyDescriptor: (s, o) => {
96
+ if (n.has(o)) return {
97
+ enumerable: !0,
98
+ configurable: !0
99
+ };
100
+ },
101
+ has: (s, o) => n.has(o)
102
+ }), O = /* @__PURE__ */ new Map(), d = {};
103
+ for (const s of Object.keys(f)) Object.defineProperty(d, s, {
104
+ get: () => n.get(s).value,
105
+ set: (o) => {
106
+ n.get(s).value = o, w();
107
+ },
108
+ enumerable: !0,
109
+ configurable: !1
110
+ });
111
+ for (const s of Object.keys(a)) {
112
+ const o = a[s], u = $(() => o(b, new Proxy({}, { get: (g, l) => {
113
+ const c = l;
114
+ if (O.has(c)) return O.get(c).value;
115
+ } })));
116
+ O.set(s, u), Object.defineProperty(d, s, {
117
+ get: () => u.value,
118
+ enumerable: !0,
119
+ configurable: !1
120
+ });
121
+ }
122
+ for (const s of Object.keys(i)) {
123
+ const o = i[s];
124
+ d[s] = function(...u) {
125
+ const g = new Proxy(d, {
126
+ get: (l, c) => typeof c == "string" && n.has(c) ? n.get(c).value : l[c],
127
+ set: (l, c, k) => typeof c == "string" && n.has(c) ? (n.get(c).value = k, w(), !0) : Reflect.set(l, c, k)
128
+ });
129
+ return o.apply(g, u);
130
+ };
131
+ }
132
+ return Object.defineProperties(d, {
133
+ $id: {
134
+ value: t,
135
+ writable: !1,
136
+ enumerable: !1
137
+ },
138
+ $reset: {
139
+ value: () => {
140
+ const s = r();
141
+ S(() => {
142
+ for (const [o, u] of n) u.value = s[o];
143
+ }), w();
144
+ },
145
+ writable: !1,
146
+ enumerable: !1
147
+ },
148
+ $subscribe: {
149
+ value: (s) => (y.push(s), () => {
150
+ const o = y.indexOf(s);
151
+ o > -1 && y.splice(o, 1);
152
+ }),
153
+ writable: !1,
154
+ enumerable: !1
155
+ },
156
+ $patch: {
157
+ value: (s) => {
158
+ S(() => {
159
+ if (typeof s == "function") {
160
+ const o = _ ? v(p()) : null, u = _ ? new Map(Array.from(n.entries()).map(([l, c]) => [l, c.value])) : null, g = p();
161
+ if (s(g), _ && o && u) {
162
+ const l = U(o, g, u);
163
+ l.length > 0 && console.warn(`[bQuery store "${t}"] Nested mutation detected in $patch() for keys: ${l.map(String).join(", ")}.
164
+ Nested object mutations do not trigger reactive updates because the store uses shallow reactivity.
165
+ To fix this, either:
166
+ 1. Replace the entire object: state.user = { ...state.user, name: "New" }
167
+ 2. Use $patchDeep() for automatic deep cloning
168
+ See: https://bquery.dev/guide/store#deep-reactivity`);
169
+ }
170
+ for (const [l, c] of Object.entries(g)) n.has(l) && (n.get(l).value = c);
171
+ } else for (const [o, u] of Object.entries(s)) n.has(o) && (n.get(o).value = u);
172
+ }), w();
173
+ },
174
+ writable: !1,
175
+ enumerable: !1
176
+ },
177
+ $patchDeep: {
178
+ value: (s) => {
179
+ S(() => {
180
+ if (typeof s == "function") {
181
+ const o = v(p());
182
+ s(o);
183
+ for (const [u, g] of Object.entries(o)) n.has(u) && (n.get(u).value = g);
184
+ } else for (const [o, u] of Object.entries(s)) n.has(o) && (n.get(o).value = v(u));
185
+ }), w();
186
+ },
187
+ writable: !1,
188
+ enumerable: !1
189
+ },
190
+ $state: {
191
+ get: () => p(),
192
+ enumerable: !1
193
+ }
194
+ }), N(t, d), Q(d, e), V(t, d), d;
195
+ }, K = (e, t) => () => A(e) ? E(e) : P({
196
+ id: e,
197
+ ...t
198
+ }), G = (e, t) => {
199
+ const r = {};
200
+ for (const a of t) Object.defineProperty(r, a, {
201
+ get: () => e[a],
202
+ enumerable: !0
203
+ });
204
+ return r;
205
+ }, I = (e, t) => {
206
+ const r = {};
207
+ for (const a of t) Object.defineProperty(r, a, {
208
+ get: () => e[a],
209
+ enumerable: !0
210
+ });
211
+ return r;
212
+ }, J = (e, t) => {
213
+ const r = {};
214
+ for (const a of t) r[a] = (...i) => e[a](...i);
215
+ return r;
216
+ }, H = (e, t) => {
217
+ const r = t ?? `bquery-store-${e.id}`, a = e.state, i = P({
218
+ ...e,
219
+ state: () => {
220
+ const f = a();
221
+ if (typeof window < "u") try {
222
+ const n = localStorage.getItem(r);
223
+ if (n) return {
224
+ ...f,
225
+ ...JSON.parse(n)
226
+ };
227
+ } catch {
228
+ }
229
+ return f;
230
+ }
231
+ });
232
+ return i.$subscribe((f) => {
233
+ if (typeof window < "u") try {
234
+ localStorage.setItem(r, JSON.stringify(f));
235
+ } catch {
236
+ }
237
+ }), i;
238
+ }, W = (e, t, r, a = {}) => {
239
+ const i = a.equals ?? (a.deep ? m : Object.is);
240
+ let f = t(e.$state);
241
+ return a.immediate && r(f, void 0), e.$subscribe((n) => {
242
+ const y = t(n);
243
+ if (!i(y, f)) {
244
+ const p = f;
245
+ f = y, r(y, p);
246
+ }
247
+ });
248
+ };
249
+ export {
250
+ G as a,
251
+ F as c,
252
+ q as d,
253
+ I as i,
254
+ E as l,
255
+ H as n,
256
+ K as o,
257
+ J as r,
258
+ P as s,
259
+ W as t,
260
+ z as u
261
+ };
262
+
263
+ //# sourceMappingURL=store-BwDvI45q.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-BwDvI45q.js","names":[],"sources":["../src/store/devtools.ts","../src/store/plugins.ts","../src/store/registry.ts","../src/store/utils.ts","../src/store/create-store.ts","../src/store/define-store.ts","../src/store/mapping.ts","../src/store/persisted.ts","../src/store/watch.ts"],"sourcesContent":["/**\n * Devtools integration for stores.\n * @internal\n */\n\ndeclare global {\n interface Window {\n __BQUERY_DEVTOOLS__?: {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n };\n }\n}\n\nexport type DevtoolsHook = {\n stores: Map<string, unknown>;\n onStoreCreated?: (id: string, store: unknown) => void;\n onStateChange?: (id: string, state: unknown) => void;\n};\n\nconst ensureDevtools = (): DevtoolsHook | undefined => {\n if (typeof window === 'undefined') return undefined;\n if (!window.__BQUERY_DEVTOOLS__) {\n window.__BQUERY_DEVTOOLS__ = { stores: new Map() };\n }\n return window.__BQUERY_DEVTOOLS__;\n};\n\nexport const registerDevtoolsStore = (id: string, store: unknown): void => {\n const devtools = ensureDevtools();\n if (!devtools) return;\n devtools.stores.set(id, store);\n devtools.onStoreCreated?.(id, store);\n};\n\nexport const unregisterDevtoolsStore = (id: string): void => {\n if (typeof window === 'undefined' || !window.__BQUERY_DEVTOOLS__) return;\n window.__BQUERY_DEVTOOLS__.stores.delete(id);\n};\n\nexport const notifyDevtoolsStateChange = (id: string, state: unknown): void => {\n if (typeof window === 'undefined') return;\n window.__BQUERY_DEVTOOLS__?.onStateChange?.(id, state);\n};\n","/**\n * Store plugins API.\n */\n\nimport type { Store, StoreDefinition, StorePlugin } from './types';\n\n/** @internal Registered plugins */\nconst plugins: StorePlugin[] = [];\n\n/**\n * Registers a plugin that extends all stores.\n *\n * @param plugin - The plugin function\n */\nexport const registerPlugin = (plugin: StorePlugin): void => {\n plugins.push(plugin);\n};\n\n/** @internal */\nexport const applyPlugins = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n options: StoreDefinition<any, any, any>\n): void => {\n for (const plugin of plugins) {\n const extension = plugin({ store, options });\n if (extension) {\n Object.assign(store, extension);\n }\n }\n};\n","/**\n * Store registry utilities.\n */\n\nimport { unregisterDevtoolsStore } from './devtools';\nimport type { Store } from './types';\n\n/** @internal Registry of all stores for devtools */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst storeRegistry = new Map<string, Store<any, any, any>>();\n\n/** @internal */\nexport const hasStore = (id: string): boolean => storeRegistry.has(id);\n\n/** @internal */\nexport const registerStore = (\n id: string,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n store: Store<any, any, any>\n): void => {\n storeRegistry.set(id, store);\n};\n\n/**\n * Retrieves an existing store by its ID.\n *\n * @param id - The store identifier\n * @returns The store instance or undefined if not found\n */\nexport const getStore = <T = unknown>(id: string): T | undefined => {\n return storeRegistry.get(id) as T | undefined;\n};\n\n/**\n * Lists all registered store IDs.\n *\n * @returns Array of store IDs\n */\nexport const listStores = (): string[] => {\n return Array.from(storeRegistry.keys());\n};\n\n/**\n * Removes a store from the registry.\n *\n * @param id - The store identifier\n */\nexport const destroyStore = (id: string): void => {\n storeRegistry.delete(id);\n unregisterDevtoolsStore(id);\n};\n","/**\n * Internal utilities for the store module.\n * @internal\n */\n\n/**\n * Check if a value is a plain object (not array, null, Date, etc.).\n * @internal\n */\nexport const isPlainObject = (value: unknown): value is Record<string, unknown> => {\n return (\n value !== null && typeof value === 'object' && Object.getPrototypeOf(value) === Object.prototype\n );\n};\n\n/**\n * Deep clones an object. Used for deep reactivity support.\n * @internal\n */\nexport const deepClone = <T>(obj: T): T => {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n return obj.map(deepClone) as T;\n }\n\n if (obj instanceof Date) {\n return new Date(obj.getTime()) as T;\n }\n\n if (obj instanceof Map) {\n return new Map(Array.from(obj.entries()).map(([k, v]) => [k, deepClone(v)])) as T;\n }\n\n if (obj instanceof Set) {\n return new Set(Array.from(obj).map(deepClone)) as T;\n }\n\n const cloned = {} as T;\n for (const key of Object.keys(obj)) {\n (cloned as Record<string, unknown>)[key] = deepClone((obj as Record<string, unknown>)[key]);\n }\n return cloned;\n};\n\n/**\n * Compares two values for deep equality.\n * @internal\n */\nexport const deepEqual = (a: unknown, b: unknown): boolean => {\n if (a === b) return true;\n if (a === null || b === null) return false;\n if (typeof a !== 'object' || typeof b !== 'object') return false;\n\n if (a instanceof Date && b instanceof Date) {\n return a.getTime() === b.getTime();\n }\n\n if (a instanceof Map && b instanceof Map) {\n if (a.size !== b.size) return false;\n for (const [key, value] of a.entries()) {\n if (!b.has(key) || !deepEqual(value, b.get(key))) return false;\n }\n return true;\n }\n\n if (a instanceof Set && b instanceof Set) {\n if (a.size !== b.size) return false;\n for (const value of a.values()) {\n let found = false;\n for (const candidate of b.values()) {\n if (deepEqual(value, candidate)) {\n found = true;\n break;\n }\n }\n if (!found) return false;\n }\n return true;\n }\n\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n return a.every((item, i) => deepEqual(item, b[i]));\n }\n\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n const keysA = Object.keys(a as object);\n const keysB = Object.keys(b as object);\n\n if (keysA.length !== keysB.length) return false;\n\n return keysA.every((key) =>\n deepEqual((a as Record<string, unknown>)[key], (b as Record<string, unknown>)[key])\n );\n};\n\n/**\n * Detects if nested objects were mutated but the reference stayed the same.\n * Returns the keys where nested mutations were detected.\n * @internal\n */\nexport const detectNestedMutations = <S extends Record<string, unknown>>(\n before: S,\n after: S,\n signalValues: Map<keyof S, unknown>\n): Array<keyof S> => {\n const mutatedKeys: Array<keyof S> = [];\n\n for (const key of Object.keys(after) as Array<keyof S>) {\n const beforeValue = before[key];\n const afterValue = after[key];\n const signalValue = signalValues.get(key);\n\n // Check if it's the same reference but content changed\n if (\n signalValue === afterValue &&\n isPlainObject(beforeValue) &&\n isPlainObject(afterValue) &&\n !deepEqual(beforeValue, afterValue)\n ) {\n mutatedKeys.push(key);\n }\n }\n\n return mutatedKeys;\n};\n\n/** @internal Flag to enable/disable development warnings */\nexport const isDev = (() => {\n try {\n const globalProcess = (globalThis as { process?: { env?: { NODE_ENV?: string } } }).process;\n // Default to dev mode unless explicitly set to production\n return !(typeof globalProcess !== 'undefined' && globalProcess.env?.NODE_ENV === 'production');\n } catch {\n return true;\n }\n})();\n","/**\n * Store creation logic.\n */\n\nimport {\n batch,\n computed,\n signal,\n untrack,\n type ReadonlySignal,\n type Signal,\n} from '../reactive/index';\nimport { notifyDevtoolsStateChange, registerDevtoolsStore } from './devtools';\nimport { applyPlugins } from './plugins';\nimport { getStore, hasStore, registerStore } from './registry';\nimport type { Getters, Store, StoreDefinition, StoreSubscriber } from './types';\nimport { deepClone, detectNestedMutations, isDev } from './utils';\n\n/**\n * Creates a reactive store with state, getters, and actions.\n *\n * @template S - State type\n * @template G - Getters type\n * @template A - Actions type\n * @param definition - Store definition\n * @returns The reactive store instance\n */\nexport const createStore = <\n S extends Record<string, unknown>,\n G extends Record<string, unknown> = Record<string, never>,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n A extends Record<string, (...args: any[]) => any> = Record<string, never>,\n>(\n definition: StoreDefinition<S, G, A>\n): Store<S, G, A> => {\n const { id, state: stateFactory, getters = {} as Getters<S, G>, actions = {} as A } = definition;\n\n // Check for duplicate store IDs\n if (hasStore(id)) {\n console.warn(`bQuery store: Store \"${id}\" already exists. Returning existing instance.`);\n return getStore(id) as Store<S, G, A>;\n }\n\n // Create initial state\n const initialState = stateFactory();\n\n // Create signals for each state property\n const stateSignals = new Map<keyof S, Signal<unknown>>();\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n stateSignals.set(key, signal(initialState[key]));\n }\n\n // Subscribers for $subscribe\n const subscribers: Array<StoreSubscriber<S>> = [];\n\n /**\n * Gets the current state.\n *\n * For subscriber notifications (where a plain object snapshot is needed),\n * this creates a shallow copy. For internal reads, use stateProxy directly.\n *\n * **Note:** Returns a shallow snapshot. Nested object mutations will NOT\n * trigger reactive updates. This differs from frameworks like Pinia that\n * use deep reactivity. To update nested state, replace the entire object.\n *\n * Uses `untrack()` to prevent accidental dependency tracking when called\n * from within reactive contexts (e.g., `effect()` or `computed()`).\n *\n * @internal\n */\n const getCurrentState = (): S =>\n untrack(() => {\n return { ...stateProxy };\n });\n\n /**\n * Notifies subscribers of state changes.\n * Short-circuits if there are no subscribers and devtools aren't active\n * to avoid unnecessary snapshot overhead.\n * @internal\n */\n const notifySubscribers = (): void => {\n // Early return if no subscribers and no devtools hook\n const hasDevtools =\n typeof window !== 'undefined' &&\n typeof window.__BQUERY_DEVTOOLS__?.onStateChange === 'function';\n if (subscribers.length === 0 && !hasDevtools) {\n return;\n }\n\n const currentState = getCurrentState();\n for (const callback of subscribers) {\n callback(currentState);\n }\n\n notifyDevtoolsStateChange(id, currentState);\n };\n\n /**\n * Cached state proxy that lazily reads signal values.\n * Uses a Proxy to avoid creating new objects on each access.\n *\n * **Note:** This returns a shallow snapshot of the state. Nested object\n * mutations will NOT trigger reactive updates. For nested reactivity,\n * replace the entire object or use signals for nested properties.\n *\n * @internal\n */\n const stateProxy = new Proxy({} as S, {\n get: (_, prop: string | symbol) => {\n const key = prop as keyof S;\n if (stateSignals.has(key)) {\n return stateSignals.get(key)!.value;\n }\n return undefined;\n },\n ownKeys: () => Array.from(stateSignals.keys()) as string[],\n getOwnPropertyDescriptor: (_, prop) => {\n if (stateSignals.has(prop as keyof S)) {\n return { enumerable: true, configurable: true };\n }\n return undefined;\n },\n has: (_, prop) => stateSignals.has(prop as keyof S),\n });\n\n // Create computed getters\n const getterComputed = new Map<keyof G, ReadonlySignal<unknown>>();\n\n // Build the store proxy\n const store = {} as Store<S, G, A>;\n\n // Define state properties with getters/setters\n for (const key of Object.keys(initialState) as Array<keyof S>) {\n Object.defineProperty(store, key, {\n get: () => stateSignals.get(key)!.value,\n set: (value: unknown) => {\n stateSignals.get(key)!.value = value;\n notifySubscribers();\n },\n enumerable: true,\n configurable: false,\n });\n }\n\n // Define getters as computed properties\n for (const key of Object.keys(getters) as Array<keyof G>) {\n const getterFn = getters[key];\n\n // Create computed that reads from state signals via proxy (more efficient)\n const computedGetter = computed(() => {\n const state = stateProxy;\n // For getter dependencies, pass a proxy that reads from computed getters\n const getterProxy = new Proxy({} as G, {\n get: (_, prop: string | symbol) => {\n const propKey = prop as keyof G;\n if (getterComputed.has(propKey)) {\n return getterComputed.get(propKey)!.value;\n }\n return undefined;\n },\n });\n return getterFn(state, getterProxy);\n });\n\n getterComputed.set(key, computedGetter as unknown as ReadonlySignal<unknown>);\n\n Object.defineProperty(store, key, {\n get: () => computedGetter.value,\n enumerable: true,\n configurable: false,\n });\n }\n\n // Bind actions to the store context\n for (const key of Object.keys(actions) as Array<keyof A>) {\n const actionFn = actions[key];\n\n // Wrap action to enable 'this' binding\n (store as Record<string, unknown>)[key as string] = function (...args: unknown[]) {\n // Create a context that allows 'this.property' access\n const context = new Proxy(store, {\n get: (target, prop) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n return stateSignals.get(prop as keyof S)!.value;\n }\n return (target as Record<string, unknown>)[prop as string];\n },\n set: (target, prop, value) => {\n if (typeof prop === 'string' && stateSignals.has(prop as keyof S)) {\n stateSignals.get(prop as keyof S)!.value = value;\n notifySubscribers();\n return true;\n }\n // Allow non-state property assignments (e.g., temporary variables in actions)\n // by delegating to the target object rather than returning false\n return Reflect.set(target, prop, value);\n },\n });\n\n return actionFn.apply(context, args);\n };\n }\n\n // Add store utility methods\n Object.defineProperties(store, {\n $id: {\n value: id,\n writable: false,\n enumerable: false,\n },\n $reset: {\n value: () => {\n const fresh = stateFactory();\n batch(() => {\n for (const [key, sig] of stateSignals) {\n sig.value = fresh[key];\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $subscribe: {\n value: (callback: StoreSubscriber<S>) => {\n subscribers.push(callback);\n return () => {\n const index = subscribers.indexOf(callback);\n if (index > -1) subscribers.splice(index, 1);\n };\n },\n writable: false,\n enumerable: false,\n },\n $patch: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Capture state before mutation for nested mutation detection\n const stateBefore = isDev ? deepClone(getCurrentState()) : null;\n const signalValuesBefore = isDev\n ? new Map(Array.from(stateSignals.entries()).map(([k, s]) => [k, s.value]))\n : null;\n\n // Mutation function\n const state = getCurrentState();\n partial(state);\n\n // Detect nested mutations in development mode\n if (isDev && stateBefore && signalValuesBefore) {\n const mutatedKeys = detectNestedMutations(stateBefore, state, signalValuesBefore);\n if (mutatedKeys.length > 0) {\n console.warn(\n `[bQuery store \"${id}\"] Nested mutation detected in $patch() for keys: ${mutatedKeys\n .map(String)\n .join(', ')}.\\n` +\n 'Nested object mutations do not trigger reactive updates because the store uses shallow reactivity.\\n' +\n 'To fix this, either:\\n' +\n ' 1. Replace the entire object: state.user = { ...state.user, name: \"New\" }\\n' +\n ' 2. Use $patchDeep() for automatic deep cloning\\n' +\n 'See: https://bquery.dev/guide/store#deep-reactivity'\n );\n }\n }\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Partial object\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $patchDeep: {\n value: (partial: Partial<S> | ((state: S) => void)) => {\n batch(() => {\n if (typeof partial === 'function') {\n // Deep clone state before mutation to ensure new references\n const state = deepClone(getCurrentState());\n partial(state);\n\n for (const [key, value] of Object.entries(state) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = value;\n }\n }\n } else {\n // Deep clone each value in partial to ensure new references\n for (const [key, value] of Object.entries(partial) as Array<[keyof S, unknown]>) {\n if (stateSignals.has(key)) {\n stateSignals.get(key)!.value = deepClone(value);\n }\n }\n }\n });\n notifySubscribers();\n },\n writable: false,\n enumerable: false,\n },\n $state: {\n get: () => getCurrentState(),\n enumerable: false,\n },\n });\n\n // Register store\n registerStore(id, store);\n\n // Apply plugins\n applyPlugins(store, definition);\n\n // Notify devtools\n registerDevtoolsStore(id, store);\n\n return store;\n};\n","/**\r\n * Store factory helpers.\r\n */\r\n\r\nimport { createStore } from './create-store';\r\nimport { getStore, hasStore } from './registry';\r\nimport type { Store, StoreDefinition } from './types';\r\n\r\n/**\r\n * Creates a store factory that returns the store instance.\r\n *\r\n * The store is lazily created on first call and cached in the global store\r\n * registry. Subsequent calls return the same instance. After calling\r\n * `destroyStore(id)`, the next factory call will create a fresh store.\r\n *\r\n * @param id - Store identifier\r\n * @param definition - Store definition without id\r\n * @returns A function that returns the store instance\r\n *\r\n * @example\r\n * ```ts\r\n * const useCounter = defineStore('counter', {\r\n * state: () => ({ count: 0 }),\r\n * actions: { increment() { this.count++; } },\r\n * });\r\n *\r\n * const counter = useCounter();\r\n * counter.increment();\r\n * ```\r\n */\r\nexport const defineStore = <\r\n S extends Record<string, unknown>,\r\n G extends Record<string, unknown> = Record<string, never>,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- actions may declare specific parameter types\r\n A extends Record<string, (...args: any[]) => any> = Record<string, never>,\r\n>(\r\n id: string,\r\n definition: Omit<StoreDefinition<S, G, A>, 'id'>\r\n): (() => Store<S, G, A>) => {\r\n // Check registry first to avoid noisy warnings from createStore()\r\n // when the factory is called multiple times (intended usage pattern).\r\n // createStore() only called when store doesn't exist or was destroyed.\r\n return () => {\r\n if (hasStore(id)) {\r\n return getStore(id) as Store<S, G, A>;\r\n }\r\n return createStore({ id, ...definition });\r\n };\r\n};\r\n","/**\r\n * Mapping helpers for store state and actions.\r\n */\r\n\r\n/**\r\n * Maps store state properties to a reactive object for use in components.\r\n *\r\n * @param store - The store instance\r\n * @param keys - State keys to map\r\n * @returns Object with mapped properties\r\n */\r\nexport const mapState = <S extends Record<string, unknown>, K extends keyof S>(\r\n store: S,\r\n keys: K[]\r\n): Pick<S, K> => {\r\n const mapped = {} as Pick<S, K>;\r\n\r\n for (const key of keys) {\r\n Object.defineProperty(mapped, key, {\r\n get: () => store[key],\r\n enumerable: true,\r\n });\r\n }\r\n\r\n return mapped;\r\n};\r\n\r\n/**\r\n * Maps store getters to a reactive object for use in components.\r\n *\r\n * @param store - The store instance\r\n * @param keys - Getter keys to map\r\n * @returns Object with mapped getters\r\n */\r\nexport const mapGetters = <G extends Record<string, unknown>, K extends keyof G>(\r\n store: G,\r\n keys: K[]\r\n): Pick<G, K> => {\r\n const mapped = {} as Pick<G, K>;\r\n\r\n for (const key of keys) {\r\n Object.defineProperty(mapped, key, {\r\n get: () => store[key],\r\n enumerable: true,\r\n });\r\n }\r\n\r\n return mapped;\r\n};\r\n\r\n/**\r\n * Maps store actions to an object for easier destructuring.\r\n *\r\n * @param store - The store instance\r\n * @param keys - Action keys to map\r\n * @returns Object with mapped actions\r\n */\r\nexport const mapActions = <\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- actions may declare specific parameter types\r\n A extends Record<string, (...args: any[]) => any>,\r\n K extends keyof A,\r\n>(\r\n store: A,\r\n keys: K[]\r\n): Pick<A, K> => {\r\n const mapped = {} as Pick<A, K>;\r\n\r\n for (const key of keys) {\r\n (mapped as Record<string, unknown>)[key as string] = (...args: unknown[]) =>\r\n (store[key] as (...args: unknown[]) => unknown)(...args);\r\n }\r\n\r\n return mapped;\r\n};\r\n","/**\r\n * Store persistence helpers.\r\n */\r\n\r\nimport { createStore } from './create-store';\r\nimport type { Store, StoreDefinition } from './types';\r\n\r\n/**\r\n * Creates a store with automatic persistence to localStorage.\r\n *\r\n * @param definition - Store definition\r\n * @param storageKey - Optional custom storage key\r\n * @returns The reactive store instance\r\n */\r\nexport const createPersistedStore = <\r\n S extends Record<string, unknown>,\r\n G extends Record<string, unknown> = Record<string, never>,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- actions may declare specific parameter types\r\n A extends Record<string, (...args: any[]) => any> = Record<string, never>,\r\n>(\r\n definition: StoreDefinition<S, G, A>,\r\n storageKey?: string\r\n): Store<S, G, A> => {\r\n const key = storageKey ?? `bquery-store-${definition.id}`;\r\n\r\n const originalStateFactory = definition.state;\r\n\r\n const wrappedDefinition: StoreDefinition<S, G, A> = {\r\n ...definition,\r\n state: () => {\r\n const defaultState = originalStateFactory();\r\n\r\n if (typeof window !== 'undefined') {\r\n try {\r\n const saved = localStorage.getItem(key);\r\n if (saved) {\r\n return { ...defaultState, ...JSON.parse(saved) } as S;\r\n }\r\n } catch {\r\n // Ignore parse errors\r\n }\r\n }\r\n\r\n return defaultState;\r\n },\r\n };\r\n\r\n const store = createStore(wrappedDefinition);\r\n\r\n // Subscribe to save changes\r\n store.$subscribe((state) => {\r\n if (typeof window !== 'undefined') {\r\n try {\r\n localStorage.setItem(key, JSON.stringify(state));\r\n } catch {\r\n // Ignore quota errors\r\n }\r\n }\r\n });\r\n\r\n return store;\r\n};\r\n","/**\r\n * Store watch helpers.\r\n */\r\n\r\nimport type { Store } from './types';\r\nimport { deepEqual } from './utils';\r\n\r\nexport type WatchStoreOptions<T> = {\r\n /** Call the callback immediately with the current value. */\r\n immediate?: boolean;\r\n /** Use deep comparison when determining changes. */\r\n deep?: boolean;\r\n /** Custom equality check for selected values. */\r\n equals?: (a: T, b: T) => boolean;\r\n};\r\n\r\n/**\r\n * Watch a selected slice of store state.\r\n *\r\n * @param store - The store instance\r\n * @param selector - Function to select the watched value\r\n * @param callback - Called when the selected value changes\r\n * @param options - Watch options\r\n * @returns Unsubscribe function\r\n */\r\nexport const watchStore = <\r\n S extends Record<string, unknown>,\r\n G extends Record<string, unknown>,\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- actions may declare specific parameter types\r\n A extends Record<string, (...args: any[]) => any>,\r\n T,\r\n>(\r\n store: Store<S, G, A>,\r\n selector: (state: S) => T,\r\n callback: (value: T, previous: T | undefined) => void,\r\n options: WatchStoreOptions<T> = {}\r\n): (() => void) => {\r\n const equals = options.equals ?? (options.deep ? deepEqual : Object.is);\r\n let previous = selector(store.$state);\r\n\r\n if (options.immediate) {\r\n callback(previous, undefined);\r\n }\r\n\r\n return store.$subscribe((state) => {\r\n const current = selector(state);\r\n if (!equals(current, previous)) {\r\n const prev = previous;\r\n previous = current;\r\n callback(current, prev);\r\n }\r\n });\r\n};\r\n"],"mappings":"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"}
package/dist/store.es.mjs CHANGED
@@ -1,27 +1,14 @@
1
- import { h as c, g as m, a as S, f as p } from "./persisted-DHoi3uEs.js";
2
- import { c as h, d as q, l as v, m as x, e as P, b as $, r as j } from "./persisted-DHoi3uEs.js";
3
- const d = (e, t) => () => c(e) ? m(e) : S({ id: e, ...t }), g = (e, t, o, s = {}) => {
4
- const i = s.equals ?? (s.deep ? p : Object.is);
5
- let r = t(e.$state);
6
- return s.immediate && o(r, void 0), e.$subscribe((n) => {
7
- const a = t(n);
8
- if (!i(a, r)) {
9
- const u = r;
10
- r = a, o(a, u);
11
- }
12
- });
13
- };
1
+ import { a as t, c as s, d as a, i as r, l as o, n as i, o as S, r as c, s as m, t as p, u as d } from "./store-BwDvI45q.js";
14
2
  export {
15
- h as createPersistedStore,
16
- S as createStore,
17
- d as defineStore,
18
- q as destroyStore,
19
- m as getStore,
20
- v as listStores,
21
- x as mapActions,
22
- P as mapGetters,
23
- $ as mapState,
24
- j as registerPlugin,
25
- g as watchStore
3
+ i as createPersistedStore,
4
+ m as createStore,
5
+ S as defineStore,
6
+ s as destroyStore,
7
+ o as getStore,
8
+ d as listStores,
9
+ c as mapActions,
10
+ r as mapGetters,
11
+ t as mapState,
12
+ a as registerPlugin,
13
+ p as watchStore
26
14
  };
27
- //# sourceMappingURL=store.es.mjs.map
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Storybook template helpers for authoring bQuery component stories.
3
+ *
4
+ * `storyHtml` mirrors bQuery's string-based `html` tag while adding support for
5
+ * Storybook-friendly boolean attribute shorthand (`?disabled=${true}`).
6
+ *
7
+ * @module bquery/storybook
8
+ */
9
+ type StoryValue = string | number | boolean | null | undefined | StoryValue[] | (() => StoryValue);
10
+ /**
11
+ * Tagged template literal for Storybook render functions.
12
+ *
13
+ * Supports boolean attribute shorthand compatible with Storybook's string
14
+ * renderer:
15
+ *
16
+ * ```ts
17
+ * storyHtml`<bq-button ?disabled=${true}>Save</bq-button>`;
18
+ * // => '<bq-button disabled="">Save</bq-button>'
19
+ * ```
20
+ *
21
+ * @param strings - Template literal string parts
22
+ * @param values - Interpolated values
23
+ * @returns HTML string compatible with `@storybook/web-components`
24
+ */
25
+ export declare const storyHtml: (strings: TemplateStringsArray, ...values: StoryValue[]) => string;
26
+ /**
27
+ * Conditionally render a value or template fragment.
28
+ *
29
+ * @param condition - Condition that controls rendering
30
+ * @param truthyValue - Value or callback rendered when the condition is truthy
31
+ * @param falsyValue - Optional value or callback rendered when the condition is falsy
32
+ * @returns Rendered string fragment, or an empty string when the condition is
33
+ * falsy and no fallback is provided
34
+ */
35
+ export declare const when: (condition: unknown, truthyValue: StoryValue, falsyValue?: StoryValue) => string;
36
+ export {};
37
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storybook/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,KAAK,UAAU,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,UAAU,EAAE,GAAG,CAAC,MAAM,UAAU,CAAC,CAAC;AA+ZnG;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS,oBAAoB,EAAE,GAAG,QAAQ,UAAU,EAAE,KAAG,MAoBlF,CAAC;AAEF;;;;;;;;GAQG;AACH,eAAO,MAAM,IAAI,GACf,WAAW,OAAO,EAClB,aAAa,UAAU,EACvB,aAAa,UAAU,KACtB,MAEF,CAAC"}
@@ -0,0 +1,151 @@
1
+ import { n as S } from "./sanitize-Bs2dkMby.js";
2
+ var b = "\0", u = (t) => t === " " || t === " " || t === `
3
+ ` || t === "\r" || t === "\f", A = (t) => t === b, d = (t) => u(t) || A(t), h = (t) => {
4
+ const r = t.charCodeAt(0);
5
+ return r >= 65 && r <= 90 || r >= 97 && r <= 122;
6
+ }, C = (t) => h(t), T = (t) => {
7
+ const r = t.charCodeAt(0);
8
+ return h(t) || r >= 48 && r <= 57 || t === ":" || t === "." || t === "_" || t === "-";
9
+ }, $ = (t) => t === '"' || t === "'", B = (t) => {
10
+ const r = t.charCodeAt(0);
11
+ return h(t) || r >= 48 && r <= 57 || t === "." || t === "_" || t === "-";
12
+ }, E = (t) => {
13
+ for (let r = 0; r < t.length; r += 1) if (t[r] === `
14
+ ` || t[r] === "\r") return !0;
15
+ return !1;
16
+ }, x = (t) => {
17
+ let r = 0;
18
+ for (; r < t.length && !d(t[r]) && t[r] !== "/" && t[r] !== ">"; ) r += 1;
19
+ return r;
20
+ }, N = (t) => {
21
+ if (!t.includes("-") || !h(t[0])) return !1;
22
+ const r = t[t.length - 1], n = r.charCodeAt(0);
23
+ return h(r) || n >= 48 && n <= 57 || r === "." || r === "_";
24
+ }, f = (t) => t !== "style" && !t.startsWith("on"), k = (t) => {
25
+ let r = t.length - 1;
26
+ for (; r >= 0 && u(t[r]); ) r -= 1;
27
+ if (r < 0 || t[r] !== "=") return null;
28
+ for (r -= 1; r >= 0 && u(t[r]); ) r -= 1;
29
+ const n = r;
30
+ for (; r >= 0 && !u(t[r]) && t[r] !== "?" && t[r] !== "=" && t[r] !== "/" && t[r] !== ">"; ) r -= 1;
31
+ const i = r + 1;
32
+ if (i > n || t[r] !== "?") return null;
33
+ const e = r;
34
+ let o = e;
35
+ for (; o > 0 && u(t[o - 1]); ) o -= 1;
36
+ return {
37
+ attribute: t.slice(i, n + 1),
38
+ basePart: t.slice(0, o),
39
+ spacing: t.slice(o, e)
40
+ };
41
+ }, L = (t) => {
42
+ const r = [];
43
+ let n = 0;
44
+ for (; n < t.length; ) {
45
+ if (t[n] !== "<") {
46
+ n += 1;
47
+ continue;
48
+ }
49
+ const i = t[n + 1];
50
+ if (!i || i === "/" || i === "!" || i === "?") {
51
+ n += 1;
52
+ continue;
53
+ }
54
+ let e = n + 1;
55
+ if (!h(t[e])) {
56
+ n += 1;
57
+ continue;
58
+ }
59
+ for (; e < t.length && B(t[e]); ) e += 1;
60
+ const o = n + 1;
61
+ if (!t.slice(o, e)) {
62
+ n += 1;
63
+ continue;
64
+ }
65
+ let s = null, c = e;
66
+ for (; c < t.length; ) {
67
+ const l = t[c];
68
+ if (s) {
69
+ l === s && (s = null), c += 1;
70
+ continue;
71
+ }
72
+ if (l === '"' || l === "'") {
73
+ s = l, c += 1;
74
+ continue;
75
+ }
76
+ if (l === ">") {
77
+ r.push(t.slice(n + 1, c)), c += 1;
78
+ break;
79
+ }
80
+ c += 1;
81
+ }
82
+ n = c;
83
+ }
84
+ return r;
85
+ }, O = (t, r) => {
86
+ if (r >= t.length) return r;
87
+ let n = r;
88
+ if (A(t[n])) return n + 1;
89
+ for (; n < t.length && u(t[n]); ) n += 1;
90
+ if (n >= t.length) return n;
91
+ if (A(t[n])) return n + 1;
92
+ const i = t[n];
93
+ if ($(i)) {
94
+ for (n += 1; n < t.length; ) {
95
+ if (t[n] === i) return n + 1;
96
+ n += 1;
97
+ }
98
+ return n;
99
+ }
100
+ for (; n < t.length && !d(t[n]) && t[n] !== "/" && t[n] !== ">"; ) n += 1;
101
+ return n < t.length && A(t[n]) ? n + 1 : n;
102
+ }, _ = (t, r, n) => {
103
+ let i = 0;
104
+ for (; i < t.length && !d(t[i]); ) i += 1;
105
+ for (; i < t.length; ) {
106
+ for (; i < t.length && d(t[i]); ) i += 1;
107
+ if (i >= t.length || t[i] === "/") return;
108
+ if (t[i] === ":") {
109
+ i += 1;
110
+ continue;
111
+ }
112
+ const e = t[i] === "?";
113
+ if (e && (i += 1), i >= t.length || !C(t[i])) {
114
+ i += 1;
115
+ continue;
116
+ }
117
+ const o = i;
118
+ for (i += 1; i < t.length && T(t[i]); ) i += 1;
119
+ const s = t.slice(o, i).toLowerCase();
120
+ for (; i < t.length && d(t[i]); ) i += 1;
121
+ if (i < t.length && t[i] === "=") {
122
+ n && f(s) && r.add(s), i = O(t, i + 1);
123
+ continue;
124
+ }
125
+ e && n && f(s) && r.add(s);
126
+ }
127
+ }, g = (t) => {
128
+ const r = t.join(b), n = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set();
129
+ for (const e of L(r)) {
130
+ const o = e.slice(0, x(e)).toLowerCase(), s = N(o);
131
+ s && n.add(o), _(e, i, s);
132
+ }
133
+ return {
134
+ allowTags: Array.from(n),
135
+ allowAttributes: Array.from(i)
136
+ };
137
+ }, w = (t) => t == null ? "" : Array.isArray(t) ? t.map((r) => w(r)).join("") : typeof t == "function" ? w(t()) : String(t), a = (t) => t == null ? !1 : typeof t == "function" ? a(t()) : Array.isArray(t) ? !!w(t) : typeof t == "boolean" ? t : !!t, M = (t, ...r) => S(t.reduce((n, i, e) => {
138
+ if (e >= r.length) return `${n}${i}`;
139
+ const o = k(i);
140
+ if (o) {
141
+ const { attribute: s, basePart: c, spacing: l } = o, y = E(l) ? l : "";
142
+ return `${n}${c}${a(r[e]) ? `${l}${s}` : y}`;
143
+ }
144
+ return `${n}${i}${w(r[e])}`;
145
+ }, ""), g(t)), P = (t, r, n) => w(t ? r : n);
146
+ export {
147
+ M as storyHtml,
148
+ P as when
149
+ };
150
+
151
+ //# sourceMappingURL=storybook.es.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"storybook.es.mjs","names":[],"sources":["../src/storybook/index.ts"],"sourcesContent":["/**\r\n * Storybook template helpers for authoring bQuery component stories.\r\n *\r\n * `storyHtml` mirrors bQuery's string-based `html` tag while adding support for\r\n * Storybook-friendly boolean attribute shorthand (`?disabled=${true}`).\r\n *\r\n * @module bquery/storybook\r\n */\r\n\r\nimport { sanitizeHtml } from '../security/sanitize';\r\n\r\ntype StoryValue = string | number | boolean | null | undefined | StoryValue[] | (() => StoryValue);\r\n\r\n/**\r\n * Marks template interpolation boundaries while inferring sanitizer allowlists.\r\n * Uses the null character because authored HTML/template strings should not\r\n * contain it, making it a safe internal sentinel during parsing.\r\n */\r\nconst INTERPOLATION_BOUNDARY_MARKER = '\\u0000';\r\n\r\nconst isWhitespace = (value: string): boolean => {\r\n return value === ' ' || value === '\\t' || value === '\\n' || value === '\\r' || value === '\\f';\r\n};\r\n\r\n/**\r\n * Detects interpolation boundaries embedded into joined template string fragments.\r\n */\r\nconst isInterpolationBoundaryMarker = (value: string): boolean => value === INTERPOLATION_BOUNDARY_MARKER;\r\n\r\nconst isAttributeSeparator = (value: string): boolean => {\r\n return isWhitespace(value) || isInterpolationBoundaryMarker(value);\r\n};\r\n\r\nconst isAsciiLetter = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (code >= 65 && code <= 90) || (code >= 97 && code <= 122);\r\n};\r\n\r\nconst isAttributeNameStart = (value: string): boolean => isAsciiLetter(value);\r\n\r\nconst isAttributeNameChar = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (\r\n isAsciiLetter(value) ||\r\n (code >= 48 && code <= 57) ||\r\n value === ':' ||\r\n value === '.' ||\r\n value === '_' ||\r\n value === '-'\r\n );\r\n};\r\n\r\nconst isQuoteChar = (value: string): boolean => value === '\"' || value === \"'\";\r\n\r\nconst isTagNameChar = (value: string): boolean => {\r\n const code = value.charCodeAt(0);\r\n\r\n return (\r\n isAsciiLetter(value) ||\r\n (code >= 48 && code <= 57) ||\r\n value === '.' ||\r\n value === '_' ||\r\n value === '-'\r\n );\r\n};\r\n\r\nconst hasLineBreak = (value: string): boolean => {\r\n for (let index = 0; index < value.length; index += 1) {\r\n if (value[index] === '\\n' || value[index] === '\\r') {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n};\r\n\r\nconst getTagNameEnd = (fragment: string): number => {\r\n let index = 0;\r\n\r\n while (\r\n index < fragment.length &&\r\n !isAttributeSeparator(fragment[index]) &&\r\n fragment[index] !== '/' &&\r\n fragment[index] !== '>'\r\n ) {\r\n index += 1;\r\n }\r\n\r\n return index;\r\n};\r\n\r\nconst isCustomElementTagName = (tagName: string): boolean => {\r\n if (!tagName.includes('-') || !isAsciiLetter(tagName[0])) {\r\n return false;\r\n }\r\n\r\n const last = tagName[tagName.length - 1];\r\n const code = last.charCodeAt(0);\r\n\r\n return isAsciiLetter(last) || (code >= 48 && code <= 57) || last === '.' || last === '_';\r\n};\r\n\r\nconst isAutoAllowedStoryAttribute = (attributeName: string): boolean => {\r\n return attributeName !== 'style' && !attributeName.startsWith('on');\r\n};\r\n\r\nconst findBooleanAttributeSuffix = (\r\n part: string\r\n): { attribute: string; basePart: string; spacing: string } | null => {\r\n let index = part.length - 1;\r\n\r\n while (index >= 0 && isWhitespace(part[index])) {\r\n index -= 1;\r\n }\r\n\r\n if (index < 0 || part[index] !== '=') {\r\n return null;\r\n }\r\n\r\n index -= 1;\r\n\r\n while (index >= 0 && isWhitespace(part[index])) {\r\n index -= 1;\r\n }\r\n\r\n const attributeEnd = index;\r\n\r\n while (\r\n index >= 0 &&\r\n !isWhitespace(part[index]) &&\r\n part[index] !== '?' &&\r\n part[index] !== '=' &&\r\n part[index] !== '/' &&\r\n part[index] !== '>'\r\n ) {\r\n index -= 1;\r\n }\r\n\r\n const attributeStart = index + 1;\r\n\r\n if (attributeStart > attributeEnd || part[index] !== '?') {\r\n return null;\r\n }\r\n\r\n const questionMarkIndex = index;\r\n let spacingStart = questionMarkIndex;\r\n\r\n while (spacingStart > 0 && isWhitespace(part[spacingStart - 1])) {\r\n spacingStart -= 1;\r\n }\r\n\r\n return {\r\n attribute: part.slice(attributeStart, attributeEnd + 1),\r\n basePart: part.slice(0, spacingStart),\r\n spacing: part.slice(spacingStart, questionMarkIndex),\r\n };\r\n};\r\n\r\nconst collectOpeningTagFragments = (template: string): string[] => {\r\n const fragments: string[] = [];\r\n let index = 0;\r\n\r\n while (index < template.length) {\r\n if (template[index] !== '<') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const next = template[index + 1];\r\n\r\n if (!next || next === '/' || next === '!' || next === '?') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n let cursor = index + 1;\r\n\r\n if (!isAsciiLetter(template[cursor])) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n while (cursor < template.length && isTagNameChar(template[cursor])) {\r\n cursor += 1;\r\n }\r\n\r\n const tagStart = index + 1;\r\n const tagName = template.slice(tagStart, cursor);\r\n\r\n if (!tagName) {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n let inQuote: '\"' | \"'\" | null = null;\r\n let tagEnd = cursor;\r\n\r\n while (tagEnd < template.length) {\r\n const char = template[tagEnd];\r\n\r\n if (inQuote) {\r\n if (char === inQuote) {\r\n inQuote = null;\r\n }\r\n\r\n tagEnd += 1;\r\n continue;\r\n }\r\n\r\n if (char === '\"' || char === \"'\") {\r\n inQuote = char;\r\n tagEnd += 1;\r\n continue;\r\n }\r\n\r\n if (char === '>') {\r\n fragments.push(template.slice(index + 1, tagEnd));\r\n tagEnd += 1;\r\n break;\r\n }\r\n\r\n tagEnd += 1;\r\n }\r\n\r\n index = tagEnd;\r\n }\r\n\r\n return fragments;\r\n};\r\n\r\n/**\r\n * Consumes a literal HTML attribute value starting at the given index.\r\n *\r\n * Returns the position immediately after a quoted or unquoted value. When the\r\n * current position reaches an interpolation boundary (optionally after\r\n * whitespace), the returned index advances past the boundary marker so\r\n * interpolated attributes do not swallow following authored attributes during\r\n * sanitizer allowlist inference.\r\n *\r\n * @param fragment - The opening-tag fragment currently being scanned\r\n * @param index - The position immediately after the `=` sign\r\n * @returns The index after the consumed literal value, or just past an\r\n * interpolation boundary when no literal value should be consumed from the\r\n * current template fragment.\r\n */\r\nconst skipAttributeValue = (fragment: string, index: number): number => {\r\n if (index >= fragment.length) {\r\n return index;\r\n }\r\n\r\n let cursor = index;\r\n\r\n if (isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n while (cursor < fragment.length && isWhitespace(fragment[cursor])) {\r\n cursor += 1;\r\n }\r\n\r\n if (cursor >= fragment.length) {\r\n return cursor;\r\n }\r\n\r\n if (isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n const quote = fragment[cursor];\r\n\r\n if (isQuoteChar(quote)) {\r\n cursor += 1;\r\n\r\n while (cursor < fragment.length) {\r\n if (fragment[cursor] === quote) {\r\n return cursor + 1;\r\n }\r\n\r\n cursor += 1;\r\n }\r\n\r\n return cursor;\r\n }\r\n\r\n while (\r\n cursor < fragment.length &&\r\n !isAttributeSeparator(fragment[cursor]) &&\r\n fragment[cursor] !== '/' &&\r\n fragment[cursor] !== '>'\r\n ) {\r\n cursor += 1;\r\n }\r\n\r\n if (cursor < fragment.length && isInterpolationBoundaryMarker(fragment[cursor])) {\r\n return cursor + 1;\r\n }\r\n\r\n return cursor;\r\n};\r\n\r\nconst collectAttributesFromTagFragment = (\r\n fragment: string,\r\n allowAttributes: Set<string>,\r\n autoAllowAttributes: boolean\r\n): void => {\r\n let index = 0;\r\n\r\n while (index < fragment.length && !isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n while (index < fragment.length) {\r\n while (index < fragment.length && isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n if (index >= fragment.length || fragment[index] === '/') {\r\n return;\r\n }\r\n\r\n // Skip standalone colons (e.g. namespace prefixes or framework-specific bindings)\r\n if (fragment[index] === ':') {\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const hasBooleanPrefix = fragment[index] === '?';\r\n\r\n if (hasBooleanPrefix) {\r\n index += 1;\r\n }\r\n\r\n if (index >= fragment.length || !isAttributeNameStart(fragment[index])) {\r\n // Skip unrecognised character to avoid an infinite loop\r\n index += 1;\r\n continue;\r\n }\r\n\r\n const nameStart = index;\r\n\r\n index += 1;\r\n\r\n while (index < fragment.length && isAttributeNameChar(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n const attributeName = fragment.slice(nameStart, index).toLowerCase();\r\n\r\n while (index < fragment.length && isAttributeSeparator(fragment[index])) {\r\n index += 1;\r\n }\r\n\r\n if (index < fragment.length && fragment[index] === '=') {\r\n if (autoAllowAttributes && isAutoAllowedStoryAttribute(attributeName)) {\r\n allowAttributes.add(attributeName);\r\n }\r\n index = skipAttributeValue(fragment, index + 1);\r\n continue;\r\n }\r\n\r\n if (hasBooleanPrefix && autoAllowAttributes && isAutoAllowedStoryAttribute(attributeName)) {\r\n allowAttributes.add(attributeName);\r\n }\r\n }\r\n};\r\n\r\nconst collectTemplateSanitizeOptions = (strings: TemplateStringsArray) => {\r\n const template = strings.join(INTERPOLATION_BOUNDARY_MARKER);\r\n const allowTags = new Set<string>();\r\n const allowAttributes = new Set<string>();\r\n\r\n for (const fragment of collectOpeningTagFragments(template)) {\r\n const tagName = fragment.slice(0, getTagNameEnd(fragment)).toLowerCase();\r\n const isCustomElement = isCustomElementTagName(tagName);\r\n\r\n if (isCustomElement) {\r\n allowTags.add(tagName);\r\n }\r\n\r\n collectAttributesFromTagFragment(fragment, allowAttributes, isCustomElement);\r\n }\r\n\r\n return {\r\n allowTags: Array.from(allowTags),\r\n allowAttributes: Array.from(allowAttributes),\r\n };\r\n};\r\n\r\nconst resolveStoryValue = (value: StoryValue): string => {\r\n if (value == null) {\r\n return '';\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return value.map((item) => resolveStoryValue(item)).join('');\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return resolveStoryValue(value());\r\n }\r\n\r\n return String(value);\r\n};\r\n\r\nconst resolveBooleanStoryValue = (value: StoryValue): boolean => {\r\n if (value == null) {\r\n return false;\r\n }\r\n\r\n if (typeof value === 'function') {\r\n return resolveBooleanStoryValue(value());\r\n }\r\n\r\n if (Array.isArray(value)) {\r\n return Boolean(resolveStoryValue(value));\r\n }\r\n\r\n if (typeof value === 'boolean') {\r\n return value;\r\n }\r\n\r\n return Boolean(value);\r\n};\r\n\r\n/**\r\n * Tagged template literal for Storybook render functions.\r\n *\r\n * Supports boolean attribute shorthand compatible with Storybook's string\r\n * renderer:\r\n *\r\n * ```ts\r\n * storyHtml`<bq-button ?disabled=${true}>Save</bq-button>`;\r\n * // => '<bq-button disabled=\"\">Save</bq-button>'\r\n * ```\r\n *\r\n * @param strings - Template literal string parts\r\n * @param values - Interpolated values\r\n * @returns HTML string compatible with `@storybook/web-components`\r\n */\r\nexport const storyHtml = (strings: TemplateStringsArray, ...values: StoryValue[]): string => {\r\n const rendered = strings.reduce((acc, part, index) => {\r\n if (index >= values.length) {\r\n return `${acc}${part}`;\r\n }\r\n\r\n const booleanAttributeMatch = findBooleanAttributeSuffix(part);\r\n\r\n if (booleanAttributeMatch) {\r\n const { attribute, basePart, spacing } = booleanAttributeMatch;\r\n const preservedSpacing = hasLineBreak(spacing) ? spacing : '';\r\n const isEnabled = resolveBooleanStoryValue(values[index]);\r\n\r\n return `${acc}${basePart}${isEnabled ? `${spacing}${attribute}` : preservedSpacing}`;\r\n }\r\n\r\n return `${acc}${part}${resolveStoryValue(values[index])}`;\r\n }, '');\r\n\r\n return sanitizeHtml(rendered, collectTemplateSanitizeOptions(strings));\r\n};\r\n\r\n/**\r\n * Conditionally render a value or template fragment.\r\n *\r\n * @param condition - Condition that controls rendering\r\n * @param truthyValue - Value or callback rendered when the condition is truthy\r\n * @param falsyValue - Optional value or callback rendered when the condition is falsy\r\n * @returns Rendered string fragment, or an empty string when the condition is\r\n * falsy and no fallback is provided\r\n */\r\nexport const when = (\r\n condition: unknown,\r\n truthyValue: StoryValue,\r\n falsyValue?: StoryValue\r\n): string => {\r\n return resolveStoryValue(condition ? truthyValue : falsyValue);\r\n};\r\n"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { u as t } from "./effect-AFRW_Plg.js";
2
+ var e = (r) => t(r);
3
+ export {
4
+ e as t
5
+ };
6
+
7
+ //# sourceMappingURL=untrack-B0rVscTc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"untrack-B0rVscTc.js","names":[],"sources":["../src/reactive/untrack.ts"],"sourcesContent":["/**\n * Dependency tracking control helpers.\n */\n\nimport { withoutCurrentObserver } from './internals';\n\n/**\n * Executes a function without tracking any signal dependencies.\n * Useful when reading a signal value without creating a reactive dependency.\n *\n * This implementation temporarily hides the current observer rather than\n * disabling tracking globally. This ensures that nested reactive internals\n * (e.g., computed recomputation triggered during untrack) can still properly\n * track their own dependencies.\n *\n * @template T - The return type of the function\n * @param fn - The function to execute without tracking\n * @returns The result of the function\n *\n * @example\n * ```ts\n * const count = signal(0);\n * effect(() => {\n * // This read creates a dependency\n * console.log(count.value);\n * // This read does not create a dependency\n * const snapshot = untrack(() => count.value);\n * });\n * ```\n */\nexport const untrack = <T>(fn: () => T): T => withoutCurrentObserver(fn);\n"],"mappings":";AA8BA,IAAa,IAAA,CAAc,MAAmB,EAAuB,CAAA"}