@ethlete/query 0.1.0-next.9 → 1.0.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 (40) hide show
  1. package/esm2020/lib/auth/auth-provider.types.mjs +1 -1
  2. package/esm2020/lib/auth/auth-provider.utils.mjs +1 -1
  3. package/esm2020/lib/auth/basic-auth-provider.mjs +4 -5
  4. package/esm2020/lib/auth/bearer-auth-provider.mjs +117 -60
  5. package/esm2020/lib/auth/custom-header-auth-provider.mjs +4 -5
  6. package/esm2020/lib/directives/infinity-query-trigger.directive.mjs +3 -3
  7. package/esm2020/lib/directives/infinity-query.directive.mjs +7 -9
  8. package/esm2020/lib/directives/query.directive.mjs +23 -19
  9. package/esm2020/lib/infinite-query/infinity-query.mjs +15 -11
  10. package/esm2020/lib/query/query.mjs +111 -86
  11. package/esm2020/lib/query/query.types.mjs +1 -1
  12. package/esm2020/lib/query/query.utils.mjs +51 -4
  13. package/esm2020/lib/query-client/query-client.mjs +25 -13
  14. package/esm2020/lib/query-client/query-client.types.mjs +1 -1
  15. package/esm2020/lib/query-form/query-form.mjs +7 -6
  16. package/esm2020/lib/request/request.mjs +168 -19
  17. package/esm2020/lib/request/request.types.mjs +1 -1
  18. package/esm2020/lib/request/request.util.mjs +66 -91
  19. package/fesm2015/ethlete-query.mjs +673 -398
  20. package/fesm2015/ethlete-query.mjs.map +1 -1
  21. package/fesm2020/ethlete-query.mjs +657 -389
  22. package/fesm2020/ethlete-query.mjs.map +1 -1
  23. package/lib/auth/auth-provider.types.d.ts +30 -22
  24. package/lib/auth/auth-provider.utils.d.ts +2 -1
  25. package/lib/auth/basic-auth-provider.d.ts +0 -2
  26. package/lib/auth/bearer-auth-provider.d.ts +14 -14
  27. package/lib/auth/custom-header-auth-provider.d.ts +0 -2
  28. package/lib/directives/infinity-query.directive.d.ts +1 -2
  29. package/lib/directives/query.directive.d.ts +6 -5
  30. package/lib/infinite-query/infinity-query.types.d.ts +4 -4
  31. package/lib/query/query.d.ts +6 -6
  32. package/lib/query/query.types.d.ts +78 -43
  33. package/lib/query/query.utils.d.ts +21 -5
  34. package/lib/query-client/query-client.d.ts +13 -11
  35. package/lib/query-client/query-client.types.d.ts +22 -10
  36. package/lib/query-form/query-form.types.d.ts +2 -2
  37. package/lib/request/request.d.ts +3 -9
  38. package/lib/request/request.types.d.ts +63 -15
  39. package/lib/request/request.util.d.ts +74 -7
  40. package/package.json +2 -5
@@ -1,6 +1,5 @@
1
- import { RouteString } from '../query';
2
- import { QueryClient } from '../query-client';
3
- import { Method } from '../request';
1
+ import { QueryResponseType } from '../query';
2
+ import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorReturnType } from '../query-client';
4
3
  export interface AuthProvider {
5
4
  /**
6
5
  * The up to date auth header.
@@ -12,10 +11,6 @@ export interface AuthProvider {
12
11
  * @internal
13
12
  */
14
13
  cleanUp(): void;
15
- /**
16
- * Reference to the query client
17
- */
18
- queryClient: QueryClient | null;
19
14
  }
20
15
  export interface AuthProviderBasicConfig {
21
16
  /**
@@ -39,30 +34,39 @@ export interface AuthProviderCustomHeaderConfig {
39
34
  */
40
35
  value: string;
41
36
  }
