@tanstack/query-persist-client-core 4.24.9 → 5.0.0-alpha.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.
@@ -1,13 +1,7 @@
1
- /// <reference types="jest" />
2
1
  import type { QueryClientConfig } from '@tanstack/query-core';
3
2
  import { QueryClient } from '@tanstack/query-core';
4
3
  import type { Persister } from '@tanstack/query-persist-client-core';
5
4
  export declare function createQueryClient(config?: QueryClientConfig): QueryClient;
6
- export declare const mockLogger: {
7
- log: jest.Mock<any, any>;
8
- warn: jest.Mock<any, any>;
9
- error: jest.Mock<any, any>;
10
- };
11
5
  export declare function sleep(timeout: number): Promise<void>;
12
6
  export declare const createMockPersister: () => Persister;
13
7
  export declare const createSpyablePersister: () => Persister;
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var persist = require('./persist.js');
6
4
  var retryStrategies = require('./retryStrategies.js');
7
5
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -5,18 +5,16 @@ import { hydrate, dehydrate } from '@tanstack/query-core';
5
5
  * Useful for persist, where we only want to trigger save when cache is changed.
6
6
  */
7
7
  const cacheableEventTypes = ['added', 'removed', 'updated'];
8
-
9
8
  function isCacheableEventType(eventType) {
10
9
  return cacheableEventTypes.includes(eventType);
11
10
  }
11
+
12
12
  /**
13
13
  * Restores persisted data to the QueryCache
14
14
  * - data obtained from persister.restoreClient
15
15
  * - data is hydrated using hydrateOptions
16
16
  * If data is expired, busted, empty, or throws, it runs persister.removeClient
17
17
  */
