@bquery/bquery 1.3.0 → 1.4.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 (71) hide show
  1. package/README.md +527 -501
  2. package/dist/{batch-4LAvfLE7.js → batch-x7b2eZST.js} +2 -2
  3. package/dist/{batch-4LAvfLE7.js.map → batch-x7b2eZST.js.map} +1 -1
  4. package/dist/component.es.mjs +1 -1
  5. package/dist/core/collection.d.ts +19 -3
  6. package/dist/core/collection.d.ts.map +1 -1
  7. package/dist/core/element.d.ts +23 -4
  8. package/dist/core/element.d.ts.map +1 -1
  9. package/dist/core/index.d.ts +1 -0
  10. package/dist/core/index.d.ts.map +1 -1
  11. package/dist/core/utils/function.d.ts +21 -4
  12. package/dist/core/utils/function.d.ts.map +1 -1
  13. package/dist/{core-COenAZjD.js → core-BhpuvPhy.js} +62 -37
  14. package/dist/core-BhpuvPhy.js.map +1 -0
  15. package/dist/core.es.mjs +174 -131
  16. package/dist/core.es.mjs.map +1 -1
  17. package/dist/full.es.mjs +7 -7
  18. package/dist/full.iife.js +2 -2
  19. package/dist/full.iife.js.map +1 -1
  20. package/dist/full.umd.js +2 -2
  21. package/dist/full.umd.js.map +1 -1
  22. package/dist/index.es.mjs +7 -7
  23. package/dist/motion.es.mjs.map +1 -1
  24. package/dist/{persisted-Dz_ryNuC.js → persisted-DHoi3uEs.js} +4 -4
  25. package/dist/{persisted-Dz_ryNuC.js.map → persisted-DHoi3uEs.js.map} +1 -1
  26. package/dist/platform/storage.d.ts.map +1 -1
  27. package/dist/platform.es.mjs +12 -7
  28. package/dist/platform.es.mjs.map +1 -1
  29. package/dist/reactive/core.d.ts +12 -0
  30. package/dist/reactive/core.d.ts.map +1 -1
  31. package/dist/reactive/effect.d.ts.map +1 -1
  32. package/dist/reactive/internals.d.ts +6 -0
  33. package/dist/reactive/internals.d.ts.map +1 -1
  34. package/dist/reactive.es.mjs +6 -6
  35. package/dist/router.es.mjs +1 -1
  36. package/dist/{sanitize-1FBEPAFH.js → sanitize-Cxvxa-DX.js} +50 -39
  37. package/dist/sanitize-Cxvxa-DX.js.map +1 -0
  38. package/dist/security/sanitize-core.d.ts.map +1 -1
  39. package/dist/security.es.mjs +2 -2
  40. package/dist/store.es.mjs +2 -2
  41. package/dist/type-guards-BdKlYYlS.js +32 -0
  42. package/dist/type-guards-BdKlYYlS.js.map +1 -0
  43. package/dist/untrack-DNnnqdlR.js +6 -0
  44. package/dist/{untrack-BuEQKH7_.js.map → untrack-DNnnqdlR.js.map} +1 -1
  45. package/dist/view/evaluate.d.ts.map +1 -1
  46. package/dist/view.es.mjs +157 -151
  47. package/dist/view.es.mjs.map +1 -1
  48. package/dist/{watch-CXyaBC_9.js → watch-DXXv3iAI.js} +3 -3
  49. package/dist/{watch-CXyaBC_9.js.map → watch-DXXv3iAI.js.map} +1 -1
  50. package/package.json +132 -132
  51. package/src/core/collection.ts +628 -588
  52. package/src/core/element.ts +774 -746
  53. package/src/core/index.ts +48 -47
  54. package/src/core/utils/function.ts +151 -110
  55. package/src/motion/animate.ts +113 -113
  56. package/src/motion/flip.ts +176 -176
  57. package/src/motion/scroll.ts +57 -57
  58. package/src/motion/spring.ts +150 -150
  59. package/src/motion/timeline.ts +246 -246
  60. package/src/motion/transition.ts +51 -51
  61. package/src/platform/storage.ts +215 -208
  62. package/src/reactive/core.ts +114 -93
  63. package/src/reactive/effect.ts +54 -43
  64. package/src/reactive/internals.ts +122 -105
  65. package/src/security/sanitize-core.ts +364 -343
  66. package/src/view/evaluate.ts +290 -274
  67. package/dist/core-COenAZjD.js.map +0 -1
  68. package/dist/sanitize-1FBEPAFH.js.map +0 -1
  69. package/dist/type-guards-DRma3-Kc.js +0 -16
  70. package/dist/type-guards-DRma3-Kc.js.map +0 -1
  71. package/dist/untrack-BuEQKH7_.js +0 -6