42
- export interface AuthProviderBearerConfig {
37
+ export interface AuthProviderBearerConfig<T extends AnyQueryCreator> {
43
38
  /**
44
39
  * The initial jwt
45
40
  */
46
- token: string;
41
+ token?: string;
47
42
  /**
48
43
  * Refresh token configuration
49
44
  */
50
- refreshConfig?: BearerRefreshConfig;
45
+ refreshConfig?: BearerRefreshConfig<T>;
51
46
  }
52
- export interface BearerRefreshConfig {
47
+ export interface BearerRefreshConfig<T extends AnyQueryCreator> {
48
+ /**
49
+ * The query used to trade the refresh token for a new token response.
50
+ */
51
+ queryCreator: T;
53
52
  /**
54
53
  * The initial refresh token
55
54
  */
56
- token: string;
55
+ token?: string;
56
+ /**
57
+ * The cookie name where the refresh token is stored
58
+ */
59
+ cookieName?: string;
57
60
  /**
58
- * The api's refresh route
59
- * @example /api/auth/refresh-token
61
+ * Enable or disable the cookie
62
+ * @default true
60
63
  */
61
- route: RouteString;
64
+ cookieEnabled?: boolean;
62
65
  /**
63
- * The api's refresh route method
66
+ * The time in milliseconds before the token expires when the refresh should be triggered.
67
+ * @default 300000 (5 minutes)
64
68
  */
65
- method: Method;
69
+ refreshBuffer?: number;
66
70
  /**
67
71
  * The expires in property name inside the jwt body
68
72
  * @default 'exp'
@@ -75,18 +79,22 @@ export interface BearerRefreshConfig {
75
79
  strategy?: AuthBearerRefreshStrategy;
76
80
  /**
77
81
  * Adapter function used to build the request body for the refresh request.
78
- * @default { refreshToken: "refreshToken" }
82
+ * @default { body: { refreshToken: "refreshToken" } }
79
83
  */
80
- bodyAdapter?: (refreshToken: string) => unknown;
84
+ requestArgsAdapter?: (tokens: {
85
+ token: string | null;
86
+ refreshToken: string;
87
+ }) => QueryCreatorArgs<T>;
81
88
  /**
82
89
  * Adapter function used to extract the token and refreshToken from the response.
83
90
  * @default { token: "token", refreshToken: "refreshToken" }
84
91
  */
85
- responseAdapter?: (response: unknown) => TokenResponse;
92
+ responseAdapter?: (response: NonNullable<QueryResponseType<QueryCreatorReturnType<T>>>) => TokenResponse;
86
93
  }
87
94
  export declare const enum AuthBearerRefreshStrategy {
88
95
  /**
89
96
  * Automatically refresh the token 5 minutes before expiration.
97
+ * The time can be configured with the `refreshBuffer` property.
90
98
  */
91
99
  BeforeExpiration = "beforeExpiration"
92
100
  }
@@ -94,10 +102,10 @@ export interface TokenResponse {
94
102
  /**
95
103
  * The access token used inside the authorization http header.
96
104
  */
97
- token: string;
105
+ token: string | null;
98
106
  /**
99
107
  * The refresh token used for requesting a new token response once the current tokes is expired.
100
108
  * This property is required if the bearer refresh config is set.
101
109
  */
102
- refreshToken?: string;
110
+ refreshToken: string | null;
103
111
  }
@@ -1,8 +1,9 @@
1
+ import { AnyQueryCreator } from '../query-client';
1
2
  import { AuthProvider } from './auth-provider.types';
2
3
  import { BasicAuthProvider } from './basic-auth-provider';
3
4
  import { BearerAuthProvider } from './bearer-auth-provider';
4
5
  import { CustomHeaderAuthProvider } from './custom-header-auth-provider';
5
6
  export declare const isBasicAuthProvider: (authProvider: AuthProvider) => authProvider is BasicAuthProvider;
6
- export declare const isBearerAuthProvider: (authProvider: AuthProvider) => authProvider is BearerAuthProvider;
7
+ export declare const isBearerAuthProvider: <T extends AnyQueryCreator = AnyQueryCreator>(authProvider: AuthProvider) => authProvider is BearerAuthProvider<T>;
7
8
  export declare const isCustomHeaderAuthProvider: (authProvider: AuthProvider) => authProvider is CustomHeaderAuthProvider;
8
9
  export declare const decryptBearer: <Result = Record<string, unknown>>(token: string) => Result | null;
@@ -1,4 +1,3 @@
1
- import { QueryClient } from '../query-client';
2
1
  import { AuthProvider, AuthProviderBasicConfig } from './auth-provider.types';
3
2
  export declare class BasicAuthProvider implements AuthProvider {
4
3
  private _config;
@@ -6,7 +5,6 @@ export declare class BasicAuthProvider implements AuthProvider {
6
5
  Authorization: string;
7
6
  };
8
7
  private get _basicAuthString();
9
- queryClient: QueryClient | null;
10
8
  constructor(_config: AuthProviderBasicConfig);
11
9
  cleanUp(): void;
12
10
  }
@@ -1,21 +1,21 @@
1
- import { Subject } from 'rxjs';
2
- import { QueryClient } from '../query-client';
3
- import { RequestError } from '../request';
1
+ import { AnyQueryCreator } from '../query-client';
4
2
  import { AuthProvider, AuthProviderBearerConfig, TokenResponse } from './auth-provider.types';
5
- export declare class BearerAuthProvider implements AuthProvider {
3
+ export declare class BearerAuthProvider<T extends AnyQueryCreator> implements AuthProvider {
6
4
  private _config;
7
- private _token;
8
- private _refreshToken;
9
- private _refreshTimerSubscription;
5
+ private readonly _destroy$;
6
+ private readonly _currentRefreshQuery$;
7
+ private readonly _tokens$;
10
8
  get header(): {
11
9
  Authorization: string;
12
10
  };
13
- queryClient: QueryClient | null;
14
- onRefreshInitiation$: Subject<void>;
15
- onRefreshSuccess$: Subject<TokenResponse>;
16
- onRefreshFailure$: Subject<RequestError<unknown>>;
17
- constructor(_config: AuthProviderBearerConfig);
11
+ get tokens$(): import("rxjs").Observable<TokenResponse>;
12
+ get tokens(): TokenResponse;
13
+ get currentRefreshQuery$(): import("rxjs").Observable<ReturnType<T["prepare"]> | null>;
14
+ get currentRefreshQuery(): ReturnType<T["prepare"]> | null;
15
+ constructor(_config: AuthProviderBearerConfig<T>);
18
16
  cleanUp(): void;
19
- private _setupRefresh;
20
- private _refresh;
17
+ enableCookie(): void;
18
+ disableCookie(): void;
19
+ private _prepareForRefresh;
20
+ private _refreshQuery;
21
21
  }
@@ -1,11 +1,9 @@
1
- import { QueryClient } from '../query-client';
2
1
  import { AuthProvider, AuthProviderCustomHeaderConfig } from './auth-provider.types';
3
2
  export declare class CustomHeaderAuthProvider implements AuthProvider {
4
3
  private _config;
5
4
  get header(): {
6
5
  [x: string]: string;
7
6
  };
8
- queryClient: QueryClient | null;
9
7
  constructor(_config: AuthProviderCustomHeaderConfig);
10
8
  cleanUp(): void;
11
9
  }
@@ -4,7 +4,6 @@ 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
- import * as i1 from "@ethlete/core";
8
7
  interface InfinityQueryContext<Q extends InfinityQueryConfig<AnyQueryCreator, BaseArguments, any, unknown[]>> {
9
8
  $implicit: Q['response']['arrayType'] | null;
10
9
  infinityQuery: Q['response']['arrayType'] | null;
@@ -44,6 +43,6 @@ export declare class InfinityQueryDirective<Q extends InfinityQueryConfig<AnyQue
44
43
  private _renderMainView;
45
44
  private _cleanup;
46
45
  static ɵfac: i0.ɵɵFactoryDeclaration<InfinityQueryDirective<any>, never>;
47
- static ɵdir: i0.ɵɵDirectiveDeclaration<InfinityQueryDirective<any>, "[infinityQuery]", ["infinityQuery"], { "infinityQuery": "infinityQuery"; }, {}, never, never, true, [{ directive: typeof i1.DestroyDirective; inputs: {}; outputs: {}; }]>;
46
+ static ɵdir: i0.ɵɵDirectiveDeclaration<InfinityQueryDirective<any>, "[infinityQuery]", ["infinityQuery"], { "infinityQuery": "infinityQuery"; }, {}, never, never, true, never>;
48
47
  }
49
48
  export {};
@@ -1,15 +1,16 @@
1
1
  import { ChangeDetectorRef, ErrorHandler, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
2
- import { AnyQuery, QueryRawResponseType, QueryResponseType } from '../query';
3
- import { RequestError } from '../request';
2
+ import { AnyQuery, AnyQueryCreatorCollection, AnyQueryOfCreatorCollection, QueryOf, QueryRawResponseType, QueryResponseType } from '../query';
3
+ import { RequestError, RequestProgress } from '../request';
4
4
  import * as i0 from "@angular/core";
5
5
  interface QueryContext<Q extends AnyQuery | null> {
6
6
  $implicit: QueryResponseType<Q>;
7
7
  query: QueryResponseType<Q>;
8
8
  raw: QueryRawResponseType<Q>;
9
9
  loading: boolean;
10
+ progress: RequestProgress | null;
10
11
  error: RequestError<unknown> | null;
11
12
  }
12
- export declare class QueryDirective<Q extends AnyQuery | null> implements OnInit, OnDestroy {
13
+ export declare class QueryDirective<Q extends AnyQuery | AnyQueryOfCreatorCollection<AnyQueryCreatorCollection> | null> implements OnInit, OnDestroy {
13
14
  private _mainTemplateRef;
14
15
  private _viewContainerRef;
15
16
  private _errorHandler;
@@ -23,8 +24,8 @@ export declare class QueryDirective<Q extends AnyQuery | null> implements OnInit
23
24
  get cache(): boolean;
24
25
  set cache(v: boolean);
25
26
  private _cache;
26
- constructor(_mainTemplateRef: TemplateRef<QueryContext<Q>>, _viewContainerRef: ViewContainerRef, _errorHandler: ErrorHandler, _cdr: ChangeDetectorRef);
27
- static ngTemplateContextGuard<Q extends AnyQuery | null>(dir: QueryDirective<Q>, ctx: unknown): ctx is QueryContext<Q>;
27
+ constructor(_mainTemplateRef: TemplateRef<QueryContext<QueryOf<Q>>>, _viewContainerRef: ViewContainerRef, _errorHandler: ErrorHandler, _cdr: ChangeDetectorRef);
28
+ static ngTemplateContextGuard<Q extends AnyQuery | AnyQueryOfCreatorCollection<AnyQueryCreatorCollection> | null>(dir: QueryDirective<Q>, ctx: unknown): ctx is QueryContext<QueryOf<Q>>;
28
29
  ngOnInit(): void;
29
30
  ngOnDestroy(): void;
30
31
  private _subscribeToQuery;
@@ -1,7 +1,7 @@
1
1
  import { BaseArguments, QueryStateData } from '../query';
2
2
  import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorReturnType } from '../query-client';
3
- export declare type InfinityQueryParamLocation = 'path' | 'query' | 'body' | 'header' | 'variable';
4
- export declare type AppendItemsLocation = 'start' | 'end';
3
+ export type InfinityQueryParamLocation = 'path' | 'query' | 'body' | 'header' | 'variable';
4
+ export type AppendItemsLocation = 'start' | 'end';
5
5
  export interface PageParamCalculatorOptions {
6
6
  page: number;
7
7
  totalPages: number | null;
@@ -89,6 +89,6 @@ export interface InfinityQueryConfig<QueryCreator extends AnyQueryCreator, Argum
89
89
  totalPagesExtractor?: (data: TotalPagesExtractorOptions<QueryResponse>) => number;
90
90
  };
91
91
  }
92
- declare type OmitUndefined<T> = T extends undefined ? never : T;
93
- export declare type InfinityQueryConfigType<QueryCreator extends AnyQueryCreator, InfinityResponse extends unknown[]> = InfinityQueryConfig<QueryCreator, OmitUndefined<QueryCreatorArgs<QueryCreator>>, QueryStateData<QueryCreatorReturnType<QueryCreator>['state']>, InfinityResponse>;
92
+ type OmitUndefined<T> = T extends undefined ? never : T;
93
+ export type InfinityQueryConfigType<QueryCreator extends AnyQueryCreator, InfinityResponse extends unknown[]> = InfinityQueryConfig<QueryCreator, OmitUndefined<QueryCreatorArgs<QueryCreator>>, QueryStateData<QueryCreatorReturnType<QueryCreator>['state']>, InfinityResponse>;
94
94
  export {};
@@ -1,24 +1,24 @@
1
1
  import { DefaultResponseTransformer, QueryClient, ResponseTransformerType } from '../query-client';
2
2
  import { Method as MethodType } from '../request';
3
- import { BaseArguments, GqlQueryConfig, PollConfig, QueryConfig, QueryState, RouteType, RunQueryOptions } from './query.types';
4
- export declare class Query<Response, Arguments extends BaseArguments | undefined, Route extends RouteType<Arguments>, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> {
3
+ import { BaseArguments, GqlQueryConfig, PollConfig, QueryState, RestQueryConfig, RouteType, RunQueryOptions, WithUseResultIn } from './query.types';
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;
7
- private _route;
7
+ private _routeWithParams;
8
8
  private _args;
9
9
  private _currentId;
10
- private _abortController;
11
10
  private _pollingSubscription;
11
+ private _onAbort$;
12
12
  private readonly _state$;
13
13
  private get _nextId();
14
14
  get state$(): import("rxjs").Observable<QueryState<ReturnType<ResponseTransformer>, Response>>;
15
15
  get state(): QueryState<ReturnType<ResponseTransformer>, Response>;
16
16
  get isExpired(): boolean;
17
- constructor(_client: QueryClient, _queryConfig: QueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _route: Route, _args: Arguments | undefined);
17
+ constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _routeWithParams: Route, _args: Arguments | undefined);
18
18
  clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
19
19
  execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
20
20
  abort(): this;
21
21
  poll(config: PollConfig): this;
22
22
  stopPolling(): this;
23
- private _handleExecuteError;
23
+ private _updateUseResultInDependencies;
24
24
  }
@@ -1,16 +1,12 @@
1
1
  import { Observable } from 'rxjs';
2
- import { ResponseTransformerType } from '../query-client';
3
- import { Method, PathParams, QueryParams, RequestError } from '../request';
2
+ import { AnyQueryCreator, QueryCreatorReturnType, ResponseTransformerType } from '../query-client';
3
+ import { Method, PathParams, QueryParams, RequestError, RequestProgress } from '../request';
4
4
  import { Query } from './query';
5
- export interface QueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
5
+ export interface QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
6
6
  /**
7
7
  * The http method to use for the query.
8
8
  */
9
9
  method: Method;
10
- /**
11
- * The api route to use for the query.
12
- */
13
- route: Route;
14
10
  /**
15
11
  * Determines if the auth provider should be used for this query.
16
12
  * The query **will throw** if the query client's auth provider is unset.
@@ -21,6 +17,20 @@ export interface QueryConfig<Route extends RouteType<Arguments>, Response, Argum
21
17
  * A function that transforms the response to the desired type.
22
18
  */
23
19
  responseTransformer?: ResponseTransformer;
20
+ /**
21
+ * Determines if the query should emit progress events.
22
+ */
23
+ reportProgress?: boolean;
24
+ /**
25
+ * Determines the query's response type.
26
+ * @default 'json'
27
+ */
28
+ responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
29
+ /**
30
+ * Whether this request should be sent with outgoing credentials (cookies).
31
+ * @default false
32
+ */
33
+ withCredentials?: boolean;
24
34
  /**
25
35
  * Object containing the query's type information.
26
36
  */
@@ -36,24 +46,30 @@ export interface QueryConfig<Route extends RouteType<Arguments>, Response, Argum
36
46
  * - `queryParams`: The query parameters for the query. (after the ? in the url)
37
47
  * - `body`: The body for the query. Unavailable for GET, HEAD and OPTIONS requests.
38
48
  * - `headers`: The headers for the query.
49
+ * - `variables`: The variables for the query. (graphql only)
39
50
  */
40
51
  args?: Arguments;
41
52
  };
42
53
  }
43
- export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
44
- method: Method;
54
+ export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
55
+ /**
56
+ * The api route to use for the query.
57
+ */
58
+ route: Route;
59
+ }
60
+ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
61
+ /**
62
+ * The graphql query to use for the query.
63
+ */
45
64
  query: string;
