@ethlete/query 0.1.0-next.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 (87) hide show
  1. package/README.md +7 -0
  2. package/esm2020/ethlete-query.mjs +5 -0
  3. package/esm2020/index.mjs +12 -0
  4. package/esm2020/lib/auth/auth-provider.types.mjs +2 -0
  5. package/esm2020/lib/auth/auth-provider.utils.mjs +22 -0
  6. package/esm2020/lib/auth/basic-auth-provider.mjs +16 -0
  7. package/esm2020/lib/auth/bearer-auth-provider.mjs +85 -0
  8. package/esm2020/lib/auth/custom-header-auth-provider.mjs +13 -0
  9. package/esm2020/lib/auth/index.mjs +6 -0
  10. package/esm2020/lib/directives/index.mjs +4 -0
  11. package/esm2020/lib/directives/infinity-query-trigger.directive.mjs +54 -0
  12. package/esm2020/lib/directives/infinity-query.directive.mjs +129 -0
  13. package/esm2020/lib/directives/query.directive.mjs +101 -0
  14. package/esm2020/lib/gql/gql.mjs +23 -0
  15. package/esm2020/lib/gql/index.mjs +2 -0
  16. package/esm2020/lib/infinite-query/index.mjs +4 -0
  17. package/esm2020/lib/infinite-query/infinity-query.mjs +161 -0
  18. package/esm2020/lib/infinite-query/infinity-query.types.mjs +2 -0
  19. package/esm2020/lib/infinite-query/infinity-query.utils.mjs +3 -0
  20. package/esm2020/lib/logger/index.mjs +2 -0
  21. package/esm2020/lib/logger/logger.mjs +16 -0
  22. package/esm2020/lib/query/index.mjs +4 -0
  23. package/esm2020/lib/query/query.mjs +164 -0
  24. package/esm2020/lib/query/query.types.mjs +2 -0
  25. package/esm2020/lib/query/query.utils.mjs +42 -0
  26. package/esm2020/lib/query-client/index.mjs +4 -0
  27. package/esm2020/lib/query-client/query-client.mjs +88 -0
  28. package/esm2020/lib/query-client/query-client.types.mjs +2 -0
  29. package/esm2020/lib/query-client/query-client.utils.mjs +16 -0
  30. package/esm2020/lib/query-form/index.mjs +4 -0
  31. package/esm2020/lib/query-form/query-form.mjs +121 -0
  32. package/esm2020/lib/query-form/query-form.types.mjs +2 -0
  33. package/esm2020/lib/query-form/query-form.utils.mjs +74 -0
  34. package/esm2020/lib/query-store/index.mjs +2 -0
  35. package/esm2020/lib/query-store/query-store.mjs +64 -0
  36. package/esm2020/lib/request/index.mjs +4 -0
  37. package/esm2020/lib/request/request.mjs +19 -0
  38. package/esm2020/lib/request/request.types.mjs +2 -0
  39. package/esm2020/lib/request/request.util.mjs +206 -0
  40. package/esm2020/lib/utils/deep-freeze.util.mjs +13 -0
  41. package/esm2020/lib/utils/def.util.mjs +8 -0
  42. package/esm2020/lib/utils/index.mjs +3 -0
  43. package/fesm2015/ethlete-query.mjs +1393 -0
  44. package/fesm2015/ethlete-query.mjs.map +1 -0
  45. package/fesm2020/ethlete-query.mjs +1412 -0
  46. package/fesm2020/ethlete-query.mjs.map +1 -0
  47. package/index.d.ts +11 -0
  48. package/lib/auth/auth-provider.types.d.ts +103 -0
  49. package/lib/auth/auth-provider.utils.d.ts +8 -0
  50. package/lib/auth/basic-auth-provider.d.ts +12 -0
  51. package/lib/auth/bearer-auth-provider.d.ts +21 -0
  52. package/lib/auth/custom-header-auth-provider.d.ts +11 -0
  53. package/lib/auth/index.d.ts +5 -0
  54. package/lib/directives/index.d.ts +3 -0
  55. package/lib/directives/infinity-query-trigger.directive.d.ts +15 -0
  56. package/lib/directives/infinity-query.directive.d.ts +43 -0
  57. package/lib/directives/query.directive.d.ts +36 -0
  58. package/lib/gql/gql.d.ts +2 -0
  59. package/lib/gql/index.d.ts +1 -0
  60. package/lib/infinite-query/index.d.ts +3 -0
  61. package/lib/infinite-query/infinity-query.d.ts +32 -0
  62. package/lib/infinite-query/infinity-query.types.d.ts +91 -0
  63. package/lib/infinite-query/infinity-query.utils.d.ts +5 -0
  64. package/lib/logger/index.d.ts +1 -0
  65. package/lib/logger/logger.d.ts +12 -0
  66. package/lib/query/index.d.ts +3 -0
  67. package/lib/query/query.d.ts +24 -0
  68. package/lib/query/query.types.d.ts +128 -0
  69. package/lib/query/query.utils.d.ts +14 -0
  70. package/lib/query-client/index.d.ts +3 -0
  71. package/lib/query-client/query-client.d.ts +22 -0
  72. package/lib/query-client/query-client.types.d.ts +47 -0
  73. package/lib/query-client/query-client.utils.d.ts +4 -0
  74. package/lib/query-form/index.d.ts +3 -0
  75. package/lib/query-form/query-form.d.ts +30 -0
  76. package/lib/query-form/query-form.types.d.ts +43 -0
  77. package/lib/query-form/query-form.utils.d.ts +8 -0
  78. package/lib/query-store/index.d.ts +1 -0
  79. package/lib/query-store/query-store.d.ts +18 -0
  80. package/lib/request/index.d.ts +3 -0
  81. package/lib/request/request.d.ts +9 -0
  82. package/lib/request/request.types.d.ts +16 -0
  83. package/lib/request/request.util.d.ts +20 -0
  84. package/lib/utils/deep-freeze.util.d.ts +1 -0
  85. package/lib/utils/def.util.d.ts +7 -0
  86. package/lib/utils/index.d.ts +2 -0
  87. package/package.json +34 -0