@@ -1,43 +1,54 @@
1
- /**
2
- * Reactive effects.
3
- */
4
-
5
- import { CleanupFn, Observer, track, clearDependencies } from './internals';
6
-
7
- /**
8
- * Creates a side effect that automatically re-runs when dependencies change.
9
- *
10
- * The effect runs immediately upon creation and then re-runs whenever
11
- * any signal or computed value read inside it changes.
12
- *
13
- * @param fn - The effect function to run
14
- * @returns A cleanup function to stop the effect
15
- */
16
- export const effect = (fn: () => void | CleanupFn): CleanupFn => {
17
- let cleanupFn: CleanupFn | void;
18
- let isDisposed = false;
19
-
20
- const observer: Observer = () => {
21
- if (isDisposed) return;
22
-
23
- if (cleanupFn) {
24
- cleanupFn();
25
- }
26
-
27
- // Clear old dependencies before running to avoid stale subscriptions
28
- clearDependencies(observer);
29
-
30
- cleanupFn = track(observer, fn);
31
- };
32
-
33
- observer();
34
-
35
- return () => {
36
- isDisposed = true;
37
- if (cleanupFn) {
38
- cleanupFn();
39
- }
40
- // Clean up all dependencies when effect is disposed
41
- clearDependencies(observer);
42
- };
43
- };
1
+ /**
2
+ * Reactive effects.
3
+ */
4
+
5
+ import { CleanupFn, Observer, track, clearDependencies } from './internals';
6
+
7
+ /**
8
+ * Creates a side effect that automatically re-runs when dependencies change.
9
+ *
10
+ * The effect runs immediately upon creation and then re-runs whenever
11
+ * any signal or computed value read inside it changes.
12
+ *
13
+ * @param fn - The effect function to run
14
+ * @returns A cleanup function to stop the effect
15
+ */
16
+ export const effect = (fn: () => void | CleanupFn): CleanupFn => {
17
+ let cleanupFn: CleanupFn | void;
18
+ let isDisposed = false;
19
+
20
+ const runCleanup = (): void => {
21
+ if (cleanupFn) {
22
+ try {
23
+ cleanupFn();
24
+ } catch (error) {
25
+ console.error('bQuery reactive: Error in effect cleanup', error);
26
+ }
27
+ cleanupFn = undefined;
28
+ }
29
+ };
30
+
31
+ const observer: Observer = () => {
32
+ if (isDisposed) return;
33
+
34
+ runCleanup();
35
+
36
+ // Clear old dependencies before running to avoid stale subscriptions
37
+ clearDependencies(observer);
38
+
39
+ try {
40
+ cleanupFn = track(observer, fn);
41
+ } catch (error) {
42
+ console.error('bQuery reactive: Error in effect', error);
43
+ }
44
+ };
45
+
46
+ observer();
47
+
48
+ return () => {
49
+ isDisposed = true;
50
+ runCleanup();
51
+ // Clean up all dependencies when effect is disposed
52
+ clearDependencies(observer);
53
+ };
54
+ };
@@ -1,105 +1,122 @@
1
- /**
2
- * Internal reactive plumbing shared across primitives.
3
- * @internal
4
- */
5
-
6
- export type Observer = () => void;
7
- export type CleanupFn = () => void;
8
-
9
- /**
10
- * Interface for reactive sources (Signals, Computed) that can unsubscribe observers.
11
- * @internal
12
- */
13
- export interface ReactiveSource {
14
- unsubscribe(observer: Observer): void;
15
- }
16
-
17
- const observerStack: Observer[] = [];
18
- let batchDepth = 0;
19
- const pendingObservers = new Set<Observer>();
20
-
21
- // Track dependencies for each observer to enable cleanup
22
- const observerDependencies = new WeakMap<Observer, Set<ReactiveSource>>();
23
-
24
- export const track = <T>(observer: Observer, fn: () => T): T => {
25
- observerStack.push(observer);
26
- try {
27
- return fn();
28
- } finally {
29
- observerStack.pop();
30
- }
31
- };
32
-
33
- export const getCurrentObserver = (): Observer | undefined =>
34
- observerStack[observerStack.length - 1];
35
-
36
- /**
37
- * Executes a function without exposing the current observer to dependencies.
38
- * Unlike disabling tracking globally, this still allows nested reactive internals
39
- * (e.g., computed recomputation) to track their own dependencies.
40
- * @internal
41
- */
42
- export const withoutCurrentObserver = <T>(fn: () => T): T => {
43
- // Push undefined to temporarily "hide" the current observer
44
- // This way, Signal.value reads won't link to the previous observer,
45
- // but nested track() calls (e.g., computed recompute) still work normally.
46
- observerStack.push(undefined as unknown as Observer);
47
- try {
48
- return fn();
49
- } finally {
50
- observerStack.pop();
51
- }
52
- };
53
-
54
- export const scheduleObserver = (observer: Observer): void => {
55
- if (batchDepth > 0) {
56
- pendingObservers.add(observer);
57
- return;
58
- }
59
- observer();
60
- };
61
-
62
- const flushObservers = (): void => {
63
- for (const observer of Array.from(pendingObservers)) {
64
- pendingObservers.delete(observer);
65
- observer();
66
- }
67
- };
68
-
69
- export const beginBatch = (): void => {
70
- batchDepth += 1;
71
- };
72
-
73
- export const endBatch = (): void => {
74
- batchDepth -= 1;
75
- if (batchDepth === 0) {
76
- flushObservers();
77
- }
78
- };
79
-
80
- /**
81
- * Registers a dependency between an observer and a reactive source.
82
- * @internal
83
- */
84
- export const registerDependency = (observer: Observer, source: ReactiveSource): void => {
85
- let deps = observerDependencies.get(observer);
86
- if (!deps) {
87
- deps = new Set();
88
- observerDependencies.set(observer, deps);
89
- }
90
- deps.add(source);
91
- };
92
-
93
- /**
94
- * Clears all dependencies for an observer, unsubscribing from all sources.
95
- * @internal
96
- */
97
- export const clearDependencies = (observer: Observer): void => {
98
- const deps = observerDependencies.get(observer);
99
- if (deps) {
100
- for (const source of deps) {
101
- source.unsubscribe(observer);
102
- }
103
- deps.clear();
104
- }
105
- };
1
+ /**
2
+ * Internal reactive plumbing shared across primitives.
3
+ * @internal
4
+ */
5
+
6
+ export type Observer = () => void;
7
+ export type CleanupFn = () => void;
8
+
9
+ /**
10
+ * Interface for reactive sources (Signals, Computed) that can unsubscribe observers.
11
+ * @internal
12
+ */
13
+ export interface ReactiveSource {
14
+ unsubscribe(observer: Observer): void;
15
+ }
16
+
17
+ const observerStack: Observer[] = [];
18
+ let batchDepth = 0;
19
+ const pendingObservers = new Set<Observer>();
20
+
21
+ // Track dependencies for each observer to enable cleanup
22
+ const observerDependencies = new WeakMap<Observer, Set<ReactiveSource>>();
23
+
24
+ export const track = <T>(observer: Observer, fn: () => T): T => {
25
+ observerStack.push(observer);
26
+ try {
27
+ return fn();
28
+ } finally {
29
+ observerStack.pop();
30
+ }
31
+ };
32
+
33
+ export const getCurrentObserver = (): Observer | undefined =>
34
+ observerStack[observerStack.length - 1];
35
+
36
+ /**
37
+ * Executes a function without exposing the current observer to dependencies.
38
+ * Unlike disabling tracking globally, this still allows nested reactive internals
39
+ * (e.g., computed recomputation) to track their own dependencies.
40
+ * @internal
41
+ */
42
+ export const withoutCurrentObserver = <T>(fn: () => T): T => {
43
+ // Push undefined to temporarily "hide" the current observer
44
+ // This way, Signal.value reads won't link to the previous observer,
45
+ // but nested track() calls (e.g., computed recompute) still work normally.
46
+ observerStack.push(undefined as unknown as Observer);
47
+ try {
48
+ return fn();
49
+ } finally {
50
+ observerStack.pop();
51
+ }
52
+ };
53
+
54
+ export const scheduleObserver = (observer: Observer): void => {
55
+ if (batchDepth > 0) {
56
+ pendingObservers.add(observer);
57
+ return;
58
+ }
59
+ observer();
60
+ };
61
+
62
+ const flushObservers = (): void => {
63
+ for (const observer of Array.from(pendingObservers)) {
64
+ pendingObservers.delete(observer);
65
+ try {
66
+ observer();
67
+ } catch (error) {
68
+ console.error('bQuery reactive: Error in observer during batch flush', error);
69
+ }
70
+ }
71
+ };
72
+
73
+ export const beginBatch = (): void => {
74
+ batchDepth += 1;
75
+ };
76
+
77
+ export const endBatch = (): void => {
78
+ if (batchDepth <= 0) return;
79
+ batchDepth -= 1;
80
+ if (batchDepth === 0) {
81
+ flushObservers();
82
+ }
83
+ };
84
+
85
+ /**
86
+ * Registers a dependency between an observer and a reactive source.
87
+ * @internal
88
+ */
89
+ export const registerDependency = (observer: Observer, source: ReactiveSource): void => {
90
+ let deps = observerDependencies.get(observer);
91
+ if (!deps) {
92
+ deps = new Set();
93
+ observerDependencies.set(observer, deps);
94
+ }
95
+ deps.add(source);
96
+ };
97
+
98
+ /**
99
+ * Removes a specific source from an observer's dependency set.
100
+ * Used when a source (e.g. Signal) is disposed to prevent stale references.
101
+ * @internal
102
+ */
103
+ export const removeDependency = (observer: Observer, source: ReactiveSource): void => {
104
+ const deps = observerDependencies.get(observer);
105
+ if (deps) {
106
+ deps.delete(source);
107
+ }
108
+ };
109
+
110
+ /**
111
+ * Clears all dependencies for an observer, unsubscribing from all sources.
112
+ * @internal
113
+ */
114
+ export const clearDependencies = (observer: Observer): void => {
115
+ const deps = observerDependencies.get(observer);
116
+ if (deps) {
117
+ for (const source of deps) {
118
+ source.unsubscribe(observer);
119
+ }
120
+ deps.clear();
121
+ }
122
+ };