@ethlete/query 2.2.0 → 2.4.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,6 +6,11 @@ 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;
9
14
  }
10
15
  export interface AuthProviderBasicConfig {
11
16
  /**
@@ -1,10 +1,10 @@
1
1
  import { InjectionToken, OnDestroy, OnInit } from '@angular/core';
2
- import { InfinityQuery, InfinityQueryConfig } from '../infinite-query';
2
+ import { InfinityQueryConfig, InfinityQueryOf } from '../infinite-query';
3
3
  import { BaseArguments } from '../query';
4
4
  import { AnyQueryCreator } from '../query-client';
5
5
  import { RequestError } from '../request';
6
6
  import * as i0 from "@angular/core";
7
- interface InfinityQueryContext<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments, any, unknown[]>> {
7
+ interface InfinityQueryContext<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments | undefined, any, unknown[]>> {
8
8
  $implicit: Q['response']['arrayType'] | null;
9
9
  infinityQuery: Q['response']['arrayType'] | null;
10
10
  loading: boolean;
@@ -17,7 +17,7 @@ interface InfinityQueryContext<Q extends InfinityQueryConfig<AnyQueryCreator, Ba
17
17
  itemsPerPage: number | null;
18
18
  }
19
19
  export declare const INFINITY_QUERY_TOKEN: InjectionToken<InfinityQueryDirective<any>>;
20
- export declare class InfinityQueryDirective<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments, any, unknown[]>> implements OnInit, OnDestroy {
20
+ export declare class InfinityQueryDirective<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments | undefined, any, unknown[]>> implements OnInit, OnDestroy {
21
21
  private readonly _queryConfigChanged$;
22
22
  private readonly _viewContext;
23
23
  private _infinityQueryInstance;
@@ -32,14 +32,20 @@ export declare class InfinityQueryDirective<Q extends InfinityQueryConfig<AnyQue
32
32
  set infinityQuery(v: Q);
33
33
  private _infinityQuery;
34
34
  get context(): InfinityQueryContext<Q>;
35
- get instance(): InfinityQuery<AnyQueryCreator, import("../query").Query<any, any, any, any, any>, BaseArguments, any, unknown[]> | null;
35
+ get instance(): InfinityQueryOf<Q> | null;
36
36
  get data$(): import("rxjs").Observable<Q["response"]["arrayType"]>;
37
37
  get data(): Q["response"]["arrayType"];
38
- static ngTemplateContextGuard<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments, any, unknown[]>>(dir: InfinityQueryDirective<Q>, ctx: unknown): ctx is InfinityQueryContext<Q>;
38
+ static ngTemplateContextGuard<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments | undefined, any, unknown[]>>(dir: InfinityQueryDirective<Q>, ctx: unknown): ctx is InfinityQueryContext<Q>;
39
39
  ngOnInit(): void;
40
40
  ngOnDestroy(): void;
41
41
  private _setupInfinityQuery;
42
+ /**
43
+ * @deprecated Use `loadNextPage` instead
44
+ * @breaking 3.0.0
45
+ */
42
46
  _loadNextPage(): void;
47
+ loadNextPage(): void;
48
+ reset(newConfig?: Omit<Q, 'queryCreator' | 'response'>): void;
43
49
  private _renderMainView;
44
50
  private _cleanup;
45
51
  static ɵfac: i0.ɵɵFactoryDeclaration<InfinityQueryDirective<any>, never>;
@@ -1,7 +1,6 @@
1
- import { QueryStateData } from '../query';
2
- import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorReturnType } from '../query-client';
1
+ import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorResponse, QueryCreatorReturnType } from '../query-client';
3
2
  import { InfinityQueryConfig } from './infinity-query.types';
4
- export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query extends QueryCreatorReturnType<QueryCreator>, Args extends QueryCreatorArgs<QueryCreator>, QueryResponse extends QueryStateData<Query['state']>, InfinityResponse extends unknown[]> {
3
+ export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query extends QueryCreatorReturnType<QueryCreator>, Args extends QueryCreatorArgs<QueryCreator>, QueryResponse extends QueryCreatorResponse<QueryCreator>, InfinityResponse extends unknown[]> {
5
4
  private _config;
6
5
  private readonly _currentPage$;
7
6
  private readonly _currentCalculatedPage$;
@@ -25,6 +24,9 @@ export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query e
25
24
  constructor(_config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>);
26
25
  nextPage(): void;
27
26
  reset(newConfig?: Omit<InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>, 'queryCreator' | 'response'>): void;
27
+ /**
28
+ * @internal
29
+ */
28
30
  _clearSubscriptions(): void;
29
31
  private _handleNewQuery;
30
32
  private _prepareArgs;
@@ -1,5 +1,6 @@
1
1
  import { BaseArguments, QueryStateData } from '../query';
2
- import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorReturnType } from '../query-client';
2
+ import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorResponse, QueryCreatorReturnType } from '../query-client';
3
+ import { InfinityQuery } from './infinity-query';
3
4
  export type InfinityQueryParamLocation = 'path' | 'query' | 'body' | 'header' | 'variable';
