@ethlete/query 5.16.0 → 5.16.2

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 (184) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/esm2022/ethlete-query.mjs +5 -0
  3. package/esm2022/index.mjs +20 -0
  4. package/esm2022/lib/auth/auth-provider.types.mjs +2 -0
  5. package/esm2022/lib/auth/auth-provider.utils.mjs +25 -0
  6. package/esm2022/lib/auth/basic-auth-provider.mjs +15 -0
  7. package/esm2022/lib/auth/bearer-auth-provider.mjs +168 -0
  8. package/esm2022/lib/auth/custom-header-auth-provider.mjs +12 -0
  9. package/esm2022/lib/auth/index.mjs +6 -0
  10. package/esm2022/lib/class-validator/class-validator.types.mjs +2 -0
  11. package/esm2022/lib/class-validator/class-validator.utils.mjs +4 -0
  12. package/esm2022/lib/class-validator/index.mjs +3 -0
  13. package/esm2022/lib/devtools/components/query-devtools/index.mjs +2 -0
  14. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +297 -0
  15. package/esm2022/lib/devtools/pipes/index.mjs +2 -0
  16. package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +24 -0
  17. package/esm2022/lib/devtools/utils/index.mjs +2 -0
  18. package/esm2022/lib/devtools/utils/query-client.utils.mjs +13 -0
  19. package/esm2022/lib/directives/index.mjs +4 -0
  20. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +56 -0
  21. package/esm2022/lib/directives/infinity-query.directive.mjs +147 -0
  22. package/esm2022/lib/directives/query.directive.mjs +123 -0
  23. package/esm2022/lib/entity/entity-store.mjs +127 -0
  24. package/esm2022/lib/entity/entity.types.mjs +2 -0
  25. package/esm2022/lib/entity/entity.utils.mjs +29 -0
  26. package/esm2022/lib/entity/index.mjs +4 -0
  27. package/esm2022/lib/gql/gql.mjs +23 -0
  28. package/esm2022/lib/gql/index.mjs +2 -0
  29. package/esm2022/lib/infinite-query/index.mjs +4 -0
  30. package/esm2022/lib/infinite-query/infinity-query.mjs +171 -0
  31. package/esm2022/lib/infinite-query/infinity-query.types.mjs +2 -0
  32. package/esm2022/lib/infinite-query/infinity-query.utils.mjs +3 -0
  33. package/esm2022/lib/logger/index.mjs +2 -0
  34. package/esm2022/lib/logger/logger.mjs +16 -0
  35. package/esm2022/lib/query/index.mjs +4 -0
  36. package/esm2022/lib/query/query.mjs +430 -0
  37. package/esm2022/lib/query/query.types.mjs +2 -0
  38. package/esm2022/lib/query/query.utils.mjs +253 -0
  39. package/esm2022/lib/query-client/index.mjs +4 -0
  40. package/esm2022/lib/query-client/query-client.mjs +80 -0
  41. package/esm2022/lib/query-client/query-client.types.mjs +2 -0
  42. package/esm2022/lib/query-client/query-client.utils.mjs +20 -0
  43. package/esm2022/lib/query-creator/index.mjs +3 -0
  44. package/esm2022/lib/query-creator/query-creator.mjs +55 -0
  45. package/esm2022/lib/query-creator/query-creator.types.mjs +2 -0
  46. package/esm2022/lib/query-form/index.mjs +4 -0
  47. package/esm2022/lib/query-form/query-form.mjs +379 -0
  48. package/esm2022/lib/query-form/query-form.types.mjs +2 -0
  49. package/esm2022/lib/query-form/query-form.utils.mjs +97 -0
  50. package/esm2022/lib/query-store/index.mjs +2 -0
  51. package/esm2022/lib/query-store/query-store.mjs +144 -0
  52. package/esm2022/lib/request/index.mjs +4 -0
  53. package/esm2022/lib/request/request.mjs +196 -0
  54. package/esm2022/lib/request/request.types.mjs +2 -0
  55. package/esm2022/lib/request/request.util.mjs +252 -0
  56. package/esm2022/lib/symfony/index.mjs +3 -0
  57. package/esm2022/lib/symfony/symfony.types.mjs +2 -0
  58. package/esm2022/lib/symfony/symfony.utils.mjs +31 -0
  59. package/esm2022/lib/utils/data.utils.mjs +138 -0
  60. package/esm2022/lib/utils/deep-freeze.util.mjs +17 -0
  61. package/esm2022/lib/utils/def.util.mjs +8 -0
  62. package/esm2022/lib/utils/index.mjs +4 -0
  63. package/fesm2022/ethlete-query.mjs +3289 -0
  64. package/fesm2022/ethlete-query.mjs.map +1 -0
  65. package/{src/index.ts → index.d.ts} +0 -2
  66. package/lib/auth/auth-provider.types.d.ts +133 -0
  67. package/lib/auth/auth-provider.utils.d.ts +9 -0
  68. package/lib/auth/basic-auth-provider.d.ts +10 -0
  69. package/lib/auth/bearer-auth-provider.d.ts +23 -0
  70. package/lib/auth/custom-header-auth-provider.d.ts +9 -0
  71. package/{src/lib/class-validator/class-validator.types.ts → lib/class-validator/class-validator.types.d.ts} +3 -4
  72. package/lib/class-validator/class-validator.utils.d.ts +2 -0
  73. package/lib/devtools/components/query-devtools/query-devtools.component.d.ts +151 -0
  74. package/lib/devtools/pipes/query-short-name.pipe.d.ts +8 -0
  75. package/lib/devtools/utils/query-client.utils.d.ts +12 -0
  76. package/lib/directives/infinity-query-trigger.directive.d.ts +15 -0
  77. package/lib/directives/infinity-query.directive.d.ts +49 -0
  78. package/lib/directives/query.directive.d.ts +63 -0
  79. package/lib/entity/entity-store.d.ts +25 -0
  80. package/lib/entity/entity.types.d.ts +25 -0
  81. package/lib/entity/entity.utils.d.ts +12 -0
  82. package/lib/gql/gql.d.ts +6 -0
  83. package/lib/infinite-query/infinity-query.d.ts +29 -0
  84. package/lib/infinite-query/infinity-query.types.d.ts +104 -0
  85. package/lib/infinite-query/infinity-query.utils.d.ts +4 -0
  86. package/lib/logger/logger.d.ts +12 -0
  87. package/lib/query/query.d.ts +60 -0
  88. package/lib/query/query.types.d.ts +388 -0
  89. package/lib/query/query.utils.d.ts +82 -0
  90. package/lib/query-client/query-client.d.ts +29 -0
  91. package/lib/query-client/query-client.types.d.ts +82 -0
  92. package/lib/query-client/query-client.utils.d.ts +4 -0
  93. package/lib/query-creator/query-creator.d.ts +20 -0
  94. package/lib/query-creator/query-creator.types.d.ts +13 -0
  95. package/lib/query-form/query-form.d.ts +91 -0
  96. package/lib/query-form/query-form.types.d.ts +145 -0
  97. package/lib/query-form/query-form.utils.d.ts +13 -0
  98. package/lib/query-store/query-store.d.ts +31 -0
  99. package/lib/request/request.d.ts +3 -0
  100. package/lib/request/request.types.d.ts +126 -0
  101. package/lib/request/request.util.d.ts +92 -0
  102. package/lib/symfony/symfony.types.d.ts +19 -0
  103. package/lib/symfony/symfony.utils.d.ts +6 -0
  104. package/lib/utils/data.utils.d.ts +59 -0
  105. package/lib/utils/deep-freeze.util.d.ts +1 -0
  106. package/{src/lib/utils/def.util.ts → lib/utils/def.util.d.ts} +1 -1
  107. package/package.json +23 -6
  108. package/.eslintrc.json +0 -40
  109. package/jest.config.ts +0 -23
  110. package/ng-package.json +0 -8
  111. package/project.json +0 -37
  112. package/src/lib/auth/auth-provider.types.ts +0 -160
  113. package/src/lib/auth/auth-provider.utils.ts +0 -39
  114. package/src/lib/auth/basic-auth-provider.ts +0 -17
  115. package/src/lib/auth/bearer-auth-provider.ts +0 -243
  116. package/src/lib/auth/custom-header-auth-provider.ts +0 -13
  117. package/src/lib/class-validator/class-validator.utils.ts +0 -5
  118. package/src/lib/devtools/components/query-devtools/query-devtools.component.html +0 -402
  119. package/src/lib/devtools/components/query-devtools/query-devtools.component.scss +0 -360
  120. package/src/lib/devtools/components/query-devtools/query-devtools.component.ts +0 -427
  121. package/src/lib/devtools/pipes/query-short-name.pipe.ts +0 -24
  122. package/src/lib/devtools/utils/query-client.utils.ts +0 -25
  123. package/src/lib/directives/infinity-query-trigger.directive.ts +0 -58
  124. package/src/lib/directives/infinity-query.directive.ts +0 -208
  125. package/src/lib/directives/query.directive.ts +0 -201
  126. package/src/lib/entity/entity-store.ts +0 -180
  127. package/src/lib/entity/entity.types.ts +0 -34
  128. package/src/lib/entity/entity.utils.ts +0 -51
  129. package/src/lib/gql/gql.ts +0 -22
  130. package/src/lib/infinite-query/infinity-query.ts +0 -245
  131. package/src/lib/infinite-query/infinity-query.types.ts +0 -149
  132. package/src/lib/infinite-query/infinity-query.utils.ts +0 -14
  133. package/src/lib/logger/logger.ts +0 -30
  134. package/src/lib/query/query.ts +0 -631
  135. package/src/lib/query/query.types.ts +0 -532
  136. package/src/lib/query/query.utils.spec.ts +0 -92
  137. package/src/lib/query/query.utils.ts +0 -450
  138. package/src/lib/query-client/query-client.spec.ts +0 -77
  139. package/src/lib/query-client/query-client.ts +0 -195
  140. package/src/lib/query-client/query-client.types.ts +0 -101
  141. package/src/lib/query-client/query-client.utils.spec.ts +0 -61
  142. package/src/lib/query-client/query-client.utils.ts +0 -28
  143. package/src/lib/query-creator/query-creator.ts +0 -103
  144. package/src/lib/query-creator/query-creator.types.ts +0 -74
  145. package/src/lib/query-form/query-form.ts +0 -526
  146. package/src/lib/query-form/query-form.types.ts +0 -169
  147. package/src/lib/query-form/query-form.utils.ts +0 -116
  148. package/src/lib/query-store/query-store.ts +0 -192
  149. package/src/lib/request/request.ts +0 -253
  150. package/src/lib/request/request.types.ts +0 -164
  151. package/src/lib/request/request.util.spec.ts +0 -177
  152. package/src/lib/request/request.util.ts +0 -399
  153. package/src/lib/stories/angular-example-page.mdx +0 -85
  154. package/src/lib/stories/authentication-page.mdx +0 -35
  155. package/src/lib/stories/changelog-page.mdx +0 -9
  156. package/src/lib/stories/client-page.mdx +0 -100
  157. package/src/lib/stories/queries-page.mdx +0 -117
  158. package/src/lib/symfony/symfony.types.ts +0 -21
  159. package/src/lib/symfony/symfony.utils.ts +0 -43
  160. package/src/lib/utils/data.utils.ts +0 -280
  161. package/src/lib/utils/deep-freeze.util.ts +0 -21
  162. package/src/test-setup.ts +0 -1
  163. package/tsconfig.json +0 -29
  164. package/tsconfig.lib.json +0 -12
  165. package/tsconfig.lib.prod.json +0 -10
  166. package/tsconfig.spec.json +0 -11
  167. /package/{src/lib/auth/index.ts → lib/auth/index.d.ts} +0 -0
  168. /package/{src/lib/class-validator/index.ts → lib/class-validator/index.d.ts} +0 -0
  169. /package/{src/lib/devtools/components/query-devtools/index.ts → lib/devtools/components/query-devtools/index.d.ts} +0 -0
  170. /package/{src/lib/devtools/pipes/index.ts → lib/devtools/pipes/index.d.ts} +0 -0
  171. /package/{src/lib/devtools/utils/index.ts → lib/devtools/utils/index.d.ts} +0 -0
  172. /package/{src/lib/directives/index.ts → lib/directives/index.d.ts} +0 -0
  173. /package/{src/lib/entity/index.ts → lib/entity/index.d.ts} +0 -0
  174. /package/{src/lib/gql/index.ts → lib/gql/index.d.ts} +0 -0
  175. /package/{src/lib/infinite-query/index.ts → lib/infinite-query/index.d.ts} +0 -0
  176. /package/{src/lib/logger/index.ts → lib/logger/index.d.ts} +0 -0
  177. /package/{src/lib/query/index.ts → lib/query/index.d.ts} +0 -0
  178. /package/{src/lib/query-client/index.ts → lib/query-client/index.d.ts} +0 -0
  179. /package/{src/lib/query-creator/index.ts → lib/query-creator/index.d.ts} +0 -0
  180. /package/{src/lib/query-form/index.ts → lib/query-form/index.d.ts} +0 -0
  181. /package/{src/lib/query-store/index.ts → lib/query-store/index.d.ts} +0 -0
  182. /package/{src/lib/request/index.ts → lib/request/index.d.ts} +0 -0
  183. /package/{src/lib/symfony/index.ts → lib/symfony/index.d.ts} +0 -0
  184. /package/{src/lib/utils/index.ts → lib/utils/index.d.ts} +0 -0
