@qiaopeng/tanstack-query-plus 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. package/dist/PersistQueryClientProvider.d.ts +22 -0
  2. package/dist/PersistQueryClientProvider.d.ts.map +1 -0
  3. package/dist/PersistQueryClientProvider.js +47 -0
  4. package/dist/components/LoadingFallback.d.ts +16 -0
  5. package/dist/components/LoadingFallback.d.ts.map +1 -0
  6. package/dist/components/LoadingFallback.js +27 -0
  7. package/dist/components/QueryErrorBoundary.d.ts +12 -0
  8. package/dist/components/QueryErrorBoundary.d.ts.map +1 -0
  9. package/dist/components/QueryErrorBoundary.js +9 -0
  10. package/dist/components/SuspenseWrapper.d.ts +14 -0
  11. package/dist/components/SuspenseWrapper.d.ts.map +1 -0
  12. package/dist/components/SuspenseWrapper.js +9 -0
  13. package/dist/components/index.d.ts +4 -0
  14. package/dist/components/index.d.ts.map +1 -0
  15. package/dist/components/index.js +3 -0
  16. package/dist/components/internal/ErrorBoundary.d.ts +26 -0
  17. package/dist/components/internal/ErrorBoundary.d.ts.map +1 -0
  18. package/dist/components/internal/ErrorBoundary.js +28 -0
  19. package/dist/core/config.d.ts +36 -0
  20. package/dist/core/config.d.ts.map +1 -0
  21. package/dist/core/config.js +213 -0
  22. package/dist/core/devtools.d.ts +14 -0
  23. package/dist/core/devtools.d.ts.map +1 -0
  24. package/dist/core/devtools.js +16 -0
  25. package/dist/core/env.d.ts +3 -0
  26. package/dist/core/env.d.ts.map +1 -0
  27. package/dist/core/env.js +2 -0
  28. package/dist/core/focusManager.d.ts +33 -0
  29. package/dist/core/focusManager.d.ts.map +1 -0
  30. package/dist/core/focusManager.js +122 -0
  31. package/dist/core/index.d.ts +6 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/index.js +5 -0
  34. package/dist/core/keys.d.ts +59 -0
  35. package/dist/core/keys.d.ts.map +1 -0
  36. package/dist/core/keys.js +107 -0
  37. package/dist/core/queryOptions.d.ts +30 -0
  38. package/dist/core/queryOptions.d.ts.map +1 -0
  39. package/dist/core/queryOptions.js +30 -0
  40. package/dist/features/index.d.ts +4 -0
  41. package/dist/features/index.d.ts.map +1 -0
  42. package/dist/features/index.js +3 -0
  43. package/dist/features/offline.d.ts +48 -0
  44. package/dist/features/offline.d.ts.map +1 -0
  45. package/dist/features/offline.js +269 -0
  46. package/dist/features/persistence.d.ts +36 -0
  47. package/dist/features/persistence.d.ts.map +1 -0
  48. package/dist/features/persistence.js +175 -0
  49. package/dist/hooks/batchQueries.d.ts +128 -0
  50. package/dist/hooks/batchQueries.d.ts.map +1 -0
  51. package/dist/hooks/batchQueries.js +301 -0
  52. package/dist/hooks/index.d.ts +8 -0
  53. package/dist/hooks/index.d.ts.map +1 -0
  54. package/dist/hooks/index.js +7 -0
  55. package/dist/hooks/useFocusManager.d.ts +41 -0
  56. package/dist/hooks/useFocusManager.d.ts.map +1 -0
  57. package/dist/hooks/useFocusManager.js +109 -0
  58. package/dist/hooks/useInfiniteQuery.d.ts +58 -0
  59. package/dist/hooks/useInfiniteQuery.d.ts.map +1 -0
  60. package/dist/hooks/useInfiniteQuery.js +61 -0
  61. package/dist/hooks/useMutation.d.ts +34 -0
  62. package/dist/hooks/useMutation.d.ts.map +1 -0
  63. package/dist/hooks/useMutation.js +176 -0
  64. package/dist/hooks/usePrefetch.d.ts +54 -0
  65. package/dist/hooks/usePrefetch.d.ts.map +1 -0
  66. package/dist/hooks/usePrefetch.js +203 -0
  67. package/dist/hooks/useQuery.d.ts +5 -0
  68. package/dist/hooks/useQuery.d.ts.map +1 -0
  69. package/dist/hooks/useQuery.js +5 -0
  70. package/dist/hooks/useSuspenseQuery.d.ts +11 -0
  71. package/dist/hooks/useSuspenseQuery.d.ts.map +1 -0
  72. package/dist/hooks/useSuspenseQuery.js +19 -0
  73. package/dist/index.d.ts +8 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +7 -0
  76. package/dist/types/base.d.ts +54 -0
  77. package/dist/types/base.d.ts.map +1 -0
  78. package/dist/types/base.js +26 -0
  79. package/dist/types/index.d.ts +23 -0
  80. package/dist/types/index.d.ts.map +1 -0
  81. package/dist/types/index.js +7 -0
  82. package/dist/types/infinite.d.ts +39 -0
  83. package/dist/types/infinite.d.ts.map +1 -0
  84. package/dist/types/infinite.js +1 -0
  85. package/dist/types/offline.d.ts +97 -0
  86. package/dist/types/offline.d.ts.map +1 -0
  87. package/dist/types/offline.js +8 -0
  88. package/dist/types/optimistic.d.ts +126 -0
  89. package/dist/types/optimistic.d.ts.map +1 -0
  90. package/dist/types/optimistic.js +7 -0
  91. package/dist/types/persistence.d.ts +9 -0
  92. package/dist/types/persistence.d.ts.map +1 -0
  93. package/dist/types/persistence.js +1 -0
  94. package/dist/types/selectors.d.ts +11 -0
  95. package/dist/types/selectors.d.ts.map +1 -0
  96. package/dist/types/selectors.js +1 -0
  97. package/dist/types/suspense.d.ts +67 -0
  98. package/dist/types/suspense.d.ts.map +1 -0
  99. package/dist/types/suspense.js +1 -0
  100. package/dist/utils/fieldMapper.d.ts +9 -0
  101. package/dist/utils/fieldMapper.d.ts.map +1 -0
  102. package/dist/utils/fieldMapper.js +27 -0
  103. package/dist/utils/index.d.ts +9 -0
  104. package/dist/utils/index.d.ts.map +1 -0
  105. package/dist/utils/index.js +8 -0
  106. package/dist/utils/network.d.ts +9 -0
  107. package/dist/utils/network.d.ts.map +1 -0
  108. package/dist/utils/network.js +43 -0
  109. package/dist/utils/optimisticUtils.d.ts +34 -0
  110. package/dist/utils/optimisticUtils.d.ts.map +1 -0
  111. package/dist/utils/optimisticUtils.js +76 -0
  112. package/dist/utils/placeholderData.d.ts +2 -0
  113. package/dist/utils/placeholderData.d.ts.map +1 -0
  114. package/dist/utils/placeholderData.js +1 -0
  115. package/dist/utils/prefetchManager.d.ts +111 -0
  116. package/dist/utils/prefetchManager.d.ts.map +1 -0
  117. package/dist/utils/prefetchManager.js +246 -0
  118. package/dist/utils/queryKey.d.ts +24 -0
  119. package/dist/utils/queryKey.d.ts.map +1 -0
  120. package/dist/utils/queryKey.js +77 -0
  121. package/dist/utils/selectors.d.ts +30 -0
  122. package/dist/utils/selectors.d.ts.map +1 -0
  123. package/dist/utils/selectors.js +18 -0
  124. package/dist/utils/storage.d.ts +7 -0
  125. package/dist/utils/storage.d.ts.map +1 -0
  126. package/dist/utils/storage.js +84 -0
  127. package/package.json +70 -0
