@ethlete/query 1.0.1 → 2.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.
@@ -6,11 +6,6 @@ export interface AuthProvider {
6
6
  * This will automatically get injected into every query that has the `secure` property set to `true`.
7
7
  */
8
8
  header: Record<string, string>;
9
- /**
10
- * Cleanup function that gets called once the auth provider gets destroyed.
11
- * @internal
12
- */
13
- cleanUp(): void;
14
9
  }
15
10
  export interface AuthProviderBasicConfig {
16
11
  /**
@@ -25,7 +25,7 @@ export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query e
25
25
  constructor(_config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>);
26
26
  nextPage(): void;
27
27
  reset(newConfig?: Omit<InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>, 'queryCreator' | 'response'>): void;
28
- _destroy(): void;
28
+ _clearSubscriptions(): void;
29
29
  private _handleNewQuery;
30
30
  private _prepareArgs;
31
31
  private _getPageParamLocation;
@@ -1,6 +1,6 @@
1
1
  import { DefaultResponseTransformer, QueryClient, ResponseTransformerType } from '../query-client';
2
2
  import { Method as MethodType } from '../request';
3
- import { BaseArguments, GqlQueryConfig, PollConfig, QueryState, RestQueryConfig, RouteType, RunQueryOptions, WithUseResultIn } from './query.types';
3
+ import { BaseArguments, GqlQueryConfig, PollConfig, QueryAutoRefreshConfig, QueryState, RestQueryConfig, RouteType, RunQueryOptions, WithUseResultIn } from './query.types';
4
4
  export declare class Query<Response, Arguments extends (BaseArguments & WithUseResultIn<Response, ResponseTransformer>) | undefined, Route extends RouteType<Arguments>, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> {
5
5
  private _client;
6
6
  private _queryConfig;
@@ -9,16 +9,22 @@ export declare class Query<Response, Arguments extends (BaseArguments & WithUseR
9
9
  private _currentId;
10
10
  private _pollingSubscription;
11
11
  private _onAbort$;
12
+ private _currentPollConfig;
12
13
  private readonly _state$;
13
14
  private get _nextId();
14
15
  get state$(): import("rxjs").Observable<QueryState<ReturnType<ResponseTransformer>, Response>>;
15
16
  get state(): QueryState<ReturnType<ResponseTransformer>, Response>;
16
17
  get isExpired(): boolean;
18
+ get isInUse(): boolean;
19
+ get isPolling(): boolean;
20
+ get autoRefreshOnConfig(): Readonly<QueryAutoRefreshConfig>;
17
21
  constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _routeWithParams: Route, _args: Arguments | undefined);
18
22
  clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
19
23
  execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
20
24
  abort(): this;
21
25
  poll(config: PollConfig): this;
22
26
  stopPolling(): this;
27
+ pausePolling(): this;
28
+ resumePolling(): this;
23
29
  private _updateUseResultInDependencies;
24
30
  }
@@ -2,7 +2,21 @@ import { Observable } from 'rxjs';
2
2
  import { AnyQueryCreator, QueryCreatorReturnType, ResponseTransformerType } from '../query-client';
3
3
  import { Method, PathParams, QueryParams, RequestError, RequestProgress } from '../request';
4
4
  import { Query } from './query';
5
- export interface QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
5
+ export interface QueryAutoRefreshConfig {
6
+ /**
7
+ * Refresh the query when the query client's headers change.
8
+ * @default true
9
+ */
10
+ queryClientDefaultHeadersChange?: boolean;
11
+ /**
12
+ * Refresh the query when the window regains focus.
13
+ *
14
+ * This can only be disabled if `autoRefreshQueriesOnWindowFocus` is enabled on the query client.
15
+ * @default true
16
+ */
17
+ windowFocus?: boolean;
18
+ }
19
+ export type QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = {
6
20
  /**
7
21
  * The http method to use for the query.
8
22
  */
@@ -31,6 +45,20 @@ export interface QueryConfigBase<Response, Arguments extends BaseArguments | und
31
45
  * @default false
32
46
  */
33
47
  withCredentials?: boolean;
48
+ /**
49
+ * Configuration for handling auto refresh triggers.
50
+ *
51
+ * **Note:** This is only available for queries that can be refreshed. (`GET`, `HEAD`, `OPTIONS`, `GQL_QUERY`)
52
+ */
53
+ autoRefreshOn?: QueryAutoRefreshConfig;
54
+ /**
55
+ * Whether to automatically stop polling for this query when the window loses focus.
56
+ * Polling will resume when the window regains focus.
57
+ *
58
+ * This can only be disabled if `enableSmartPolling` is enabled on the query client.
59
+ * @default true
60
+ */
61
+ enableSmartPolling?: boolean;
34
62
  /**
35
63
  * Object containing the query's type information.
36
64
  */
@@ -50,13 +78,13 @@ export interface QueryConfigBase<Response, Arguments extends BaseArguments | und
50
78
  */
51
79
  args?: Arguments;
52
80
  };