4
5
  export type AppendItemsLocation = 'start' | 'end';
5
6
  export interface PageParamCalculatorOptions {
@@ -11,7 +12,7 @@ export interface TotalPagesExtractorOptions<QueryResponse> {
11
12
  response: QueryResponse;
12
13
  itemsPerPage: number;
13
14
  }
14
- export interface InfinityQueryConfig<QueryCreator extends AnyQueryCreator, Arguments extends BaseArguments, QueryResponse, InfinityResponse extends unknown[]> {
15
+ export interface InfinityQueryConfig<QueryCreator extends AnyQueryCreator, Arguments extends BaseArguments | undefined, QueryResponse, InfinityResponse extends unknown[]> {
15
16
  /**
16
17
  * The query creator to use for fetching pages.
17
18
  */
@@ -90,5 +91,8 @@ export interface InfinityQueryConfig<QueryCreator extends AnyQueryCreator, Argum
90
91
  };
91
92
  }
92
93
  type OmitUndefined<T> = T extends undefined ? never : T;
94
+ export type AnyInfinityQueryConfig = InfinityQueryConfig<any, any, any, any>;
95
+ export type AnyInfinityQuery = InfinityQuery<any, any, any, any, any>;
93
96
  export type InfinityQueryConfigType<QueryCreator extends AnyQueryCreator, InfinityResponse extends unknown[]> = InfinityQueryConfig<QueryCreator, OmitUndefined<QueryCreatorArgs<QueryCreator>>, QueryStateData<QueryCreatorReturnType<QueryCreator>['state']>, InfinityResponse>;
97
+ export type InfinityQueryOf<Cfg extends AnyInfinityQueryConfig> = InfinityQuery<Cfg['queryCreator'], QueryCreatorReturnType<Cfg['queryCreator']>, QueryCreatorArgs<Cfg['queryCreator']>, QueryCreatorResponse<Cfg['queryCreator']>, Cfg['response']['arrayType']>;
94
98
  export {};
@@ -10,6 +10,10 @@ export declare class Query<Response, Arguments extends (BaseArguments & WithUseR
10
10
  private _pollingSubscription;
11
11
  private _onAbort$;
12
12
  private _currentPollConfig;
13
+ /**
14
+ * @internal
15
+ */
16
+ _isPollingPaused: boolean;
13
17
  private readonly _state$;
14
18
  private get _nextId();
15
19
  get state$(): import("rxjs").Observable<QueryState<ReturnType<ResponseTransformer>, Response>>;
@@ -18,6 +22,10 @@ export declare class Query<Response, Arguments extends (BaseArguments & WithUseR
18
22
  get isInUse(): boolean;
19
23
  get isPolling(): boolean;
20
24
  get autoRefreshOnConfig(): Readonly<QueryAutoRefreshConfig>;
25
+ /**
26
+ * @internal
27
+ */
28
+ get _enableSmartPolling(): boolean;
21
29
  constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _routeWithParams: Route, _args: Arguments | undefined);
22
30
  clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
23
31
  execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
@@ -90,11 +90,20 @@ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined,
90
90
  * The graphql query to use for the query.
91
91
  */
92
92
  query: string;
93
+ /**
94
+ * Determines if the query should be sent via GET or POST.
95
+ * - `GET`: The query will be sent via query parameters.
96
+ * - `POST`: The query will be sent via the body.
97
+ * @default 'POST'
98
+ */
99
+ transferVia?: 'GET' | 'POST';
93
100
  /**
94
101
  * Subroute to use for the query.
95
102
  */
96
103
  route?: Route;
97
104
  }
105
+ export type AnyRestQueryConfig = RestQueryConfig<any, any, any, any>;
106
+ export type AnyGqlQueryConfig = GqlQueryConfig<any, any, any, any>;
98
107
  export type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<RestQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
99
108
  export type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
100
109
  export type BaseArguments = WithHeaders & WithVariables & WithBody & WithQueryParams & WithPathParams;
@@ -124,6 +133,15 @@ export interface RunQueryOptions {
124
133
  * @default false
125
134
  */
126
135
  skipCache?: boolean;
136
+ /**
137
+ * The trigger type for this query.
138
+ * - `program`: The query was triggered by the user.
139
+ * - `poll`: The query was triggered by polling.
140
+ * - `auto`: The query was triggered by an auto refresh event.
141
+ * @default 'program'
142
+ * @internal
143
+ */
144
+ _triggeredVia?: QueryTrigger;
127
145
  }
128
146
  export type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
129
147
  pathParams: infer PathParams;
@@ -1,9 +1,10 @@
1
1
  import { BehaviorSubject, Observable } from 'rxjs';
2
- import { ResponseTransformerType } from '../query-client';
2
+ import { AnyQueryCreator, QueryClient, QueryCreator, QueryCreatorArgs, QueryCreatorMethod, QueryCreatorResponse, QueryCreatorResponseTransformer, ResponseTransformerType } from '../query-client';
3
3
  import { Method, RequestHeaders, RequestHeadersMethodMap } from '../request';
4
- import { AnyQuery, AnyQueryCreatorCollection, AnyQueryOfCreatorCollection, BaseArguments, Cancelled, Failure, GqlQueryConfig, Loading, Prepared, QueryRawResponseType, QueryResponseType, QueryState, QueryStateData, QueryStateRawData, QueryStateType, RouteType, Success } from './query.types';
4
+ import { AnyGqlQueryConfig, AnyQuery, AnyQueryCreatorCollection, AnyQueryOfCreatorCollection, AnyRestQueryConfig, BaseArguments, Cancelled, Failure, GqlQueryConfig, Loading, Prepared, QueryRawResponseType, QueryResponseType, QueryState, QueryStateData, QueryStateRawData, QueryStateType, RouteType, Success } from './query.types';
5
5
  type OmitNull<T> = T extends null ? never : T;
6
6
  export declare function filterSuccess(): <T extends QueryState<unknown, unknown> | null, Response_1 extends QueryStateData<OmitNull<T>>, RawResponse extends QueryStateRawData<OmitNull<T>>>(source: Observable<T>) => Observable<Success<Response_1, RawResponse>>;
7
+ export declare function ignoreAutoRefresh(): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<T>;
7
8
  export declare function filterFailure(): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<Failure>;
8
9
  export declare function filterQueryStates(allowedStates: QueryStateType[]): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<T>;
9
10
  export declare function takeUntilResponse(config?: {
@@ -20,6 +21,7 @@ export declare const isQueryStateSuccess: (state: QueryState | null | undefined)
20
21
  export declare const isQueryStateFailure: (state: QueryState | null | undefined) => state is Failure;
21
22
  export declare const isQueryStateCancelled: (state: QueryState | null | undefined) => state is Cancelled;
22
23
  export declare const isQueryStatePrepared: (state: QueryState | null | undefined) => state is Prepared;
24
+ export declare const isAutoRefresh: (state: QueryState | null | undefined) => boolean;
23
25
  export declare const mergeHeaders: (...headers: Array<RequestHeaders | null | undefined>) => RequestHeaders | null | undefined;
24
26
  export declare const isGqlQueryConfig: <Response_1, Arguments extends BaseArguments | undefined, Route extends RouteType<Arguments> | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> | undefined>(config: unknown) => config is GqlQueryConfig<Route, Response_1, Arguments, ResponseTransformer>;
25
27
  export declare const isQuery: <T extends AnyQuery>(query: unknown) => query is T;
@@ -29,4 +31,30 @@ export declare const extractQuery: <T extends AnyQuery | {
29
31
  query: import("@ethlete/query").Query<any, any, any, any, any>;
30
32
  } | null>(v: T) => import("@ethlete/query").Query<any, any, any, any, any> | null;
31
33
  export declare const getDefaultHeaders: (headers: RequestHeaders | RequestHeadersMethodMap | null | undefined, method: Method) => RequestHeaders;
34
+ export declare const castQueryCreatorTypes: <QC extends AnyQueryCreator, Arguments extends QueryCreatorArgs<QC>, Method_1 extends QueryCreatorMethod<QC>, Response_1 extends QueryCreatorResponse<QC>, Route extends RouteType<Arguments>, ResponseTransformer extends QueryCreatorResponseTransformer<QC>, OverrideArguments extends BaseArguments | undefined, OverrideResponse extends Response_1 | undefined>(config: {
35
+ creator: QC;
36
+ args?: OverrideArguments | undefined;
37
+ response?: OverrideResponse | undefined;
38
+ }) => QueryCreator<OverrideArguments, Method_1, OverrideResponse, Route, ResponseTransformer>;
39
+ export declare const computeQueryMethod: (config: {
40
+ config: AnyRestQueryConfig | AnyGqlQueryConfig;
41
+ }) => "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT" | "PURGE" | "LINK" | "UNLINK" | "CUSTOM";
42
+ export declare const computeQueryBody: (config: {
43
+ config: AnyRestQueryConfig | AnyGqlQueryConfig;
44
+ args?: BaseArguments | undefined;
45
+ method: Method;
46
+ }) => unknown;
47
+ export declare const computeQueryAuthHeader: (config: {
48
+ config: AnyRestQueryConfig | AnyGqlQueryConfig;
49
+ client: QueryClient;
50
+ }) => Record<string, string> | null;
51
+ export declare const computeQueryHeaders: (config: {
52
+ config: AnyRestQueryConfig | AnyGqlQueryConfig;
53
+ client: QueryClient;
54
+ args?: BaseArguments | undefined;
55
+ }) => RequestHeaders | undefined;
56
+ export declare const computeQueryQueryParams: (config: {
57
+ config: AnyRestQueryConfig | AnyGqlQueryConfig;
58
+ args?: BaseArguments | undefined;
59
+ }) => import("../request").QueryParams | undefined;
32
60
  export {};
@@ -69,7 +69,11 @@ export type QueryCreator<Arguments extends BaseArguments | undefined, Method ext
69
69
  behaviorSubject: <T extends Query<Response, Arguments, Route, Method, ResponseTransformer>>(initialValue?: T | null) => BehaviorSubject<T | null>;
70
70
  };
71
71
  export type AnyQueryCreator = QueryCreator<any, any, any, any, any>;
72
- export type QueryCreatorArgs<T extends AnyQueryCreator> = Parameters<T['prepare']>[0];
72
+ export type QueryCreatorArgs<T extends AnyQueryCreator> = T extends QueryCreator<infer Args, any, any, any, any> ? Args : never;
73
+ export type QueryCreatorMethod<Q extends AnyQueryCreator> = Q extends QueryCreator<any, infer Method, any, any, any> ? Method : never;
74
+ export type QueryCreatorResponse<T extends AnyQueryCreator> = T extends QueryCreator<any, any, infer Response, any, any> ? Response : never;
75
+ export type QueryCreatorRoute<Q extends AnyQueryCreator> = Q extends QueryCreator<infer Args, any, any, any, any> ? RouteType<Args> : never;
76
+ export type QueryCreatorResponseTransformer<Q extends AnyQueryCreator> = Q extends QueryCreator<any, any, any, any, infer ResponseTransformer> ? ResponseTransformer : never;
73
77
  export type ResponseTransformerType<Response> = (response: Response) => unknown;
74
78
  export type DefaultResponseTransformer<Response> = (response: Response) => Response;
75
79
  export type QueryCreatorReturnType<T extends AnyQueryCreator> = ReturnType<T['prepare']>;
@@ -3,6 +3,8 @@ export declare class QueryStore {
3
3
  private _config?;
4
4
  private readonly _store;
5
5
  private _garbageCollector;
6
+ private _isInLowResourceMode;
7
+ private _lastBlurTimestamp;
6
8
  constructor(_config?: {
7
9
  enableChangeLogging?: boolean | undefined;
8
10
  enableGarbageCollectorLogging?: boolean | undefined;
@@ -14,7 +14,10 @@ export declare const isParamValid: (primitive: UnfilteredParamPrimitive) => bool
14
14
  export declare const extractExpiresInSeconds: (headers: RequestHeaders) => number | null;
15
15
  export declare const buildTimestampFromSeconds: (seconds: number | null) => number | null;
16
16
  export declare const serializeBody: (body: unknown) => ArrayBuffer | Blob | FormData | string | null;
17
- export declare const transformMethod: (method: Method) => "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT" | "PURGE" | "LINK" | "UNLINK" | "CUSTOM";
17
+ export declare const transformMethod: (config: {
18
+ method: Method;
19
+ transferVia?: 'GET' | 'POST';
20
+ }) => "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT" | "PURGE" | "LINK" | "UNLINK" | "CUSTOM";
18
21
  export declare const detectContentTypeHeader: (body: unknown) => string | null;
19
22
  export declare const hasHeader: (headers: RequestHeaders, header: string) => boolean;
20
23
  export declare const forEachHeader: (headers: RequestHeaders, callback: (value: string, key: string) => void) => void;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ethlete/query",
3
- "version": "2.2.0",
3
+ "version": "2.4.0",
4
4
  "dependencies": {
5
- "tslib": "^2.3.0"
5
+ "tslib": "^2.5.0"
6
6
  },
7
7
  "peerDependencies": {
8
- "@angular/common": "^14.2.0 || ^15.0.0",
9
- "@angular/core": "^14.2.0 || ^15.0.0",
10
- "@ethlete/core": "1.4.3"
8
+ "@angular/common": "^15.2.1",
9
+ "@angular/core": "^15.2.1",
10
+ "@ethlete/core": "1.5.1"
11
11
  },
12
12
  "module": "fesm2015/ethlete-query.mjs",
13
13
  "es2020": "fesm2020/ethlete-query.mjs",