@ethlete/query 2.5.4 → 2.7.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 (35) hide show
  1. package/esm2020/index.mjs +2 -1
  2. package/esm2020/lib/directives/infinity-query-trigger.directive.mjs +3 -3
  3. package/esm2020/lib/directives/infinity-query.directive.mjs +3 -3
  4. package/esm2020/lib/directives/query.directive.mjs +3 -3
  5. package/esm2020/lib/entity/entity-store.mjs +141 -0
  6. package/esm2020/lib/entity/entity.types.mjs +2 -0
  7. package/esm2020/lib/entity/index.mjs +3 -0
  8. package/esm2020/lib/infinite-query/infinity-query.mjs +17 -3
  9. package/esm2020/lib/query/query.mjs +63 -1
  10. package/esm2020/lib/query/query.types.mjs +1 -1
  11. package/esm2020/lib/query/query.utils.mjs +24 -1
  12. package/esm2020/lib/query-client/query-client.mjs +2 -2
  13. package/esm2020/lib/query-client/query-client.types.mjs +1 -1
  14. package/esm2020/lib/query-client/query-client.utils.mjs +2 -4
  15. package/esm2020/lib/query-store/query-store.mjs +2 -1
  16. package/esm2020/lib/request/request.types.mjs +1 -1
  17. package/esm2020/lib/request/request.util.mjs +24 -5
  18. package/fesm2015/ethlete-query.mjs +273 -23
  19. package/fesm2015/ethlete-query.mjs.map +1 -1
  20. package/fesm2020/ethlete-query.mjs +277 -20
  21. package/fesm2020/ethlete-query.mjs.map +1 -1
  22. package/index.d.ts +1 -0
  23. package/lib/entity/entity-store.d.ts +33 -0
  24. package/lib/entity/entity.types.d.ts +10 -0
  25. package/lib/entity/index.d.ts +2 -0
  26. package/lib/infinite-query/infinity-query.d.ts +8 -6
  27. package/lib/query/query.d.ts +11 -5
  28. package/lib/query/query.types.d.ts +28 -9
  29. package/lib/query/query.utils.d.ts +21 -7
  30. package/lib/query-client/query-client.d.ts +8 -8
  31. package/lib/query-client/query-client.types.d.ts +12 -10
  32. package/lib/query-client/query-client.utils.d.ts +2 -2
  33. package/lib/request/request.types.d.ts +3 -1
  34. package/lib/request/request.util.d.ts +1 -0
  35. package/package.json +2 -2
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './lib/auth';
2
2
  export * from './lib/directives';
3
+ export * from './lib/entity';
3
4
  export * from './lib/gql';
4
5
  export * from './lib/infinite-query';
5
6
  export * from './lib/logger';
@@ -0,0 +1,33 @@
1
+ import { EntityKey, EntityStoreActionResult, EntityStoreConfig } from './entity.types';
2
+ export declare class EntityStore<T> {
3
+ private readonly _config;
4
+ private readonly _dictionary;
5
+ private readonly _keys;
6
+ private readonly _events$;
7
+ get events$(): import("rxjs").Observable<EntityStoreActionResult>;
8
+ get keys(): EntityKey[];
9
+ get values(): T[];
10
+ get size(): number;
11
+ get isEmpty(): boolean;
12
+ get config(): EntityStoreConfig;
13
+ get idKey(): string;
14
+ readonly entities$: import("rxjs").Observable<{
15
+ keys: EntityKey[];
16
+ values: T[];
17
+ }>;
18
+ constructor(_config: EntityStoreConfig);
19
+ getOne(key: EntityKey): NonNullable<T> | null;
20
+ getMany(keys: EntityKey[]): (NonNullable<T> | null)[];
21
+ addOne(value: T): EntityStoreActionResult | null;
22
+ addMany(values: T[]): (EntityStoreActionResult | null)[];
23
+ updateOne(value: T): EntityStoreActionResult | null;
24
+ updateMany(values: T[]): (EntityStoreActionResult | null)[];
25
+ setOne(value: T): EntityStoreActionResult;
26
+ setMany(values: T[]): EntityStoreActionResult[];
27
+ removeOne(key: EntityKey): EntityStoreActionResult | null;
28
+ removeMany(keys: EntityKey[]): (EntityStoreActionResult | null)[];
29
+ has(key: EntityKey): boolean;
30
+ clear(): void;
31
+ getKey(value: T): string | number;
32
+ logState(): void;
33
+ }
@@ -0,0 +1,10 @@
1
+ export type EntityKey = string | number;
2
+ export type EntityStoreActionResult = {
3
+ type: 'add' | 'update' | 'set' | 'remove';
4
+ key: EntityKey;
5
+ };
6
+ export interface EntityStoreConfig {
7
+ name: string;
8
+ idKey?: string;
9
+ logActions?: boolean;
10
+ }
@@ -0,0 +1,2 @@
1
+ export * from './entity-store';
2
+ export * from './entity.types';
@@ -1,3 +1,4 @@
1
+ import { Observable } from 'rxjs';
1
2
  import { AnyQueryCreator, QueryCreatorArgs, QueryCreatorResponse, QueryCreatorReturnType } from '../query-client';