@@ -0,0 +1,122 @@
1
+ import { focusManager } from "@tanstack/react-query";
2
+ export { focusManager };
3
+ export function setupFocusManager(config = {}) {
4
+ const { enabled = true, customEventListener } = config;
5
+ if (!enabled) {
6
+ focusManager.setEventListener(() => () => { });
7
+ focusManager.setFocused(false);
8
+ return;
9
+ }
10
+ if (customEventListener) {
11
+ focusManager.setEventListener(customEventListener);
12
+ }
13
+ else {
14
+ focusManager.setEventListener((handleFocus) => {
15
+ if (typeof window === "undefined" || !window.addEventListener) {
16
+ return () => { };
17
+ }
18
+ const handleVisibilityChange = () => {
19
+ handleFocus();
20
+ };
21
+ const handleWindowFocus = () => handleFocus();
22
+ window.addEventListener("visibilitychange", handleVisibilityChange, false);
23
+ window.addEventListener("focus", handleWindowFocus, false);
24
+ return () => {
25
+ window.removeEventListener("visibilitychange", handleVisibilityChange);
26
+ window.removeEventListener("focus", handleWindowFocus);
27
+ };
28
+ });
29
+ }
30
+ }
31
+ export function pauseFocusManager() {
32
+ focusManager.setFocused(false);
33
+ }
34
+ export function resumeFocusManager() {
35
+ const isVisible = typeof document !== "undefined" ? !document.hidden : true;
36
+ focusManager.setFocused(isVisible);
37
+ }
38
+ export class SmartFocusManager {
39
+ constructor() {
40
+ this.pauseCount = 0;
41
+ this.refetchHistory = new Map();
42
+ }
43
+ serializeKey(queryKey) {
44
+ try {
45
+ return JSON.stringify(queryKey);
46
+ }
47
+ catch {
48
+ return Array.isArray(queryKey)
49
+ ? queryKey
50
+ .map((v) => {
51
+ try {
52
+ return JSON.stringify(v);
53
+ }
54
+ catch {
55
+ return String(v);
56
+ }
57
+ })
58
+ .join("|")
59
+ : String(queryKey);
60
+ }
61
+ }
62
+ pause() {
63
+ if (this.pauseCount === 0) {
64
+ this.originalFocusState = focusManager.isFocused();
65
+ focusManager.setFocused(false);
66
+ }
67
+ this.pauseCount++;
68
+ }
69
+ resume() {
70
+ if (this.pauseCount > 0) {
71
+ this.pauseCount--;
72
+ if (this.pauseCount === 0) {
73
+ focusManager.setFocused(this.originalFocusState);
74
+ }
75
+ }
76
+ }
77
+ reset() {
78
+ if (this.pauseCount > 0) {
79
+ this.pauseCount = 0;
80
+ focusManager.setFocused(this.originalFocusState);
81
+ this.originalFocusState = undefined;
82
+ }
83
+ }
84
+ destroy() {
85
+ this.reset();
86
+ this.clearHistory();
87
+ }
88
+ shouldRefetch(queryKey, minInterval = 5000) {
89
+ const key = this.serializeKey(queryKey);
90
+ const lastRefetchTime = this.refetchHistory.has(key) ? this.refetchHistory.get(key) : -Infinity;
91
+ const now = Date.now();
92
+ if (now - lastRefetchTime < minInterval) {
93
+ return false;
94
+ }
95
+ this.refetchHistory.set(key, now);
96
+ return true;
97
+ }
98
+ clearHistory() {
99
+ this.refetchHistory.clear();
100
+ }
101
+ clearHistoryByKey(queryKey) {
102
+ const key = this.serializeKey(queryKey);
103
+ this.refetchHistory.delete(key);
104
+ }
105
+ getLastRefetchTime(queryKey) {
106
+ const key = this.serializeKey(queryKey);
107
+ return this.refetchHistory.get(key);
108
+ }
109
+ getStats() {
110
+ return { isPaused: this.pauseCount > 0, pauseCount: this.pauseCount, isFocused: focusManager.isFocused() };
111
+ }
112
+ }
113
+ let smartFocusManagerInstance = null;
114
+ export function getSmartFocusManager() {
115
+ if (!smartFocusManagerInstance) {
116
+ smartFocusManagerInstance = new SmartFocusManager();
117
+ }
118
+ return smartFocusManagerInstance;
119
+ }
120
+ export function resetSmartFocusManager() {
121
+ smartFocusManagerInstance = null;
122
+ }
@@ -0,0 +1,6 @@
1
+ export { createCustomConfig, DEFAULT_GC_TIME, DEFAULT_MUTATION_CONFIG, DEFAULT_QUERY_CONFIG, DEFAULT_STALE_TIME, defaultMutationRetryStrategy, defaultQueryRetryStrategy, DEVELOPMENT_CONFIG, ensureBestPractices, exponentialBackoff, getConfigByEnvironment, GLOBAL_QUERY_CONFIG, LONG_CACHE_CONFIG, PRODUCTION_CONFIG, REALTIME_CONFIG, SMART_RETRY_MUTATION_CONFIG, TIME_CONSTANTS, validateConfig, validateGcTime } from "./config.js";
2
+ export { createDevToolsConfig, defaultDevToolsConfig, type DevToolsConfig, isDevToolsEnabled, ReactQueryDevtools } from "./devtools.js";
3
+ export { focusManager, type FocusManagerConfig, getSmartFocusManager, pauseFocusManager, resetSmartFocusManager, resumeFocusManager, setupFocusManager, SmartFocusManager } from "./focusManager.js";
4
+ export { areKeysEqual, containsEntity, createComplexKey, createDomainKeyFactory, createFilteredKey, createMutationKeyFactory, createPaginatedKey, createSearchKey, createSortedKey, extractEntityId, matchesKeyPattern, normalizeQueryKey, queryKeys, validateQueryKey } from "./keys.js";
5
+ export { createAppQueryOptions, createAppQueryOptionsWithSelect } from "./queryOptions.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,uBAAuB,EACvB,oBAAoB,EACpB,kBAAkB,EAClB,4BAA4B,EAC5B,yBAAyB,EACzB,kBAAkB,EAClB,mBAAmB,EACnB,kBAAkB,EAClB,sBAAsB,EACtB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,2BAA2B,EAC3B,cAAc,EACd,cAAc,EACd,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,KAAK,cAAc,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxI,OAAO,EACL,YAAY,EACZ,KAAK,kBAAkB,EACvB,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,kBAAkB,EAClB,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,sBAAsB,EACtB,iBAAiB,EACjB,wBAAwB,EACxB,kBAAkB,EAClB,eAAe,EACf,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,SAAS,EACT,gBAAgB,EACjB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,qBAAqB,EAAE,+BAA+B,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { createCustomConfig, DEFAULT_GC_TIME, DEFAULT_MUTATION_CONFIG, DEFAULT_QUERY_CONFIG, DEFAULT_STALE_TIME, defaultMutationRetryStrategy, defaultQueryRetryStrategy, DEVELOPMENT_CONFIG, ensureBestPractices, exponentialBackoff, getConfigByEnvironment, GLOBAL_QUERY_CONFIG, LONG_CACHE_CONFIG, PRODUCTION_CONFIG, REALTIME_CONFIG, SMART_RETRY_MUTATION_CONFIG, TIME_CONSTANTS, validateConfig, validateGcTime } from "./config.js";
2
+ export { createDevToolsConfig, defaultDevToolsConfig, isDevToolsEnabled, ReactQueryDevtools } from "./devtools.js";
3
+ export { focusManager, getSmartFocusManager, pauseFocusManager, resetSmartFocusManager, resumeFocusManager, setupFocusManager, SmartFocusManager } from "./focusManager.js";
4
+ export { areKeysEqual, containsEntity, createComplexKey, createDomainKeyFactory, createFilteredKey, createMutationKeyFactory, createPaginatedKey, createSearchKey, createSortedKey, extractEntityId, matchesKeyPattern, normalizeQueryKey, queryKeys, validateQueryKey } from "./keys.js";
5
+ export { createAppQueryOptions, createAppQueryOptionsWithSelect } from "./queryOptions.js";
@@ -0,0 +1,59 @@
1
+ import type { QueryKey } from "@tanstack/react-query";
2
+ export declare const queryKeys: {
3
+ all: readonly ["tanstack-query"];
4
+ users: () => readonly ["tanstack-query", "users"];
5
+ user: (id: string) => readonly ["tanstack-query", "users", string];
6
+ userProfile: (id: string) => readonly ["tanstack-query", "users", string, "profile"];
7
+ userSettings: (id: string) => readonly ["tanstack-query", "users", string, "settings"];
8
+ usersByRole: (role: string) => readonly ["tanstack-query", "users", "by-role", string];
9
+ posts: () => readonly ["tanstack-query", "posts"];
10
+ post: (id: string) => readonly ["tanstack-query", "posts", string];
11
+ postsByUser: (userId: string) => readonly ["tanstack-query", "posts", "by-user", string];
12
+ postsByTag: (tag: string) => readonly ["tanstack-query", "posts", "by-tag", string];
13
+ postComments: (postId: string) => readonly ["tanstack-query", "posts", string, "comments"];
14
+ search: (query: string, type?: string) => readonly ["tanstack-query", "search", {
15
+ readonly query: string;
16
+ readonly type: string | undefined;
17
+ }];
18
+ notifications: () => readonly ["tanstack-query", "notifications"];
19
+ notification: (id: string) => readonly ["tanstack-query", "notifications", string];
20
+ unreadNotifications: () => readonly ["tanstack-query", "notifications", "unread"];
21
+ settings: () => readonly ["tanstack-query", "settings"];
22
+ appSettings: () => readonly ["tanstack-query", "settings", "app"];
23
+ userPreferences: (userId: string) => readonly ["tanstack-query", "settings", "preferences", string];
24
+ };
25
+ export declare function createFilteredKey(baseKey: QueryKey, filters: Record<string, unknown>): QueryKey;
26
+ export declare function createPaginatedKey(baseKey: QueryKey, page: number, pageSize: number): QueryKey;
27
+ export declare function createSortedKey(baseKey: QueryKey, sortBy: string, sortOrder?: "asc" | "desc"): QueryKey;
28
+ export declare function createSearchKey(baseKey: QueryKey, searchTerm: string, searchFields?: string[]): QueryKey;
29
+ export declare function createComplexKey(baseKey: QueryKey, options: {
30
+ page?: number;
31
+ pageSize?: number;
32
+ filters?: Record<string, unknown>;
33
+ sortBy?: string;
34
+ sortOrder?: "asc" | "desc";
35
+ search?: string;
36
+ }): QueryKey;
37
+ export declare function matchesKeyPattern(queryKey: QueryKey, pattern: QueryKey): boolean;
38
+ export declare function validateQueryKey(queryKey: QueryKey): boolean;
39
+ export declare function containsEntity(queryKey: QueryKey, entity: string): boolean;
40
+ export declare function extractEntityId(queryKey: QueryKey, entityIndex: number): string | undefined;
41
+ export declare function normalizeQueryKey(queryKey: QueryKey): QueryKey;
42
+ export declare function areKeysEqual(key1: QueryKey, key2: QueryKey): boolean;
43
+ export declare function createDomainKeyFactory(domain: string): {
44
+ all: () => readonly ["tanstack-query", string];
45
+ lists: () => readonly ["tanstack-query", string, "list"];
46
+ list: (params?: Record<string, unknown>) => readonly ["tanstack-query", string, "list"] | readonly ["tanstack-query", string, "list", Record<string, unknown>];
47
+ details: () => readonly ["tanstack-query", string, "detail"];
48
+ detail: (id: string | number) => readonly ["tanstack-query", string, "detail", string | number];
49
+ subResource: (id: string | number, resource: string) => readonly ["tanstack-query", string, "detail", string | number, string];
50
+ byRelation: (relation: string, relationId: string | number) => readonly ["tanstack-query", string, `by-${string}`, string | number];
51
+ };
52
+ export declare function createMutationKeyFactory(domain: string): {
53
+ create: () => readonly [string, "create"];
54
+ update: (id?: string | number) => readonly [string, "update", string | number] | readonly [string, "update"];
55
+ delete: (id?: string | number) => readonly [string, "delete", string | number] | readonly [string, "delete"];
56
+ batch: (operation: string) => readonly [string, "batch", string];
57
+ custom: (operation: string, id?: string | number) => readonly [string, string, string | number] | readonly [string, string];
58
+ };
59
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/core/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAEtD,eAAO,MAAM,SAAS;;;eAGT,MAAM;sBACC,MAAM;uBACL,MAAM;wBACL,MAAM;;eAEf,MAAM;0BACK,MAAM;sBACV,MAAM;2BACD,MAAM;oBACb,MAAM,SAAS,MAAM;;;;;uBAElB,MAAM;;;;8BAIC,MAAM;CACjC,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,QAAQ,CAE/F;AACD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAE9F;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,KAAK,GAAG,MAAc,GAAG,QAAQ,CAE9G;AACD,wBAAgB,eAAe,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,CAExG;AACD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,QAAQ,EACjB,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7I,QAAQ,CAiBV;AACD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,GAAG,OAAO,CAShF;AACD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAK5D;AACD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAE1E;AACD,wBAAgB,eAAe,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG3F;AACD,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAE9D;AACD,wBAAgB,YAAY,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CASpE;AACD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM;;;oBAIjC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;;iBAE1B,MAAM,GAAG,MAAM;sBACV,MAAM,GAAG,MAAM,YAAY,MAAM;2BAC5B,MAAM,cAAc,MAAM,GAAG,MAAM;EAE7D;AACD,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,MAAM;;kBAGrC,MAAM,GAAG,MAAM;kBACf,MAAM,GAAG,MAAM;uBACV,MAAM;wBACL,MAAM,OAAO,MAAM,GAAG,MAAM;EAEnD"}
@@ -0,0 +1,107 @@
1
+ export const queryKeys = {
2
+ all: ["tanstack-query"],
3
+ users: () => [...queryKeys.all, "users"],
4
+ user: (id) => [...queryKeys.users(), id],
5
+ userProfile: (id) => [...queryKeys.user(id), "profile"],
6
+ userSettings: (id) => [...queryKeys.user(id), "settings"],
7
+ usersByRole: (role) => [...queryKeys.users(), "by-role", role],
8
+ posts: () => [...queryKeys.all, "posts"],
9
+ post: (id) => [...queryKeys.posts(), id],
10
+ postsByUser: (userId) => [...queryKeys.posts(), "by-user", userId],
11
+ postsByTag: (tag) => [...queryKeys.posts(), "by-tag", tag],
12
+ postComments: (postId) => [...queryKeys.post(postId), "comments"],
13
+ search: (query, type) => [...queryKeys.all, "search", { query, type }],
14
+ notifications: () => [...queryKeys.all, "notifications"],
15
+ notification: (id) => [...queryKeys.notifications(), id],
16
+ unreadNotifications: () => [...queryKeys.notifications(), "unread"],
17
+ settings: () => [...queryKeys.all, "settings"],
18
+ appSettings: () => [...queryKeys.settings(), "app"],
19
+ userPreferences: (userId) => [...queryKeys.settings(), "preferences", userId]
20
+ };
21
+ export function createFilteredKey(baseKey, filters) {
22
+ return [...baseKey, "filtered", filters];
23
+ }
24
+ export function createPaginatedKey(baseKey, page, pageSize) {
25
+ return [...baseKey, "paginated", { page, pageSize }];
26
+ }
27
+ export function createSortedKey(baseKey, sortBy, sortOrder = "asc") {
28
+ return [...baseKey, "sorted", { sortBy, sortOrder }];
29
+ }
30
+ export function createSearchKey(baseKey, searchTerm, searchFields) {
31
+ return [...baseKey, "search", { term: searchTerm, fields: searchFields }];
32
+ }
33
+ export function createComplexKey(baseKey, options) {
34
+ const params = {};
35
+ if (options.page !== undefined && options.pageSize !== undefined) {
36
+ params.page = options.page;
37
+ params.pageSize = options.pageSize;
38
+ }
39
+ if (options.filters && Object.keys(options.filters).length > 0) {
40
+ params.filters = options.filters;
41
+ }
42
+ if (options.sortBy) {
43
+ params.sortBy = options.sortBy;
44
+ params.sortOrder = options.sortOrder || "asc";
45
+ }
46
+ if (options.search) {
47
+ params.search = options.search;
48
+ }
49
+ return [...baseKey, "complex", params];
50
+ }
51
+ export function matchesKeyPattern(queryKey, pattern) {
52
+ if (pattern.length > queryKey.length)
53
+ return false;
54
+ return pattern.every((patternPart, index) => {
55
+ const keyPart = queryKey[index];
56
+ if (typeof patternPart === "object" && typeof keyPart === "object") {
57
+ return JSON.stringify(patternPart) === JSON.stringify(keyPart);
58
+ }
59
+ return patternPart === keyPart;
60
+ });
61
+ }
62
+ export function validateQueryKey(queryKey) {
63
+ if (!Array.isArray(queryKey) || queryKey.length === 0)
64
+ return false;
65
+ return queryKey.every((part) => part !== null && part !== undefined && (typeof part === "string" || typeof part === "number" || typeof part === "boolean" || (typeof part === "object" && part !== null)));
66
+ }
67
+ export function containsEntity(queryKey, entity) {
68
+ return queryKey.includes(entity);
69
+ }
70
+ export function extractEntityId(queryKey, entityIndex) {
71
+ const value = queryKey[entityIndex];
72
+ return typeof value === "string" ? value : undefined;
73
+ }
74
+ export function normalizeQueryKey(queryKey) {
75
+ return queryKey.filter((part) => part !== null && part !== undefined);
76
+ }
77
+ export function areKeysEqual(key1, key2) {
78
+ if (key1.length !== key2.length)
79
+ return false;
80
+ return key1.every((part, index) => {
81
+ const otherPart = key2[index];
82
+ if (typeof part === "object" && typeof otherPart === "object") {
83
+ return JSON.stringify(part) === JSON.stringify(otherPart);
84
+ }
85
+ return part === otherPart;
86
+ });
87
+ }
88
+ export function createDomainKeyFactory(domain) {
89
+ return {
90
+ all: () => [...queryKeys.all, domain],
91
+ lists: () => [...queryKeys.all, domain, "list"],
92
+ list: (params) => (params ? [...queryKeys.all, domain, "list", params] : [...queryKeys.all, domain, "list"]),
93
+ details: () => [...queryKeys.all, domain, "detail"],
94
+ detail: (id) => [...queryKeys.all, domain, "detail", id],
95
+ subResource: (id, resource) => [...queryKeys.all, domain, "detail", id, resource],
96
+ byRelation: (relation, relationId) => [...queryKeys.all, domain, `by-${relation}`, relationId]
97
+ };
98
+ }
99
+ export function createMutationKeyFactory(domain) {
100
+ return {
101
+ create: () => [domain, "create"],
102
+ update: (id) => (id ? [domain, "update", id] : [domain, "update"]),
103
+ delete: (id) => (id ? [domain, "delete", id] : [domain, "delete"]),
104
+ batch: (operation) => [domain, "batch", operation],
105
+ custom: (operation, id) => (id ? [domain, operation, id] : [domain, operation])
106
+ };
107
+ }
@@ -0,0 +1,30 @@
1
+ import type { QueryFunction, QueryKey } from "@tanstack/react-query";
2
+ export declare function createAppQueryOptions<TData>(config: {
3
+ queryKey: QueryKey;
4
+ queryFn: QueryFunction<TData>;
5
+ staleTime?: number;
6
+ gcTime?: number;
7
+ enabled?: boolean;
8
+ }): import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<TData, Error, TData, readonly unknown[]>, "queryFn"> & {
9
+ queryFn?: QueryFunction<TData, readonly unknown[], never> | undefined;
10
+ } & {
11
+ queryKey: readonly unknown[] & {
12
+ [dataTagSymbol]: TData;
13
+ [dataTagErrorSymbol]: Error;
14
+ };
15
+ };
16
+ export declare function createAppQueryOptionsWithSelect<TData, TSelected = TData>(config: {
17
+ queryKey: QueryKey;
18
+ queryFn: QueryFunction<TData, QueryKey>;
19
+ select: (data: TData) => TSelected;
20
+ staleTime?: number;
21
+ gcTime?: number;
22
+ }): import("@tanstack/query-core").OmitKeyof<import("@tanstack/react-query").UseQueryOptions<TData, Error, TSelected, readonly unknown[]>, "queryFn"> & {
23
+ queryFn?: QueryFunction<TData, readonly unknown[], never> | undefined;
24
+ } & {
25
+ queryKey: readonly unknown[] & {
26
+ [dataTagSymbol]: TData;
27
+ [dataTagErrorSymbol]: Error;
28
+ };
29
+ };
30
+ //# sourceMappingURL=queryOptions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queryOptions.d.ts","sourceRoot":"","sources":["../../src/core/queryOptions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAIrE,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE;;;;;;;EAajK;AACD,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,MAAM,EAAE;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAAC,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,KAAK,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE;;;;;;;EAazN"}
@@ -0,0 +1,30 @@
1
+ import { queryOptions } from "@tanstack/react-query";
2
+ import { DEFAULT_GC_TIME, DEFAULT_STALE_TIME, defaultQueryRetryStrategy, exponentialBackoff } from "./config.js";
3
+ export function createAppQueryOptions(config) {
4
+ return queryOptions({
5
+ queryKey: config.queryKey,
6
+ queryFn: config.queryFn,
7
+ staleTime: config.staleTime ?? DEFAULT_STALE_TIME,
8
+ gcTime: config.gcTime ?? DEFAULT_GC_TIME,
9
+ enabled: config.enabled,
10
+ retry: defaultQueryRetryStrategy,
11
+ retryDelay: exponentialBackoff,
12
+ refetchOnWindowFocus: true,
13
+ refetchOnReconnect: true,
14
+ refetchOnMount: true
15
+ });
16
+ }
17
+ export function createAppQueryOptionsWithSelect(config) {
18
+ return queryOptions({
19
+ queryKey: config.queryKey,
20
+ queryFn: config.queryFn,
21
+ select: config.select,
22
+ staleTime: config.staleTime ?? DEFAULT_STALE_TIME,
23
+ gcTime: config.gcTime ?? DEFAULT_GC_TIME,
24
+ retry: defaultQueryRetryStrategy,
25
+ retryDelay: exponentialBackoff,
26
+ refetchOnWindowFocus: true,
27
+ refetchOnReconnect: true,
28
+ refetchOnMount: true
29
+ });
30
+ }
@@ -0,0 +1,4 @@
1
+ export { cancelQueriesBatch, invalidateQueriesBatch, setQueryDataBatch } from "../hooks/useMutation.js";
2
+ export { calculateExponentialBackoff, configureOfflineQueries, createOfflineQueueManager, isOnline, mutationRegistry, OfflineQueueManager, setupOnlineManager, subscribeToOnlineStatus } from "./offline.js";
3
+ export { checkStorageSize, clearCache, clearExpiredCache, createPersister, createPersistOptions, getStorageStats, migrateToIndexedDB, type PersistedClient, type Persister, type PersistOptions } from "./persistence.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/features/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACxG,OAAO,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAC7M,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,oBAAoB,EAAE,eAAe,EAAE,kBAAkB,EAAE,KAAK,eAAe,EAAE,KAAK,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { cancelQueriesBatch, invalidateQueriesBatch, setQueryDataBatch } from "../hooks/useMutation.js";
2
+ export { calculateExponentialBackoff, configureOfflineQueries, createOfflineQueueManager, isOnline, mutationRegistry, OfflineQueueManager, setupOnlineManager, subscribeToOnlineStatus } from "./offline.js";
3
+ export { checkStorageSize, clearCache, clearExpiredCache, createPersister, createPersistOptions, getStorageStats, migrateToIndexedDB } from "./persistence.js";
@@ -0,0 +1,48 @@
1
+ import type { QueryClient } from "@tanstack/react-query";
2
+ import type { MutationFunctionRegistry, OfflineMutationOperation, OfflineQueueConfig, OfflineState } from "../types/offline";
3
+ export declare function setupOnlineManager(): void;
4
+ export declare const isOnline: () => boolean;
5
+ export declare function subscribeToOnlineStatus(callback: (online: boolean) => void): () => void;
6
+ export declare function configureOfflineQueries(_queryClient: QueryClient): void;
7
+ export declare function calculateExponentialBackoff(attempt: number, baseDelay?: number, maxDelay?: number): number;
8
+ declare class MutationRegistry implements MutationFunctionRegistry {
9
+ private registry;
10
+ register(key: string, fn: () => Promise<unknown>): void;
11
+ get(key: string): (() => Promise<unknown>) | undefined;
12
+ unregister(key: string): void;
13
+ clear(): void;
14
+ getKeys(): string[];
15
+ }
16
+ export declare const mutationRegistry: MutationRegistry;
17
+ export declare class OfflineQueueManager {
18
+ private queue;
19
+ private config;
20
+ private isExecuting;
21
+ private executionTimer;
22
+ private unsubscribeOnline;
23
+ private executingOperations;
24
+ constructor(config?: Partial<OfflineQueueConfig>);
25
+ add(operation: Omit<OfflineMutationOperation, "id" | "createdAt" | "retryCount">): Promise<string>;
26
+ remove(operationId: string): Promise<boolean>;
27
+ getState(): OfflineState;
28
+ getOperations(): OfflineMutationOperation[];
29
+ clear(): Promise<void>;
30
+ execute(): Promise<{
31
+ success: number;
32
+ failed: number;
33
+ skipped: number;
34
+ }>;
35
+ private executeOperation;
36
+ private sortOperationsByDependency;
37
+ private createBatches;
38
+ private persistQueue;
39
+ private loadQueue;
40
+ private cleanupOldOperations;
41
+ private setupOnlineListener;
42
+ private startAutoExecution;
43
+ private stopAutoExecution;
44
+ destroy(): void;
45
+ }
46
+ export declare function createOfflineQueueManager(config?: Partial<OfflineQueueConfig>): OfflineQueueManager;
47
+ export {};
48
+ //# sourceMappingURL=offline.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"offline.d.ts","sourceRoot":"","sources":["../../src/features/offline.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,KAAK,EAAE,wBAAwB,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAK7H,wBAAgB,kBAAkB,SAYjC;AACD,eAAO,MAAM,QAAQ,eAAiC,CAAC;AACvD,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,cAA+C;AAC1H,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,WAAW,QAAI;AAGrE,wBAAgB,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,SAAO,EAAE,QAAQ,SAAQ,GAAG,MAAM,CAIvG;AACD,cAAM,gBAAiB,YAAW,wBAAwB;IACxD,OAAO,CAAC,QAAQ,CAA6C;IAC7D,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,IAAI;IACvD,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,SAAS;IACtD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAC7B,KAAK,IAAI,IAAI;IACb,OAAO,IAAI,MAAM,EAAE;CACpB;AACD,eAAO,MAAM,gBAAgB,kBAAyB,CAAC;AAEvD,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,MAAM,CAAqB;IACnC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,iBAAiB,CAA6B;IACtD,OAAO,CAAC,mBAAmB,CAAqB;gBACpC,MAAM,GAAE,OAAO,CAAC,kBAAkB,CAAM;IAM9C,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,wBAAwB,EAAE,IAAI,GAAG,WAAW,GAAG,YAAY,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IASlG,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAOnD,QAAQ,IAAI,YAAY;IAIxB,aAAa,IAAI,wBAAwB,EAAE;IACrC,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IACtB,OAAO,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;YAmBhE,gBAAgB;IAsB9B,OAAO,CAAC,0BAA0B;IAsBlC,OAAO,CAAC,aAAa;YAKP,YAAY;IAe1B,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,oBAAoB;IAI5B,OAAO,CAAC,mBAAmB;IAG3B,OAAO,CAAC,kBAAkB;IAK1B,OAAO,CAAC,iBAAiB;IAGzB,OAAO,IAAI,IAAI;CAKhB;AACD,wBAAgB,yBAAyB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,kBAAkB,CAAC,GAAG,mBAAmB,CAA4C"}