65
+ /**
66
+ * Subroute to use for the query.
67
+ */
46
68
  route?: Route;
47
- secure?: boolean;
48
- responseTransformer?: ResponseTransformer;
49
- types?: {
50
- response?: Response;
51
- args?: Arguments;
52
- };
53
69
  }
54
- export declare type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<QueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
55
- export declare type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
56
- export declare type BaseArguments = WithHeaders & WithVariables & WithBody & WithQueryParams & WithPathParams;
70
+ export type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<RestQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
71
+ export type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
72
+ export type BaseArguments = WithHeaders & WithVariables & WithBody & WithQueryParams & WithPathParams;
57
73
  export interface WithHeaders {
58
74
  headers?: Record<string, string>;
59
75
  }
@@ -69,14 +85,17 @@ export interface WithQueryParams {
69
85
  export interface WithPathParams {
70
86
  pathParams?: PathParams;
71
87
  }
72
- export declare type EmptyObject = {};
88
+ export type WithUseResultIn<Response, ResponseTransformer extends ResponseTransformerType<Response>> = {
89
+ useResultIn?: Query<Response, any, any, any, ResponseTransformer>[];
90
+ };
91
+ export type EmptyObject = {};
73
92
  export interface RunQueryOptions {
74
93
  skipCache?: boolean;
75
94
  }
76
- export declare type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
95
+ export type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
77
96
  pathParams: infer PathParams;
78
97
  } ? (p: PathParams) => RouteString : RouteString;
