@spoosh/core 0.14.0 → 0.14.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -210,6 +210,7 @@ type EventEmitter = {
210
210
  declare function createEventEmitter(): EventEmitter;
211
211
 
212
212
  type Subscriber = () => void;
213
+ type DataChangeCallback = (key: string, oldData: unknown, newData: unknown) => void;
213
214
  type CacheEntryWithKey<TData = unknown, TError = unknown> = {
214
215
  key: string;
215
216
  entry: CacheEntry<TData, TError>;
@@ -241,6 +242,11 @@ type StateManager = {
241
242
  setPendingPromise: (key: string, promise: Promise<unknown> | undefined) => void;
242
243
  /** Get a pending promise for a query key */
243
244
  getPendingPromise: (key: string) => Promise<unknown> | undefined;
245
+ /**
246
+ * Register a callback to be invoked when cache data changes.
247
+ * @returns Unsubscribe function
248
+ */
249
+ onDataChange: (callback: DataChangeCallback) => () => void;
244
250
  clear: () => void;
245
251
  };
246
252
  declare function createStateManager(): StateManager;
package/dist/index.d.ts CHANGED
@@ -210,6 +210,7 @@ type EventEmitter = {
210
210
  declare function createEventEmitter(): EventEmitter;
211
211
 
212
212
  type Subscriber = () => void;
213
+ type DataChangeCallback = (key: string, oldData: unknown, newData: unknown) => void;
213
214
  type CacheEntryWithKey<TData = unknown, TError = unknown> = {
214
215
  key: string;
215
216
  entry: CacheEntry<TData, TError>;
@@ -241,6 +242,11 @@ type StateManager = {
241
242
  setPendingPromise: (key: string, promise: Promise<unknown> | undefined) => void;
242
243
  /** Get a pending promise for a query key */
243
244
  getPendingPromise: (key: string) => Promise<unknown> | undefined;
245
+ /**
246
+ * Register a callback to be invoked when cache data changes.
247
+ * @returns Unsubscribe function
248
+ */
249
+ onDataChange: (callback: DataChangeCallback) => () => void;
244
250
  clear: () => void;
245
251
  };
246
252
  declare function createStateManager(): StateManager;
package/dist/index.js CHANGED
@@ -767,6 +767,7 @@ function createStateManager() {
767
767
  const cache = /* @__PURE__ */ new Map();
768
768
  const subscribers = /* @__PURE__ */ new Map();
769
769
  const pendingPromises = /* @__PURE__ */ new Map();
770
+ const dataChangeCallbacks = /* @__PURE__ */ new Set();
770
771
  const notifySubscribers = (key) => {
771
772
  const subs = subscribers.get(key);
772
773
  subs?.forEach((cb) => cb());
@@ -786,6 +787,7 @@ function createStateManager() {
786
787
  },
787
788
  setCache(key, entry) {
788
789
  const existing = cache.get(key);
790
+ const oldData = existing?.state.data;
789
791
  if (existing) {
790
792
  existing.state = { ...existing.state, ...entry.state };
791
793
  if (entry.tags) {
@@ -798,6 +800,10 @@ function createStateManager() {
798
800
  existing.stale = entry.stale;
799
801
  }
800
802
  notifySubscribers(key);
803
+ const newData = existing.state.data;
804
+ if (oldData !== newData) {
805
+ dataChangeCallbacks.forEach((cb) => cb(key, oldData, newData));
806
+ }
801
807
  } else {
802
808
  const newEntry = {
803
809
  state: entry.state ?? createInitialState(),
@@ -809,6 +815,10 @@ function createStateManager() {
809
815
  };
810
816
  cache.set(key, newEntry);
811
817
  notifySubscribers(key);
818
+ const newData = newEntry.state.data;
819
+ if (oldData !== newData) {
820
+ dataChangeCallbacks.forEach((cb) => cb(key, oldData, newData));
821
+ }
812
822
  }
813
823
  },
814
824
  deleteCache(key) {
@@ -913,10 +923,17 @@ function createStateManager() {
913
923
  getPendingPromise(key) {
914
924
  return pendingPromises.get(key);
915
925
  },
926
+ onDataChange(callback) {
927
+ dataChangeCallbacks.add(callback);
928
+ return () => {
929
+ dataChangeCallbacks.delete(callback);
930
+ };
931
+ },
916
932
  clear() {
917
933
  cache.clear();
918
934
  subscribers.clear();
919
935
  pendingPromises.clear();
936
+ dataChangeCallbacks.clear();
920
937
  }
921
938
  };
922
939
  }
package/dist/index.mjs CHANGED
@@ -698,6 +698,7 @@ function createStateManager() {
698
698
  const cache = /* @__PURE__ */ new Map();
699
699
  const subscribers = /* @__PURE__ */ new Map();
700
700
  const pendingPromises = /* @__PURE__ */ new Map();
701
+ const dataChangeCallbacks = /* @__PURE__ */ new Set();
701
702
  const notifySubscribers = (key) => {
702
703
  const subs = subscribers.get(key);
703
704
  subs?.forEach((cb) => cb());
@@ -717,6 +718,7 @@ function createStateManager() {
717
718
  },
718
719
  setCache(key, entry) {
719
720
  const existing = cache.get(key);
721
+ const oldData = existing?.state.data;
720
722
  if (existing) {
721
723
  existing.state = { ...existing.state, ...entry.state };
722
724
  if (entry.tags) {
@@ -729,6 +731,10 @@ function createStateManager() {
729
731
  existing.stale = entry.stale;
730
732
  }
731
733
  notifySubscribers(key);
734
+ const newData = existing.state.data;
735
+ if (oldData !== newData) {
736
+ dataChangeCallbacks.forEach((cb) => cb(key, oldData, newData));
737
+ }
732
738
  } else {
733
739
  const newEntry = {
734
740
  state: entry.state ?? createInitialState(),
@@ -740,6 +746,10 @@ function createStateManager() {
740
746
  };
741
747
  cache.set(key, newEntry);
742
748
  notifySubscribers(key);
749
+ const newData = newEntry.state.data;
750
+ if (oldData !== newData) {
751
+ dataChangeCallbacks.forEach((cb) => cb(key, oldData, newData));
752
+ }
743
753
  }
744
754
  },
745
755
  deleteCache(key) {
@@ -844,10 +854,17 @@ function createStateManager() {
844
854
  getPendingPromise(key) {
845
855
  return pendingPromises.get(key);
846
856
  },
857
+ onDataChange(callback) {
858
+ dataChangeCallbacks.add(callback);
859
+ return () => {
860
+ dataChangeCallbacks.delete(callback);
861
+ };
862
+ },
847
863
  clear() {
848
864
  cache.clear();
849
865
  subscribers.clear();
850
866
  pendingPromises.clear();
867
+ dataChangeCallbacks.clear();
851
868
  }
852
869
  };
853
870
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spoosh/core",
3
- "version": "0.14.0",
3
+ "version": "0.14.1",
4
4
  "license": "MIT",
5
5
  "description": "Type-safe API toolkit with plugin middleware system",
6
6
  "keywords": [