53
- }
54
- export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
81
+ };
82
+ export type RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = QueryConfigBase<Response, Arguments, ResponseTransformer> & {
55
83
  /**
56
84
  * The api route to use for the query.
57
85
  */
58
86
  route: Route;
59
- }
87
+ };
60
88
  export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
61
89
  /**
62
90
  * The graphql query to use for the query.
@@ -88,8 +116,13 @@ export interface WithPathParams {
88
116
  export type WithUseResultIn<Response, ResponseTransformer extends ResponseTransformerType<Response>> = {
89
117
  useResultIn?: Query<Response, any, any, any, ResponseTransformer>[];
90
118
  };
119
+ export type QueryTrigger = 'program' | 'poll' | 'auto';
91
120
  export type EmptyObject = {};
92
121
  export interface RunQueryOptions {
122
+ /**
123
+ * Whether to skip the cache for this query. This will force the query to be executed. It might still be caught by the native browser cache.
124
+ * @default false
125
+ */
93
126
  skipCache?: boolean;
94
127
  }
95
128
  export type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
@@ -97,8 +130,18 @@ export type RouteType<Arguments extends BaseArguments | undefined> = Arguments e
97
130
  } ? (p: PathParams) => RouteString : RouteString;
98
131
  export type RouteString = `/${string}`;
99
132
  export interface PollConfig {
133
+ /**
134
+ * The interval in milliseconds to poll the query.
135
+ */
100
136
  interval: number;
137
+ /**
138
+ * A observable that will stop the polling when it emits.
139
+ */
101
140
  takeUntil: Observable<unknown>;
141
+ /**
142
+ * Whether to trigger the query immediately after polling starts.
143
+ */
144
+ triggerImmediately?: boolean;
102
145
  }
103
146
  export declare const enum QueryStateType {
104
147
  Prepared = "PREPARED",
@@ -134,6 +177,7 @@ export interface Cancelled {
134
177
  }
135
178
  export interface QueryStateMeta {
136
179
  id: number;
180
+ triggeredVia: QueryTrigger;
137
181
  }
138
182
  export interface QueryStateSuccessMeta extends QueryStateMeta {
139
183
  expiresAt?: number;
@@ -19,6 +19,9 @@ export declare class QueryClient {
19
19
  gqlMutate: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "GQL_MUTATE", Response_1, Route, ResponseTransformer>;
20
20
  fetch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: RestQueryConfig<Route, Response_1, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, Method, Response_1, Route, ResponseTransformer>;
21
21
  setAuthProvider: (authProvider: AuthProvider) => void;
22
- setDefaultHeaders: (headers: RequestHeaders | RequestHeadersMethodMap | null) => void;
22
+ setDefaultHeaders: (config: {
23
+ headers: RequestHeaders | RequestHeadersMethodMap | null;
24
+ refreshQueriesInUse?: boolean;
25
+ }) => void;
23
26
  clearAuthProvider: () => void;
24
27
  }
@@ -38,6 +38,17 @@ export interface QueryClientConfig {
38
38
  * Do not include the `Authorization` header here. Use an `AuthProvider` instead.
39
39
  */
40
40
  headers?: RequestHeaders | RequestHeadersMethodMap;
41
+ /**
42
+ * Whether to automatically refresh expired queries when the window regains focus.
43
+ * @default true
44
+ */
45
+ autoRefreshQueriesOnWindowFocus?: boolean;
46
+ /**
47
+ * Whether to automatically stop polling queries when the window loses focus.
48
+ * Polling will resume when the window regains focus.
49
+ * @default true
50
+ */
51
+ enableSmartPolling?: boolean;
41
52
  };
42
53
  /**
43
54
  * Parent query client.
@@ -6,10 +6,18 @@ export declare class QueryStore {
6
6
  constructor(_config?: {
7
7
  enableChangeLogging?: boolean | undefined;
8
8
  enableGarbageCollectorLogging?: boolean | undefined;
9
+ autoRefreshQueriesOnWindowFocus?: boolean | undefined;
10
+ enableSmartPolling?: boolean | undefined;
9
11
  } | undefined);
10
12
  add(id: string, query: AnyQuery): void;
11
13
  get(id: string): AnyQuery | null;
12
14
  remove(id: string): void;
15
+ forEach(callback: (value: AnyQuery, key: string) => void): void;
16
+ refreshQueriesInUse(config?: {
17
+ ignoreCacheValidity?: boolean;
18
+ purgeUnused?: boolean;
19
+ }): void;
20
+ private _initSmartQueryHandling;
13
21
  private _logState;
14
22
  private _initGarbageCollector;
15
23
  private _stopGarbageCollector;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ethlete/query",
3
- "version": "1.0.1",
3
+ "version": "2.1.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0"
6
6
  },
7
7
  "peerDependencies": {
8
8
  "@angular/common": "^14.2.0 || ^15.0.0",
9
9
  "@angular/core": "^14.2.0 || ^15.0.0",
10
- "@ethlete/core": "1.1.0"
10
+ "@ethlete/core": "1.4.1"
11
11
  },
12
12
  "module": "fesm2015/ethlete-query.mjs",
13
13
  "es2020": "fesm2020/ethlete-query.mjs",