@tanstack/query-core 5.0.0-alpha.84 → 5.0.0-alpha.86
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/lib/hydration.cjs +12 -4
- package/build/lib/hydration.cjs.map +1 -1
- package/build/lib/hydration.d.ts +3 -1
- package/build/lib/hydration.d.ts.map +1 -1
- package/build/lib/hydration.js +12 -4
- package/build/lib/hydration.js.map +1 -1
- package/build/lib/hydration.legacy.cjs +12 -4
- package/build/lib/hydration.legacy.cjs.map +1 -1
- package/build/lib/hydration.legacy.js +12 -4
- package/build/lib/hydration.legacy.js.map +1 -1
- package/build/lib/onlineManager.cjs +12 -29
- package/build/lib/onlineManager.cjs.map +1 -1
- package/build/lib/onlineManager.d.ts +4 -4
- package/build/lib/onlineManager.d.ts.map +1 -1
- package/build/lib/onlineManager.js +12 -29
- package/build/lib/onlineManager.js.map +1 -1
- package/build/lib/onlineManager.legacy.cjs +12 -29
- package/build/lib/onlineManager.legacy.cjs.map +1 -1
- package/build/lib/onlineManager.legacy.js +12 -29
- package/build/lib/onlineManager.legacy.js.map +1 -1
- package/build/lib/tests/utils.d.ts +3 -2
- package/build/lib/tests/utils.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/hydration.ts +8 -0
- package/src/onlineManager.ts +16 -41
- package/src/tests/hydration.test.tsx +114 -3
- package/src/tests/onlineManager.test.tsx +6 -10
- package/src/tests/queryClient.test.tsx +9 -9
- package/src/tests/utils.ts +9 -5
|
@@ -4,7 +4,6 @@ var _rollupPluginBabelHelpers = require('./_virtual/_rollupPluginBabelHelpers.le
|
|
|
4
4
|
var subscribable = require('./subscribable.legacy.cjs');
|
|
5
5
|
var utils = require('./utils.legacy.cjs');
|
|
6
6
|
|
|
7
|
-
const onlineEvents = ['online', 'offline'];
|
|
8
7
|
var _online = /*#__PURE__*/_rollupPluginBabelHelpers.classPrivateFieldLooseKey("online");
|
|
9
8
|
var _cleanup = /*#__PURE__*/_rollupPluginBabelHelpers.classPrivateFieldLooseKey("cleanup");
|
|
10
9
|
var _setup = /*#__PURE__*/_rollupPluginBabelHelpers.classPrivateFieldLooseKey("setup");
|
|
@@ -13,7 +12,7 @@ class OnlineManager extends subscribable.Subscribable {
|
|
|
13
12
|
super();
|
|
14
13
|
Object.defineProperty(this, _online, {
|
|
15
14
|
writable: true,
|
|
16
|
-
value:
|
|
15
|
+
value: true
|
|
17
16
|
});
|
|
18
17
|
Object.defineProperty(this, _cleanup, {
|
|
19
18
|
writable: true,
|
|
@@ -27,16 +26,15 @@ class OnlineManager extends subscribable.Subscribable {
|
|
|
27
26
|
// addEventListener does not exist in React Native, but window does
|
|
28
27
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
29
28
|
if (!utils.isServer && window.addEventListener) {
|
|
30
|
-
const
|
|
29
|
+
const onlineListener = () => onOnline(true);
|
|
30
|
+
const offlineListener = () => onOnline(false);
|
|
31
31
|
// Listen to online
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
});
|
|
32
|
+
window.addEventListener('online', onlineListener, false);
|
|
33
|
+
window.addEventListener('offline', offlineListener, false);
|
|
35
34
|
return () => {
|
|
36
35
|
// Be sure to unsubscribe if a new handler is set
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
});
|
|
36
|
+
window.removeEventListener('online', onlineListener);
|
|
37
|
+
window.removeEventListener('offline', offlineListener);
|
|
40
38
|
};
|
|
41
39
|
}
|
|
42
40
|
return;
|
|
@@ -58,34 +56,19 @@ class OnlineManager extends subscribable.Subscribable {
|
|
|
58
56
|
var _classPrivateFieldLoo3, _classPrivateFieldLoo4;
|
|
59
57
|
_rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _setup)[_setup] = setup;
|
|
60
58
|
(_classPrivateFieldLoo3 = (_classPrivateFieldLoo4 = _rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _cleanup))[_cleanup]) == null ? void 0 : _classPrivateFieldLoo3.call(_classPrivateFieldLoo4);
|
|
61
|
-
_rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _cleanup)[_cleanup] = setup(
|
|
62
|
-
if (typeof online === 'boolean') {
|
|
63
|
-
this.setOnline(online);
|
|
64
|
-
} else {
|
|
65
|
-
this.onOnline();
|
|
66
|
-
}
|
|
67
|
-
});
|
|
59
|
+
_rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _cleanup)[_cleanup] = setup(this.setOnline.bind(this));
|
|
68
60
|
}
|
|
69
61
|
setOnline(online) {
|
|
70
62
|
const changed = _rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _online)[_online] !== online;
|
|
71
63
|
if (changed) {
|
|
72
64
|
_rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _online)[_online] = online;
|
|
73
|
-
this.
|
|
65
|
+
this.listeners.forEach(listener => {
|
|
66
|
+
listener(online);
|
|
67
|
+
});
|
|
74
68
|
}
|
|
75
69
|
}
|
|
76
|
-
onOnline() {
|
|
77
|
-
this.listeners.forEach(listener => {
|
|
78
|
-
listener();
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
70
|
isOnline() {
|
|
82
|
-
|
|
83
|
-
return _rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _online)[_online];
|
|
84
|
-
}
|
|
85
|
-
if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {
|
|
86
|
-
return true;
|
|
87
|
-
}
|
|
88
|
-
return navigator.onLine;
|
|
71
|
+
return _rollupPluginBabelHelpers.classPrivateFieldLooseBase(this, _online)[_online];
|
|
89
72
|
}
|
|
90
73
|
}
|
|
91
74
|
const onlineManager = new OnlineManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.legacy.cjs","sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype
|
|
1
|
+
{"version":3,"file":"onlineManager.legacy.cjs","sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!isServer && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n isOnline(): boolean {\n return this.#online\n }\n}\n\nexport const onlineManager = new OnlineManager()\n"],"names":["_online","_classPrivateFieldLooseKey","_cleanup","_setup","OnlineManager","Subscribable","constructor","Object","defineProperty","writable","value","_classPrivateFieldLooseBase","onOnline","isServer","window","addEventListener","onlineListener","offlineListener","removeEventListener","onSubscribe","setEventListener","onUnsubscribe","hasListeners","_classPrivateFieldLoo","_classPrivateFieldLoo2","call","undefined","setup","_classPrivateFieldLoo3","_classPrivateFieldLoo4","setOnline","bind","online","changed","listeners","forEach","listener","isOnline","onlineManager"],"mappings":"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"}
|
|
@@ -2,7 +2,6 @@ import { classPrivateFieldLooseBase as _classPrivateFieldLooseBase, classPrivate
|
|
|
2
2
|
import { Subscribable } from './subscribable.legacy.js';
|
|
3
3
|
import { isServer } from './utils.legacy.js';
|
|
4
4
|
|
|
5
|
-
const onlineEvents = ['online', 'offline'];
|
|
6
5
|
var _online = /*#__PURE__*/_classPrivateFieldLooseKey("online");
|
|
7
6
|
var _cleanup = /*#__PURE__*/_classPrivateFieldLooseKey("cleanup");
|
|
8
7
|
var _setup = /*#__PURE__*/_classPrivateFieldLooseKey("setup");
|
|
@@ -11,7 +10,7 @@ class OnlineManager extends Subscribable {
|
|
|
11
10
|
super();
|
|
12
11
|
Object.defineProperty(this, _online, {
|
|
13
12
|
writable: true,
|
|
14
|
-
value:
|
|
13
|
+
value: true
|
|
15
14
|
});
|
|
16
15
|
Object.defineProperty(this, _cleanup, {
|
|
17
16
|
writable: true,
|
|
@@ -25,16 +24,15 @@ class OnlineManager extends Subscribable {
|
|
|
25
24
|
// addEventListener does not exist in React Native, but window does
|
|
26
25
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
27
26
|
if (!isServer && window.addEventListener) {
|
|
28
|
-
const
|
|
27
|
+
const onlineListener = () => onOnline(true);
|
|
28
|
+
const offlineListener = () => onOnline(false);
|
|
29
29
|
// Listen to online
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
30
|
+
window.addEventListener('online', onlineListener, false);
|
|
31
|
+
window.addEventListener('offline', offlineListener, false);
|
|
33
32
|
return () => {
|
|
34
33
|
// Be sure to unsubscribe if a new handler is set
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
});
|
|
34
|
+
window.removeEventListener('online', onlineListener);
|
|
35
|
+
window.removeEventListener('offline', offlineListener);
|
|
38
36
|
};
|
|
39
37
|
}
|
|
40
38
|
return;
|
|
@@ -56,34 +54,19 @@ class OnlineManager extends Subscribable {
|
|
|
56
54
|
var _classPrivateFieldLoo3, _classPrivateFieldLoo4;
|
|
57
55
|
_classPrivateFieldLooseBase(this, _setup)[_setup] = setup;
|
|
58
56
|
(_classPrivateFieldLoo3 = (_classPrivateFieldLoo4 = _classPrivateFieldLooseBase(this, _cleanup))[_cleanup]) == null ? void 0 : _classPrivateFieldLoo3.call(_classPrivateFieldLoo4);
|
|
59
|
-
_classPrivateFieldLooseBase(this, _cleanup)[_cleanup] = setup(
|
|
60
|
-
if (typeof online === 'boolean') {
|
|
61
|
-
this.setOnline(online);
|
|
62
|
-
} else {
|
|
63
|
-
this.onOnline();
|
|
64
|
-
}
|
|
65
|
-
});
|
|
57
|
+
_classPrivateFieldLooseBase(this, _cleanup)[_cleanup] = setup(this.setOnline.bind(this));
|
|
66
58
|
}
|
|
67
59
|
setOnline(online) {
|
|
68
60
|
const changed = _classPrivateFieldLooseBase(this, _online)[_online] !== online;
|
|
69
61
|
if (changed) {
|
|
70
62
|
_classPrivateFieldLooseBase(this, _online)[_online] = online;
|
|
71
|
-
this.
|
|
63
|
+
this.listeners.forEach(listener => {
|
|
64
|
+
listener(online);
|
|
65
|
+
});
|
|
72
66
|
}
|
|
73
67
|
}
|
|
74
|
-
onOnline() {
|
|
75
|
-
this.listeners.forEach(listener => {
|
|
76
|
-
listener();
|
|
77
|
-
});
|
|
78
|
-
}
|
|
79
68
|
isOnline() {
|
|
80
|
-
|
|
81
|
-
return _classPrivateFieldLooseBase(this, _online)[_online];
|
|
82
|
-
}
|
|
83
|
-
if (typeof navigator === 'undefined' || typeof navigator.onLine === 'undefined') {
|
|
84
|
-
return true;
|
|
85
|
-
}
|
|
86
|
-
return navigator.onLine;
|
|
69
|
+
return _classPrivateFieldLooseBase(this, _online)[_online];
|
|
87
70
|
}
|
|
88
71
|
}
|
|
89
72
|
const onlineManager = new OnlineManager();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"onlineManager.legacy.js","sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype
|
|
1
|
+
{"version":3,"file":"onlineManager.legacy.js","sources":["../../src/onlineManager.ts"],"sourcesContent":["import { Subscribable } from './subscribable'\nimport { isServer } from './utils'\n\ntype Listener = (online: boolean) => void\ntype SetupFn = (setOnline: Listener) => (() => void) | undefined\n\nexport class OnlineManager extends Subscribable<Listener> {\n #online = true\n #cleanup?: () => void\n\n #setup: SetupFn\n\n constructor() {\n super()\n this.#setup = (onOnline) => {\n // addEventListener does not exist in React Native, but window does\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!isServer && window.addEventListener) {\n const onlineListener = () => onOnline(true)\n const offlineListener = () => onOnline(false)\n // Listen to online\n window.addEventListener('online', onlineListener, false)\n window.addEventListener('offline', offlineListener, false)\n\n return () => {\n // Be sure to unsubscribe if a new handler is set\n window.removeEventListener('online', onlineListener)\n window.removeEventListener('offline', offlineListener)\n }\n }\n\n return\n }\n }\n\n protected onSubscribe(): void {\n if (!this.#cleanup) {\n this.setEventListener(this.#setup)\n }\n }\n\n protected onUnsubscribe() {\n if (!this.hasListeners()) {\n this.#cleanup?.()\n this.#cleanup = undefined\n }\n }\n\n setEventListener(setup: SetupFn): void {\n this.#setup = setup\n this.#cleanup?.()\n this.#cleanup = setup(this.setOnline.bind(this))\n }\n\n setOnline(online: boolean): void {\n const changed = this.#online !== online\n\n if (changed) {\n this.#online = online\n this.listeners.forEach((listener) => {\n listener(online)\n })\n }\n }\n\n isOnline(): boolean {\n return this.#online\n }\n}\n\nexport const onlineManager = new OnlineManager()\n"],"names":["_online","_classPrivateFieldLooseKey","_cleanup","_setup","OnlineManager","Subscribable","constructor","Object","defineProperty","writable","value","_classPrivateFieldLooseBase","onOnline","isServer","window","addEventListener","onlineListener","offlineListener","removeEventListener","onSubscribe","setEventListener","onUnsubscribe","hasListeners","_classPrivateFieldLoo","_classPrivateFieldLoo2","call","undefined","setup","_classPrivateFieldLoo3","_classPrivateFieldLoo4","setOnline","bind","online","changed","listeners","forEach","listener","isOnline","onlineManager"],"mappings":";;;;AACkC,IAAAA,OAAA,gBAAAC,0BAAA,CAAA,QAAA,CAAA,CAAA;AAAA,IAAAC,QAAA,gBAAAD,0BAAA,CAAA,SAAA,CAAA,CAAA;AAAA,IAAAE,MAAA,gBAAAF,0BAAA,CAAA,OAAA,CAAA,CAAA;AAK3B,MAAMG,aAAa,SAASC,YAAY,CAAW;AAMxDC,EAAAA,WAAWA,GAAG;AACZ,IAAA,KAAK,EAAE,CAAA;IAAAC,MAAA,CAAAC,cAAA,CAAA,IAAA,EAAAR,OAAA,EAAA;MAAAS,QAAA,EAAA,IAAA;AAAAC,MAAAA,KAAA,EANC,IAAA;AAAI,KAAA,CAAA,CAAA;IAAAH,MAAA,CAAAC,cAAA,CAAA,IAAA,EAAAN,QAAA,EAAA;MAAAO,QAAA,EAAA,IAAA;MAAAC,KAAA,EAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;IAAAH,MAAA,CAAAC,cAAA,CAAA,IAAA,EAAAL,MAAA,EAAA;MAAAM,QAAA,EAAA,IAAA;MAAAC,KAAA,EAAA,KAAA,CAAA;AAAA,KAAA,CAAA,CAAA;AAOZC,IAAAA,2BAAA,KAAI,EAAAR,MAAA,EAAAA,MAAA,CAAA,GAAWS,QAAQ,IAAK;AAC1B;AACA;AACA,MAAA,IAAI,CAACC,QAAQ,IAAIC,MAAM,CAACC,gBAAgB,EAAE;AACxC,QAAA,MAAMC,cAAc,GAAGA,MAAMJ,QAAQ,CAAC,IAAI,CAAC,CAAA;AAC3C,QAAA,MAAMK,eAAe,GAAGA,MAAML,QAAQ,CAAC,KAAK,CAAC,CAAA;AAC7C;QACAE,MAAM,CAACC,gBAAgB,CAAC,QAAQ,EAAEC,cAAc,EAAE,KAAK,CAAC,CAAA;QACxDF,MAAM,CAACC,gBAAgB,CAAC,SAAS,EAAEE,eAAe,EAAE,KAAK,CAAC,CAAA;AAE1D,QAAA,OAAO,MAAM;AACX;AACAH,UAAAA,MAAM,CAACI,mBAAmB,CAAC,QAAQ,EAAEF,cAAc,CAAC,CAAA;AACpDF,UAAAA,MAAM,CAACI,mBAAmB,CAAC,SAAS,EAAED,eAAe,CAAC,CAAA;SACvD,CAAA;AACH,OAAA;AAEA,MAAA,OAAA;KACD,CAAA;AACH,GAAA;AAEUE,EAAAA,WAAWA,GAAS;IAC5B,IAAI,CAAAR,2BAAA,CAAC,IAAI,EAAAT,QAAA,CAAA,CAAAA,QAAA,CAAS,EAAE;MAClB,IAAI,CAACkB,gBAAgB,CAAAT,2BAAA,CAAC,IAAI,EAAAR,MAAA,CAAA,CAAAA,MAAA,CAAO,CAAC,CAAA;AACpC,KAAA;AACF,GAAA;AAEUkB,EAAAA,aAAaA,GAAG;AACxB,IAAA,IAAI,CAAC,IAAI,CAACC,YAAY,EAAE,EAAE;MAAA,IAAAC,qBAAA,EAAAC,sBAAA,CAAA;AACxB,MAAA,CAAAD,qBAAA,GAAA,CAAAC,sBAAA,GAAAb,2BAAA,CAAI,IAAA,EAAAT,QAAA,CAAA,EAAAA,QAAA,CAAAqB,KAAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,qBAAA,CAAAE,IAAA,CAAAD,sBAAA,CAAA,CAAA;AACJb,MAAAA,2BAAA,KAAI,EAAAT,QAAA,CAAAA,CAAAA,QAAA,IAAYwB,SAAS,CAAA;AAC3B,KAAA;AACF,GAAA;EAEAN,gBAAgBA,CAACO,KAAc,EAAQ;IAAA,IAAAC,sBAAA,EAAAC,sBAAA,CAAA;AACrClB,IAAAA,2BAAA,KAAI,EAAAR,MAAA,CAAAA,CAAAA,MAAA,IAAUwB,KAAK,CAAA;AACnB,IAAA,CAAAC,sBAAA,GAAA,CAAAC,sBAAA,GAAAlB,2BAAA,CAAI,IAAA,EAAAT,QAAA,CAAA,EAAAA,QAAA,CAAA0B,KAAAA,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,sBAAA,CAAAH,IAAA,CAAAI,sBAAA,CAAA,CAAA;AACJlB,IAAAA,2BAAA,KAAI,EAAAT,QAAA,CAAAA,CAAAA,QAAA,IAAYyB,KAAK,CAAC,IAAI,CAACG,SAAS,CAACC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;AAClD,GAAA;EAEAD,SAASA,CAACE,MAAe,EAAQ;IAC/B,MAAMC,OAAO,GAAGtB,2BAAA,CAAA,IAAI,EAAAX,OAAA,CAAA,CAAAA,OAAA,CAAA,KAAagC,MAAM,CAAA;AAEvC,IAAA,IAAIC,OAAO,EAAE;AACXtB,MAAAA,2BAAA,KAAI,EAAAX,OAAA,CAAAA,CAAAA,OAAA,IAAWgC,MAAM,CAAA;AACrB,MAAA,IAAI,CAACE,SAAS,CAACC,OAAO,CAAEC,QAAQ,IAAK;QACnCA,QAAQ,CAACJ,MAAM,CAAC,CAAA;AAClB,OAAC,CAAC,CAAA;AACJ,KAAA;AACF,GAAA;AAEAK,EAAAA,QAAQA,GAAY;AAClB,IAAA,OAAA1B,2BAAA,CAAO,IAAI,EAAAX,OAAA,EAAAA,OAAA,CAAA,CAAA;AACb,GAAA;AACF,CAAA;MAEasC,aAAa,GAAG,IAAIlC,aAAa;;;;"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { QueryClient } from '..';
|
|
3
|
+
import type { SpyInstance } from 'vitest';
|
|
3
4
|
import type { MutationOptions, QueryClientConfig } from '..';
|
|
4
5
|
export declare function createQueryClient(config?: QueryClientConfig): QueryClient;
|
|
5
|
-
export declare function mockVisibilityState(value: DocumentVisibilityState):
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function mockVisibilityState(value: DocumentVisibilityState): SpyInstance<[], DocumentVisibilityState>;
|
|
7
|
+
export declare function mockOnlineManagerIsOnline(value: boolean): SpyInstance<[], boolean>;
|
|
7
8
|
export declare function queryKey(): Array<string>;
|
|
8
9
|
export declare function sleep(timeout: number): Promise<void>;
|
|
9
10
|
export declare function setActTimeout(fn: () => void, ms?: number): NodeJS.Timeout;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tests/utils.ts"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/tests/utils.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAiB,MAAM,IAAI,CAAA;AAE/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACzC,OAAO,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,IAAI,CAAA;AAE5D,wBAAgB,iBAAiB,CAAC,MAAM,CAAC,EAAE,iBAAiB,GAAG,WAAW,CAEzE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,uBAAuB,GAC7B,WAAW,CAAC,EAAE,EAAE,uBAAuB,CAAC,CAE1C;AAED,wBAAgB,yBAAyB,CACvC,KAAK,EAAE,OAAO,GACb,WAAW,CAAC,EAAE,EAAE,OAAO,CAAC,CAE1B;AAGD,wBAAgB,QAAQ,IAAI,KAAK,CAAC,MAAM,CAAC,CAGxC;AAED,wBAAgB,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIpD;AAED,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,kBAMxD;AAED;;GAEG;AACH,eAAO,MAAM,UAAU,eAAc,IAAiB,CAAA;AAEtD,eAAO,MAAM,eAAe,4BACb,WAAW,6FAQzB,CAAA;AAID,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,cAW5C"}
|
package/package.json
CHANGED
package/src/hydration.ts
CHANGED
|
@@ -2,8 +2,10 @@ import type { QueryClient } from './queryClient'
|
|
|
2
2
|
import type { Query, QueryState } from './query'
|
|
3
3
|
import type {
|
|
4
4
|
MutationKey,
|
|
5
|
+
MutationMeta,
|
|
5
6
|
MutationOptions,
|
|
6
7
|
QueryKey,
|
|
8
|
+
QueryMeta,
|
|
7
9
|
QueryOptions,
|
|
8
10
|
} from './types'
|
|
9
11
|
import type { Mutation, MutationState } from './mutation'
|
|
@@ -25,12 +27,14 @@ export interface HydrateOptions {
|
|
|
25
27
|
interface DehydratedMutation {
|
|
26
28
|
mutationKey?: MutationKey
|
|
27
29
|
state: MutationState
|
|
30
|
+
meta?: MutationMeta
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
interface DehydratedQuery {
|
|
31
34
|
queryHash: string
|
|
32
35
|
queryKey: QueryKey
|
|
33
36
|
state: QueryState
|
|
37
|
+
meta?: QueryMeta
|
|
34
38
|
}
|
|
35
39
|
|
|
36
40
|
export interface DehydratedState {
|
|
@@ -44,6 +48,7 @@ function dehydrateMutation(mutation: Mutation): DehydratedMutation {
|
|
|
44
48
|
return {
|
|
45
49
|
mutationKey: mutation.options.mutationKey,
|
|
46
50
|
state: mutation.state,
|
|
51
|
+
...(mutation.meta && { meta: mutation.meta }),
|
|
47
52
|
}
|
|
48
53
|
}
|
|
49
54
|
|
|
@@ -56,6 +61,7 @@ function dehydrateQuery(query: Query): DehydratedQuery {
|
|
|
56
61
|
state: query.state,
|
|
57
62
|
queryKey: query.queryKey,
|
|
58
63
|
queryHash: query.queryHash,
|
|
64
|
+
...(query.meta && { meta: query.meta }),
|
|
59
65
|
}
|
|
60
66
|
}
|
|
61
67
|
|
|
@@ -115,6 +121,7 @@ export function hydrate(
|
|
|
115
121
|
{
|
|
116
122
|
...options?.defaultOptions?.mutations,
|
|
117
123
|
mutationKey: dehydratedMutation.mutationKey,
|
|
124
|
+
meta: dehydratedMutation.meta,
|
|
118
125
|
},
|
|
119
126
|
dehydratedMutation.state,
|
|
120
127
|
)
|
|
@@ -145,6 +152,7 @@ export function hydrate(
|
|
|
145
152
|
...options?.defaultOptions?.queries,
|
|
146
153
|
queryKey: dehydratedQuery.queryKey,
|
|
147
154
|
queryHash: dehydratedQuery.queryHash,
|
|
155
|
+
meta: dehydratedQuery.meta,
|
|
148
156
|
},
|
|
149
157
|
dehydratedQueryState,
|
|
150
158
|
)
|
package/src/onlineManager.ts
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
import { Subscribable } from './subscribable'
|
|
2
2
|
import { isServer } from './utils'
|
|
3
3
|
|
|
4
|
-
type
|
|
5
|
-
|
|
6
|
-
) => (() => void) | undefined
|
|
4
|
+
type Listener = (online: boolean) => void
|
|
5
|
+
type SetupFn = (setOnline: Listener) => (() => void) | undefined
|
|
7
6
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export class OnlineManager extends Subscribable {
|
|
11
|
-
#online?: boolean
|
|
7
|
+
export class OnlineManager extends Subscribable<Listener> {
|
|
8
|
+
#online = true
|
|
12
9
|
#cleanup?: () => void
|
|
13
10
|
|
|
14
11
|
#setup: SetupFn
|
|
@@ -19,17 +16,16 @@ export class OnlineManager extends Subscribable {
|
|
|
19
16
|
// addEventListener does not exist in React Native, but window does
|
|
20
17
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
21
18
|
if (!isServer && window.addEventListener) {
|
|
22
|
-
const
|
|
19
|
+
const onlineListener = () => onOnline(true)
|
|
20
|
+
const offlineListener = () => onOnline(false)
|
|
23
21
|
// Listen to online
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
})
|
|
22
|
+
window.addEventListener('online', onlineListener, false)
|
|
23
|
+
window.addEventListener('offline', offlineListener, false)
|
|
27
24
|
|
|
28
25
|
return () => {
|
|
29
26
|
// Be sure to unsubscribe if a new handler is set
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
})
|
|
27
|
+
window.removeEventListener('online', onlineListener)
|
|
28
|
+
window.removeEventListener('offline', offlineListener)
|
|
33
29
|
}
|
|
34
30
|
}
|
|
35
31
|
|
|
@@ -53,43 +49,22 @@ export class OnlineManager extends Subscribable {
|
|
|
53
49
|
setEventListener(setup: SetupFn): void {
|
|
54
50
|
this.#setup = setup
|
|
55
51
|
this.#cleanup?.()
|
|
56
|
-
this.#cleanup = setup((
|
|
57
|
-
if (typeof online === 'boolean') {
|
|
58
|
-
this.setOnline(online)
|
|
59
|
-
} else {
|
|
60
|
-
this.onOnline()
|
|
61
|
-
}
|
|
62
|
-
})
|
|
52
|
+
this.#cleanup = setup(this.setOnline.bind(this))
|
|
63
53
|
}
|
|
64
54
|
|
|
65
|
-
setOnline(online
|
|
55
|
+
setOnline(online: boolean): void {
|
|
66
56
|
const changed = this.#online !== online
|
|
67
57
|
|
|
68
58
|
if (changed) {
|
|
69
59
|
this.#online = online
|
|
70
|
-
this.
|
|
60
|
+
this.listeners.forEach((listener) => {
|
|
61
|
+
listener(online)
|
|
62
|
+
})
|
|
71
63
|
}
|
|
72
64
|
}
|
|
73
65
|
|
|
74
|
-
onOnline(): void {
|
|
75
|
-
this.listeners.forEach((listener) => {
|
|
76
|
-
listener()
|
|
77
|
-
})
|
|
78
|
-
}
|
|
79
|
-
|
|
80
66
|
isOnline(): boolean {
|
|
81
|
-
|
|
82
|
-
return this.#online
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
if (
|
|
86
|
-
typeof navigator === 'undefined' ||
|
|
87
|
-
typeof navigator.onLine === 'undefined'
|
|
88
|
-
) {
|
|
89
|
-
return true
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
return navigator.onLine
|
|
67
|
+
return this.#online
|
|
93
68
|
}
|
|
94
69
|
}
|
|
95
70
|
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { vi } from 'vitest'
|
|
1
|
+
import { expect, vi } from 'vitest'
|
|
2
2
|
import { QueryCache } from '../queryCache'
|
|
3
3
|
import { dehydrate, hydrate } from '../hydration'
|
|
4
|
+
import { MutationCache } from '../mutationCache'
|
|
4
5
|
import {
|
|
5
6
|
createQueryClient,
|
|
6
7
|
executeMutation,
|
|
7
|
-
|
|
8
|
+
mockOnlineManagerIsOnline,
|
|
8
9
|
sleep,
|
|
9
10
|
} from './utils'
|
|
10
11
|
|
|
@@ -346,7 +347,7 @@ describe('dehydration and rehydration', () => {
|
|
|
346
347
|
test('should be able to dehydrate mutations and continue on hydration', async () => {
|
|
347
348
|
const consoleMock = vi.spyOn(console, 'error')
|
|
348
349
|
consoleMock.mockImplementation(() => undefined)
|
|
349
|
-
const onlineMock =
|
|
350
|
+
const onlineMock = mockOnlineManagerIsOnline(false)
|
|
350
351
|
|
|
351
352
|
const serverAddTodo = vi
|
|
352
353
|
.fn()
|
|
@@ -557,4 +558,114 @@ describe('dehydration and rehydration', () => {
|
|
|
557
558
|
hydrationCache.find({ queryKey: ['string'] })?.state.fetchStatus,
|
|
558
559
|
).toBe('idle')
|
|
559
560
|
})
|
|
561
|
+
|
|
562
|
+
test('should dehydrate and hydrate meta for queries', async () => {
|
|
563
|
+
const queryCache = new QueryCache()
|
|
564
|
+
const queryClient = createQueryClient({ queryCache })
|
|
565
|
+
await queryClient.prefetchQuery({
|
|
566
|
+
queryKey: ['meta'],
|
|
567
|
+
queryFn: () => Promise.resolve('meta'),
|
|
568
|
+
meta: {
|
|
569
|
+
some: 'meta',
|
|
570
|
+
},
|
|
571
|
+
})
|
|
572
|
+
await queryClient.prefetchQuery({
|
|
573
|
+
queryKey: ['no-meta'],
|
|
574
|
+
queryFn: () => Promise.resolve('no-meta'),
|
|
575
|
+
})
|
|
576
|
+
|
|
577
|
+
const dehydrated = dehydrate(queryClient)
|
|
578
|
+
|
|
579
|
+
expect(
|
|
580
|
+
dehydrated.queries.find((q) => q.queryHash === '["meta"]')?.meta,
|
|
581
|
+
).toEqual({
|
|
582
|
+
some: 'meta',
|
|
583
|
+
})
|
|
584
|
+
|
|
585
|
+
expect(
|
|
586
|
+
dehydrated.queries.find((q) => q.queryHash === '["no-meta"]')?.meta,
|
|
587
|
+
).toEqual(undefined)
|
|
588
|
+
|
|
589
|
+
expect(
|
|
590
|
+
Object.keys(
|
|
591
|
+
dehydrated.queries.find((q) => q.queryHash === '["no-meta"]')!,
|
|
592
|
+
),
|
|
593
|
+
).not.toEqual(expect.arrayContaining(['meta']))
|
|
594
|
+
|
|
595
|
+
const stringified = JSON.stringify(dehydrated)
|
|
596
|
+
|
|
597
|
+
// ---
|
|
598
|
+
|
|
599
|
+
const parsed = JSON.parse(stringified)
|
|
600
|
+
const hydrationCache = new QueryCache()
|
|
601
|
+
const hydrationClient = createQueryClient({
|
|
602
|
+
queryCache: hydrationCache,
|
|
603
|
+
})
|
|
604
|
+
hydrate(hydrationClient, parsed)
|
|
605
|
+
expect(hydrationCache.find({ queryKey: ['meta'] })?.meta).toEqual({
|
|
606
|
+
some: 'meta',
|
|
607
|
+
})
|
|
608
|
+
expect(hydrationCache.find({ queryKey: ['no-meta'] })?.meta).toEqual(
|
|
609
|
+
undefined,
|
|
610
|
+
)
|
|
611
|
+
})
|
|
612
|
+
|
|
613
|
+
test('should dehydrate and hydrate meta for mutations', async () => {
|
|
614
|
+
const mutationCache = new MutationCache()
|
|
615
|
+
const queryClient = createQueryClient({ mutationCache })
|
|
616
|
+
|
|
617
|
+
await executeMutation(
|
|
618
|
+
queryClient,
|
|
619
|
+
{
|
|
620
|
+
mutationKey: ['meta'],
|
|
621
|
+
mutationFn: () => Promise.resolve('meta'),
|
|
622
|
+
meta: {
|
|
623
|
+
some: 'meta',
|
|
624
|
+
},
|
|
625
|
+
},
|
|
626
|
+
undefined,
|
|
627
|
+
)
|
|
628
|
+
|
|
629
|
+
await executeMutation(
|
|
630
|
+
queryClient,
|
|
631
|
+
{
|
|
632
|
+
mutationKey: ['no-meta'],
|
|
633
|
+
mutationFn: () => Promise.resolve('no-meta'),
|
|
634
|
+
},
|
|
635
|
+
undefined,
|
|
636
|
+
)
|
|
637
|
+
|
|
638
|
+
const dehydrated = dehydrate(queryClient, {
|
|
639
|
+
shouldDehydrateMutation: () => true,
|
|
640
|
+
})
|
|
641
|
+
|
|
642
|
+
expect(Object.keys(dehydrated.mutations[0]!)).toEqual(
|
|
643
|
+
expect.arrayContaining(['meta']),
|
|
644
|
+
)
|
|
645
|
+
expect(dehydrated.mutations[0]?.meta).toEqual({
|
|
646
|
+
some: 'meta',
|
|
647
|
+
})
|
|
648
|
+
|
|
649
|
+
expect(Object.keys(dehydrated.mutations[1]!)).not.toEqual(
|
|
650
|
+
expect.arrayContaining(['meta']),
|
|
651
|
+
)
|
|
652
|
+
expect(dehydrated.mutations[1]?.meta).toEqual(undefined)
|
|
653
|
+
|
|
654
|
+
const stringified = JSON.stringify(dehydrated)
|
|
655
|
+
|
|
656
|
+
// ---
|
|
657
|
+
|
|
658
|
+
const parsed = JSON.parse(stringified)
|
|
659
|
+
const hydrationCache = new MutationCache()
|
|
660
|
+
const hydrationClient = createQueryClient({
|
|
661
|
+
mutationCache: hydrationCache,
|
|
662
|
+
})
|
|
663
|
+
hydrate(hydrationClient, parsed)
|
|
664
|
+
expect(hydrationCache.find({ mutationKey: ['meta'] })?.meta).toEqual({
|
|
665
|
+
some: 'meta',
|
|
666
|
+
})
|
|
667
|
+
expect(hydrationCache.find({ mutationKey: ['no-meta'] })?.meta).toEqual(
|
|
668
|
+
undefined,
|
|
669
|
+
)
|
|
670
|
+
})
|
|
560
671
|
})
|
|
@@ -31,7 +31,7 @@ describe('onlineManager', () => {
|
|
|
31
31
|
test('setEventListener should use online boolean arg', async () => {
|
|
32
32
|
let count = 0
|
|
33
33
|
|
|
34
|
-
const setup = (setOnline: (online
|
|
34
|
+
const setup = (setOnline: (online: boolean) => void) => {
|
|
35
35
|
setTimeout(() => {
|
|
36
36
|
count++
|
|
37
37
|
setOnline(false)
|
|
@@ -154,19 +154,15 @@ describe('onlineManager', () => {
|
|
|
154
154
|
|
|
155
155
|
onlineManager.subscribe(listener)
|
|
156
156
|
|
|
157
|
-
onlineManager.setOnline(true)
|
|
158
|
-
onlineManager.setOnline(true)
|
|
159
|
-
|
|
160
|
-
expect(listener).toHaveBeenCalledTimes(1)
|
|
161
|
-
|
|
162
157
|
onlineManager.setOnline(false)
|
|
163
158
|
onlineManager.setOnline(false)
|
|
164
159
|
|
|
165
|
-
expect(listener).
|
|
160
|
+
expect(listener).toHaveBeenNthCalledWith(1, false)
|
|
166
161
|
|
|
167
|
-
onlineManager.setOnline(
|
|
168
|
-
onlineManager.setOnline(
|
|
162
|
+
onlineManager.setOnline(true)
|
|
163
|
+
onlineManager.setOnline(true)
|
|
169
164
|
|
|
170
|
-
expect(listener).toHaveBeenCalledTimes(
|
|
165
|
+
expect(listener).toHaveBeenCalledTimes(2)
|
|
166
|
+
expect(listener).toHaveBeenNthCalledWith(2, true)
|
|
171
167
|
})
|
|
172
168
|
})
|