18
-
19
-
20
18
  async function persistQueryClientRestore({
21
19
  queryClient,
22
20
  persister,
@@ -26,12 +24,10 @@ async function persistQueryClientRestore({
26
24
  }) {
27
25
  try {
28
26
  const persistedClient = await persister.restoreClient();
29
-
30
27
  if (persistedClient) {
31
28
  if (persistedClient.timestamp) {
32
29
  const expired = Date.now() - persistedClient.timestamp > maxAge;
33
30
  const busted = persistedClient.buster !== buster;
34
-
35
31
  if (expired || busted) {
36
32
  persister.removeClient();
37
33
  } else {
@@ -43,19 +39,18 @@ async function persistQueryClientRestore({
43
39
  }
44
40
  } catch (err) {
45
41
  if (process.env.NODE_ENV !== 'production') {
46
- queryClient.getLogger().error(err);
47
- queryClient.getLogger().warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
42
+ console.error(err);
43
+ console.warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
48
44
  }
49
-
50
45
  persister.removeClient();
51
46
  }
52
47
  }
48
+
53
49
  /**
54
50
  * Persists data from the QueryCache
55
51
  * - data dehydrated using dehydrateOptions
56
52
  * - data is persisted using persister.persistClient
57
53
  */
58
-
59
54
  async function persistQueryClientSave({
60
55
  queryClient,
61
56
  persister,
@@ -69,11 +64,11 @@ async function persistQueryClientSave({
69
64
  };
70
65
  await persister.persistClient(persistClient);
71
66
  }
67
+
72
68
  /**
73
69
  * Subscribe to QueryCache and MutationCache updates (for persisting)
74
70
  * @returns an unsubscribe function (to discontinue monitoring)
75
71
  */
76
-
77
72
  function persistQueryClientSubscribe(props) {
78
73
  const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe(event => {
79
74
  if (isCacheableEventType(event.type)) {
@@ -90,20 +85,19 @@ function persistQueryClientSubscribe(props) {
90
85
  unusbscribeMutationCache();
91
86
  };
92
87
  }
88
+
93
89
  /**
94
90
  * Restores persisted data to QueryCache and persists further changes.
95
91
  */
96
-
97
92
  function persistQueryClient(props) {
98
93
  let hasUnsubscribed = false;
99
94
  let persistQueryClientUnsubscribe;
100
-
101
95
  const unsubscribe = () => {
102
96
  hasUnsubscribed = true;
103
- persistQueryClientUnsubscribe == null ? void 0 : persistQueryClientUnsubscribe();
104
- }; // Attempt restore
105
-
97
+ persistQueryClientUnsubscribe?.();
98
+ };
106
99
 
100
+ // Attempt restore
107
101
  const restorePromise = persistQueryClientRestore(props).then(() => {
108
102
  if (!hasUnsubscribed) {
109
103
  // Subscribe to changes in the query cache to trigger the save
@@ -1 +1 @@
1
- {"version":3,"file":"persist.esm.js","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n queryClient.getLogger().error(err)\n queryClient\n .getLogger()\n .warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","getLogger","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":"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"}
1
+ {"version":3,"file":"persist.esm.js","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n console.warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","console","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":";;AAuDA;AACA;AACA;AACA;AACA,MAAMA,mBAA2C,GAAG,CAClD,OAAO,EACP,SAAS,EACT,SAAS,CACV,CAAA;AAED,SAASC,oBAAoB,CAACC,SAA0B,EAAE;AACxD,EAAA,OAAOF,mBAAmB,CAACG,QAAQ,CAACD,SAAS,CAAC,CAAA;AAChD,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeE,yBAAyB,CAAC;EAC9CC,WAAW;EACXC,SAAS;AACTC,EAAAA,MAAM,GAAG,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE;AAC5BC,EAAAA,MAAM,GAAG,EAAE;AACXC,EAAAA,cAAAA;AACkC,CAAC,EAAE;EACrC,IAAI;AACF,IAAA,MAAMC,eAAe,GAAG,MAAMJ,SAAS,CAACK,aAAa,EAAE,CAAA;AAEvD,IAAA,IAAID,eAAe,EAAE;MACnB,IAAIA,eAAe,CAACE,SAAS,EAAE;QAC7B,MAAMC,OAAO,GAAGC,IAAI,CAACC,GAAG,EAAE,GAAGL,eAAe,CAACE,SAAS,GAAGL,MAAM,CAAA;AAC/D,QAAA,MAAMS,MAAM,GAAGN,eAAe,CAACF,MAAM,KAAKA,MAAM,CAAA;QAChD,IAAIK,OAAO,IAAIG,MAAM,EAAE;UACrBV,SAAS,CAACW,YAAY,EAAE,CAAA;AAC1B,SAAC,MAAM;UACLC,OAAO,CAACb,WAAW,EAAEK,eAAe,CAACS,WAAW,EAAEV,cAAc,CAAC,CAAA;AACnE,SAAA;AACF,OAAC,MAAM;QACLH,SAAS,CAACW,YAAY,EAAE,CAAA;AAC1B,OAAA;AACF,KAAA;GACD,CAAC,OAAOG,GAAG,EAAE;AACZ,IAAA,IAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,EAAE;AACzCC,MAAAA,OAAO,CAACC,KAAK,CAACL,GAAG,CAAC,CAAA;AAClBI,MAAAA,OAAO,CAACE,IAAI,CACV,0IAA0I,CAC3I,CAAA;AACH,KAAA;IACApB,SAAS,CAACW,YAAY,EAAE,CAAA;AAC1B,GAAA;AACF,CAAA;;AAEA;AACA;AACA;AACA;AACA;AACO,eAAeU,sBAAsB,CAAC;EAC3CtB,WAAW;EACXC,SAAS;AACTE,EAAAA,MAAM,GAAG,EAAE;AACXoB,EAAAA,gBAAAA;AAC+B,CAAC,EAAE;AAClC,EAAA,MAAMC,aAA8B,GAAG;IACrCrB,MAAM;AACNI,IAAAA,SAAS,EAAEE,IAAI,CAACC,GAAG,EAAE;AACrBI,IAAAA,WAAW,EAAEW,SAAS,CAACzB,WAAW,EAAEuB,gBAAgB,CAAA;GACrD,CAAA;AAED,EAAA,MAAMtB,SAAS,CAACuB,aAAa,CAACA,aAAa,CAAC,CAAA;AAC9C,CAAA;;AAEA;AACA;AACA;AACA;AACO,SAASE,2BAA2B,CACzCC,KAAsC,EACtC;AACA,EAAA,MAAMC,qBAAqB,GAAGD,KAAK,CAAC3B,WAAW,CAC5C6B,aAAa,EAAE,CACfC,SAAS,CAAEC,KAAK,IAAK;AACpB,IAAA,IAAInC,oBAAoB,CAACmC,KAAK,CAACC,IAAI,CAAC,EAAE;MACpCV,sBAAsB,CAACK,KAAK,CAAC,CAAA;AAC/B,KAAA;AACF,GAAC,CAAC,CAAA;AAEJ,EAAA,MAAMM,wBAAwB,GAAGN,KAAK,CAAC3B,WAAW,CAC/CkC,gBAAgB,EAAE,CAClBJ,SAAS,CAAEC,KAAK,IAAK;AACpB,IAAA,IAAInC,oBAAoB,CAACmC,KAAK,CAACC,IAAI,CAAC,EAAE;MACpCV,sBAAsB,CAACK,KAAK,CAAC,CAAA;AAC/B,KAAA;AACF,GAAC,CAAC,CAAA;AAEJ,EAAA,OAAO,MAAM;AACXC,IAAAA,qBAAqB,EAAE,CAAA;AACvBK,IAAAA,wBAAwB,EAAE,CAAA;GAC3B,CAAA;AACH,CAAA;;AAEA;AACA;AACA;AACO,SAASE,kBAAkB,CAChCR,KAAgC,EACH;EAC7B,IAAIS,eAAe,GAAG,KAAK,CAAA;AAC3B,EAAA,IAAIC,6BAAuD,CAAA;EAC3D,MAAMC,WAAW,GAAG,MAAM;AACxBF,IAAAA,eAAe,GAAG,IAAI,CAAA;AACtBC,IAAAA,6BAA6B,IAAI,CAAA;GAClC,CAAA;;AAED;EACA,MAAME,cAAc,GAAGxC,yBAAyB,CAAC4B,KAAK,CAAC,CAACa,IAAI,CAAC,MAAM;IACjE,IAAI,CAACJ,eAAe,EAAE;AACpB;AACAC,MAAAA,6BAA6B,GAAGX,2BAA2B,CAACC,KAAK,CAAC,CAAA;AACpE,KAAA;AACF,GAAC,CAAC,CAAA;AAEF,EAAA,OAAO,CAACW,WAAW,EAAEC,cAAc,CAAC,CAAA;AACtC;;;;"}
@@ -1,7 +1,5 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  var queryCore = require('@tanstack/query-core');
6
4
 
7
5
  /**
@@ -9,18 +7,16 @@ var queryCore = require('@tanstack/query-core');
9
7
  * Useful for persist, where we only want to trigger save when cache is changed.
10
8
  */
11
9
  const cacheableEventTypes = ['added', 'removed', 'updated'];
12
-
13
10
  function isCacheableEventType(eventType) {
14
11
  return cacheableEventTypes.includes(eventType);
15
12
  }
13
+
16
14
  /**
17
15
  * Restores persisted data to the QueryCache
18
16
  * - data obtained from persister.restoreClient
19
17
  * - data is hydrated using hydrateOptions
20
18
  * If data is expired, busted, empty, or throws, it runs persister.removeClient
21
19
  */
22
-
23
-
24
20
  async function persistQueryClientRestore({
25
21
  queryClient,
26
22
  persister,
@@ -30,12 +26,10 @@ async function persistQueryClientRestore({
30
26
  }) {
31
27
  try {
32
28
  const persistedClient = await persister.restoreClient();
33
-
34
29
  if (persistedClient) {
35
30
  if (persistedClient.timestamp) {
36
31
  const expired = Date.now() - persistedClient.timestamp > maxAge;
37
32
  const busted = persistedClient.buster !== buster;
38
-
39
33
  if (expired || busted) {
40
34
  persister.removeClient();
41
35
  } else {
@@ -47,19 +41,18 @@ async function persistQueryClientRestore({
47
41
  }
48
42
  } catch (err) {
49
43
  if (process.env.NODE_ENV !== 'production') {
50
- queryClient.getLogger().error(err);
51
- queryClient.getLogger().warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
44
+ console.error(err);
45
+ console.warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
52
46
  }
53
-
54
47
  persister.removeClient();
55
48
  }
56
49
  }
50
+
57
51
  /**
58
52
  * Persists data from the QueryCache
59
53
  * - data dehydrated using dehydrateOptions
60
54
  * - data is persisted using persister.persistClient
61
55
  */
62
-
63
56
  async function persistQueryClientSave({
64
57
  queryClient,
65
58
  persister,
@@ -73,11 +66,11 @@ async function persistQueryClientSave({
73
66
  };
74
67
  await persister.persistClient(persistClient);
75
68
  }
69
+
76
70
  /**
77
71
  * Subscribe to QueryCache and MutationCache updates (for persisting)
78
72
  * @returns an unsubscribe function (to discontinue monitoring)
79
73
  */
80
-
81
74
  function persistQueryClientSubscribe(props) {
82
75
  const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe(event => {
83
76
  if (isCacheableEventType(event.type)) {
@@ -94,20 +87,19 @@ function persistQueryClientSubscribe(props) {
94
87
  unusbscribeMutationCache();
95
88
  };
96
89
  }
90
+
97
91
  /**
98
92
  * Restores persisted data to QueryCache and persists further changes.
99
93
  */
100
-
101
94
  function persistQueryClient(props) {
102
95
  let hasUnsubscribed = false;
103
96
  let persistQueryClientUnsubscribe;
104
-
105
97
  const unsubscribe = () => {
106
98
  hasUnsubscribed = true;
107
- persistQueryClientUnsubscribe == null ? void 0 : persistQueryClientUnsubscribe();
108
- }; // Attempt restore
109
-
99
+ persistQueryClientUnsubscribe?.();
100
+ };
110
101
 
102
+ // Attempt restore
111
103
  const restorePromise = persistQueryClientRestore(props).then(() => {
112
104
  if (!hasUnsubscribed) {
113
105
  // Subscribe to changes in the query cache to trigger the save
@@ -1 +1 @@
1
- {"version":3,"file":"persist.js","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n queryClient.getLogger().error(err)\n queryClient\n .getLogger()\n .warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","getLogger","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":"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"}
1
+ {"version":3,"file":"persist.js","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n console.warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","console","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":"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"}
@@ -5,18 +5,16 @@ import { hydrate, dehydrate } from '@tanstack/query-core';
5
5
  * Useful for persist, where we only want to trigger save when cache is changed.
6
6
  */
7
7
  const cacheableEventTypes = ['added', 'removed', 'updated'];
8
-
9
8
  function isCacheableEventType(eventType) {
10
9
  return cacheableEventTypes.includes(eventType);
11
10
  }
11
+
12
12
  /**
13
13
  * Restores persisted data to the QueryCache
14
14
  * - data obtained from persister.restoreClient
15
15
  * - data is hydrated using hydrateOptions
16
16
  * If data is expired, busted, empty, or throws, it runs persister.removeClient
17
17
  */
18
-
19
-
20
18
  async function persistQueryClientRestore({
21
19
  queryClient,
22
20
  persister,
@@ -26,12 +24,10 @@ async function persistQueryClientRestore({
26
24
  }) {
27
25
  try {
28
26
  const persistedClient = await persister.restoreClient();
29
-
30
27
  if (persistedClient) {
31
28
  if (persistedClient.timestamp) {
32
29
  const expired = Date.now() - persistedClient.timestamp > maxAge;
33
30
  const busted = persistedClient.buster !== buster;
34
-
35
31
  if (expired || busted) {
36
32
  persister.removeClient();
37
33
  } else {
@@ -43,19 +39,18 @@ async function persistQueryClientRestore({
43
39
  }
44
40
  } catch (err) {
45
41
  if (process.env.NODE_ENV !== 'production') {
46
- queryClient.getLogger().error(err);
47
- queryClient.getLogger().warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
42
+ console.error(err);
43
+ console.warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
48
44
  }
49
-
50
45
  persister.removeClient();
51
46
  }
52
47
  }
48
+
53
49
  /**
54
50
  * Persists data from the QueryCache
55
51
  * - data dehydrated using dehydrateOptions
56
52
  * - data is persisted using persister.persistClient
57
53
  */
58
-
59
54
  async function persistQueryClientSave({
60
55
  queryClient,
61
56
  persister,
@@ -69,11 +64,11 @@ async function persistQueryClientSave({
69
64
  };
70
65
  await persister.persistClient(persistClient);
71
66
  }
67
+
72
68
  /**
73
69
  * Subscribe to QueryCache and MutationCache updates (for persisting)
74
70
  * @returns an unsubscribe function (to discontinue monitoring)
75
71
  */
76
-
77
72
  function persistQueryClientSubscribe(props) {
78
73
  const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe(event => {
79
74
  if (isCacheableEventType(event.type)) {
@@ -90,20 +85,19 @@ function persistQueryClientSubscribe(props) {
90
85
  unusbscribeMutationCache();
91
86
  };
92
87
  }
88
+
93
89
  /**
94
90
  * Restores persisted data to QueryCache and persists further changes.
95
91
  */
96
-
97
92
  function persistQueryClient(props) {
98
93
  let hasUnsubscribed = false;
99
94
  let persistQueryClientUnsubscribe;
100
-
101
95
  const unsubscribe = () => {
102
96
  hasUnsubscribed = true;
103
- persistQueryClientUnsubscribe == null ? void 0 : persistQueryClientUnsubscribe();
104
- }; // Attempt restore
105
-
97
+ persistQueryClientUnsubscribe?.();
98
+ };
106
99
 
100
+ // Attempt restore
107
101
  const restorePromise = persistQueryClientRestore(props).then(() => {
108
102
  if (!hasUnsubscribed) {
109
103
  // Subscribe to changes in the query cache to trigger the save
@@ -1 +1 @@
1
- {"version":3,"file":"persist.mjs","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n queryClient.getLogger().error(err)\n queryClient\n .getLogger()\n .warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","getLogger","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":"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"}
1
+ {"version":3,"file":"persist.mjs","sources":["../../src/persist.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n console.warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","process","env","NODE_ENV","console","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then"],"mappings":"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"}
@@ -3,21 +3,23 @@ const removeOldestQuery = ({
3
3
  }) => {
4
4
  const mutations = [...persistedClient.clientState.mutations];
5
5
  const queries = [...persistedClient.clientState.queries];
6
- const client = { ...persistedClient,
6
+ const client = {
7
+ ...persistedClient,
7
8
  clientState: {
8
9
  mutations,
9
10
  queries
10
11
  }
11
- }; // sort queries by dataUpdatedAt (oldest first)
12
+ };
12
13
 
13
- const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt); // clean oldest query
14
+ // sort queries by dataUpdatedAt (oldest first)
15
+ const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt);
14
16
 
17
+ // clean oldest query
15
18
  if (sortedQueries.length > 0) {
16
19
  const oldestData = sortedQueries.shift();
17
20
  client.clientState.queries = queries.filter(q => q !== oldestData);
18
21
  return client;
19
22
  }
20
-
21
23
  return undefined;
22
24
  };
23
25
 
@@ -1 +1 @@
1
- {"version":3,"file":"retryStrategies.esm.js","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":"AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAF,CAAD,KAAyB;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAhB,CAA4BD,SAAhC,CAAlB,CAAA;EACA,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAhB,CAA4BC,OAAhC,CAAhB,CAAA;AACA,EAAA,MAAMC,MAAuB,GAAG,EAC9B,GAAGJ,eAD2B;AAE9BE,IAAAA,WAAW,EAAE;MAAED,SAAF;AAAaE,MAAAA,OAAAA;AAAb,KAAA;AAFiB,GAAhC,CAHwE;;EASxE,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAJ,CAAaG,CAAAA,IAAb,CACpB,CAACC,CAAD,EAAIC,CAAJ,KAAUD,CAAC,CAACE,KAAF,CAAQC,aAAR,GAAwBF,CAAC,CAACC,KAAF,CAAQC,aADtB,CAAtB,CATwE;;AAcxE,EAAA,IAAIL,aAAa,CAACM,MAAd,GAAuB,CAA3B,EAA8B;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAd,EAAnB,CAAA;AACAT,IAAAA,MAAM,CAACF,WAAP,CAAmBC,OAAnB,GAA6BA,OAAO,CAACW,MAAR,CAAgBC,CAAD,IAAOA,CAAC,KAAKH,UAA5B,CAA7B,CAAA;AACA,IAAA,OAAOR,MAAP,CAAA;AACD,GAAA;;AAED,EAAA,OAAOY,SAAP,CAAA;AACD;;;;"}
1
+ {"version":3,"file":"retryStrategies.esm.js","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":"AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAgB,CAAC,KAAK;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAW,CAACD,SAAS,CAAC,CAAA;EAC5D,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAW,CAACC,OAAO,CAAC,CAAA;AACxD,EAAA,MAAMC,MAAuB,GAAG;AAC9B,IAAA,GAAGJ,eAAe;AAClBE,IAAAA,WAAW,EAAE;MAAED,SAAS;AAAEE,MAAAA,OAAAA;AAAQ,KAAA;GACnC,CAAA;;AAED;EACA,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAO,CAAC,CAACG,IAAI,CACrC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,CAACC,aAAa,GAAGF,CAAC,CAACC,KAAK,CAACC,aAAa,CACxD,CAAA;;AAED;AACA,EAAA,IAAIL,aAAa,CAACM,MAAM,GAAG,CAAC,EAAE;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAK,EAAE,CAAA;AACxCT,IAAAA,MAAM,CAACF,WAAW,CAACC,OAAO,GAAGA,OAAO,CAACW,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,UAAU,CAAC,CAAA;AACpE,IAAA,OAAOR,MAAM,CAAA;AACf,GAAA;AAEA,EAAA,OAAOY,SAAS,CAAA;AAClB;;;;"}
@@ -1,27 +1,27 @@
1
1
  'use strict';
2
2
 
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
3
  const removeOldestQuery = ({
6
4
  persistedClient
7
5
  }) => {
8
6
  const mutations = [...persistedClient.clientState.mutations];
9
7
  const queries = [...persistedClient.clientState.queries];
10
- const client = { ...persistedClient,
8
+ const client = {
9
+ ...persistedClient,
11
10
  clientState: {
12
11
  mutations,
13
12
  queries
14
13
  }
15
- }; // sort queries by dataUpdatedAt (oldest first)
14
+ };
16
15
 
17
- const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt); // clean oldest query
16
+ // sort queries by dataUpdatedAt (oldest first)
17
+ const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt);
18
18
 
19
+ // clean oldest query
19
20
  if (sortedQueries.length > 0) {
20
21
  const oldestData = sortedQueries.shift();
21
22
  client.clientState.queries = queries.filter(q => q !== oldestData);
22
23
  return client;
23
24
  }
24
-
25
25
  return undefined;
26
26
  };
27
27
 
@@ -1 +1 @@
1
- {"version":3,"file":"retryStrategies.js","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":";;;;AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAF,CAAD,KAAyB;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAhB,CAA4BD,SAAhC,CAAlB,CAAA;EACA,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAhB,CAA4BC,OAAhC,CAAhB,CAAA;AACA,EAAA,MAAMC,MAAuB,GAAG,EAC9B,GAAGJ,eAD2B;AAE9BE,IAAAA,WAAW,EAAE;MAAED,SAAF;AAAaE,MAAAA,OAAAA;AAAb,KAAA;AAFiB,GAAhC,CAHwE;;EASxE,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAJ,CAAaG,CAAAA,IAAb,CACpB,CAACC,CAAD,EAAIC,CAAJ,KAAUD,CAAC,CAACE,KAAF,CAAQC,aAAR,GAAwBF,CAAC,CAACC,KAAF,CAAQC,aADtB,CAAtB,CATwE;;AAcxE,EAAA,IAAIL,aAAa,CAACM,MAAd,GAAuB,CAA3B,EAA8B;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAd,EAAnB,CAAA;AACAT,IAAAA,MAAM,CAACF,WAAP,CAAmBC,OAAnB,GAA6BA,OAAO,CAACW,MAAR,CAAgBC,CAAD,IAAOA,CAAC,KAAKH,UAA5B,CAA7B,CAAA;AACA,IAAA,OAAOR,MAAP,CAAA;AACD,GAAA;;AAED,EAAA,OAAOY,SAAP,CAAA;AACD;;;;"}
1
+ {"version":3,"file":"retryStrategies.js","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":";;AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAgB,CAAC,KAAK;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAW,CAACD,SAAS,CAAC,CAAA;EAC5D,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAW,CAACC,OAAO,CAAC,CAAA;AACxD,EAAA,MAAMC,MAAuB,GAAG;AAC9B,IAAA,GAAGJ,eAAe;AAClBE,IAAAA,WAAW,EAAE;MAAED,SAAS;AAAEE,MAAAA,OAAAA;AAAQ,KAAA;GACnC,CAAA;;AAED;EACA,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAO,CAAC,CAACG,IAAI,CACrC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,CAACC,aAAa,GAAGF,CAAC,CAACC,KAAK,CAACC,aAAa,CACxD,CAAA;;AAED;AACA,EAAA,IAAIL,aAAa,CAACM,MAAM,GAAG,CAAC,EAAE;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAK,EAAE,CAAA;AACxCT,IAAAA,MAAM,CAACF,WAAW,CAACC,OAAO,GAAGA,OAAO,CAACW,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,UAAU,CAAC,CAAA;AACpE,IAAA,OAAOR,MAAM,CAAA;AACf,GAAA;AAEA,EAAA,OAAOY,SAAS,CAAA;AAClB;;;;"}
@@ -3,21 +3,23 @@ const removeOldestQuery = ({
3
3
  }) => {
4
4
  const mutations = [...persistedClient.clientState.mutations];
5
5
  const queries = [...persistedClient.clientState.queries];
6
- const client = { ...persistedClient,
6
+ const client = {
7
+ ...persistedClient,
7
8
  clientState: {
8
9
  mutations,
9
10
  queries
10
11
  }
11
- }; // sort queries by dataUpdatedAt (oldest first)
12
+ };
12
13
 
13
- const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt); // clean oldest query
14
+ // sort queries by dataUpdatedAt (oldest first)
15
+ const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt);
14
16
 
17
+ // clean oldest query
15
18
  if (sortedQueries.length > 0) {
16
19
  const oldestData = sortedQueries.shift();
17
20
  client.clientState.queries = queries.filter(q => q !== oldestData);
18
21
  return client;
19
22
  }
20
-
21
23
  return undefined;
22
24
  };
23
25
 
@@ -1 +1 @@
1
- {"version":3,"file":"retryStrategies.mjs","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":"AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAF,CAAD,KAAyB;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAhB,CAA4BD,SAAhC,CAAlB,CAAA;EACA,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAhB,CAA4BC,OAAhC,CAAhB,CAAA;AACA,EAAA,MAAMC,MAAuB,GAAG,EAC9B,GAAGJ,eAD2B;AAE9BE,IAAAA,WAAW,EAAE;MAAED,SAAF;AAAaE,MAAAA,OAAAA;AAAb,KAAA;AAFiB,GAAhC,CAHwE;;EASxE,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAJ,CAAaG,CAAAA,IAAb,CACpB,CAACC,CAAD,EAAIC,CAAJ,KAAUD,CAAC,CAACE,KAAF,CAAQC,aAAR,GAAwBF,CAAC,CAACC,KAAF,CAAQC,aADtB,CAAtB,CATwE;;AAcxE,EAAA,IAAIL,aAAa,CAACM,MAAd,GAAuB,CAA3B,EAA8B;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAd,EAAnB,CAAA;AACAT,IAAAA,MAAM,CAACF,WAAP,CAAmBC,OAAnB,GAA6BA,OAAO,CAACW,MAAR,CAAgBC,CAAD,IAAOA,CAAC,KAAKH,UAA5B,CAA7B,CAAA;AACA,IAAA,OAAOR,MAAP,CAAA;AACD,GAAA;;AAED,EAAA,OAAOY,SAAP,CAAA;AACD;;;;"}
1
+ {"version":3,"file":"retryStrategies.mjs","sources":["../../src/retryStrategies.ts"],"sourcesContent":["import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["removeOldestQuery","persistedClient","mutations","clientState","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":"AAQO,MAAMA,iBAAiC,GAAG,CAAC;AAAEC,EAAAA,eAAAA;AAAgB,CAAC,KAAK;EACxE,MAAMC,SAAS,GAAG,CAAC,GAAGD,eAAe,CAACE,WAAW,CAACD,SAAS,CAAC,CAAA;EAC5D,MAAME,OAAO,GAAG,CAAC,GAAGH,eAAe,CAACE,WAAW,CAACC,OAAO,CAAC,CAAA;AACxD,EAAA,MAAMC,MAAuB,GAAG;AAC9B,IAAA,GAAGJ,eAAe;AAClBE,IAAAA,WAAW,EAAE;MAAED,SAAS;AAAEE,MAAAA,OAAAA;AAAQ,KAAA;GACnC,CAAA;;AAED;EACA,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAO,CAAC,CAACG,IAAI,CACrC,CAACC,CAAC,EAAEC,CAAC,KAAKD,CAAC,CAACE,KAAK,CAACC,aAAa,GAAGF,CAAC,CAACC,KAAK,CAACC,aAAa,CACxD,CAAA;;AAED;AACA,EAAA,IAAIL,aAAa,CAACM,MAAM,GAAG,CAAC,EAAE;AAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAK,EAAE,CAAA;AACxCT,IAAAA,MAAM,CAACF,WAAW,CAACC,OAAO,GAAGA,OAAO,CAACW,MAAM,CAAEC,CAAC,IAAKA,CAAC,KAAKH,UAAU,CAAC,CAAA;AACpE,IAAA,OAAOR,MAAM,CAAA;AACf,GAAA;AAEA,EAAA,OAAOY,SAAS,CAAA;AAClB;;;;"}
@@ -9,18 +9,16 @@
9
9
  * Useful for persist, where we only want to trigger save when cache is changed.
10
10
  */
11
11
  const cacheableEventTypes = ['added', 'removed', 'updated'];
12
-
13
12
  function isCacheableEventType(eventType) {
14
13
  return cacheableEventTypes.includes(eventType);
15
14
  }
15
+
16
16
  /**
17
17
  * Restores persisted data to the QueryCache
18
18
  * - data obtained from persister.restoreClient
19
19
  * - data is hydrated using hydrateOptions
20
20
  * If data is expired, busted, empty, or throws, it runs persister.removeClient
21
21
  */
22
-
23
-
24
22
  async function persistQueryClientRestore({
25
23
  queryClient,
26
24
  persister,
@@ -30,12 +28,10 @@
30
28
  }) {
31
29
  try {
32
30
  const persistedClient = await persister.restoreClient();
33
-
34
31
  if (persistedClient) {
35
32
  if (persistedClient.timestamp) {
36
33
  const expired = Date.now() - persistedClient.timestamp > maxAge;
37
34
  const busted = persistedClient.buster !== buster;
38
-
39
35
  if (expired || busted) {
40
36
  persister.removeClient();
41
37
  } else {
@@ -47,19 +43,18 @@
47
43
  }
48
44
  } catch (err) {
49
45
  {
50
- queryClient.getLogger().error(err);
51
- queryClient.getLogger().warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
46
+ console.error(err);
47
+ console.warn('Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.');
52
48
  }
53
-
54
49
  persister.removeClient();
55
50
  }
56
51
  }
52
+
57
53
  /**
58
54
  * Persists data from the QueryCache
59
55
  * - data dehydrated using dehydrateOptions
60
56
  * - data is persisted using persister.persistClient
61
57
  */
62
-
63
58
  async function persistQueryClientSave({
64
59
  queryClient,
65
60
  persister,
@@ -73,11 +68,11 @@
73
68
  };
74
69
  await persister.persistClient(persistClient);
75
70
  }
71
+
76
72
  /**
77
73
  * Subscribe to QueryCache and MutationCache updates (for persisting)
78
74
  * @returns an unsubscribe function (to discontinue monitoring)
79
75
  */
80
-
81
76
  function persistQueryClientSubscribe(props) {
82
77
  const unsubscribeQueryCache = props.queryClient.getQueryCache().subscribe(event => {
83
78
  if (isCacheableEventType(event.type)) {
@@ -94,20 +89,19 @@
94
89
  unusbscribeMutationCache();
95
90
  };
96
91
  }
92
+
97
93
  /**
98
94
  * Restores persisted data to QueryCache and persists further changes.
99
95
  */
100
-
101
96
  function persistQueryClient(props) {
102
97
  let hasUnsubscribed = false;
103
98
  let persistQueryClientUnsubscribe;
104
-
105
99
  const unsubscribe = () => {
106
100
  hasUnsubscribed = true;
107
- persistQueryClientUnsubscribe == null ? void 0 : persistQueryClientUnsubscribe();
108
- }; // Attempt restore
109
-
101
+ persistQueryClientUnsubscribe?.();
102
+ };
110
103
 
104
+ // Attempt restore
111
105
  const restorePromise = persistQueryClientRestore(props).then(() => {
112
106
  if (!hasUnsubscribed) {
113
107
  // Subscribe to changes in the query cache to trigger the save
@@ -122,21 +116,23 @@
122
116
  }) => {
123
117
  const mutations = [...persistedClient.clientState.mutations];
124
118
  const queries = [...persistedClient.clientState.queries];
125
- const client = { ...persistedClient,
119
+ const client = {
120
+ ...persistedClient,
126
121
  clientState: {
127
122
  mutations,
128
123
  queries
129
124
  }
130
- }; // sort queries by dataUpdatedAt (oldest first)
125
+ };
131
126
 
132
- const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt); // clean oldest query
127
+ // sort queries by dataUpdatedAt (oldest first)
128
+ const sortedQueries = [...queries].sort((a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt);
133
129
 
130
+ // clean oldest query
134
131
  if (sortedQueries.length > 0) {
135
132
  const oldestData = sortedQueries.shift();
136
133
  client.clientState.queries = queries.filter(q => q !== oldestData);
137
134
  return client;
138
135
  }
139
-
140
136
  return undefined;
141
137
  };
142
138
 
@@ -146,7 +142,5 @@
146
142
  exports.persistQueryClientSubscribe = persistQueryClientSubscribe;
147
143
  exports.removeOldestQuery = removeOldestQuery;
148
144
 
149
- Object.defineProperty(exports, '__esModule', { value: true });
150
-
151
145
  }));
152
146
  //# sourceMappingURL=index.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.development.js","sources":["../../src/persist.ts","../../src/retryStrategies.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n queryClient.getLogger().error(err)\n queryClient\n .getLogger()\n .warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n","import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","getLogger","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then","removeOldestQuery","mutations","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":";;;;;;EAuDA;EACA;EACA;EACA;EACA,MAAMA,mBAA2C,GAAG,CAClD,OADkD,EAElD,SAFkD,EAGlD,SAHkD,CAApD,CAAA;;EAMA,SAASC,oBAAT,CAA8BC,SAA9B,EAA0D;EACxD,EAAA,OAAOF,mBAAmB,CAACG,QAApB,CAA6BD,SAA7B,CAAP,CAAA;EACD,CAAA;EAED;EACA;EACA;EACA;EACA;EACA;;;EACO,eAAeE,yBAAf,CAAyC;IAC9CC,WAD8C;IAE9CC,SAF8C;EAG9CC,EAAAA,MAAM,GAAG,IAAO,GAAA,EAAP,GAAY,EAAZ,GAAiB,EAHoB;EAI9CC,EAAAA,MAAM,GAAG,EAJqC;EAK9CC,EAAAA,cAAAA;EAL8C,CAAzC,EAMgC;IACrC,IAAI;EACF,IAAA,MAAMC,eAAe,GAAG,MAAMJ,SAAS,CAACK,aAAV,EAA9B,CAAA;;EAEA,IAAA,IAAID,eAAJ,EAAqB;QACnB,IAAIA,eAAe,CAACE,SAApB,EAA+B;UAC7B,MAAMC,OAAO,GAAGC,IAAI,CAACC,GAAL,KAAaL,eAAe,CAACE,SAA7B,GAAyCL,MAAzD,CAAA;EACA,QAAA,MAAMS,MAAM,GAAGN,eAAe,CAACF,MAAhB,KAA2BA,MAA1C,CAAA;;UACA,IAAIK,OAAO,IAAIG,MAAf,EAAuB;EACrBV,UAAAA,SAAS,CAACW,YAAV,EAAA,CAAA;EACD,SAFD,MAEO;YACLC,iBAAO,CAACb,WAAD,EAAcK,eAAe,CAACS,WAA9B,EAA2CV,cAA3C,CAAP,CAAA;EACD,SAAA;EACF,OARD,MAQO;EACLH,QAAAA,SAAS,CAACW,YAAV,EAAA,CAAA;EACD,OAAA;EACF,KAAA;KAfH,CAgBE,OAAOG,GAAP,EAAY;EACZ,IAA2C;EACzCf,MAAAA,WAAW,CAACgB,SAAZ,EAAwBC,CAAAA,KAAxB,CAA8BF,GAA9B,CAAA,CAAA;EACAf,MAAAA,WAAW,CACRgB,SADH,EAEGE,CAAAA,IAFH,CAGI,0IAHJ,CAAA,CAAA;EAKD,KAAA;;EACDjB,IAAAA,SAAS,CAACW,YAAV,EAAA,CAAA;EACD,GAAA;EACF,CAAA;EAED;EACA;EACA;EACA;EACA;;EACO,eAAeO,sBAAf,CAAsC;IAC3CnB,WAD2C;IAE3CC,SAF2C;EAG3CE,EAAAA,MAAM,GAAG,EAHkC;EAI3CiB,EAAAA,gBAAAA;EAJ2C,CAAtC,EAK6B;EAClC,EAAA,MAAMC,aAA8B,GAAG;MACrClB,MADqC;EAErCI,IAAAA,SAAS,EAAEE,IAAI,CAACC,GAAL,EAF0B;EAGrCI,IAAAA,WAAW,EAAEQ,mBAAS,CAACtB,WAAD,EAAcoB,gBAAd,CAAA;KAHxB,CAAA;EAMA,EAAA,MAAMnB,SAAS,CAACoB,aAAV,CAAwBA,aAAxB,CAAN,CAAA;EACD,CAAA;EAED;EACA;EACA;EACA;;EACO,SAASE,2BAAT,CACLC,KADK,EAEL;IACA,MAAMC,qBAAqB,GAAGD,KAAK,CAACxB,WAAN,CAC3B0B,aAD2B,EAE3BC,CAAAA,SAF2B,CAEhBC,KAAD,IAAW;EACpB,IAAA,IAAIhC,oBAAoB,CAACgC,KAAK,CAACC,IAAP,CAAxB,EAAsC;QACpCV,sBAAsB,CAACK,KAAD,CAAtB,CAAA;EACD,KAAA;EACF,GAN2B,CAA9B,CAAA;IAQA,MAAMM,wBAAwB,GAAGN,KAAK,CAACxB,WAAN,CAC9B+B,gBAD8B,EAE9BJ,CAAAA,SAF8B,CAEnBC,KAAD,IAAW;EACpB,IAAA,IAAIhC,oBAAoB,CAACgC,KAAK,CAACC,IAAP,CAAxB,EAAsC;QACpCV,sBAAsB,CAACK,KAAD,CAAtB,CAAA;EACD,KAAA;EACF,GAN8B,CAAjC,CAAA;EAQA,EAAA,OAAO,MAAM;MACXC,qBAAqB,EAAA,CAAA;MACrBK,wBAAwB,EAAA,CAAA;KAF1B,CAAA;EAID,CAAA;EAED;EACA;EACA;;EACO,SAASE,kBAAT,CACLR,KADK,EAEwB;IAC7B,IAAIS,eAAe,GAAG,KAAtB,CAAA;EACA,EAAA,IAAIC,6BAAJ,CAAA;;IACA,MAAMC,WAAW,GAAG,MAAM;EACxBF,IAAAA,eAAe,GAAG,IAAlB,CAAA;MACAC,6BAA6B,IAAA,IAA7B,YAAAA,6BAA6B,EAAA,CAAA;EAC9B,GAHD,CAH6B;;;IAS7B,MAAME,cAAc,GAAGrC,yBAAyB,CAACyB,KAAD,CAAzB,CAAiCa,IAAjC,CAAsC,MAAM;MACjE,IAAI,CAACJ,eAAL,EAAsB;EACpB;EACAC,MAAAA,6BAA6B,GAAGX,2BAA2B,CAACC,KAAD,CAA3D,CAAA;EACD,KAAA;EACF,GALsB,CAAvB,CAAA;EAOA,EAAA,OAAO,CAACW,WAAD,EAAcC,cAAd,CAAP,CAAA;EACD;;AC9KM,QAAME,iBAAiC,GAAG,CAAC;EAAEjC,EAAAA,eAAAA;EAAF,CAAD,KAAyB;IACxE,MAAMkC,SAAS,GAAG,CAAC,GAAGlC,eAAe,CAACS,WAAhB,CAA4ByB,SAAhC,CAAlB,CAAA;IACA,MAAMC,OAAO,GAAG,CAAC,GAAGnC,eAAe,CAACS,WAAhB,CAA4B0B,OAAhC,CAAhB,CAAA;EACA,EAAA,MAAMC,MAAuB,GAAG,EAC9B,GAAGpC,eAD2B;EAE9BS,IAAAA,WAAW,EAAE;QAAEyB,SAAF;EAAaC,MAAAA,OAAAA;EAAb,KAAA;EAFiB,GAAhC,CAHwE;;IASxE,MAAME,aAAa,GAAG,CAAC,GAAGF,OAAJ,CAAaG,CAAAA,IAAb,CACpB,CAACC,CAAD,EAAIC,CAAJ,KAAUD,CAAC,CAACE,KAAF,CAAQC,aAAR,GAAwBF,CAAC,CAACC,KAAF,CAAQC,aADtB,CAAtB,CATwE;;EAcxE,EAAA,IAAIL,aAAa,CAACM,MAAd,GAAuB,CAA3B,EAA8B;EAC5B,IAAA,MAAMC,UAAU,GAAGP,aAAa,CAACQ,KAAd,EAAnB,CAAA;EACAT,IAAAA,MAAM,CAAC3B,WAAP,CAAmB0B,OAAnB,GAA6BA,OAAO,CAACW,MAAR,CAAgBC,CAAD,IAAOA,CAAC,KAAKH,UAA5B,CAA7B,CAAA;EACA,IAAA,OAAOR,MAAP,CAAA;EACD,GAAA;;EAED,EAAA,OAAOY,SAAP,CAAA;EACD;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.development.js","sources":["../../src/persist.ts","../../src/retryStrategies.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n console.warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n","import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","console","error","warn","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClient","hasUnsubscribed","persistQueryClientUnsubscribe","unsubscribe","restorePromise","then","removeOldestQuery","mutations","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q","undefined"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@tanstack/query-core")):"function"==typeof define&&define.amd?define(["exports","@tanstack/query-core"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).QueryPersistClientCore={},e.QueryCore)}(this,(function(e,t){"use strict";const i=["added","removed","updated"];function n(e){return i.includes(e)}async function r({queryClient:e,persister:i,maxAge:n=864e5,buster:r="",hydrateOptions:s}){try{const u=await i.restoreClient();if(u)if(u.timestamp){const a=Date.now()-u.timestamp>n,o=u.buster!==r;a||o?i.removeClient():t.hydrate(e,u.clientState,s)}else i.removeClient()}catch(e){i.removeClient()}}async function s({queryClient:e,persister:i,buster:n="",dehydrateOptions:r}){const s={buster:n,timestamp:Date.now(),clientState:t.dehydrate(e,r)};await i.persistClient(s)}function u(e){const t=e.queryClient.getQueryCache().subscribe((t=>{n(t.type)&&s(e)})),i=e.queryClient.getMutationCache().subscribe((t=>{n(t.type)&&s(e)}));return()=>{t(),i()}}e.persistQueryClient=function(e){let t,i=!1;return[()=>{i=!0,null==t||t()},r(e).then((()=>{i||(t=u(e))}))]},e.persistQueryClientRestore=r,e.persistQueryClientSave=s,e.persistQueryClientSubscribe=u,e.removeOldestQuery=({persistedClient:e})=>{const t=[...e.clientState.mutations],i=[...e.clientState.queries],n={...e,clientState:{mutations:t,queries:i}},r=[...i].sort(((e,t)=>e.state.dataUpdatedAt-t.state.dataUpdatedAt));if(r.length>0){const e=r.shift();return n.clientState.queries=i.filter((t=>t!==e)),n}},Object.defineProperty(e,"__esModule",{value:!0})}));
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@tanstack/query-core")):"function"==typeof define&&define.amd?define(["exports","@tanstack/query-core"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).QueryPersistClientCore={},e.QueryCore)}(this,(function(e,t){"use strict";const i=["added","removed","updated"];function n(e){return i.includes(e)}async function r({queryClient:e,persister:i,maxAge:n=864e5,buster:r="",hydrateOptions:s}){try{const a=await i.restoreClient();if(a)if(a.timestamp){const u=Date.now()-a.timestamp>n,o=a.buster!==r;u||o?i.removeClient():t.hydrate(e,a.clientState,s)}else i.removeClient()}catch(e){i.removeClient()}}async function s({queryClient:e,persister:i,buster:n="",dehydrateOptions:r}){const s={buster:n,timestamp:Date.now(),clientState:t.dehydrate(e,r)};await i.persistClient(s)}function a(e){const t=e.queryClient.getQueryCache().subscribe((t=>{n(t.type)&&s(e)})),i=e.queryClient.getMutationCache().subscribe((t=>{n(t.type)&&s(e)}));return()=>{t(),i()}}e.persistQueryClient=function(e){let t,i=!1;return[()=>{i=!0,t?.()},r(e).then((()=>{i||(t=a(e))}))]},e.persistQueryClientRestore=r,e.persistQueryClientSave=s,e.persistQueryClientSubscribe=a,e.removeOldestQuery=({persistedClient:e})=>{const t=[...e.clientState.mutations],i=[...e.clientState.queries],n={...e,clientState:{mutations:t,queries:i}},r=[...i].sort(((e,t)=>e.state.dataUpdatedAt-t.state.dataUpdatedAt));if(r.length>0){const e=r.shift();return n.clientState.queries=i.filter((t=>t!==e)),n}}}));
2
2
  //# sourceMappingURL=index.production.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.production.js","sources":["../../src/persist.ts","../../src/retryStrategies.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n queryClient.getLogger().error(err)\n queryClient\n .getLogger()\n .warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n","import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","async","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClientUnsubscribe","hasUnsubscribed","then","mutations","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q"],"mappings":"mUA2DA,MAAMA,EAA8C,CAClD,QACA,UACA,WAGF,SAASC,EAAqBC,GAC5B,OAAOF,EAAoBG,SAASD,GAS/BE,eAAeC,GAA0BC,YAC9CA,EAD8CC,UAE9CA,EAF8CC,OAG9CA,EAAS,MAHqCC,OAI9CA,EAAS,GAJqCC,eAK9CA,IAEA,IACE,MAAMC,QAAwBJ,EAAUK,gBAExC,GAAID,EACF,GAAIA,EAAgBE,UAAW,CAC7B,MAAMC,EAAUC,KAAKC,MAAQL,EAAgBE,UAAYL,EACnDS,EAASN,EAAgBF,SAAWA,EACtCK,GAAWG,EACbV,EAAUW,eAEVC,EAAAA,QAAQb,EAAaK,EAAgBS,YAAaV,QAGpDH,EAAUW,eAGd,MAAOG,GASPd,EAAUW,gBASPd,eAAekB,GAAuBhB,YAC3CA,EAD2CC,UAE3CA,EAF2CE,OAG3CA,EAAS,GAHkCc,iBAI3CA,IAEA,MAAMC,EAAiC,CACrCf,SACAI,UAAWE,KAAKC,MAChBI,YAAaK,EAAAA,UAAUnB,EAAaiB,UAGhChB,EAAUiB,cAAcA,GAOzB,SAASE,EACdC,GAEA,MAAMC,EAAwBD,EAAMrB,YACjCuB,gBACAC,WAAWC,IACN9B,EAAqB8B,EAAMC,OAC7BV,EAAuBK,MAIvBM,EAA2BN,EAAMrB,YACpC4B,mBACAJ,WAAWC,IACN9B,EAAqB8B,EAAMC,OAC7BV,EAAuBK,MAI7B,MAAO,KACLC,IACAK,0BAOG,SACLN,GAEA,IACIQ,EADAC,GAAkB,EAetB,MAAO,CAba,KAClBA,GAAkB,EACW,MAA7BD,GAAAA,KAIqB9B,EAA0BsB,GAAOU,MAAK,KACtDD,IAEHD,EAAgCT,EAA4BC,sHCzKjB,EAAGhB,sBAClD,MAAM2B,EAAY,IAAI3B,EAAgBS,YAAYkB,WAC5CC,EAAU,IAAI5B,EAAgBS,YAAYmB,SAC1CC,EAA0B,IAC3B7B,EACHS,YAAa,CAAEkB,YAAWC,YAItBE,EAAgB,IAAIF,GAASG,MACjC,CAACC,EAAGC,IAAMD,EAAEE,MAAMC,cAAgBF,EAAEC,MAAMC,gBAI5C,GAAIL,EAAcM,OAAS,EAAG,CAC5B,MAAMC,EAAaP,EAAcQ,QAEjC,OADAT,EAAOpB,YAAYmB,QAAUA,EAAQW,QAAQC,GAAMA,IAAMH,IAClDR"}
1
+ {"version":3,"file":"index.production.js","sources":["../../src/persist.ts","../../src/retryStrategies.ts"],"sourcesContent":["import type {\n QueryClient,\n DehydratedState,\n DehydrateOptions,\n HydrateOptions,\n} from '@tanstack/query-core'\nimport { dehydrate, hydrate } from '@tanstack/query-core'\nimport type { NotifyEventType } from '@tanstack/query-core'\n\nexport type Promisable<T> = T | PromiseLike<T>\n\nexport interface Persister {\n persistClient(persistClient: PersistedClient): Promisable<void>\n restoreClient(): Promisable<PersistedClient | undefined>\n removeClient(): Promisable<void>\n}\n\nexport interface PersistedClient {\n timestamp: number\n buster: string\n clientState: DehydratedState\n}\n\nexport interface PersistQueryClienRootOptions {\n /** The QueryClient to persist */\n queryClient: QueryClient\n /** The Persister interface for storing and restoring the cache\n * to/from a persisted location */\n persister: Persister\n /** A unique string that can be used to forcefully\n * invalidate existing caches if they do not share the same buster string */\n buster?: string\n}\n\nexport interface PersistedQueryClientRestoreOptions\n extends PersistQueryClienRootOptions {\n /** The max-allowed age of the cache in milliseconds.\n * If a persisted cache is found that is older than this\n * time, it will be discarded */\n maxAge?: number\n /** The options passed to the hydrate function */\n hydrateOptions?: HydrateOptions\n}\n\nexport interface PersistedQueryClientSaveOptions\n extends PersistQueryClienRootOptions {\n /** The options passed to the dehydrate function */\n dehydrateOptions?: DehydrateOptions\n}\n\nexport interface PersistQueryClientOptions\n extends PersistedQueryClientRestoreOptions,\n PersistedQueryClientSaveOptions,\n PersistQueryClienRootOptions {}\n\n/**\n * Checks if emitted event is about cache change and not about observers.\n * Useful for persist, where we only want to trigger save when cache is changed.\n */\nconst cacheableEventTypes: Array<NotifyEventType> = [\n 'added',\n 'removed',\n 'updated',\n]\n\nfunction isCacheableEventType(eventType: NotifyEventType) {\n return cacheableEventTypes.includes(eventType)\n}\n\n/**\n * Restores persisted data to the QueryCache\n * - data obtained from persister.restoreClient\n * - data is hydrated using hydrateOptions\n * If data is expired, busted, empty, or throws, it runs persister.removeClient\n */\nexport async function persistQueryClientRestore({\n queryClient,\n persister,\n maxAge = 1000 * 60 * 60 * 24,\n buster = '',\n hydrateOptions,\n}: PersistedQueryClientRestoreOptions) {\n try {\n const persistedClient = await persister.restoreClient()\n\n if (persistedClient) {\n if (persistedClient.timestamp) {\n const expired = Date.now() - persistedClient.timestamp > maxAge\n const busted = persistedClient.buster !== buster\n if (expired || busted) {\n persister.removeClient()\n } else {\n hydrate(queryClient, persistedClient.clientState, hydrateOptions)\n }\n } else {\n persister.removeClient()\n }\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.error(err)\n console.warn(\n 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',\n )\n }\n persister.removeClient()\n }\n}\n\n/**\n * Persists data from the QueryCache\n * - data dehydrated using dehydrateOptions\n * - data is persisted using persister.persistClient\n */\nexport async function persistQueryClientSave({\n queryClient,\n persister,\n buster = '',\n dehydrateOptions,\n}: PersistedQueryClientSaveOptions) {\n const persistClient: PersistedClient = {\n buster,\n timestamp: Date.now(),\n clientState: dehydrate(queryClient, dehydrateOptions),\n }\n\n await persister.persistClient(persistClient)\n}\n\n/**\n * Subscribe to QueryCache and MutationCache updates (for persisting)\n * @returns an unsubscribe function (to discontinue monitoring)\n */\nexport function persistQueryClientSubscribe(\n props: PersistedQueryClientSaveOptions,\n) {\n const unsubscribeQueryCache = props.queryClient\n .getQueryCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n const unusbscribeMutationCache = props.queryClient\n .getMutationCache()\n .subscribe((event) => {\n if (isCacheableEventType(event.type)) {\n persistQueryClientSave(props)\n }\n })\n\n return () => {\n unsubscribeQueryCache()\n unusbscribeMutationCache()\n }\n}\n\n/**\n * Restores persisted data to QueryCache and persists further changes.\n */\nexport function persistQueryClient(\n props: PersistQueryClientOptions,\n): [() => void, Promise<void>] {\n let hasUnsubscribed = false\n let persistQueryClientUnsubscribe: (() => void) | undefined\n const unsubscribe = () => {\n hasUnsubscribed = true\n persistQueryClientUnsubscribe?.()\n }\n\n // Attempt restore\n const restorePromise = persistQueryClientRestore(props).then(() => {\n if (!hasUnsubscribed) {\n // Subscribe to changes in the query cache to trigger the save\n persistQueryClientUnsubscribe = persistQueryClientSubscribe(props)\n }\n })\n\n return [unsubscribe, restorePromise]\n}\n","import type { PersistedClient } from '@tanstack/query-persist-client-core'\n\nexport type PersistRetryer = (props: {\n persistedClient: PersistedClient\n error: Error\n errorCount: number\n}) => PersistedClient | undefined\n\nexport const removeOldestQuery: PersistRetryer = ({ persistedClient }) => {\n const mutations = [...persistedClient.clientState.mutations]\n const queries = [...persistedClient.clientState.queries]\n const client: PersistedClient = {\n ...persistedClient,\n clientState: { mutations, queries },\n }\n\n // sort queries by dataUpdatedAt (oldest first)\n const sortedQueries = [...queries].sort(\n (a, b) => a.state.dataUpdatedAt - b.state.dataUpdatedAt,\n )\n\n // clean oldest query\n if (sortedQueries.length > 0) {\n const oldestData = sortedQueries.shift()\n client.clientState.queries = queries.filter((q) => q !== oldestData)\n return client\n }\n\n return undefined\n}\n"],"names":["cacheableEventTypes","isCacheableEventType","eventType","includes","async","persistQueryClientRestore","queryClient","persister","maxAge","buster","hydrateOptions","persistedClient","restoreClient","timestamp","expired","Date","now","busted","removeClient","hydrate","clientState","err","persistQueryClientSave","dehydrateOptions","persistClient","dehydrate","persistQueryClientSubscribe","props","unsubscribeQueryCache","getQueryCache","subscribe","event","type","unusbscribeMutationCache","getMutationCache","persistQueryClientUnsubscribe","hasUnsubscribed","then","mutations","queries","client","sortedQueries","sort","a","b","state","dataUpdatedAt","length","oldestData","shift","filter","q"],"mappings":"mUA2DA,MAAMA,EAA8C,CAClD,QACA,UACA,WAGF,SAASC,EAAqBC,GAC5B,OAAOF,EAAoBG,SAASD,GAS/BE,eAAeC,GAA0BC,YAC9CA,EAAWC,UACXA,EAASC,OACTA,EAAS,MAAmBC,OAC5BA,EAAS,GAAEC,eACXA,IAEA,IACE,MAAMC,QAAwBJ,EAAUK,gBAExC,GAAID,EACF,GAAIA,EAAgBE,UAAW,CAC7B,MAAMC,EAAUC,KAAKC,MAAQL,EAAgBE,UAAYL,EACnDS,EAASN,EAAgBF,SAAWA,EACtCK,GAAWG,EACbV,EAAUW,eAEVC,EAAAA,QAAQb,EAAaK,EAAgBS,YAAaV,QAGpDH,EAAUW,eAGd,MAAOG,GAOPd,EAAUW,gBASPd,eAAekB,GAAuBhB,YAC3CA,EAAWC,UACXA,EAASE,OACTA,EAAS,GAAEc,iBACXA,IAEA,MAAMC,EAAiC,CACrCf,SACAI,UAAWE,KAAKC,MAChBI,YAAaK,EAAAA,UAAUnB,EAAaiB,UAGhChB,EAAUiB,cAAcA,GAOzB,SAASE,EACdC,GAEA,MAAMC,EAAwBD,EAAMrB,YACjCuB,gBACAC,WAAWC,IACN9B,EAAqB8B,EAAMC,OAC7BV,EAAuBK,MAIvBM,EAA2BN,EAAMrB,YACpC4B,mBACAJ,WAAWC,IACN9B,EAAqB8B,EAAMC,OAC7BV,EAAuBK,MAI7B,MAAO,KACLC,IACAK,0BAOG,SACLN,GAEA,IACIQ,EADAC,GAAkB,EAetB,MAAO,CAba,KAClBA,GAAkB,EAClBD,OAIqB9B,EAA0BsB,GAAOU,MAAK,KACtDD,IAEHD,EAAgCT,EAA4BC,sHCvKjB,EAAGhB,sBAClD,MAAM2B,EAAY,IAAI3B,EAAgBS,YAAYkB,WAC5CC,EAAU,IAAI5B,EAAgBS,YAAYmB,SAC1CC,EAA0B,IAC3B7B,EACHS,YAAa,CAAEkB,YAAWC,YAItBE,EAAgB,IAAIF,GAASG,MACjC,CAACC,EAAGC,IAAMD,EAAEE,MAAMC,cAAgBF,EAAEC,MAAMC,gBAI5C,GAAIL,EAAcM,OAAS,EAAG,CAC5B,MAAMC,EAAaP,EAAcQ,QAEjC,OADAT,EAAOpB,YAAYmB,QAAUA,EAAQW,QAAQC,GAAMA,IAAMH,IAClDR"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tanstack/query-persist-client-core",
3
- "version": "4.24.9",
3
+ "version": "5.0.0-alpha.0",
4
4
  "description": "Set of utilities for interacting with persisters, which can save your queryClient for later use",
5
5
  "author": "tannerlinsley",
6
6
  "license": "MIT",
@@ -28,7 +28,7 @@
28
28
  "src"
29
29
  ],
30
30
  "dependencies": {
31
- "@tanstack/query-core": "4.24.9"
31
+ "@tanstack/query-core": "5.0.0-alpha.0"
32
32
  },
33
33
  "scripts": {
34
34
  "clean": "rimraf ./build",
@@ -20,7 +20,6 @@ describe('persistQueryClientSubscribe', () => {
20
20
 
21
21
  queryClient.getMutationCache().build(queryClient, {
22
22
  mutationFn: async (text: string) => text,
23
- variables: 'todo',
24
23
  })
25
24
 
26
25
  const result = await persister.restoreClient()
@@ -6,14 +6,7 @@ import type {
6
6
  } from '@tanstack/query-persist-client-core'
7
7
 
8
8
  export function createQueryClient(config?: QueryClientConfig): QueryClient {
9
- jest.spyOn(console, 'error').mockImplementation(() => undefined)
10
- return new QueryClient({ logger: mockLogger, ...config })
11
- }
12
-
13
- export const mockLogger = {
14
- log: jest.fn(),
15
- warn: jest.fn(),
16
- error: jest.fn(),
9
+ return new QueryClient(config)
17
10
  }
18
11
 
19
12
  export function sleep(timeout: number): Promise<void> {
package/src/persist.ts CHANGED
@@ -98,12 +98,10 @@ export async function persistQueryClientRestore({
98
98
  }
99
99
  } catch (err) {
100
100
  if (process.env.NODE_ENV !== 'production') {
101
- queryClient.getLogger().error(err)
102
- queryClient
103
- .getLogger()
104
- .warn(
105
- 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',
106
- )
101
+ console.error(err)
102
+ console.warn(
103
+ 'Encountered an error attempting to restore client cache from persisted location. As a precaution, the persisted cache will be discarded.',
104
+ )
107
105
  }
108
106
  persister.removeClient()
109
107
  }