@qiaopeng/tanstack-query-plus 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/internal/ErrorBoundary.d.ts +1 -0
- package/dist/components/internal/ErrorBoundary.d.ts.map +1 -1
- package/dist/components/internal/ErrorBoundary.js +9 -0
- package/dist/core/devtools.d.ts +4 -3
- package/dist/core/devtools.d.ts.map +1 -1
- package/dist/core/env.d.ts +1 -0
- package/dist/core/env.d.ts.map +1 -1
- package/dist/core/env.js +25 -2
- package/dist/core/index.d.ts +1 -0
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1 -0
- package/dist/hooks/index.d.ts +1 -1
- package/dist/hooks/index.d.ts.map +1 -1
- package/dist/hooks/usePrefetch.d.ts.map +1 -1
- package/dist/hooks/usePrefetch.js +27 -23
- package/dist/hooks/useQuery.d.ts +17 -1
- package/dist/hooks/useQuery.d.ts.map +1 -1
- package/dist/hooks/useQuery.js +42 -1
- package/package.json +10 -1
|
@@ -19,6 +19,7 @@ export declare class ErrorBoundary extends Component<ErrorBoundaryProps, ErrorBo
|
|
|
19
19
|
componentDidCatch(error: Error, errorInfo: {
|
|
20
20
|
componentStack: string;
|
|
21
21
|
}): void;
|
|
22
|
+
componentDidUpdate(prevProps: ErrorBoundaryProps): void;
|
|
22
23
|
resetErrorBoundary: () => void;
|
|
23
24
|
render(): string | number | boolean | Iterable<ReactNode> | import("react/jsx-runtime").JSX.Element | null | undefined;
|
|
24
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/internal/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IACvE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACpC;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACtE,KAAK,EAAE,kBAAkB;IAIrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAGjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAGrE,kBAAkB,aAGhB;IACF,MAAM;CAmBP"}
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../../src/components/internal/ErrorBoundary.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,IAAI,KAAK,SAAS,CAAC;IACvE,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACxE,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,SAAS,CAAC,EAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;CACpC;AAED,UAAU,kBAAkB;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,KAAK,CAAC;CACf;AAED,qBAAa,aAAc,SAAQ,SAAS,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;gBACtE,KAAK,EAAE,kBAAkB;IAIrC,MAAM,CAAC,wBAAwB,CAAC,KAAK,EAAE,KAAK,GAAG,kBAAkB;IAGjE,iBAAiB,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE;QAAE,cAAc,EAAE,MAAM,CAAA;KAAE;IAGrE,kBAAkB,CAAC,SAAS,EAAE,kBAAkB;IAShD,kBAAkB,aAGhB;IACF,MAAM;CAmBP"}
|
|
@@ -15,6 +15,15 @@ export class ErrorBoundary extends Component {
|
|
|
15
15
|
componentDidCatch(error, errorInfo) {
|
|
16
16
|
this.props.onError?.(error, errorInfo);
|
|
17
17
|
}
|
|
18
|
+
componentDidUpdate(prevProps) {
|
|
19
|
+
if (this.state.hasError && this.props.resetKeys && prevProps.resetKeys) {
|
|
20
|
+
const hasResetKeyChanged = this.props.resetKeys.length !== prevProps.resetKeys.length ||
|
|
21
|
+
this.props.resetKeys.some((key, index) => key !== prevProps.resetKeys?.[index]);
|
|
22
|
+
if (hasResetKeyChanged) {
|
|
23
|
+
this.resetErrorBoundary();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
18
27
|
render() {
|
|
19
28
|
const { hasError, error } = this.state;
|
|
20
29
|
const { children, fallback } = this.props;
|
package/dist/core/devtools.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import type { ComponentProps } from "react";
|
|
1
2
|
export { ReactQueryDevtools } from "@tanstack/react-query-devtools";
|
|
2
3
|
export interface DevToolsConfig {
|
|
3
4
|
initialIsOpen?: boolean;
|
|
4
5
|
position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
5
6
|
enabled?: boolean;
|
|
6
7
|
buttonPosition?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
7
|
-
panelProps?:
|
|
8
|
-
closeButtonProps?:
|
|
9
|
-
toggleButtonProps?:
|
|
8
|
+
panelProps?: ComponentProps<"div">;
|
|
9
|
+
closeButtonProps?: ComponentProps<"button">;
|
|
10
|
+
toggleButtonProps?: ComponentProps<"button">;
|
|
10
11
|
}
|
|
11
12
|
export declare const defaultDevToolsConfig: DevToolsConfig;
|
|
12
13
|
export declare function createDevToolsConfig(overrides?: Partial<DevToolsConfig>): DevToolsConfig;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../src/core/devtools.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"devtools.d.ts","sourceRoot":"","sources":["../../src/core/devtools.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE,MAAM,WAAW,cAAc;IAC7B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IACrE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,aAAa,GAAG,cAAc,CAAC;IAC3E,UAAU,CAAC,EAAE,cAAc,CAAC,KAAK,CAAC,CAAC;IACnC,gBAAgB,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC5C,iBAAiB,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,CAAC;CAC9C;AAED,eAAO,MAAM,qBAAqB,EAAE,cAInC,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,GAAG,cAAc,CAKxF;AAED,wBAAgB,iBAAiB,IAAI,OAAO,CAE3C"}
|
package/dist/core/env.d.ts
CHANGED
package/dist/core/env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AAqBA,eAAO,MAAM,MAAM,SAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,SAA+D,CAAC;AAClF,eAAO,MAAM,MAAM,SAAqB,CAAC"}
|
package/dist/core/env.js
CHANGED
|
@@ -1,3 +1,26 @@
|
|
|
1
|
-
|
|
1
|
+
function getEnvironment() {
|
|
2
|
+
// Node.js / Webpack / CRA
|
|
3
|
+
if (typeof process !== "undefined" && process?.env?.NODE_ENV) {
|
|
4
|
+
return process.env.NODE_ENV;
|
|
5
|
+
}
|
|
6
|
+
// Vite / modern bundlers
|
|
7
|
+
try {
|
|
8
|
+
// @ts-expect-error import.meta.env may not exist in all environments
|
|
9
|
+
if (typeof import.meta !== "undefined" && import.meta.env) {
|
|
10
|
+
// @ts-expect-error accessing Vite-specific env
|
|
11
|
+
const env = import.meta.env;
|
|
12
|
+
if (env.MODE)
|
|
13
|
+
return env.MODE;
|
|
14
|
+
if (typeof env.PROD === "boolean")
|
|
15
|
+
return env.PROD ? "production" : "development";
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
// import.meta not supported
|
|
20
|
+
}
|
|
21
|
+
return undefined;
|
|
22
|
+
}
|
|
23
|
+
const nodeEnv = getEnvironment();
|
|
2
24
|
export const isProd = nodeEnv === "production";
|
|
3
|
-
export const isDev = !isProd;
|
|
25
|
+
export const isDev = nodeEnv === "development" || (!isProd && nodeEnv !== "test");
|
|
26
|
+
export const isTest = nodeEnv === "test";
|
package/dist/core/index.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
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
2
|
export { createDevToolsConfig, defaultDevToolsConfig, type DevToolsConfig, isDevToolsEnabled } from "./devtools.js";
|
|
3
3
|
export { ReactQueryDevtools } from "./devtools.js";
|
|
4
|
+
export { isDev, isProd, isTest } from "./env.js";
|
|
4
5
|
export { focusManager, type FocusManagerConfig, getSmartFocusManager, pauseFocusManager, resetSmartFocusManager, resumeFocusManager, setupFocusManager, SmartFocusManager } from "./focusManager.js";
|
|
5
6
|
export { areKeysEqual, containsEntity, createComplexKey, createDomainKeyFactory, createFilteredKey, createMutationKeyFactory, createPaginatedKey, createSearchKey, createSortedKey, extractEntityId, matchesKeyPattern, normalizeQueryKey, queryKeys, validateQueryKey } from "./keys.js";
|
|
6
7
|
export { createAppQueryOptions, createAppQueryOptionsWithSelect } from "./queryOptions.js";
|
package/dist/core/index.d.ts.map
CHANGED
|
@@ -1 +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,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,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"}
|
|
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,MAAM,eAAe,CAAC;AACpH,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACjD,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"}
|
package/dist/core/index.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
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
2
|
export { createDevToolsConfig, defaultDevToolsConfig, isDevToolsEnabled } from "./devtools.js";
|
|
3
3
|
export { ReactQueryDevtools } from "./devtools.js";
|
|
4
|
+
export { isDev, isProd, isTest } from "./env.js";
|
|
4
5
|
export { focusManager, getSmartFocusManager, pauseFocusManager, resetSmartFocusManager, resumeFocusManager, setupFocusManager, SmartFocusManager } from "./focusManager.js";
|
|
5
6
|
export { areKeysEqual, containsEntity, createComplexKey, createDomainKeyFactory, createFilteredKey, createMutationKeyFactory, createPaginatedKey, createSearchKey, createSortedKey, extractEntityId, matchesKeyPattern, normalizeQueryKey, queryKeys, validateQueryKey } from "./keys.js";
|
|
6
7
|
export { createAppQueryOptions, createAppQueryOptionsWithSelect } from "./queryOptions.js";
|
package/dist/hooks/index.d.ts
CHANGED
|
@@ -3,6 +3,6 @@ export { useConditionalFocusRefetch, useFocusCallback, useFocusRefetch, type Use
|
|
|
3
3
|
export { createCursorPaginationOptions, createOffsetPaginationOptions, createPageNumberPaginationOptions, useEnhancedInfiniteQuery } from "./useInfiniteQuery.js";
|
|
4
4
|
export { cancelQueriesBatch, invalidateQueriesBatch, type MutationDefaultsConfig, type MutationKey, setQueryDataBatch, setupMutationDefaults, useBatchMutation, useConditionalOptimisticMutation, useListMutation, useMutation } from "./useMutation.js";
|
|
5
5
|
export { type HoverPrefetchOptions, type InViewPrefetchOptions, type PrefetchOptions, useBatchPrefetch, useConditionalPrefetch, useHoverPrefetch, useIdlePrefetch, usePeriodicPrefetch, usePredictivePrefetch, usePriorityPrefetch, useRoutePrefetch, useSmartPrefetch } from "./usePrefetch.js";
|
|
6
|
-
export { skipToken, useEnhancedQuery } from "./useQuery.js";
|
|
6
|
+
export { skipToken, useEnhancedQuery, type EnhancedQueryOptions, type EnhancedQueryResult } from "./useQuery.js";
|
|
7
7
|
export { createSuspenseInfiniteQuery, createSuspenseQuery, useEnhancedSuspenseInfiniteQuery, useEnhancedSuspenseQuery } from "./useSuspenseQuery.js";
|
|
8
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,KAAK,sBAAsB,EAC3B,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,KAAK,oBAAoB,EACzB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAClK,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gCAAgC,EAChC,eAAe,EACf,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,eAAe,EACf,mBAAmB,EACnB,sBAAsB,EACtB,0BAA0B,EAC1B,wBAAwB,EACxB,kBAAkB,EAClB,0BAA0B,EAC1B,mBAAmB,EACnB,wBAAwB,EACxB,sBAAsB,EACtB,kBAAkB,EAClB,0BAA0B,EAC1B,wBAAwB,EACxB,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,0BAA0B,EAC1B,gBAAgB,EAChB,eAAe,EACf,KAAK,sBAAsB,EAC3B,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,KAAK,oBAAoB,EACzB,oBAAoB,EACrB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,6BAA6B,EAAE,6BAA6B,EAAE,iCAAiC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAClK,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,gCAAgC,EAChC,eAAe,EACf,WAAW,EACZ,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,gBAAgB,EAChB,sBAAsB,EACtB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePrefetch.d.ts","sourceRoot":"","sources":["../../src/hooks/usePrefetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMrE,MAAM,WAAW,eAAe;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAChH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAAG,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AACrF,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE;AASjI,wBAAgB,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,oBAAyB;;;;EAwBtI;AAGD,wBAAgB,gBAAgB,KAGV,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe,UAUlH;AAED,wBAAgB,gBAAgB,KAEV,KAAK,qBAAqB,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,UAO/H;AAED,wBAAgB,gBAAgB;eAUA,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe;;;EAa5H;
|
|
1
|
+
{"version":3,"file":"usePrefetch.d.ts","sourceRoot":"","sources":["../../src/hooks/usePrefetch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAMrE,MAAM,WAAW,eAAe;IAAG,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE;AAChH,MAAM,WAAW,oBAAqB,SAAQ,eAAe;IAAG,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE;AACrF,MAAM,WAAW,qBAAsB,SAAQ,eAAe;IAAG,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE;AASjI,wBAAgB,gBAAgB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,GAAE,oBAAyB;;;;EAwBtI;AAGD,wBAAgB,gBAAgB,KAGV,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe,UAUlH;AAED,wBAAgB,gBAAgB,KAEV,KAAK,qBAAqB,KAAK,CAAC;IAAE,QAAQ,EAAE,QAAQ,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,UAO/H;AAED,wBAAgB,gBAAgB;eAUA,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,YAAY,eAAe;;;EAa5H;AAaD,wBAAgB,sBAAsB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,eAAe,QAgBvJ;AAED,wBAAgB,eAAe,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG;IAAE,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,QAwBnJ;AAED,wBAAgB,mBAAmB,CAAC,KAAK,GAAG,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,EAAE,eAAe,GAAG;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,QAkBxJ;AAED,wBAAgB,qBAAqB;gCAIY,MAAM,UAAU,MAAM;;wBAa9B,KAAK,4BAA4B,CAAC,MAAM,EAAE,MAAM,KAAK;QAAE,QAAQ,EAAE,QAAQ,CAAC;QAAC,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAA;KAAE;;EASlJ;AAED,wBAAgB,mBAAmB;sBAII,KAAK,sBAAsB,QAAQ,WAAW,aAAa,CAAC,KAAK,CAAC,aAAY,MAAM,GAAG,QAAQ,GAAG,KAAK;;;;EAmB7I"}
|
|
@@ -100,75 +100,79 @@ export function useSmartPrefetch() {
|
|
|
100
100
|
const clearPrefetchHistory = useCallback(() => { prefetchedRef.current.clear(); }, []);
|
|
101
101
|
return { prefetch, shouldPrefetch: !isSlowNetwork(), clearPrefetchHistory };
|
|
102
102
|
}
|
|
103
|
+
function useStableQueryKey(queryKey) {
|
|
104
|
+
const keyRef = useRef(queryKey);
|
|
105
|
+
const keyStr = JSON.stringify(queryKey);
|
|
106
|
+
const prevKeyStr = useRef(keyStr);
|
|
107
|
+
if (prevKeyStr.current !== keyStr) {
|
|
108
|
+
keyRef.current = queryKey;
|
|
109
|
+
prevKeyStr.current = keyStr;
|
|
110
|
+
}
|
|
111
|
+
return keyRef.current;
|
|
112
|
+
}
|
|
103
113
|
export function useConditionalPrefetch(queryKey, queryFn, condition, options) {
|
|
104
114
|
const queryClient = useQueryClient();
|
|
105
115
|
const { staleTime = DEFAULT_STALE_TIME, delay = 0 } = options || {};
|
|
106
116
|
const queryFnRef = useRef(queryFn);
|
|
107
117
|
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
108
|
-
const stableQueryKey =
|
|
109
|
-
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
110
|
-
stableQueryKey.current = queryKey;
|
|
111
|
-
} }, [queryKey]);
|
|
118
|
+
const stableQueryKey = useStableQueryKey(queryKey);
|
|
112
119
|
useEffect(() => {
|
|
113
120
|
if (!condition)
|
|
114
121
|
return;
|
|
122
|
+
const currentQueryKey = stableQueryKey;
|
|
115
123
|
const timeoutId = setTimeout(() => {
|
|
116
|
-
if (isMissingOrStale(queryClient,
|
|
117
|
-
queryClient.prefetchQuery({ queryKey:
|
|
124
|
+
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
125
|
+
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
118
126
|
}
|
|
119
127
|
}, delay);
|
|
120
128
|
return () => clearTimeout(timeoutId);
|
|
121
|
-
}, [condition, queryClient, staleTime, delay]);
|
|
129
|
+
}, [condition, queryClient, staleTime, delay, stableQueryKey]);
|
|
122
130
|
}
|
|
123
131
|
export function useIdlePrefetch(queryKey, queryFn, options) {
|
|
124
132
|
const queryClient = useQueryClient();
|
|
125
133
|
const { staleTime = DEFAULT_STALE_TIME, enabled = true, timeout = 1000 } = options || {};
|
|
126
134
|
const queryFnRef = useRef(queryFn);
|
|
127
135
|
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
128
|
-
const stableQueryKey =
|
|
129
|
-
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
130
|
-
stableQueryKey.current = queryKey;
|
|
131
|
-
} }, [queryKey]);
|
|
136
|
+
const stableQueryKey = useStableQueryKey(queryKey);
|
|
132
137
|
useEffect(() => {
|
|
133
138
|
if (!enabled)
|
|
134
139
|
return;
|
|
140
|
+
const currentQueryKey = stableQueryKey;
|
|
135
141
|
if (typeof window === "undefined" || !("requestIdleCallback" in window)) {
|
|
136
142
|
const timeoutId = setTimeout(() => {
|
|
137
|
-
if (isMissingOrStale(queryClient,
|
|
138
|
-
queryClient.prefetchQuery({ queryKey:
|
|
143
|
+
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
144
|
+
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
139
145
|
}
|
|
140
146
|
}, timeout);
|
|
141
147
|
return () => clearTimeout(timeoutId);
|
|
142
148
|
}
|
|
143
149
|
const idleCallbackId = window.requestIdleCallback(() => {
|
|
144
|
-
if (isMissingOrStale(queryClient,
|
|
145
|
-
queryClient.prefetchQuery({ queryKey:
|
|
150
|
+
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
151
|
+
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
146
152
|
}
|
|
147
153
|
}, { timeout });
|
|
148
154
|
return () => window.cancelIdleCallback(idleCallbackId);
|
|
149
|
-
}, [queryClient, staleTime, enabled, timeout]);
|
|
155
|
+
}, [queryClient, staleTime, enabled, timeout, stableQueryKey]);
|
|
150
156
|
}
|
|
151
157
|
export function usePeriodicPrefetch(queryKey, queryFn, options) {
|
|
152
158
|
const queryClient = useQueryClient();
|
|
153
159
|
const { staleTime = DEFAULT_STALE_TIME, enabled = true, interval = 60000 } = options || {};
|
|
154
160
|
const queryFnRef = useRef(queryFn);
|
|
155
161
|
useEffect(() => { queryFnRef.current = queryFn; }, [queryFn]);
|
|
156
|
-
const stableQueryKey =
|
|
157
|
-
useEffect(() => { if (JSON.stringify(stableQueryKey.current) !== JSON.stringify(queryKey)) {
|
|
158
|
-
stableQueryKey.current = queryKey;
|
|
159
|
-
} }, [queryKey]);
|
|
162
|
+
const stableQueryKey = useStableQueryKey(queryKey);
|
|
160
163
|
useEffect(() => {
|
|
161
164
|
if (!enabled)
|
|
162
165
|
return;
|
|
166
|
+
const currentQueryKey = stableQueryKey;
|
|
163
167
|
const prefetchData = () => {
|
|
164
|
-
if (isMissingOrStale(queryClient,
|
|
165
|
-
queryClient.prefetchQuery({ queryKey:
|
|
168
|
+
if (isMissingOrStale(queryClient, currentQueryKey, staleTime)) {
|
|
169
|
+
queryClient.prefetchQuery({ queryKey: currentQueryKey, queryFn: queryFnRef.current, staleTime });
|
|
166
170
|
}
|
|
167
171
|
};
|
|
168
172
|
prefetchData();
|
|
169
173
|
const intervalId = setInterval(prefetchData, interval);
|
|
170
174
|
return () => clearInterval(intervalId);
|
|
171
|
-
}, [queryClient, staleTime, enabled, interval]);
|
|
175
|
+
}, [queryClient, staleTime, enabled, interval, stableQueryKey]);
|
|
172
176
|
}
|
|
173
177
|
export function usePredictivePrefetch() {
|
|
174
178
|
const queryClient = useQueryClient();
|
package/dist/hooks/useQuery.d.ts
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
import type { DefaultError, QueryKey, UseQueryOptions, UseQueryResult } from "@tanstack/react-query";
|
|
2
2
|
import { skipToken } from "@tanstack/react-query";
|
|
3
|
-
export
|
|
3
|
+
export interface EnhancedQueryOptions<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> extends UseQueryOptions<TQueryFnData, TError, TData, TQueryKey> {
|
|
4
|
+
/** Log errors to console in development */
|
|
5
|
+
logErrors?: boolean;
|
|
6
|
+
/** Callback when query takes longer than threshold */
|
|
7
|
+
onSlowQuery?: (duration: number, queryKey: TQueryKey) => void;
|
|
8
|
+
/** Threshold in ms to trigger onSlowQuery (default: 3000) */
|
|
9
|
+
slowQueryThreshold?: number;
|
|
10
|
+
/** Enable performance tracking */
|
|
11
|
+
trackPerformance?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type EnhancedQueryResult<TData = unknown, TError = DefaultError> = UseQueryResult<TData, TError> & {
|
|
14
|
+
/** Number of times the query has been refetched */
|
|
15
|
+
refetchCount: number;
|
|
16
|
+
/** Last query duration in ms */
|
|
17
|
+
lastQueryDuration: number | null;
|
|
18
|
+
};
|
|
19
|
+
export declare function useEnhancedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: EnhancedQueryOptions<TQueryFnData, TError, TData, TQueryKey>): EnhancedQueryResult<TData, TError>;
|
|
4
20
|
export { skipToken };
|
|
5
21
|
//# sourceMappingURL=useQuery.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAY,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/hooks/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACrG,OAAO,EAAE,SAAS,EAAY,MAAM,uBAAuB,CAAC;AAI5D,MAAM,WAAW,oBAAoB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,CAAE,SAAQ,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC;IAC/M,2CAA2C;IAC3C,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,sDAAsD;IACtD,WAAW,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,KAAK,IAAI,CAAC;IAC9D,6DAA6D;IAC7D,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,kCAAkC;IAClC,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,MAAM,MAAM,mBAAmB,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,IAAI,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG;IACxG,mDAAmD;IACnD,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EACzI,OAAO,EAAE,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GACpE,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAoDpC;AAED,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
package/dist/hooks/useQuery.js
CHANGED
|
@@ -1,5 +1,46 @@
|
|
|
1
1
|
import { skipToken, useQuery } from "@tanstack/react-query";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
import { isDev } from "../core/env.js";
|
|
2
4
|
export function useEnhancedQuery(options) {
|
|
3
|
-
|
|
5
|
+
const { logErrors = isDev, onSlowQuery, slowQueryThreshold = 3000, trackPerformance = false, ...queryOptions } = options;
|
|
6
|
+
const startTimeRef = useRef(0);
|
|
7
|
+
const refetchCountRef = useRef(0);
|
|
8
|
+
const lastDurationRef = useRef(null);
|
|
9
|
+
const wasFetchingRef = useRef(false);
|
|
10
|
+
const result = useQuery(queryOptions);
|
|
11
|
+
// Performance tracking
|
|
12
|
+
useEffect(() => {
|
|
13
|
+
if (trackPerformance || onSlowQuery) {
|
|
14
|
+
if (result.isFetching && !wasFetchingRef.current) {
|
|
15
|
+
startTimeRef.current = Date.now();
|
|
16
|
+
}
|
|
17
|
+
else if (!result.isFetching && wasFetchingRef.current && startTimeRef.current > 0) {
|
|
18
|
+
const duration = Date.now() - startTimeRef.current;
|
|
19
|
+
lastDurationRef.current = duration;
|
|
20
|
+
if (onSlowQuery && duration > slowQueryThreshold) {
|
|
21
|
+
onSlowQuery(duration, queryOptions.queryKey);
|
|
22
|
+
}
|
|
23
|
+
startTimeRef.current = 0;
|
|
24
|
+
}
|
|
25
|
+
wasFetchingRef.current = result.isFetching;
|
|
26
|
+
}
|
|
27
|
+
}, [result.isFetching, onSlowQuery, slowQueryThreshold, trackPerformance, queryOptions.queryKey]);
|
|
28
|
+
// Error logging
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
if (logErrors && result.isError && result.error) {
|
|
31
|
+
console.error(`[useEnhancedQuery Error] ${JSON.stringify(queryOptions.queryKey)}:`, result.error);
|
|
32
|
+
}
|
|
33
|
+
}, [result.isError, result.error, logErrors, queryOptions.queryKey]);
|
|
34
|
+
// Refetch counting
|
|
35
|
+
useEffect(() => {
|
|
36
|
+
if (result.isRefetching) {
|
|
37
|
+
refetchCountRef.current++;
|
|
38
|
+
}
|
|
39
|
+
}, [result.isRefetching]);
|
|
40
|
+
return {
|
|
41
|
+
...result,
|
|
42
|
+
refetchCount: refetchCountRef.current,
|
|
43
|
+
lastQueryDuration: lastDurationRef.current
|
|
44
|
+
};
|
|
4
45
|
}
|
|
5
46
|
export { skipToken };
|
package/package.json
CHANGED
|
@@ -1,8 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qiaopeng/tanstack-query-plus",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Enhanced TanStack Query toolkit: defaults, hooks, persistence, offline, utils",
|
|
5
|
+
"author": "qiaopeng",
|
|
5
6
|
"license": "MIT",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/qiaopengg/qiaopeng-tanstack-query-plus.git"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/qiaopengg/qiaopeng-tanstack-query-plus/issues"
|
|
13
|
+
},
|
|
14
|
+
"homepage": "https://github.com/qiaopengg/qiaopeng-tanstack-query-plus#readme",
|
|
6
15
|
"type": "module",
|
|
7
16
|
"main": "./dist/index.js",
|
|
8
17
|
"module": "./dist/index.js",
|