79
- export declare type RouteString = `/${string}`;
98
+ export type RouteString = `/${string}`;
80
99
  export interface PollConfig {
81
100
  interval: number;
82
101
  takeUntil: Observable<unknown>;
@@ -89,40 +108,56 @@ export declare const enum QueryStateType {
89
108
  Cancelled = "CANCELLED"
90
109
  }
91
110
  export interface Prepared {
92
- readonly type: QueryStateType.Prepared;
93
- readonly meta: QueryStateMeta;
111
+ type: QueryStateType.Prepared;
112
+ meta: QueryStateMeta;
94
113
  }
95
114
  export interface Success<Response = unknown, RawResponse = unknown> {
96
- readonly type: QueryStateType.Success;
97
- readonly response: Response;
98
- readonly rawResponse: RawResponse;
99
- readonly meta: QueryStateSuccessMeta;
115
+ type: QueryStateType.Success;
116
+ response: Response;
117
+ rawResponse: RawResponse;
118
+ meta: QueryStateSuccessMeta;
100
119
  }
101
120
  export interface Failure {
102
- readonly type: QueryStateType.Failure;
103
- readonly error: RequestError;
104
- readonly meta: QueryStateMeta;
121
+ type: QueryStateType.Failure;
122
+ error: RequestError;
123
+ meta: QueryStateMeta;
105
124
  }
106
125
  export interface Loading {
107
- readonly type: QueryStateType.Loading;
108
- readonly meta: QueryStateMeta;
126
+ type: QueryStateType.Loading;
127
+ meta: QueryStateMeta;
128
+ partialText?: string;
129
+ progress?: RequestProgress;
109
130
  }
110
131
  export interface Cancelled {
111
- readonly type: QueryStateType.Cancelled;
112
- readonly meta: QueryStateMeta;
132
+ type: QueryStateType.Cancelled;
133
+ meta: QueryStateMeta;
113
134
  }
114
135
  export interface QueryStateMeta {
115
- readonly id: number;
136
+ id: number;
116
137
  }
117
138
  export interface QueryStateSuccessMeta extends QueryStateMeta {
118
- readonly expiresAt: number | null;
139
+ expiresAt?: number;
119
140
  }
120
- export declare type QueryState<Response = unknown, RawResponse = unknown> = Loading | Success<Response, RawResponse> | Failure | Cancelled | Prepared;
121
- export declare type QueryStateData<T extends QueryState = QueryState> = T extends Success<infer Response> ? Response : never;
122
- export declare type QueryStateRawData<T extends QueryState = QueryState> = T extends Success<infer Response, infer RawResponse> ? RawResponse : never;
123
- export declare type AnyQuery = Query<any, any, any, any, any>;
124
- export declare type QueryType<T extends {
141
+ export type QueryState<Response = unknown, RawResponse = unknown> = Loading | Success<Response, RawResponse> | Failure | Cancelled | Prepared;
142
+ export type QueryStateData<T extends QueryState = QueryState> = T extends Success<infer Response> ? Response : never;
143
+ export type QueryStateRawData<T extends QueryState = QueryState> = T extends Success<infer Response, infer RawResponse> ? RawResponse : never;
144
+ export type AnyQuery = Query<any, any, any, any, any>;
145
+ export type QueryType<T extends {
125
146
  prepare: (args: any) => AnyQuery;
126
147
  }> = T['prepare'] extends () => infer R ? R : T['prepare'] extends (args: any) => infer R ? R : never;
127
- export declare type QueryResponseType<Q extends AnyQuery | null> = Q extends AnyQuery ? QueryStateData<Q['state']> | null : null;
128
- export declare type QueryRawResponseType<Q extends AnyQuery | null> = Q extends AnyQuery ? QueryStateRawData<Q['state']> | null : null;
148
+ export type QueryResponseType<Q extends AnyQuery | null> = Q extends AnyQuery ? QueryStateData<Q['state']> | null : null;
149
+ export type QueryRawResponseType<Q extends AnyQuery | null> = Q extends AnyQuery ? QueryStateRawData<Q['state']> | null : null;
150
+ export type AnyQueryCreatorCollection = {
151
+ [name: string]: AnyQueryCreator;
152
+ };
153
+ export type AnyQueryOfCreatorCollection<T extends {
154
+ [name: string]: AnyQueryCreator;
155
+ }> = {
156
+ [K in keyof T]: {
157
+ type: K;
158
+ query: QueryCreatorReturnType<T[K]>;
159
+ };
160
+ }[keyof T];
161
+ export type QueryOf<T extends AnyQueryOfCreatorCollection<AnyQueryCreatorCollection> | AnyQuery | null> = T extends AnyQuery ? T : T extends AnyQueryOfCreatorCollection<AnyQueryCreatorCollection> ? T['query'] : never;
162
+ export type AnyQueryResponseOfCreatorCollection<T extends AnyQueryOfCreatorCollection<AnyQueryCreatorCollection>> = QueryResponseType<T['query']>;
163
+ export type AnyQueryRawResponseOfCreatorCollection<T extends AnyQueryOfCreatorCollection<AnyQueryCreatorCollection>> = QueryRawResponseType<T['query']>;
@@ -1,11 +1,20 @@
1
- import { Observable } from 'rxjs';
1
+ import { BehaviorSubject, Observable } from 'rxjs';
2
2
  import { ResponseTransformerType } from '../query-client';
3
- import { RequestHeaders } from '../request';
4
- import { BaseArguments, Cancelled, Failure, GqlQueryConfig, Loading, Prepared, QueryState, QueryStateData, QueryStateRawData, RouteType, Success } from './query.types';
5
- declare type OmitNull<T> = T extends null ? never : T;
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';
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
7
  export declare function filterFailure(): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<Failure>;
8
- export declare function takeUntilResponse(): <T extends QueryState<unknown, unknown>>(source: Observable<T>) => Observable<T>;
8
+ export declare function filterQueryStates(allowedStates: QueryStateType[]): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<T>;
9
+ export declare function takeUntilResponse(config?: {
10
+ excludeNull?: boolean;
11
+ }): <T extends QueryState<unknown, unknown> | null>(source: Observable<T>) => Observable<T>;
12
+ export declare function filterNull(): <T>(source: Observable<T>) => Observable<OmitNull<T>>;
13
+ export declare function switchQueryState(): <T extends AnyQuery | null, Response_1 extends QueryResponseType<OmitNull<T>>, RawResponse extends QueryRawResponseType<OmitNull<T>>>(source: Observable<T>) => Observable<QueryState<OmitNull<Response_1>, OmitNull<RawResponse>> | null>;
14
+ export declare function switchQueryCollectionState(): <T extends {
15
+ type: string;
16
+ query: import("@ethlete/query").Query<any, any, any, any, any>;
17
+ } | null, Response_1 extends QueryResponseType<OmitNull<T>["query"]>, RawResponse extends QueryRawResponseType<OmitNull<T>["query"]>>(source: Observable<T>) => Observable<QueryState<OmitNull<Response_1>, OmitNull<RawResponse>> | null>;
9
18
  export declare const isQueryStateLoading: (state: QueryState | null | undefined) => state is Loading;
10
19
  export declare const isQueryStateSuccess: (state: QueryState | null | undefined) => state is Success<unknown, unknown>;
11
20
  export declare const isQueryStateFailure: (state: QueryState | null | undefined) => state is Failure;
@@ -13,4 +22,11 @@ export declare const isQueryStateCancelled: (state: QueryState | null | undefine
13
22
  export declare const isQueryStatePrepared: (state: QueryState | null | undefined) => state is Prepared;
14
23
  export declare const mergeHeaders: (...headers: Array<RequestHeaders | null | undefined>) => RequestHeaders | null | undefined;
15
24
  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
+ export declare const isQuery: <T extends AnyQuery>(query: unknown) => query is T;
26
+ export declare const createQueryCollection: <T extends AnyQueryCreatorCollection, R extends AnyQueryOfCreatorCollection<T>>(queryMap: T) => BehaviorSubject<R | null>;
27
+ export declare const extractQuery: <T extends AnyQuery | {
28
+ type: string;
29
+ query: import("@ethlete/query").Query<any, any, any, any, any>;
30
+ } | null>(v: T) => import("@ethlete/query").Query<any, any, any, any, any> | null;
31
+ export declare const getDefaultHeaders: (headers: RequestHeaders | RequestHeadersMethodMap | null | undefined, method: Method) => RequestHeaders;
16
32
  export {};
@@ -1,22 +1,24 @@
1
1
  import { AuthProvider } from '../auth';
2
- import { BaseArguments, GqlQueryConfig, GqlQueryConfigWithoutMethod, QueryConfig, QueryConfigWithoutMethod, RouteType } from '../query';
3
- import { Method as MethodType } from '../request';
2
+ import { BaseArguments, GqlQueryConfig, GqlQueryConfigWithoutMethod, QueryConfigWithoutMethod, RestQueryConfig, RouteType } from '../query';
3
+ import { Method as MethodType, RequestHeaders, RequestHeadersMethodMap } from '../request';
4
4
  import { DefaultResponseTransformer, QueryClientConfig, QueryCreator, ResponseTransformerType } from './query-client.types';
5
5
  export declare class QueryClient {
6
6
  private _clientConfig;
7
7
  private readonly _store;
8
- private _authProvider;
9
8
  get config(): QueryClientConfig;
10
9
  get authProvider(): AuthProvider | null;
10
+ get authProvider$(): import("rxjs").Observable<AuthProvider | null>;
11
+ private readonly _authProvider$;
11
12
  constructor(_clientConfig: QueryClientConfig);
12
- get: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "GET", Response_1, Route, ResponseTransformer>;
13
- post: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "POST", Response_1, Route, ResponseTransformer>;
14
- put: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "PUT", Response_1, Route, ResponseTransformer>;
15
- patch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "PATCH", Response_1, Route, ResponseTransformer>;
16
- delete: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "DELETE", Response_1, Route, ResponseTransformer>;
17
- gqlQuery: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "GQL_QUERY", Response_1, Route, ResponseTransformer>;
18
- gqlMutate: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "GQL_MUTATE", Response_1, Route, ResponseTransformer>;
19
- fetch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfig<Route, Response_1, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, Method, Response_1, Route, ResponseTransformer>;
13
+ get: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "GET", Response_1, Route, ResponseTransformer>;
14
+ post: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "POST", Response_1, Route, ResponseTransformer>;
15
+ put: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "PUT", Response_1, Route, ResponseTransformer>;
16
+ patch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "PATCH", Response_1, Route, ResponseTransformer>;
17
+ delete: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer>) => QueryCreator<Arguments, "DELETE", Response_1, Route, ResponseTransformer>;
18
+ gqlQuery: <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_QUERY", Response_1, Route, ResponseTransformer>;
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
+ 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>;
20
21
  setAuthProvider: (authProvider: AuthProvider) => void;
22
+ setDefaultHeaders: (headers: RequestHeaders | RequestHeadersMethodMap | null) => void;
21
23
  clearAuthProvider: () => void;
22
24
  }
@@ -1,7 +1,8 @@
1
1
  import { BehaviorSubject } from 'rxjs';
2
2
  import { Query } from '../query/query';
3
- import { BaseArguments, EmptyObject, RouteType, WithHeaders } from '../query/query.types';
4
- import { CacheAdapterFn, Method as MethodType } from '../request';
3
+ import { BaseArguments, EmptyObject, RouteType, WithHeaders, WithUseResultIn } from '../query/query.types';
4
+ import { CacheAdapterFn, Method as MethodType, RequestHeaders, RequestHeadersMethodMap } from '../request';
5
+ import { QueryClient } from './query-client';
5
6
  export interface QueryClientConfig {
6
7
  /**
7
8
  * The api base route.
@@ -31,17 +32,28 @@ export interface QueryClientConfig {
31
32
  * Should return a number in seconds.
32
33
  */
33
34
  cacheAdapter?: CacheAdapterFn;
35
+ /**
36
+ * Default headers to be sent with every request.
37
+ * Will be overridden by headers passed to the query.
38
+ * Do not include the `Authorization` header here. Use an `AuthProvider` instead.
39
+ */
40
+ headers?: RequestHeaders | RequestHeadersMethodMap;
34
41
  };
42
+ /**
43
+ * Parent query client.
44
+ * Used for sharing the same auth provider.
45
+ */
46
+ parent?: QueryClient;
35
47
  }
36
- export declare type QueryCreator<Arguments extends BaseArguments | undefined, Method extends MethodType, Response, Route extends RouteType<Arguments>, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> = (Arguments extends Record<string, unknown> ? {
37
- prepare: (args: Arguments & WithHeaders) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
48
+ export type QueryCreator<Arguments extends BaseArguments | undefined, Method extends MethodType, Response, Route extends RouteType<Arguments>, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> = (Arguments extends BaseArguments ? {
49
+ prepare: (args: Arguments & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
38
50
  } : {
39
- prepare: (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
51
+ prepare: (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
40
52
  }) & {
41
53
  behaviorSubject: <T extends Query<Response, Arguments, Route, Method, ResponseTransformer>>(initialValue?: T | null) => BehaviorSubject<T | null>;
42
54
  };
43
- export declare type AnyQueryCreator = QueryCreator<any, any, any, any, any>;
44
- export declare type QueryCreatorArgs<T extends AnyQueryCreator> = Parameters<T['prepare']>[0];
45
- export declare type ResponseTransformerType<Response> = (response: Response) => unknown;
46
- export declare type DefaultResponseTransformer<Response> = (response: Response) => Response;
47
- export declare type QueryCreatorReturnType<T extends AnyQueryCreator> = ReturnType<T['prepare']>;
55
+ export type AnyQueryCreator = QueryCreator<any, any, any, any, any>;
56
+ export type QueryCreatorArgs<T extends AnyQueryCreator> = Parameters<T['prepare']>[0];
57
+ export type ResponseTransformerType<Response> = (response: Response) => unknown;
58
+ export type DefaultResponseTransformer<Response> = (response: Response) => Response;
59
+ export type QueryCreatorReturnType<T extends AnyQueryCreator> = ReturnType<T['prepare']>;
@@ -45,9 +45,9 @@ export interface QueryFieldOptions<T = unknown> {
45
45
  */
46
46
  valueToQueryParamTransformFn?: (val: T | null) => unknown;
47
47
  }
48
- export declare type QueryFormGroup<T extends Record<string, QueryField<any>>> = {
48
+ export type QueryFormGroup<T extends Record<string, QueryField<any>>> = {
49
49
  [Property in keyof T]: T[Property]['control'];
50
50
  };
51
- export declare type QueryFormValue<T extends Record<string, QueryField<any>>> = {
51
+ export type QueryFormValue<T extends Record<string, QueryField<any>>> = {
52
52
  [Property in keyof T]: T[Property]['control']['value'];
53
53
  };
@@ -1,9 +1,3 @@
1
- import { CacheAdapterFn } from './request.types';
2
- export declare const request: <Response_1 = unknown>(options: {
3
- route: string;
4
- init?: RequestInit;
5
- cacheAdapter?: CacheAdapterFn;
6
- }) => Promise<{
7
- data: Response_1;
8
- expiresInTimestamp: number | null;
9
- }>;
1
+ import { Observable } from 'rxjs';
2
+ import { RequestConfig, RequestEvent } from './request.types';
3
+ export declare const request: <Response_1 = unknown>(config: RequestConfig) => Observable<RequestEvent<Response_1>>;