2
3
  import { InfinityQueryConfig } from './infinity-query.types';
3
4
  export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query extends QueryCreatorReturnType<QueryCreator>, Args extends QueryCreatorArgs<QueryCreator>, QueryResponse extends QueryCreatorResponse<QueryCreator>, InfinityResponse extends unknown[]> {
@@ -9,17 +10,18 @@ export declare class InfinityQuery<QueryCreator extends AnyQueryCreator, Query e
9
10
  private readonly _currentQuery$;
10
11
  private readonly _data$;
11
12
  private _subscriptions;
12
- get currentPage$(): import("rxjs").Observable<number | null>;
13
+ private _responsiveDataSubscription;
14
+ get currentPage$(): Observable<number | null>;
13
15
  get currentPage(): number | null;
14
- get currentCalculatedPage$(): import("rxjs").Observable<number | null>;
16
+ get currentCalculatedPage$(): Observable<number | null>;
15
17
  get currentCalculatedPage(): number | null;
16
- get totalPages$(): import("rxjs").Observable<number | null>;
18
+ get totalPages$(): Observable<number | null>;
17
19
  get totalPages(): number | null;
18
- get itemsPerPage$(): import("rxjs").Observable<number>;
20
+ get itemsPerPage$(): Observable<number>;
19
21
  get itemsPerPage(): number;
20
- get currentQuery$(): import("rxjs").Observable<Query | null>;
22
+ get currentQuery$(): Observable<Query | null>;
21
23
  get currentQuery(): Query | null;
22
- get data$(): import("rxjs").Observable<InfinityResponse>;
24
+ get data$(): Observable<InfinityResponse>;
23
25
  get data(): InfinityResponse;
24
26
  constructor(_config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>);
25
27
  nextPage(): void;
@@ -1,13 +1,14 @@
1
- import { DefaultResponseTransformer, QueryClient, ResponseTransformerType } from '../query-client';
1
+ import { QueryClient, ResponseTransformerType } from '../query-client';
2
2
  import { Method as MethodType } from '../request';
3
3
  import { BaseArguments, GqlQueryConfig, PollConfig, QueryAutoRefreshConfig, 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>> {
4
+ export declare class Query<Response, Arguments extends (BaseArguments & WithUseResultIn<Response, ResponseTransformer>) | undefined, Route extends RouteType<Arguments>, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response>, Entity> {
5
5
  private _client;
6
6
  private _queryConfig;
7
7
  private _routeWithParams;
8
8
  private _args;
9
9
  private _currentId;
10
10
  private _pollingSubscription;
11
+ private _entitySubscription;
11
12
  private _onAbort$;
12
13
  private _currentPollConfig;
13
14
  /**
@@ -26,13 +27,18 @@ export declare class Query<Response, Arguments extends (BaseArguments & WithUseR
26
27
  * @internal
27
28
  */
28
29
  get _enableSmartPolling(): boolean;
29
- constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _routeWithParams: Route, _args: Arguments | undefined);
30
- clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
31
- execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
30
+ get store(): import("@ethlete/query").EntityStore<Entity> | null;
31
+ constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer, Entity> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer, Entity>, _routeWithParams: Route, _args: Arguments);
32
+ clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer, Entity>;
33
+ execute<ComputedResponse extends ReturnType<ResponseTransformer>, EntityResponse extends ResponseTransformer extends (response: Response) => infer R ? R : Response>(options?: RunQueryOptions): this;
32
34
  abort(): this;
33
35
  poll(config: PollConfig): this;
34
36
  stopPolling(): this;
35
37
  pausePolling(): this;
36
38
  resumePolling(): this;
37
39
  private _updateUseResultInDependencies;
40
+ /**
41
+ * @internal
42
+ */
43
+ _destroy(): void;
38
44
  }
@@ -1,4 +1,5 @@
1
1
  import { Observable } from 'rxjs';
2
+ import { EntityStore, EntityStoreActionResult } from '../entity';
2
3
  import { AnyQueryCreator, QueryCreatorReturnType, ResponseTransformerType } from '../query-client';
3
4
  import { Method, PathParams, QueryParams, RequestError, RequestProgress } from '../request';
4
5
  import { Query } from './query';
@@ -16,7 +17,7 @@ export interface QueryAutoRefreshConfig {
16
17
  */
17
18
  windowFocus?: boolean;
18
19
  }
19
- export type QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = {
20
+ export type QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined, Entity> = {
20
21
  /**
21
22
  * The http method to use for the query.
22
23
  */
@@ -78,15 +79,33 @@ export type QueryConfigBase<Response, Arguments extends BaseArguments | undefine
78
79
  */
79
80
  args?: Arguments;
80
81
  };
82
+ entity?: {
83
+ store: EntityStore<Entity>;
84
+ successAction: (data: {
85
+ rawResponse: Response;
86
+ response: ResponseTransformer extends (response: Response) => infer R ? R : Response;
87
+ args: Arguments;
88
+ store: EntityStore<Entity>;
89
+ }) => EntityStoreActionResult | null | Array<EntityStoreActionResult | null>;
90
+ valueUpdater?: (data: {
91
+ rawResponse: Response;
92
+ response: ResponseTransformer extends (response: Response) => infer R ? R : Response;
93
+ args: Arguments;
94
+ entity: Entity;
95
+ }) => {
96
+ rawResponse: Response;
97
+ response: ResponseTransformer extends (response: Response) => infer R ? R : Response;
98
+ } | null;
99
+ };
81
100
  };
82
- export type RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = QueryConfigBase<Response, Arguments, ResponseTransformer> & {
101
+ export type RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined, Entity> = QueryConfigBase<Response, Arguments, ResponseTransformer, Entity> & {
83
102
  /**
84
103
  * The api route to use for the query.
85
104
  */
86
105
  route: Route;
87
106
  };
88
107
  export type GqlTransferOption = 'GET' | 'POST';
89
- export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
108
+ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined, Entity> extends QueryConfigBase<Response, Arguments, ResponseTransformer, Entity> {
90
109
  /**
91
110
  * The graphql query to use for the query.
92
111
  */
@@ -103,10 +122,10 @@ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined,
103
122
  */
104
123
  route?: Route;
105
124
  }
106
- export type AnyRestQueryConfig = RestQueryConfig<any, any, any, any>;
107
- export type AnyGqlQueryConfig = GqlQueryConfig<any, any, any, any>;
108
- export type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<RestQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
109
- export type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
125
+ export type AnyRestQueryConfig = RestQueryConfig<any, any, any, any, any>;
126
+ export type AnyGqlQueryConfig = GqlQueryConfig<any, any, any, any, any>;
127
+ export type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined, Entity> = Omit<RestQueryConfig<Route, Response, Arguments, ResponseTransformer, Entity>, 'method'>;
128
+ export type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined, Entity> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer, Entity>, 'method'>;
110
129
  export type BaseArguments = WithHeaders & WithVariables & WithBody & WithQueryParams & WithPathParams;
111
130
  export interface WithHeaders {
112
131
  headers?: Record<string, string>;
@@ -124,7 +143,7 @@ export interface WithPathParams {
124
143
  pathParams?: PathParams;
125
144
  }
126
145
  export type WithUseResultIn<Response, ResponseTransformer extends ResponseTransformerType<Response>> = {
127
- useResultIn?: Query<Response, any, any, any, ResponseTransformer>[];
146
+ useResultIn?: Query<Response, any, any, any, ResponseTransformer, any>[];
128
147
  };
129
148
  export type QueryTrigger = 'program' | 'poll' | 'auto';
130
149
  export type EmptyObject = {};
@@ -207,7 +226,7 @@ export interface QueryStateSuccessMeta extends QueryStateMeta {
207
226
  export type QueryState<Response = unknown, RawResponse = unknown> = Loading | Success<Response, RawResponse> | Failure | Cancelled | Prepared;
208
227
  export type QueryStateData<T extends QueryState = QueryState> = T extends Success<infer Response> ? Response : never;
209
228
  export type QueryStateRawData<T extends QueryState = QueryState> = T extends Success<infer Response, infer RawResponse> ? RawResponse : never;
210
- export type AnyQuery = Query<any, any, any, any, any>;
229
+ export type AnyQuery = Query<any, any, any, any, any, any>;
211
230
  export type QueryType<T extends {
212
231
  prepare: (args: any) => AnyQuery;
213
232
  }> = T['prepare'] extends () => infer R ? R : T['prepare'] extends (args: any) => infer R ? R : never;
@@ -1,5 +1,6 @@
1
+ import { Paginated } from '@ethlete/types';
1
2
  import { BehaviorSubject, Observable } from 'rxjs';
2
- import { AnyQueryCreator, QueryClient, QueryCreator, QueryCreatorArgs, QueryCreatorMethod, QueryCreatorResponse, QueryCreatorResponseTransformer, ResponseTransformerType } from '../query-client';
3
+ import { AnyQueryCreator, QueryClient, QueryCreator, QueryCreatorArgs, QueryCreatorEntity, QueryCreatorMethod, QueryCreatorResponse, QueryCreatorResponseTransformer, ResponseTransformerType } from '../query-client';
3
4
  import { Method, RequestHeaders, RequestHeadersMethodMap } from '../request';
4
5
  import { AnyGqlQueryConfig, AnyQuery, AnyQueryCreatorCollection, AnyQueryOfCreatorCollection, AnyRestQueryConfig, BaseArguments, Cancelled, Failure, GqlQueryConfig, Loading, Prepared, QueryRawResponseType, QueryResponseType, QueryState, QueryStateData, QueryStateRawData, QueryStateType, RouteType, Success } from './query.types';
5
6
  type OmitNull<T> = T extends null ? never : T;
@@ -14,7 +15,7 @@ export declare function filterNull(): <T>(source: Observable<T>) => Observable<O
14
15
  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>;
15
16
  export declare function switchQueryCollectionState(): <T extends {
16
17
  type: string;
17
- query: import("@ethlete/query").Query<any, any, any, any, any>;
18
+ query: import("@ethlete/query").Query<any, any, any, any, any, any>;
18
19
  } | 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>;
19
20
  export declare const isQueryStateLoading: (state: QueryState | null | undefined) => state is Loading;
20
21
  export declare const isQueryStateSuccess: (state: QueryState | null | undefined) => state is Success<unknown, unknown>;
@@ -23,19 +24,19 @@ export declare const isQueryStateCancelled: (state: QueryState | null | undefine
23
24
  export declare const isQueryStatePrepared: (state: QueryState | null | undefined) => state is Prepared;
24
25
  export declare const isAutoRefresh: (state: QueryState | null | undefined) => boolean;
25
26
  export declare const mergeHeaders: (...headers: Array<RequestHeaders | null | undefined>) => RequestHeaders | null | undefined;
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>;
27
+ export declare const isGqlQueryConfig: <Response_1, Arguments extends BaseArguments | undefined, Route extends RouteType<Arguments> | undefined, ResponseTransformer extends ResponseTransformerType<Response_1> | undefined, Entity = unknown>(config: unknown) => config is GqlQueryConfig<Route, Response_1, Arguments, ResponseTransformer, Entity>;
27
28
  export declare const isQuery: <T extends AnyQuery>(query: unknown) => query is T;
28
29
  export declare const createQueryCollection: <T extends AnyQueryCreatorCollection, R extends AnyQueryOfCreatorCollection<T>>(queryMap: T) => BehaviorSubject<R | null>;
29
30
  export declare const extractQuery: <T extends AnyQuery | {
30
31
  type: string;
31
- query: import("@ethlete/query").Query<any, any, any, any, any>;
32
- } | null>(v: T) => import("@ethlete/query").Query<any, any, any, any, any> | null;
32
+ query: import("@ethlete/query").Query<any, any, any, any, any, any>;
33
+ } | null>(v: T) => import("@ethlete/query").Query<any, any, any, any, any, any> | null;
33
34
  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
+ 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>, Entity extends QueryCreatorEntity<QC>, OverrideArguments extends BaseArguments | undefined, OverrideResponse extends Response_1 | undefined>(config: {
35
36
  creator: QC;
36
37
  args?: OverrideArguments | undefined;
37
38
  response?: OverrideResponse | undefined;
38
- }) => QueryCreator<OverrideArguments, Method_1, OverrideResponse, Route, ResponseTransformer>;
39
+ }) => QueryCreator<OverrideArguments, Method_1, OverrideResponse, Route, ResponseTransformer, Entity>;
39
40
  export declare const computeQueryMethod: (config: {
40
41
  config: AnyRestQueryConfig | AnyGqlQueryConfig;
41
42
  client: QueryClient;
@@ -60,4 +61,17 @@ export declare const computeQueryQueryParams: (config: {
60
61
  client: QueryClient;
61
62
  args?: BaseArguments | undefined;
62
63
  }) => import("../request").QueryParams | undefined;
64
+ export declare const paginatedEntityValueUpdater: <T extends Paginated<unknown>, Args extends BaseArguments, Entity, J extends T extends Paginated<infer X> ? X : never>(findFn: (val: J, entity: Entity) => boolean) => ({ response, rawResponse, entity }: {
65
+ rawResponse: T;
66
+ response: T;
67
+ args: Args;
68
+ entity: Entity;
69
+ }) => {
70
+ response: T & {
71
+ items: unknown[];
72
+ };
73
+ rawResponse: T & {
74
+ items: unknown[];
75
+ };
76
+ } | null;
63
77
  export {};
@@ -10,14 +10,14 @@ export declare class QueryClient {
10
10
  get authProvider$(): import("rxjs").Observable<AuthProvider | null>;
11
11
  private readonly _authProvider$;
12
12
  constructor(_clientConfig: QueryClientConfig);
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>;
13
+ get: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "GET", Response_1, Route, ResponseTransformer, Entity>;
14
+ post: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "POST", Response_1, Route, ResponseTransformer, Entity>;
15
+ put: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "PUT", Response_1, Route, ResponseTransformer, Entity>;
16
+ patch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "PATCH", Response_1, Route, ResponseTransformer, Entity>;
17
+ delete: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: QueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "DELETE", Response_1, Route, ResponseTransformer, Entity>;
18
+ gqlQuery: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "GQL_QUERY", Response_1, Route, ResponseTransformer, Entity>;
19
+ gqlMutate: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined = undefined, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, "GQL_MUTATE", Response_1, Route, ResponseTransformer, Entity>;
20
+ fetch: <Route extends RouteType<Arguments>, Response_1, Arguments extends BaseArguments | undefined, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response_1> = DefaultResponseTransformer<Response_1>, Entity = unknown>(queryConfig: RestQueryConfig<Route, Response_1, Arguments, ResponseTransformer, Entity> | GqlQueryConfig<Route, Response_1, Arguments, ResponseTransformer, Entity>) => QueryCreator<Arguments, Method, Response_1, Route, ResponseTransformer, Entity>;
21
21
  setAuthProvider: (authProvider: AuthProvider) => void;
22
22
  setDefaultHeaders: (config: {
23
23
  headers: RequestHeaders | RequestHeadersMethodMap | null;
@@ -73,19 +73,21 @@ export interface QueryClientConfig {
73
73
  */
74
74
  parent?: QueryClient;
75
75
  }
76
- export type QueryCreator<Arguments extends BaseArguments | undefined, Method extends MethodType, Response, Route extends RouteType<Arguments>, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> = (Arguments extends BaseArguments ? {
77
- prepare: (args: Arguments & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
76
+ export type QueryCreator<Arguments extends BaseArguments | undefined, Method extends MethodType, Response, Route extends RouteType<Arguments>, ResponseTransformer extends ResponseTransformerType<Response>, Entity> = (Arguments extends BaseArguments ? {
77
+ prepare: (args: Arguments & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer, Entity>;
78
78
  } : {
79
- prepare: (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
79
+ prepare: (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders & WithUseResultIn<Response, ResponseTransformer>) => Query<Response, Arguments, Route, Method, ResponseTransformer, Entity>;
80
80
  }) & {
81
- behaviorSubject: <T extends Query<Response, Arguments, Route, Method, ResponseTransformer>>(initialValue?: T | null) => BehaviorSubject<T | null>;
81
+ behaviorSubject: <T extends Query<Response, Arguments, Route, Method, ResponseTransformer, Entity>>(initialValue?: T | null) => BehaviorSubject<T | null>;
82
82
  };
83
- export type AnyQueryCreator = QueryCreator<any, any, any, any, any>;
84
- export type QueryCreatorArgs<T extends AnyQueryCreator> = T extends QueryCreator<infer Args, any, any, any, any> ? Args : never;
85
- export type QueryCreatorMethod<Q extends AnyQueryCreator> = Q extends QueryCreator<any, infer Method, any, any, any> ? Method : never;
86
- export type QueryCreatorResponse<T extends AnyQueryCreator> = T extends QueryCreator<any, any, infer Response, any, any> ? Response : never;
87
- export type QueryCreatorRoute<Q extends AnyQueryCreator> = Q extends QueryCreator<infer Args, any, any, any, any> ? RouteType<Args> : never;
88
- export type QueryCreatorResponseTransformer<Q extends AnyQueryCreator> = Q extends QueryCreator<any, any, any, any, infer ResponseTransformer> ? ResponseTransformer : never;
83
+ export type AnyQueryCreator = QueryCreator<any, any, any, any, any, any>;
84
+ export type QueryCreatorArgs<T extends AnyQueryCreator> = T extends QueryCreator<infer Args, any, any, any, any, any> ? Args : never;
85
+ export type QueryCreatorMethod<Q extends AnyQueryCreator> = Q extends QueryCreator<any, infer Method, any, any, any, any> ? Method : never;
86
+ export type QueryCreatorResponse<T extends AnyQueryCreator> = T extends QueryCreator<any, any, infer Response, any, any, any> ? Response : never;
87
+ export type QueryCreatorRoute<Q extends AnyQueryCreator> = Q extends QueryCreator<infer Args, any, any, any, any, any> ? RouteType<Args> : never;
88
+ export type QueryCreatorResponseTransformer<Q extends AnyQueryCreator> = Q extends QueryCreator<any, any, any, any, infer ResponseTransformer, any> ? ResponseTransformer : never;
89
+ export type QueryCreatorEntity<Q extends AnyQueryCreator> = Q extends QueryCreator<any, any, any, any, any, infer Entity> ? Entity : never;
89
90
  export type ResponseTransformerType<Response> = (response: Response) => unknown;
90
91
  export type DefaultResponseTransformer<Response> = (response: Response) => Response;
92
+ export type ResponseTransformerReturnType<T, J> = T extends (response: Response) => infer R ? R : J;
91
93
  export type QueryCreatorReturnType<T extends AnyQueryCreator> = ReturnType<T['prepare']>;
@@ -1,4 +1,4 @@
1
- import { BaseArguments, GqlQueryConfig } from '../query/query.types';
1
+ import { AnyGqlQueryConfig, BaseArguments } from '../query/query.types';
2
2
  import { Method } from '../request';
3
3
  export declare const shouldCacheQuery: (method: Method) => boolean;
4
- export declare const buildGqlCacheKey: (config: GqlQueryConfig<any, any, any, any>, args: BaseArguments | undefined) => string;
4
+ export declare const buildGqlCacheKey: (config: AnyGqlQueryConfig, args: BaseArguments | undefined) => string;
@@ -10,7 +10,9 @@ export type ParamPrimitive = string | number | boolean | null | undefined;
10
10
  export type Params = Record<string | number | symbol, ParamPrimitive | ParamArray>;
11
11
  export type ParamArray = Array<ParamPrimitive>;
12
12
  export type UnfilteredParamPrimitive = string | number | boolean | null | undefined;
13
- export type QueryParams = Record<string | number | symbol, UnfilteredParamPrimitive | UnfilteredParamArray>;
13
+ export type QueryParams = {
14
+ [key: string | number | symbol]: UnfilteredParamPrimitive | UnfilteredParamArray | QueryParams;
15
+ };
14
16
  export type PathParams = Record<string, string | number>;
15
17
  export type UnfilteredParamArray = Array<UnfilteredParamPrimitive>;
16
18
  export type CacheAdapterFn = (headers: RequestHeaders) => number | null;
@@ -8,6 +8,7 @@ export declare const buildRoute: (options: {
8
8
  }) => string;
9
9
  export declare const buildQueryString: (params: QueryParams) => string | null;
10
10
  export declare const buildQueryArrayString: (key: string, array: ParamArray) => string;
11
+ export declare const buildQueryObjectString: (key: string, object: QueryParams) => string;
11
12
  export declare const isFetchResponse: (response: unknown) => response is Response;
12
13
  export declare const filterInvalidParams: (params: QueryParams) => Params;
13
14
  export declare const isParamValid: (primitive: UnfilteredParamPrimitive) => boolean;
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ethlete/query",
3
- "version": "2.5.4",
3
+ "version": "2.7.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },
7
7
  "peerDependencies": {
8
8
  "@angular/common": "^15.2.1",
9
9
  "@angular/core": "^15.2.1",
10
- "@ethlete/core": "1.7.0"
10
+ "@ethlete/core": "1.8.0"
11
11
  },
12
12
  "module": "fesm2015/ethlete-query.mjs",
13
13
  "es2020": "fesm2020/ethlete-query.mjs",