@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.
@@ -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;
@@ -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?: React.ComponentProps<"div">;
8
- closeButtonProps?: React.ComponentProps<"button">;
9
- toggleButtonProps?: React.ComponentProps<"button">;
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":"AACA,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,KAAK,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;IACzC,gBAAgB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAClD,iBAAiB,CAAC,EAAE,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;CACpD;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"}
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"}
@@ -1,3 +1,4 @@
1
1
  export declare const isProd: boolean;
2
2
  export declare const isDev: boolean;
3
+ export declare const isTest: boolean;
3
4
  //# sourceMappingURL=env.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/core/env.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,MAAM,SAA2B,CAAC;AAC/C,eAAO,MAAM,KAAK,SAAU,CAAC"}
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
- const nodeEnv = typeof process !== "undefined" && process && typeof process.env !== "undefined" ? process.env.NODE_ENV : undefined;
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";
@@ -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";
@@ -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"}
@@ -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";
@@ -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;AAC5D,OAAO,EAAE,2BAA2B,EAAE,mBAAmB,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,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;AAED,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"}
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 = useRef(queryKey);
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, stableQueryKey.current, staleTime)) {
117
- queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
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 = useRef(queryKey);
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, stableQueryKey.current, staleTime)) {
138
- queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
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, stableQueryKey.current, staleTime)) {
145
- queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
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 = useRef(queryKey);
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, stableQueryKey.current, staleTime)) {
165
- queryClient.prefetchQuery({ queryKey: stableQueryKey.current, queryFn: queryFnRef.current, staleTime });
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();
@@ -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 declare function useEnhancedQuery<TQueryFnData = unknown, TError = DefaultError, TData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(options: UseQueryOptions<TQueryFnData, TError, TData, TQueryKey>): UseQueryResult<TData, TError>;
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;AAC5D,wBAAgB,gBAAgB,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,YAAY,EAAE,KAAK,GAAG,YAAY,EAAE,SAAS,SAAS,QAAQ,GAAG,QAAQ,EAAE,OAAO,EAAE,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,CAAC,GAAG,cAAc,CAAC,KAAK,EAAE,MAAM,CAAC,CAE5O;AACD,OAAO,EAAE,SAAS,EAAE,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"}
@@ -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
- return useQuery(options);
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.4",
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",