@@ -0,0 +1,91 @@
1
+ import { BaseArguments } from '../query';
2
+ import { AnyQueryCreator } from '../query-client';
3
+ export declare type InfinityQueryParamLocation = 'path' | 'query' | 'body' | 'header' | 'variable';
4
+ export declare type AppendItemsLocation = 'start' | 'end';
5
+ export interface PageParamCalculatorOptions {
6
+ page: number;
7
+ totalPages: number | null;
8
+ itemsPerPage: number;
9
+ }
10
+ export interface TotalPagesExtractorOptions<QueryResponse> {
11
+ response: QueryResponse;
12
+ itemsPerPage: number;
13
+ }
14
+ export interface InfinityQueryConfig<QueryCreator extends AnyQueryCreator, Arguments extends BaseArguments, QueryResponse, InfinityResponse extends unknown[]> {
15
+ /**
16
+ * The query creator to use for fetching pages.
17
+ */
18
+ queryCreator: QueryCreator;
19
+ /**
20
+ * The args that will be merged with the page arg.
21
+ */
22
+ defaultArgs?: Arguments;
23
+ pageParam?: {
24
+ /**
25
+ * The location where the page param is in request.
26
+ *
27
+ * @default "query"
28
+ */
29
+ location?: InfinityQueryParamLocation;
30
+ /**
31
+ * Used as page param name.
32
+ *
33
+ * @default "page"
34
+ */
35
+ key?: string;
36
+ /**
37
+ * A function that calculates the page value for the next request.
38
+ * E.g. if the pagination is done with a `skip` param, the `pageParamName` should be `skip` and this function should return the correct value.
39
+ */
40
+ valueCalculator?: (data: PageParamCalculatorOptions) => number;
41
+ };
42
+ limitParam?: {
43
+ /**
44
+ * The location where the limit param is in request.
45
+ *
46
+ * @default "query"
47
+ */
48
+ location?: InfinityQueryParamLocation;
49
+ /**
50
+ * Used as limit param name.
51
+ *
52
+ * @default "limit"
53
+ */
54
+ key?: string;
55
+ /**
56
+ * The value of the limit param.
57
+ *
58
+ * @default 10
59
+ */
60
+ value?: number;
61
+ };
62
+ response: {
63
+ /**
64
+ * Determines if the response should get reversed before appending to the data array.
65
+ *
66
+ * @default false
67
+ */
68
+ reverse?: boolean;
69
+ /**
70
+ * Determines where to put the new items in the data array.
71
+ *
72
+ * @default "end"
73
+ */
74
+ appendItemsTo?: AppendItemsLocation;
75
+ /**
76
+ * The type of the array that will be created by the infinite query.
77
+ */
78
+ arrayType: InfinityResponse;
79
+ /**
80
+ * A function that returns the data array from the response.
81
+ * This function should return the type provided in `responseArrayType`.
82
+ */
83
+ valueExtractor: (response: QueryResponse) => InfinityResponse;
84
+ /**
85
+ * The property in the response that contains the total page count.
86
+ *
87
+ * @default "totalPages"
88
+ */
89
+ totalPagesExtractor?: (data: TotalPagesExtractorOptions<QueryResponse>) => number;
90
+ };
91
+ }
@@ -0,0 +1,5 @@
1
+ import { QueryStateData } from '../query';
2
+ import { AnyQueryCreator, QueryCreatorArgs } from '../query-client';
3
+ import { InfinityQueryConfig, PageParamCalculatorOptions } from './infinity-query.types';
4
+ export declare const createInfinityQueryConfig: <QueryCreator extends AnyQueryCreator, Query extends ReturnType<QueryCreator["prepare"]>, Args extends QueryCreatorArgs<QueryCreator>, QueryResponse extends QueryStateData<Query["state"]>, InfinityResponse extends unknown[]>(config: InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>) => InfinityQueryConfig<QueryCreator, Args, QueryResponse, InfinityResponse>;
5
+ export declare const skipPaginationPageParamCalculator: ({ page, itemsPerPage }: PageParamCalculatorOptions) => number;
@@ -0,0 +1 @@
1
+ export * from './logger';
@@ -0,0 +1,12 @@
1
+ export declare const buildErrorMessage: (code: string, message: string) => string;
2
+ export declare class QueryError extends Error {
3
+ data?: unknown;
4
+ constructor(code: string, message: string, data?: unknown);
5
+ }
6
+ export declare const invalidBaseRouteError: (data: unknown) => QueryError;
7
+ export declare const invalidRouteError: (data: unknown) => QueryError;
8
+ export declare const pathParamsMissingInRouteFunctionError: (data: unknown) => QueryError;
9
+ export declare const queryStateAlreadyHasKeyError: (data: unknown) => QueryError;
10
+ export declare const queryStateDoesNotContainKeyError: (data: unknown) => QueryError;
11
+ export declare const queryStateCannotTransformError: (data: unknown) => QueryError;
12
+ export declare const invalidBodyError: (data: unknown) => QueryError;
@@ -0,0 +1,3 @@
1
+ export * from './query';
2
+ export * from './query.types';
3
+ export * from './query.utils';
@@ -0,0 +1,24 @@
1
+ import { DefaultResponseTransformer, QueryClient, ResponseTransformerType } from '../query-client';
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>> {
5
+ private _client;
6
+ private _queryConfig;
7
+ private _route;
8
+ private _args;
9
+ private _currentId;
10
+ private _abortController;
11
+ private _pollingSubscription;
12
+ private readonly _state$;
13
+ private get _nextId();
14
+ get state$(): import("rxjs").Observable<QueryState<ReturnType<ResponseTransformer>, Response>>;
15
+ get state(): QueryState<ReturnType<ResponseTransformer>, Response>;
16
+ get isExpired(): boolean;
17
+ constructor(_client: QueryClient, _queryConfig: QueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _route: Route, _args: Arguments | undefined);
18
+ clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
19
+ execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
20
+ abort(): this;
21
+ poll(config: PollConfig): this;
22
+ stopPolling(): this;
23
+ private _handleExecuteError;
24
+ }
@@ -0,0 +1,128 @@
1
+ import { Observable } from 'rxjs';
2
+ import { ResponseTransformerType } from '../query-client';
3
+ import { Method, PathParams, QueryParams, RequestError } from '../request';
4
+ import { Query } from './query';
5
+ export interface QueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
6
+ /**
7
+ * The http method to use for the query.
8
+ */
9
+ method: Method;
10
+ /**
11
+ * The api route to use for the query.
12
+ */
13
+ route: Route;
14
+ /**
15
+ * Determines if the auth provider should be used for this query.
16
+ * The query **will throw** if the query client's auth provider is unset.
17
+ */
18
+ secure?: boolean;
19
+ /**
20
+ * The response transformer to use for the query.
21
+ * A function that transforms the response to the desired type.
22
+ */
23
+ responseTransformer?: ResponseTransformer;
24
+ /**
25
+ * Object containing the query's type information.
26
+ */
27
+ types?: {
28
+ /**
29
+ * The type of the successful response.
30
+ */
31
+ response?: Response;
32
+ /**
33
+ * Arguments for executing the query.
34
+ *
35
+ * - `pathParams`: The path parameters for the query. (in front of the ? in the url)
36
+ * - `queryParams`: The query parameters for the query. (after the ? in the url)
37
+ * - `body`: The body for the query. Unavailable for GET, HEAD and OPTIONS requests.
38
+ * - `headers`: The headers for the query.
39
+ */
40
+ args?: Arguments;
41
+ };
42
+ }
43
+ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
44
+ method: Method;
45
+ query: string;
46
+ route?: Route;
47
+ secure?: boolean;
48
+ responseTransformer?: ResponseTransformer;
49
+ types?: {
50
+ response?: Response;
51
+ args?: Arguments;
52
+ };
53
+ }
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;
57
+ export interface WithHeaders {
58
+ headers?: Record<string, string>;
59
+ }
60
+ export interface WithVariables {
61
+ variables?: Record<string, unknown>;
62
+ }
63
+ export interface WithBody {
64
+ body?: unknown;
65
+ }
66
+ export interface WithQueryParams {
67
+ queryParams?: QueryParams;
68
+ }
69
+ export interface WithPathParams {
70
+ pathParams?: PathParams;
71
+ }
72
+ export declare type EmptyObject = {};
73
+ export interface RunQueryOptions {
74
+ skipCache?: boolean;
75
+ }
76
+ export declare type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
77
+ pathParams: infer PathParams;
78
+ } ? (p: PathParams) => RouteString : RouteString;
79
+ export declare type RouteString = `/${string}`;
80
+ export interface PollConfig {
81
+ interval: number;
82
+ takeUntil: Observable<unknown>;
83
+ }
84
+ export declare const enum QueryStateType {
85
+ Prepared = "PREPARED",
86
+ Loading = "LOADING",
87
+ Success = "SUCCESS",
88
+ Failure = "FAILURE",
89
+ Cancelled = "CANCELLED"
90
+ }
91
+ export interface Prepared {
92
+ readonly type: QueryStateType.Prepared;
93
+ readonly meta: QueryStateMeta;
94
+ }
95
+ export interface Success<Response = unknown, RawResponse = unknown> {
96
+ readonly type: QueryStateType.Success;
97
+ readonly response: Response;
98
+ readonly rawResponse: RawResponse;
99
+ readonly meta: QueryStateSuccessMeta;
100
+ }
101
+ export interface Failure {
102
+ readonly type: QueryStateType.Failure;
103
+ readonly error: RequestError;
104
+ readonly meta: QueryStateMeta;
105
+ }
106
+ export interface Loading {
107
+ readonly type: QueryStateType.Loading;
108
+ readonly meta: QueryStateMeta;
109
+ }
110
+ export interface Cancelled {
111
+ readonly type: QueryStateType.Cancelled;
112
+ readonly meta: QueryStateMeta;
113
+ }
114
+ export interface QueryStateMeta {
115
+ readonly id: number;
116
+ }
117
+ export interface QueryStateSuccessMeta extends QueryStateMeta {
118
+ readonly expiresAt: number | null;
119
+ }
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 {
125
+ prepare: (args: any) => AnyQuery;
126
+ }> = 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;
@@ -0,0 +1,14 @@
1
+ import { Observable } from 'rxjs';
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
+ export declare function filterSuccess(): <T extends QueryState<unknown, unknown>, Response_1 extends QueryStateData<T>, RawResponse extends QueryStateRawData<T>>(source: Observable<T>) => Observable<Success<Response_1, RawResponse>>;
6
+ export declare function filterFailure(): <T extends QueryState<unknown, unknown>>(source: Observable<T>) => Observable<Failure>;
7
+ export declare function takeUntilResponse(): <T extends QueryState<unknown, unknown>>(source: Observable<T>) => Observable<T>;
8
+ export declare const isQueryStateLoading: (state: QueryState | null | undefined) => state is Loading;
9
+ export declare const isQueryStateSuccess: (state: QueryState | null | undefined) => state is Success<unknown, unknown>;
10
+ export declare const isQueryStateFailure: (state: QueryState | null | undefined) => state is Failure;
11
+ export declare const isQueryStateCancelled: (state: QueryState | null | undefined) => state is Cancelled;
12
+ export declare const isQueryStatePrepared: (state: QueryState | null | undefined) => state is Prepared;
13
+ export declare const mergeHeaders: (...headers: Array<RequestHeaders | null | undefined>) => RequestHeaders | null | undefined;
14
+ 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>;
@@ -0,0 +1,3 @@
1
+ export * from './query-client';
2
+ export * from './query-client.types';
3
+ export * from './query-client.utils';
@@ -0,0 +1,22 @@
1
+ import { AuthProvider } from '../auth';
2
+ import { BaseArguments, GqlQueryConfig, GqlQueryConfigWithoutMethod, QueryConfig, QueryConfigWithoutMethod, RouteType } from '../query';
3
+ import { Method as MethodType } from '../request';
4
+ import { DefaultResponseTransformer, QueryClientConfig, QueryCreator, ResponseTransformerType } from './query-client.types';
5
+ export declare class QueryClient {
6
+ private _clientConfig;
7
+ private readonly _store;
8
+ private _authProvider;
9
+ get config(): QueryClientConfig;
10
+ get authProvider(): AuthProvider | null;
11
+ 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>;
20
+ setAuthProvider: (authProvider: AuthProvider) => void;
21
+ clearAuthProvider: () => void;
22
+ }
@@ -0,0 +1,47 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { Query } from '../query/query';
3
+ import { BaseArguments, EmptyObject, RouteType, WithHeaders } from '../query/query.types';
4
+ import { CacheAdapterFn, Method as MethodType } from '../request';
5
+ export interface QueryClientConfig {
6
+ /**
7
+ * The api base route.
8
+ * @example 'https://api.example.com'
9
+ */
10
+ baseRoute: `https://${string}` | `http://localhost:${string}`;
11
+ /**
12
+ * Logging configuration for debugging.
13
+ */
14
+ logging?: {
15
+ /**
16
+ * Log all query state changes.
17
+ */
18
+ queryStateChanges?: boolean;
19
+ /**
20
+ * Log query state garbage collector runs.
21
+ */
22
+ queryStateGarbageCollector?: boolean;
23
+ };
24
+ /**
25
+ * Request options.
26
+ */
27
+ request?: {
28
+ /**
29
+ * Adapter function used for extracting the time until the response is invalid.
30
+ * The default uses the `cache-control` (`max-age` & `s-maxage`), `age` and `expires` headers.
31
+ * Should return a number in seconds.
32
+ */
33
+ cacheAdapter?: CacheAdapterFn;
34
+ };
35
+ }
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>;
38
+ } : {
39
+ prepare: (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders) => Query<Response, Arguments, Route, Method, ResponseTransformer>;
40
+ }) & {
41
+ behaviorSubject: <T extends Query<Response, Arguments, Route, Method, ResponseTransformer>>(initialValue?: T | null) => BehaviorSubject<T | null>;
42
+ };
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']>;
@@ -0,0 +1,4 @@
1
+ import { BaseArguments, GqlQueryConfig } from '../query/query.types';
2
+ import { Method } from '../request';
3
+ export declare const shouldCacheQuery: (method: Method) => boolean;
4
+ export declare const buildGqlCacheKey: (config: GqlQueryConfig<any, any, any, any>, args: BaseArguments | undefined) => string;
@@ -0,0 +1,3 @@
1
+ export * from './query-form';
2
+ export * from './query-form.utils';
3
+ export * from './query-form.types';
@@ -0,0 +1,30 @@
1
+ import { FormGroup } from '@angular/forms';
2
+ import { Observable } from 'rxjs';
3
+ import { QueryFormGroup, QueryFieldOptions, QueryFormValue } from './query-form.types';
4
+ export declare class QueryField<T> {
5
+ data: QueryFieldOptions<T>;
6
+ changes$: Observable<T | null>;
7
+ get control(): import("@angular/forms").FormControl<T | null>;
8
+ private _currentDebounceTimeout;
9
+ constructor(data: QueryFieldOptions<T>);
10
+ setValue(value: T | null): void;
11
+ private _setupChangesObservable;
12
+ }
13
+ export declare class QueryForm<T extends Record<string, QueryField<any>>> {
14
+ private _fields;
15
+ private _router;
16
+ private _activatedRoute;
17
+ private _defaultValues;
18
+ form: FormGroup<QueryFormGroup<T>>;
19
+ constructor(_fields: T);
20
+ observe(options?: {
21
+ syncViaUrlQueryParams?: boolean;
22
+ }): Observable<QueryFormValue<T>>;
23
+ setFormValueFromUrlQueryParams(): void;
24
+ updateFormOnUrlQueryParamsChange(): Observable<import("@angular/router").Params>;
25
+ private _getDefaultValue;
26
+ private _isDefaultValue;
27
+ private _setupFormGroup;
28
+ private _extractDefaultValues;
29
+ private _syncViaUrlQueryParams;
30
+ }
@@ -0,0 +1,43 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { QueryField } from './query-form';
3
+ export interface QueryFieldOptions<T = unknown> {
4
+ /**
5
+ * Debounce time in milliseconds.
6
+ */
7
+ debounce?: number;
8
+ /**
9
+ * The form control for the field.
10
+ */
11
+ control: FormControl<T | null>;
12
+ /**
13
+ * Append the field's value to the url.
14
+ *
15
+ * The field wont be appended to the url if one of the following is true:
16
+ * - It is the default value
17
+ * - It is an empty string
18
+ * - It is `null`
19
+ * - It is `undefined`
20
+ *
21
+ * @default true
22
+ */
23
+ appendToUrl?: boolean;
24
+ /**
25
+ * A function that transforms the the value gotten from the url query params to a value required by the field.
26
+ * E.g. for a number field, the value from the url query params is a string, but the field requires a number.
27
+ *
28
+ * The following common transformations are already implemented:
29
+ * - `transformToNumber`
30
+ * - `transformToNumberArray`
31
+ * - `transformToBoolean`
32
+ * - `transformToBooleanArray`
33
+ * - `transformToDate` (expects a string in the default js format)
34
+ * - `transformToDateArray` (expects strings in the default js format)
35
+ */
36
+ queryParamTransformFn?: (val: unknown) => T | null;
37
+ }
38
+ export declare type QueryFormGroup<T extends Record<string, QueryField<any>>> = {
39
+ [Property in keyof T]: T[Property]['control'];
40
+ };
41
+ export declare type QueryFormValue<T extends Record<string, QueryField<any>>> = {
42
+ [Property in keyof T]: T[Property]['control']['value'];
43
+ };
@@ -0,0 +1,8 @@
1
+ export declare const transformToString: (value: unknown) => string | null;
2
+ export declare const transformToStringArray: (value: unknown) => string[] | null;
3
+ export declare const transformToNumber: (value: unknown) => number | null;
4
+ export declare const transformToNumberArray: (value: unknown) => number[] | null;
5
+ export declare const transformToBoolean: (value: unknown) => boolean | null;
6
+ export declare const transformToBooleanArray: (value: unknown) => boolean[] | null;
7
+ export declare const transformToDate: (value: unknown) => Date | null;
8
+ export declare const transformToDateArray: (value: unknown) => Date[] | null;
@@ -0,0 +1 @@
1
+ export * from './query-store';
@@ -0,0 +1,18 @@
1
+ import { AnyQuery } from '../query';
2
+ export declare class QueryStore {
3
+ private _config?;
4
+ private readonly _store;
5
+ private _garbageCollector;
6
+ constructor(_config?: {
7
+ enableChangeLogging?: boolean | undefined;
8
+ enableGarbageCollectorLogging?: boolean | undefined;
9
+ } | undefined);
10
+ add(id: string, query: AnyQuery): void;
11
+ get(id: string): AnyQuery | null;
12
+ remove(id: string): void;
13
+ private _logState;
14
+ private _initGarbageCollector;
15
+ private _stopGarbageCollector;
16
+ private _runGarbageCollector;
17
+ private _logGarbageCollector;
18
+ }
@@ -0,0 +1,3 @@
1
+ export * from './request';
2
+ export * from './request.types';
3
+ export * from './request.util';
@@ -0,0 +1,9 @@
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
+ }>;
@@ -0,0 +1,16 @@
1
+ export declare type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT' | 'PURGE' | 'LINK' | 'UNLINK' | 'GQL_QUERY' | 'GQL_MUTATE' | 'CUSTOM';
2
+ export interface RequestError<Detail = unknown> {
3
+ code: number;
4
+ message: string;
5
+ detail: Detail;
6
+ raw: unknown;
7
+ }
8
+ export declare type ParamPrimitive = string | number | boolean | null | undefined;
9
+ export declare type Params = Record<string | number | symbol, ParamPrimitive | ParamArray>;
10
+ export declare type ParamArray = Array<ParamPrimitive>;
11
+ export declare type UnfilteredParamPrimitive = string | number | boolean | null | undefined;
12
+ export declare type QueryParams = Record<string | number | symbol, UnfilteredParamPrimitive | UnfilteredParamArray>;
13
+ export declare type PathParams = Record<string, string | number>;
14
+ export declare type UnfilteredParamArray = Array<UnfilteredParamPrimitive>;
15
+ export declare type CacheAdapterFn = (headers: Headers) => number | null;
16
+ export declare type RequestHeaders = Record<string, string>;
@@ -0,0 +1,20 @@
1
+ import { QueryParams, Params, RequestError, ParamArray, UnfilteredParamPrimitive, Method } from './request.types';
2
+ export declare const isRequestError: (error: unknown) => error is RequestError<unknown>;
3
+ export declare const isAbortRequestError: (error: unknown) => error is RequestError<unknown>;
4
+ export declare const buildRoute: (options: {
5
+ base: string;
6
+ route: string | ((args: Record<string, unknown>) => string) | null | undefined;
7
+ pathParams?: Record<string, unknown> | undefined;
8
+ queryParams?: QueryParams | undefined;
9
+ }) => string;
10
+ export declare const buildQueryString: (params: QueryParams) => string | null;
11
+ export declare const buildQueryArrayString: (key: string, array: ParamArray) => string;
12
+ export declare const isFetchResponse: (response: unknown) => response is Response;
13
+ export declare const filterInvalidParams: (params: QueryParams) => Params;
14
+ export declare const isParamValid: (primitive: UnfilteredParamPrimitive) => boolean;
15
+ export declare const extractExpiresInSeconds: (headers: Headers) => number | null;
16
+ export declare const buildTimestampFromSeconds: (seconds: number | null) => number | null;
17
+ export declare const buildRequestError: <ErrorResponse = unknown>(error: unknown) => Promise<RequestError<null> | RequestError<ErrorResponse>>;
18
+ export declare const buildBody: (body: unknown) => string | FormData | null;
19
+ export declare const transformMethod: (method: Method) => "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT" | "PURGE" | "LINK" | "UNLINK" | "CUSTOM";
20
+ export declare const guessContentType: (body: unknown) => "text/plain" | "multipart/form-data" | "application/json" | null;
@@ -0,0 +1 @@
1
+ export declare const deepFreeze: <T extends Record<string, unknown>>(object: T) => Readonly<T>;
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Dummy function for providing types while not breaking inference.
3
+ * **This function always returns null.**
4
+ * @see https://github.com/microsoft/TypeScript/issues/26242
5
+ * @returns null
6
+ */
7
+ export declare const def: <Data>() => Data;
@@ -0,0 +1,2 @@
1
+ export * from './deep-freeze.util';
2
+ export * from './def.util';
package/package.json ADDED
@@ -0,0 +1,34 @@
1
+ {
2
+ "name": "@ethlete/query",
3
+ "version": "0.1.0-next.0",
4
+ "dependencies": {
5
+ "tslib": "^2.3.0"
6
+ },
7
+ "peerDependencies": {
8
+ "@angular/common": "^14.2.0",
9
+ "@angular/core": "^14.2.0",
10
+ "rxjs": "7.5.7",
11
+ "@angular/forms": "14.2.8",
12
+ "@angular/router": "14.2.8"
13
+ },
14
+ "module": "fesm2015/ethlete-query.mjs",
15
+ "es2020": "fesm2020/ethlete-query.mjs",
16
+ "esm2020": "esm2020/ethlete-query.mjs",
17
+ "fesm2020": "fesm2020/ethlete-query.mjs",
18
+ "fesm2015": "fesm2015/ethlete-query.mjs",
19
+ "typings": "index.d.ts",
20
+ "exports": {
21
+ "./package.json": {
22
+ "default": "./package.json"
23
+ },
24
+ ".": {
25
+ "types": "./index.d.ts",
26
+ "esm2020": "./esm2020/ethlete-query.mjs",
27
+ "es2020": "./fesm2020/ethlete-query.mjs",
28
+ "es2015": "./fesm2015/ethlete-query.mjs",
29
+ "node": "./fesm2015/ethlete-query.mjs",
30
+ "default": "./fesm2020/ethlete-query.mjs"
31
+ }
32
+ },
33
+ "sideEffects": false
34
+ }