@@ -0,0 +1,29 @@
1
+ import { AuthProvider } from '../auth';
2
+ import { EntityStore } from '../entity';
3
+ import { BaseArguments, GqlQueryConfig, GqlQueryConfigWithoutMethod, QueryConfigWithoutMethod, RestQueryConfig, RouteType } from '../query';
4
+ import { QueryCreator } from '../query-creator';
5
+ import { RequestHeaders, RequestHeadersMethodMap } from '../request';
6
+ import { QueryClientConfig } from './query-client.types';
7
+ export declare class QueryClient {
8
+ private _clientConfig;
9
+ get config(): QueryClientConfig;
10
+ get authProvider(): AuthProvider | null;
11
+ get authProvider$(): import("rxjs").Observable<AuthProvider | null>;
12
+ private readonly _authProvider$;
13
+ constructor(_clientConfig: QueryClientConfig);
14
+ get: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
15
+ post: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
16
+ put: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
17
+ patch: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
18
+ delete: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: QueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
19
+ gqlQuery: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
20
+ gqlMutate: <Route extends RouteType<Arguments>, Response, Id, Data = Response, Arguments extends BaseArguments | undefined = undefined, Store extends EntityStore<unknown> = EntityStore<unknown>>(queryConfig: GqlQueryConfigWithoutMethod<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
21
+ fetch: <Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, Id, Store extends EntityStore<unknown> = EntityStore<unknown>, Data = Response>(queryConfig: RestQueryConfig<Route, Response, Arguments, Store, Data, Id> | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>) => QueryCreator<Arguments, Response, Route, Store, Data, Id>;
22
+ setAuthProvider: (authProvider: AuthProvider) => void;
23
+ setDefaultHeaders: (config: {
24
+ headers: RequestHeaders | RequestHeadersMethodMap | null;
25
+ refreshQueriesInUse?: boolean;
26
+ }) => void;
27
+ clearAuthProvider: () => void;
28
+ _updateBaseRoute: (route: string) => void;
29
+ }
@@ -0,0 +1,82 @@
1
+ import { GqlTransferOption } from '../query/query.types';
2
+ import { BuildQueryStringConfig, CacheAdapterFn, RequestHeaders, RequestHeadersMethodMap, RequestRetryFn } from '../request';
3
+ import { QueryClient } from './query-client';
4
+ export interface QueryClientConfig {
5
+ /**
6
+ * The api base route. Should **not** end with a trailing slash.
7
+ * @example 'https://api.example.com'
8
+ */
9
+ baseRoute: string;
10
+ /**
11
+ * Logging configuration for debugging.
12
+ */
13
+ logging?: {
14
+ /**
15
+ * Log all query state changes.
16
+ */
17
+ queryStateChanges?: boolean;
18
+ /**
19
+ * Log query state garbage collector runs.
20
+ */
21
+ queryStateGarbageCollector?: boolean;
22
+ /**
23
+ * Log if subscriptions are made to queries that are in the `prepared` state.
24
+ * This usually indicates that the `.execute()` method was forgotten.
25
+ */
26
+ preparedQuerySubscriptions?: boolean;
27
+ };
28
+ /**
29
+ * Request options.
30
+ */
31
+ request?: {
32
+ /**
33
+ * Adapter function used for extracting the time until the response is invalid.
34
+ * The default uses the `cache-control` (`max-age` & `s-maxage`), `age` and `expires` headers.
35
+ * Should return a number in seconds.
36
+ */
37
+ cacheAdapter?: CacheAdapterFn;
38
+ /**
39
+ * Default headers to be sent with every request.
40
+ * Will be overridden by headers passed to the query.
41
+ * Do not include the `Authorization` header here. Use an `AuthProvider` instead.
42
+ */
43
+ headers?: RequestHeaders | RequestHeadersMethodMap;
44
+ /**
45
+ * Whether to automatically refresh expired queries when the window regains focus.
46
+ * @default true
47
+ */
48
+ autoRefreshQueriesOnWindowFocus?: boolean;
49
+ /**
50
+ * Whether to automatically stop polling queries when the window loses focus.
51
+ * Polling will resume when the window regains focus.
52
+ * @default true
53
+ */
54
+ enableSmartPolling?: boolean;
55
+ /**
56
+ * A retry function to be used for all queries.
57
+ * @default shouldRetryRequest()
58
+ */
59
+ retryFn?: RequestRetryFn;
60
+ /**
61
+ * Configuration options for all graphql queries.
62
+ */
63
+ gql?: {
64
+ /**
65
+ * Determines if the query should be sent via GET or POST.
66
+ * - `GET`: The query will be sent via query parameters.
67
+ * - `POST`: The query will be sent via the body.
68
+ * @default 'POST'
69
+ */
70
+ transferVia?: GqlTransferOption;
71
+ };
72
+ /**
73
+ * Configuration options for all query strings.
74
+ */
75
+ queryParams?: BuildQueryStringConfig;
76
+ };
77
+ /**
78
+ * Parent query client.
79
+ * Used for sharing the same auth provider.
80
+ */
81
+ parent?: QueryClient;
82
+ }
@@ -0,0 +1,4 @@
1
+ import { BaseArguments } from '../query/query.types';
2
+ import { Method } from '../request';
3
+ export declare const shouldCacheQuery: (method: Method) => method is "GET" | "HEAD" | "OPTIONS" | "GQL_QUERY";
4
+ export declare const buildQueryCacheKey: (route: string, args: BaseArguments | undefined) => string;
@@ -0,0 +1,20 @@
1
+ import { BehaviorSubject } from 'rxjs';
2
+ import { EntityStore } from '../entity';
3
+ import { QueryClient } from '../query-client';
4
+ import { QueryStore } from '../query-store';
5
+ import { BaseArguments, GqlQueryConfig, RestQueryConfig, RouteType } from '../query/query.types';
6
+ import { QueryContainerConfig } from '../utils';
7
+ import { QueryPrepareFn } from './query-creator.types';
8
+ export declare class QueryCreator<Arguments extends BaseArguments | undefined, Response, Route extends RouteType<Arguments>, Store extends EntityStore<unknown>, Data, Id> {
9
+ private _queryConfig;
10
+ private _client;
11
+ private _store;
12
+ constructor(_queryConfig: RestQueryConfig<Route, Response, Arguments, Store, Data, Id> | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>, _client: QueryClient, _store: QueryStore);
13
+ prepare: QueryPrepareFn<Arguments, Response, Route, Store, Data, Id>;
14
+ createSubject: (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => BehaviorSubject<ReturnType<QueryPrepareFn<Arguments, Response, Route, Store, Data, Id>> | null>;
15
+ createSignal: (initialValue?: ReturnType<typeof this.prepare> | null, config?: QueryContainerConfig) => import("@angular/core").WritableSignal<ReturnType<QueryPrepareFn<Arguments, Response, Route, Store, Data, Id>> | null>;
16
+ /**
17
+ * @deprecated Use `myQuery.createSubject()` or `myQuery.createSignal()` instead. Will be removed in v6.
18
+ */
19
+ behaviorSubject: (initialValue?: ReturnType<typeof this.prepare> | null) => BehaviorSubject<ReturnType<QueryPrepareFn<Arguments, Response, Route, Store, Data, Id>> | null>;
20
+ }
@@ -0,0 +1,13 @@
1
+ import { EntityStore } from '../entity';
2
+ import { Query } from '../query/query';
3
+ import { AnyQuery, BaseArguments, EmptyObject, RouteType, WithConfig, WithHeaders, WithMock } from '../query/query.types';
4
+ import { QueryCreator } from './query-creator';
5
+ export type QueryPrepareFn<Arguments extends BaseArguments | undefined, Response, Route extends RouteType<Arguments>, Store extends EntityStore<unknown>, Data, Id> = Arguments extends BaseArguments ? (args: Arguments & WithHeaders & WithConfig & WithMock<Response>) => Query<Response, Arguments, Route, Store, Data, Id> : (args?: (Arguments extends EmptyObject ? Arguments : EmptyObject) & WithHeaders & WithConfig & WithMock<Response>) => Query<Response, Arguments, Route, Store, Data, Id>;
6
+ export type AnyQueryCreator = QueryCreator<any, any, any, any, any, any>;
7
+ export type QueryArgsOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<infer Args, any, any, any, any, any> ? Args : T extends Query<any, infer Args, any, any, any, any> ? Args : never;
8
+ export type QueryResponseOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<any, infer Response, any, any, any, any> ? Response : T extends Query<infer Response, any, any, any, any, any> ? Response : never;
9
+ export type QueryRouteOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<any, any, infer Route, any, any, any> ? Route : T extends Query<any, any, infer Route, any, any, any> ? Route : never;
10
+ export type QueryStoreOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<any, any, any, infer Store, any, any> ? Store : T extends Query<any, any, any, infer Store, any, any> ? Store : never;
11
+ export type QueryDataOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<any, any, any, any, infer Data, any> ? Data : T extends Query<any, any, any, any, infer Data, any> ? Data : never;
12
+ export type QueryStoreIdOf<T extends AnyQueryCreator | AnyQuery | null> = T extends QueryCreator<any, any, any, any, any, infer StoreId> ? StoreId : T extends Query<any, any, any, any, any, infer StoreId> ? StoreId : never;
13
+ export type ConstructQuery<T extends AnyQueryCreator> = ReturnType<T['prepare']>;
@@ -0,0 +1,91 @@
1
+ import { FormGroup } from '@angular/forms';
2
+ import { QueryFieldOptions, QueryFormGroupControls, QueryFormObserveOptions, QueryFormValue, QueryFormValueEvent, QueryFormWriteOptions } from './query-form.types';
3
+ export declare class QueryField<T> {
4
+ data: QueryFieldOptions<T>;
5
+ get control(): import("@angular/forms").FormControl<T | null>;
6
+ constructor(data: QueryFieldOptions<T>);
7
+ }
8
+ export interface QueryFormOptions {
9
+ /**
10
+ * A prefix to use for the query parameters. This is useful when you have multiple query forms on the same page.
11
+ */
12
+ queryParamPrefix?: string | (() => string);
13
+ }
14
+ export type AnyQueryForm = QueryForm<any>;
15
+ export declare class QueryForm<T extends Record<string, QueryField<any>>> {
16
+ private _fields;
17
+ private _options?;
18
+ private readonly _destroy$;
19
+ private readonly _unobserveTrigger$;
20
+ private readonly _router;
21
+ private readonly _activatedRoute;
22
+ private readonly _defaultValues;
23
+ private readonly _routerStateService;
24
+ private readonly _zone;
25
+ private readonly _didValueChanges$;
26
+ private _isObserving;
27
+ private _skipNextResets;
28
+ /**
29
+ * The angular form group that contains all the fields.
30
+ *
31
+ * **Do not** use any of the following methods on this form group:
32
+ * - `setValue`: Use `QueryForm.setValue` instead.
33
+ * - `patchValue`: Use `QueryForm.patchValue` instead.
34
+ * - `valueChanges`: Use `QueryForm.changes$` instead.
35
+ * - `value`: Use `QueryForm.value` instead.
36
+ * - `controls`: Use `QueryForm.controls` instead.
37
+ */
38
+ readonly form: FormGroup<QueryFormGroupControls<T>>;
39
+ private readonly _lastFormValue$;
40
+ private readonly _currentFormValue$;
41
+ private get _formValue();
42
+ private get _form();
43
+ private readonly _changes$;
44
+ readonly changes$: import("rxjs").Observable<QueryFormValueEvent<T>>;
45
+ readonly currentValue$: import("rxjs").Observable<QueryFormValue<T>>;
46
+ readonly previousValue$: import("rxjs").Observable<QueryFormValue<T> | null>;
47
+ readonly changes: import("@angular/core").Signal<QueryFormValueEvent<T> | undefined>;
48
+ readonly currentValue: import("@angular/core").Signal<QueryFormValue<T> | undefined>;
49
+ readonly previousValue: import("@angular/core").Signal<QueryFormValue<T> | null | undefined>;
50
+ /**
51
+ * The number of active filters.
52
+ *
53
+ * Excludes the following fields by default:
54
+ * - `page`
55
+ * - `skip`
56
+ * - `take`
57
+ * - `limit`
58
+ * - `sort`
59
+ * - `sortBy`
60
+ * - `sortOrder`
61
+ * - `query`
62
+ * - `search`
63
+ */
64
+ readonly activeFilterCount$: import("rxjs").Observable<number>;
65
+ get controls(): 0 extends 1 & QueryFormGroupControls<T> ? {
66
+ [key: string]: import("@angular/forms").AbstractControl<any, any>;
67
+ } : QueryFormGroupControls<T>;
68
+ get value(): QueryFormValue<T>;
69
+ get defaultFormValue(): QueryFormValue<T>;
70
+ constructor(_fields: T, _options?: QueryFormOptions | undefined);
71
+ observe(options?: QueryFormObserveOptions): this;
72
+ private _handleQueryFormResets;
73
+ unobserve(): void;
74
+ setFormValueFromUrlQueryParams(options: {
75
+ queryParams: Record<string, unknown>;
76
+ }): boolean;
77
+ setValue(value: QueryFormValue<T>, options?: QueryFormWriteOptions): void;
78
+ patchValue(value: Partial<QueryFormValue<T>>, options?: QueryFormWriteOptions): void;
79
+ resetFieldToDefault(key: keyof QueryFormValue<T>, options?: QueryFormWriteOptions): void;
80
+ resetFieldsToDefault(keys: (keyof QueryFormValue<T>)[], options?: QueryFormWriteOptions): void;
81
+ resetAllFieldsToDefault(options?: QueryFormWriteOptions & {
82
+ skipFields?: (keyof QueryFormValue<T>)[];
83
+ }): void;
84
+ private _getDefaultValue;
85
+ private _transformKeyToQueryParam;
86
+ private _isDefaultValue;
87
+ private _setupFormGroup;
88
+ private _extractDefaultValues;
89
+ private _syncViaUrlQueryParams;
90
+ private _handleFormChange;
91
+ }
@@ -0,0 +1,145 @@
1
+ import { FormControl, FormGroup } from '@angular/forms';
2
+ import { QueryField } from './query-form';
3
+ export interface QueryFieldOptions<T = unknown> {
4
+ /**
5
+ * The default value of the field.
6
+ * Will be set to the initial value of the form control if not specified.
7
+ */
8
+ defaultValue?: T | null;
9
+ /**
10
+ * Debounce time in milliseconds.
11
+ */
12
+ debounce?: number;
13
+ /**
14
+ * Whether the debounce should not be applied if the value is falsy.
15
+ * This is useful for fields that can be cleared like a search field.
16
+ *
17
+ * @default false
18
+ */
19
+ disableDebounceIfFalsy?: boolean;
20
+ /**
21
+ * The form control for the field.
22
+ */
23
+ control: FormControl<T | null>;
24
+ /**
25
+ * Append the field's value to the url.
26
+ *
27
+ * The field wont be appended to the url if one of the following is true:
28
+ * - It is the default value and `appendDefaultValueToUrl` is `false`
29
+ * - It is an empty string
30
+ * - It is `null`
31
+ * - It is `undefined`
32
+ *
33
+ * @default true
34
+ */
35
+ appendToUrl?: boolean;
36
+ /**
37
+ * Append the field's value to the url even if it is the default value.
38
+ * Will be ignored if `appendToUrl` is `false`.
39
+ *
40
+ * @default false
41
+ */
42
+ appendDefaultValueToUrl?: boolean;
43
+ /**
44
+ * Reset the field's value to the default value if one or more of the specified fields are changed.
45
+ *
46
+ * @example
47
+ * // Given this field is a `page` field, the field will be reset if the `limit`, `query` or `search` fields are changed.
48
+ * ['limit', 'query', 'search']
49
+ */
50
+ isResetBy?: string | string[];
51
+ /**
52
+ * Whether the field should change the count of current active filters.
53
+ *
54
+ * Will be `true` for these common fields:
55
+ * - `page`
56
+ * - `skip`
57
+ * - `take`
58
+ * - `limit`
59
+ * - `sort`
60
+ * - `sortBy`
61
+ * - `sortOrder`
62
+ * - `query`
63
+ * - `search`
64
+ * @default false
65
+ */
66
+ skipInFilterCount?: boolean;
67
+ /**
68
+ * A function that transforms the the value gotten from the url query params to a value required by the field.
69
+ * E.g. for a number field, the value from the url query params is a string, but the field requires a number.
70
+ *
71
+ * The following common transformations are already implemented:
72
+ * - `transformToString`
73
+ * - `transformToStringArray`
74
+ * - `transformToNumber`
75
+ * - `transformToNumberArray`
76
+ * - `transformToBoolean`
77
+ * - `transformToBooleanArray`
78
+ * - `transformToDate` (expects a string in the default js format)
79
+ * - `transformToDateArray` (expects strings in the default js format)
80
+ * - `transformToSort` (expects a string in the format `field:direction`)
81
+ */
82
+ queryParamToValueTransformFn?: (val: unknown) => T | null;
83
+ /**
84
+ * A function that transforms the value of the field to a value that can be appended to the url query params.
85
+ *
86
+ * The following common transformations are already implemented:
87
+ * - `transformToSortQueryParam` (returns an object containing `field` and `direction` properties)
88
+ */
89
+ valueToQueryParamTransformFn?: (val: T | null) => unknown;
90
+ }
91
+ export type QueryFormGroupControls<T extends Record<string, QueryField<any>>> = {
92
+ [Property in keyof T]: T[Property]['control'];
93
+ };
94
+ export type QueryFormValue<T extends Record<string, QueryField<any>>> = {
95
+ [Property in keyof T]: T[Property]['control']['value'];
96
+ };
97
+ export type QueryFormOf<T extends FormGroup> = {
98
+ [K in keyof T['controls']]: QueryField<T['controls'][K]['value']>;
99
+ };
100
+ export interface QueryFormGroup extends FormGroup {
101
+ _setValue: FormGroup['setValue'];
102
+ _patchValue: FormGroup['patchValue'];
103
+ setValue(value: unknown, options?: QueryFormWriteOptions): void;
104
+ patchValue(value: unknown, options?: QueryFormWriteOptions): void;
105
+ }
106
+ export interface QueryFormObserveOptions {
107
+ /**
108
+ * Whether the form value should be synced to the url query params.
109
+ * @default true
110
+ */
111
+ writeToQueryParams?: boolean;
112
+ /**
113
+ * Whether the form value should be updated when the url query params change.
114
+ * @default true
115
+ */
116
+ syncOnNavigation?: boolean;
117
+ /**
118
+ * If true, the navigation will not create a new entry in the browser's history.
119
+ * @default false
120
+ */
121
+ replaceUrl?: boolean;
122
+ }
123
+ export interface QueryFormValueEvent<T extends Record<string, QueryField<any>>> {
124
+ previousValue: QueryFormValue<T> | null;
125
+ currentValue: QueryFormValue<T>;
126
+ }
127
+ export interface QueryFormWriteOptions {
128
+ /**
129
+ * When true, each change only affects this control, and not its parent.
130
+ * @default false
131
+ */
132
+ onlySelf?: boolean;
133
+ /**
134
+ * When true or not supplied (the default), both the `statusChanges` and `valueChanges`
135
+ * observables emit events with the latest status and value when the control value is updated.
136
+ * When false, no events are emitted.
137
+ * @default true
138
+ */
139
+ emitEvent?: boolean;
140
+ /**
141
+ * When true, the `resetBy` conditions will be ignored for this write.
142
+ * @default false
143
+ */
144
+ skipResets?: boolean;
145
+ }
@@ -0,0 +1,13 @@
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;
9
+ export declare const transformToSort: (value: unknown) => {
10
+ active: string;
11
+ direction: "asc" | "desc";
12
+ } | null;
13
+ export declare const transformToSortQueryParam: (value: unknown) => string | null;
@@ -0,0 +1,31 @@
1
+ import { AnyQuery } from '../query';
2
+ export declare class QueryStore {
3
+ private _config?;
4
+ private _garbageCollector;
5
+ private _isInLowResourceMode;
6
+ private _lastBlurTimestamp;
7
+ private _storeChange$;
8
+ private _queryCreated$;
9
+ readonly storeChange$: import("rxjs").Observable<string>;
10
+ readonly queryCreated$: import("rxjs").Observable<AnyQuery>;
11
+ constructor(_config?: {
12
+ enableChangeLogging?: boolean;
13
+ enableGarbageCollectorLogging?: boolean;
14
+ autoRefreshQueriesOnWindowFocus?: boolean;
15
+ enableSmartPolling?: boolean;
16
+ } | undefined);
17
+ add(id: string, query: AnyQuery): void;
18
+ get<T extends AnyQuery>(id: string): T | null;
19
+ remove(id: string): void;
20
+ forEach(callback: (value: AnyQuery, key: string) => void): void;
21
+ refreshQueriesInUse(config?: {
22
+ ignoreCacheValidity?: boolean;
23
+ purgeUnused?: boolean;
24
+ }): void;
25
+ private _initSmartQueryHandling;
26
+ private _logState;
27
+ private _initGarbageCollector;
28
+ private _stopGarbageCollector;
29
+ private _runGarbageCollector;
30
+ private _logGarbageCollector;
31
+ }
@@ -0,0 +1,3 @@
1
+ import { Observable } from 'rxjs';
2
+ import { RequestConfig, RequestEvent } from './request.types';
3
+ export declare const request: <Response = unknown>(config: RequestConfig) => Observable<RequestEvent<Response>>;
@@ -0,0 +1,126 @@
1
+ import { HttpStatusCode } from './request.util';
2
+ export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT' | 'PURGE' | 'LINK' | 'UNLINK' | 'GQL_QUERY' | 'GQL_MUTATE' | 'CUSTOM';
3
+ export interface RequestError<Detail = unknown> {
4
+ url: string;
5
+ status: HttpStatusCode;
6
+ statusText: string;
7
+ detail: Detail;
8
+ }
9
+ export type RequestHeaders = Record<string, string>;
10
+ export type QueryParams = object;
11
+ export type PathParams = Record<string, string | number>;
12
+ export type CacheAdapterFn = (headers: RequestHeaders) => number | null;
13
+ export type RequestHeadersMethodMap = {
14
+ [M in Method]?: RequestHeaders;
15
+ };
16
+ export interface PartialXhrState {
17
+ headers: RequestHeaders;
18
+ status: number;
19
+ statusText: string;
20
+ url: string;
21
+ }
22
+ export interface RequestRetryFnConfig {
23
+ error: RequestError;
24
+ headers: RequestHeaders;
25
+ currentRetryCount: number;
26
+ }
27
+ export interface RequestRetryFnResult {
28
+ retry: boolean;
29
+ delay?: number;
30
+ }
31
+ export type RequestRetryFn = (config: RequestRetryFnConfig) => RequestRetryFnResult;
32
+ export interface RequestConfig {
33
+ method: Method;
34
+ urlWithParams: string;
35
+ body?: unknown;
36
+ reportProgress?: boolean;
37
+ withCredentials?: boolean;
38
+ responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
39
+ headers?: RequestHeaders;
40
+ cacheAdapter?: CacheAdapterFn;
41
+ retryFn?: RequestRetryFn;
42
+ }
43
+ export type RequestProgress = {
44
+ current: number;
45
+ percentage?: number;
46
+ total?: number;
47
+ };
48
+ export type RequestEvent<Response = unknown> = {
49
+ type: 'start';
50
+ headers: RequestHeaders;
51
+ isRetry?: boolean;
52
+ retryNumber?: number;
53
+ retryDelay?: number;
54
+ } | {
55
+ type: 'delay-retry';
56
+ headers: RequestHeaders;
57
+ retryNumber: number;
58
+ retryDelay: number;
59
+ } | {
60
+ type: 'download-progress';
61
+ headers: RequestHeaders;
62
+ progress: RequestProgress;
63
+ partialText?: string;
64
+ } | {
65
+ type: 'upload-progress';
66
+ headers: RequestHeaders;
67
+ progress: RequestProgress;
68
+ } | {
69
+ type: 'success';
70
+ headers: RequestHeaders;
71
+ response: Response;
72
+ expiresInTimestamp?: number;
73
+ } | {
74
+ type: 'failure';
75
+ headers: RequestHeaders;
76
+ error: RequestError;
77
+ } | {
78
+ type: 'cancel';
79
+ headers: RequestHeaders;
80
+ };
81
+ export interface BuildQueryStringConfig {
82
+ /**
83
+ * Object notation to use for nested objects.
84
+ *
85
+ * @example
86
+ * // dot notation
87
+ * { foo: { bar: 'baz' } } => "foo.bar=baz"
88
+ *
89
+ * @example
90
+ * // bracket notation
91
+ * { foo: { bar: 'baz' } } => "foo[bar]=baz"
92
+ *
93
+ * @default 'bracket'
94
+ */
95
+ objectNotation?: 'dot' | 'bracket';
96
+ /**
97
+ * Whether to write array indexes in bracket notation.
98
+ *
99
+ * @example
100
+ * // true
101
+ * { foo: ['bar', 'baz'] } => "foo[0]=bar&foo[1]=baz"
102
+ *
103
+ * @example
104
+ * // false
105
+ * { foo: ['bar', 'baz'] } => "foo[]=bar&foo[]=baz"
106
+ *
107
+ * @default false
108
+ */
109
+ writeArrayIndexes?: boolean;
110
+ /**
111
+ * A list of values that should be ignored when building the query string.
112
+ *
113
+ * Also have a look at `ignoredValuesFns`.
114
+ *
115
+ * @default [undefined, null, Infinity, -Infinity]
116
+ */
117
+ ignoredValues?: Array<unknown>;
118
+ /**
119
+ * A list of functions that should be used to determine whether a value should be ignored when building the query string.
120
+ *
121
+ * Also have a look at `ignoredValues`.
122
+ *
123
+ * @default [isNaN, isEmptyString]
124
+ */
125
+ ignoredValuesFns?: Array<(value: unknown) => boolean>;
126
+ }
@@ -0,0 +1,92 @@
1
+ import { AnyRoute } from '../query';
2
+ import { BuildQueryStringConfig, Method, PathParams, QueryParams, RequestError, RequestHeaders, RequestRetryFn } from './request.types';
3
+ export declare const isNaN: (value: unknown) => boolean;
4
+ export declare const isEmptyString: (value: unknown) => boolean;
5
+ export declare const isRequestError: <T = unknown>(error: unknown) => error is RequestError<T>;
6
+ export declare const buildRoute: (options: {
7
+ base: string;
8
+ route: AnyRoute | null | undefined;
9
+ pathParams?: PathParams;
10
+ queryParams?: QueryParams;
11
+ queryParamConfig?: BuildQueryStringConfig;
12
+ }) => string;
13
+ export declare const buildQueryString: (params: QueryParams, config?: BuildQueryStringConfig) => string | null;
14
+ export declare const extractExpiresInSeconds: (headers: RequestHeaders) => number | null;
15
+ export declare const buildTimestampFromSeconds: (seconds: number | null) => number | null;
16
+ export declare const serializeBody: (body: unknown) => ArrayBuffer | URLSearchParams | Blob | FormData | string | null;
17
+ export declare const transformMethod: (config: {
18
+ method: Method;
19
+ transferVia?: "GET" | "POST";
20
+ }) => "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT" | "PURGE" | "LINK" | "UNLINK" | "CUSTOM";
21
+ export declare const detectContentTypeHeader: (body: unknown) => string | null;
22
+ export declare const hasHeader: (headers: RequestHeaders, header: string) => boolean;
23
+ export declare const forEachHeader: (headers: RequestHeaders, callback: (value: string, key: string) => void) => void;
24
+ export declare const parseAllXhrResponseHeaders: (xhr: XMLHttpRequest) => RequestHeaders;
25
+ export declare const getResponseUrl: (xhr: XMLHttpRequest) => string | null;
26
+ export declare const shouldRetryRequest: RequestRetryFn;
27
+ export declare const enum HttpStatusCode {
28
+ Unknown = 0,
29
+ Continue = 100,
30
+ SwitchingProtocols = 101,
31
+ Processing = 102,
32
+ EarlyHints = 103,
33
+ Ok = 200,
34
+ Created = 201,
35
+ Accepted = 202,
36
+ NonAuthoritativeInformation = 203,
37
+ NoContent = 204,
38
+ ResetContent = 205,
39
+ PartialContent = 206,
40
+ MultiStatus = 207,
41
+ AlreadyReported = 208,
42
+ ImUsed = 226,
43
+ MultipleChoices = 300,
44
+ MovedPermanently = 301,
45
+ Found = 302,
46
+ SeeOther = 303,
47
+ NotModified = 304,
48
+ UseProxy = 305,
49
+ Unused = 306,
50
+ TemporaryRedirect = 307,
51
+ PermanentRedirect = 308,
52
+ BadRequest = 400,
53
+ Unauthorized = 401,
54
+ PaymentRequired = 402,
55
+ Forbidden = 403,
56
+ NotFound = 404,
57
+ MethodNotAllowed = 405,
58
+ NotAcceptable = 406,
59
+ ProxyAuthenticationRequired = 407,
60
+ RequestTimeout = 408,
61
+ Conflict = 409,
62
+ Gone = 410,
63
+ LengthRequired = 411,
64
+ PreconditionFailed = 412,
65
+ PayloadTooLarge = 413,
66
+ UriTooLong = 414,
67
+ UnsupportedMediaType = 415,
68
+ RangeNotSatisfiable = 416,
69
+ ExpectationFailed = 417,
70
+ ImATeapot = 418,
71
+ MisdirectedRequest = 421,
72
+ UnprocessableEntity = 422,
73
+ Locked = 423,
74
+ FailedDependency = 424,
75
+ TooEarly = 425,
76
+ UpgradeRequired = 426,
77
+ PreconditionRequired = 428,
78
+ TooManyRequests = 429,
79
+ RequestHeaderFieldsTooLarge = 431,
80
+ UnavailableForLegalReasons = 451,
81
+ InternalServerError = 500,
82
+ NotImplemented = 501,
83
+ BadGateway = 502,
84
+ ServiceUnavailable = 503,
85
+ GatewayTimeout = 504,
86
+ HttpVersionNotSupported = 505,
87
+ VariantAlsoNegotiates = 506,
88
+ InsufficientStorage = 507,
89
+ LoopDetected = 508,
90
+ NotExtended = 510,
91
+ NetworkAuthenticationRequired = 511
92
+ }