@ethlete/query 4.6.0 → 4.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 (43) hide show
  1. package/esm2022/index.mjs +2 -1
  2. package/esm2022/lib/devtools/components/public-api.mjs +2 -0
  3. package/esm2022/lib/devtools/components/query-devtools/public-api.mjs +2 -0
  4. package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +72 -0
  5. package/esm2022/lib/devtools/index.mjs +2 -0
  6. package/esm2022/lib/devtools/public-api.mjs +3 -0
  7. package/esm2022/lib/devtools/utils/index.mjs +2 -0
  8. package/esm2022/lib/devtools/utils/public-api.mjs +2 -0
  9. package/esm2022/lib/devtools/utils/query-client.utils.mjs +13 -0
  10. package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +3 -3
  11. package/esm2022/lib/directives/infinity-query.directive.mjs +3 -3
  12. package/esm2022/lib/directives/query.directive.mjs +3 -3
  13. package/esm2022/lib/entity/entity-store.mjs +28 -12
  14. package/esm2022/lib/entity/entity.types.mjs +1 -1
  15. package/esm2022/lib/entity/entity.utils.mjs +26 -2
  16. package/esm2022/lib/query/query.mjs +17 -4
  17. package/esm2022/lib/query-client/query-client.mjs +1 -1
  18. package/esm2022/lib/query-client/query-client.types.mjs +1 -1
  19. package/esm2022/lib/query-form/query-form.mjs +10 -5
  20. package/esm2022/lib/query-store/query-store.mjs +9 -2
  21. package/esm2022/lib/request/request.util.mjs +2 -1
  22. package/fesm2022/ethlete-query.mjs +174 -29
  23. package/fesm2022/ethlete-query.mjs.map +1 -1
  24. package/index.d.ts +1 -0
  25. package/lib/auth/auth-provider.types.d.ts +0 -5
  26. package/lib/auth/bearer-auth-provider.d.ts +0 -4
  27. package/lib/devtools/components/public-api.d.ts +1 -0
  28. package/lib/devtools/components/query-devtools/public-api.d.ts +1 -0
  29. package/lib/devtools/components/query-devtools/query-devtools.component.d.ts +28 -0
  30. package/lib/devtools/index.d.ts +1 -0
  31. package/lib/devtools/public-api.d.ts +2 -0
  32. package/lib/devtools/utils/index.d.ts +1 -0
  33. package/lib/devtools/utils/public-api.d.ts +1 -0
  34. package/lib/devtools/utils/query-client.utils.d.ts +12 -0
  35. package/lib/entity/entity-store.d.ts +4 -0
  36. package/lib/entity/entity.types.d.ts +20 -0
  37. package/lib/entity/entity.utils.d.ts +10 -0
  38. package/lib/query/query.d.ts +4 -16
  39. package/lib/query/query.types.d.ts +0 -14
  40. package/lib/query-client/query-client.d.ts +0 -1
  41. package/lib/query-client/query-client.types.d.ts +5 -0
  42. package/lib/query-store/query-store.d.ts +2 -1
  43. package/package.json +1 -1
package/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  export * from './lib/auth';
2
2
  export * from './lib/class-validator';
3
+ export * from './lib/devtools';
3
4
  export * from './lib/directives';
4
5
  export * from './lib/entity';
5
6
  export * from './lib/gql';
@@ -5,11 +5,6 @@ export interface AuthProvider {
5
5
  * This will automatically get injected into every query that has the `secure` property set to `true`.
6
6
  */
7
7
  header: Record<string, string>;
8
- /**
9
- * Cleanup function that gets called once the auth provider gets destroyed.
10
- * @internal
11
- */
12
- cleanUp(): void;
13
8
  }
14
9
  export interface AuthProviderBasicConfig {
15
10
  /**
@@ -18,8 +18,4 @@ export declare class BearerAuthProvider<T extends AnyQueryCreator> implements Au
18
18
  enableCookie(): void;
19
19
  disableCookie(): void;
20
20
  private _prepareForRefresh;
21
- /**
22
- * @internal
23
- */
24
- _refreshQuery(): import("../query").Query<any, any, any, any, any, any> | null | undefined;
25
21
  }
@@ -0,0 +1 @@
1
+ export * from './query-devtools/public-api';
@@ -0,0 +1 @@
1
+ export * from './query-devtools.component';
@@ -0,0 +1,28 @@
1
+ import { TrackByFunction } from '@angular/core';
2
+ import { AnyQuery } from '../../../query';
3
+ import { QueryClientDevtoolsOptions } from '../../utils';
4
+ import * as i0 from "@angular/core";
5
+ export declare class QueryDevtoolsComponent {
6
+ protected readonly _destroy$: import("rxjs").Observable<boolean>;
7
+ protected readonly queryClientConfigs: QueryClientDevtoolsOptions[];
8
+ protected readonly isOpen: import("@angular/core").WritableSignal<boolean>;
9
+ protected showResponse: import("@angular/core").WritableSignal<boolean>;
10
+ protected showRawResponse: import("@angular/core").WritableSignal<boolean>;
11
+ protected readonly selectedClientId: import("@angular/core").WritableSignal<number>;
12
+ protected readonly selectedQueryPath: import("@angular/core").WritableSignal<string | null>;
13
+ protected readonly selectedClientConfig: import("@angular/core").Signal<QueryClientDevtoolsOptions>;
14
+ protected readonly queryStore: import("@angular/core").Signal<import("@ethlete/query").QueryStore>;
15
+ private readonly _queries$;
16
+ protected readonly queries: import("@angular/core").Signal<AnyQuery[] | undefined>;
17
+ protected readonly selectedQuery: import("@angular/core").Signal<AnyQuery | null>;
18
+ constructor();
19
+ protected trackByClient: TrackByFunction<QueryClientDevtoolsOptions>;
20
+ protected trackByQuery: TrackByFunction<AnyQuery>;
21
+ protected toggleOpen(): void;
22
+ protected toggleShowResponse(): void;
23
+ protected toggleShowRawResponse(): void;
24
+ protected selectClient(clientId: number): void;
25
+ protected selectQuery(query: AnyQuery): void;
26
+ static ɵfac: i0.ɵɵFactoryDeclaration<QueryDevtoolsComponent, never>;
27
+ static ɵcmp: i0.ɵɵComponentDeclaration<QueryDevtoolsComponent, "et-query-devtools", never, {}, {}, never, never, true, never>;
28
+ }
@@ -0,0 +1 @@
1
+ export * from './public-api';
@@ -0,0 +1,2 @@
1
+ export * from './components/public-api';
2
+ export * from './utils/public-api';
@@ -0,0 +1 @@
1
+ export * from './public-api';
@@ -0,0 +1 @@
1
+ export * from './query-client.utils';
@@ -0,0 +1,12 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { QueryClient } from '../../query-client';
3
+ export interface QueryClientDevtoolsOptions {
4
+ displayName?: string;
5
+ client: QueryClient;
6
+ }
7
+ export declare const QUERY_CLIENT_DEVTOOLS_TOKEN: InjectionToken<QueryClientDevtoolsOptions[]>;
8
+ export declare const provideQueryClientForDevtools: (queryClient: QueryClientDevtoolsOptions) => {
9
+ provide: InjectionToken<QueryClientDevtoolsOptions[]>;
10
+ useValue: QueryClientDevtoolsOptions;
11
+ multi: boolean;
12
+ };
@@ -7,17 +7,21 @@ export declare class EntityStore<T> {
7
7
  constructor(_config: EntityStoreConfig);
8
8
  select(key: EntityKey): Observable<T | null>;
9
9
  select(keys: EntityKey[]): Observable<T[]>;
10
+ select(keys: EntityKey[][]): Observable<T[]>;
10
11
  /**
11
12
  * **Note:** Prefer `select` over `selectWhere` when possible.
12
13
  */
13
14
  selectWhere(predicate: (value: T) => boolean): Observable<T[]>;
14
15
  set(key: EntityKey, value: T): void;
15
16
  set(keys: EntityKey[], values: T[]): void;
17
+ set(keys: EntityKey[][], values: T[][]): void;
16
18
  remove(key: EntityKey): void;
17
19
  remove(keys: EntityKey[]): void;
20
+ remove(keys: EntityKey[][]): void;
18
21
  logState(): void;
19
22
  private _select;
20
23
  private _selectMany;
21
24
  private _set;
22
25
  private _remove;
26
+ private _normalizeKeys;
23
27
  }
@@ -3,3 +3,23 @@ export interface EntityStoreConfig {
3
3
  name: string;
4
4
  logActions?: boolean;
5
5
  }
6
+ export interface InsertFromConfig<OriginStoreType, OriginKeys extends keyof NonNullable<OriginStoreType>, IdFn extends (value: NonNullable<OriginStoreType>) => EntityKey | EntityKey[]> {
7
+ /**
8
+ * The property key of which the value should be replaced.
9
+ */
10
+ for: OriginKeys;
11
+ /**
12
+ * A function that returns the id of the entity. Can also return an array of ids.
13
+ */
14
+ id: IdFn;
15
+ }
16
+ export interface RemoveFromConfig<T> {
17
+ /**
18
+ * The where function to select the entities to remove.
19
+ */
20
+ where: (entity: T) => boolean;
21
+ /**
22
+ * A function that returns the id of the entity.
23
+ */
24
+ id: (entity: T) => EntityKey;
25
+ }
@@ -1,2 +1,12 @@
1
1
  import { Paginated } from '@ethlete/types';
2
+ import { EntityStore } from './entity-store';
3
+ import { EntityKey, InsertFromConfig, RemoveFromConfig } from './entity.types';
2
4
  export declare function mapToPaginated<T>(response: Paginated<T>): import("rxjs").OperatorFunction<unknown, Paginated<T>>;
5
+ /**
6
+ * Use an other store to represent a property of the current entity.
7
+ */
8
+ export declare const insertFrom: <OriginStoreType, OriginKeys extends keyof NonNullable<OriginStoreType>, SubStoreType extends NonNullable<OriginStoreType>[OriginKeys] extends (infer U)[] ? U : NonNullable<OriginStoreType>[OriginKeys], IdFn extends (value: NonNullable<OriginStoreType>) => EntityKey | EntityKey[], ComputedEntityType extends ReturnType<IdFn> extends unknown[] ? OriginStoreType : Omit<OriginStoreType, OriginKeys> & { [K in OriginKeys]: SubStoreType | null; }>(store: EntityStore<SubStoreType>, { for: key, id }: InsertFromConfig<OriginStoreType, OriginKeys, IdFn>) => import("rxjs").OperatorFunction<OriginStoreType, ComputedEntityType | null>;
9
+ /**
10
+ * Remove entities from a store based on a where function.
11
+ */
12
+ export declare const removeFrom: <T>(store: EntityStore<T>, { where, id }: RemoveFromConfig<T>) => void;
@@ -5,17 +5,12 @@ import { BaseArguments, ExecuteQueryOptions, GqlQueryConfig, PollConfig, QueryAu
5
5
  export declare class Query<Response, Arguments extends BaseArguments | undefined, Route extends RouteType<Arguments>, Store extends EntityStore<unknown>, Data, Id> {
6
6
  private _client;
7
7
  private _queryConfig;
8
- private _routeWithParams;
9
8
  private _args;
10
9
  private _currentId;
11
10
  private _pollingSubscription;
12
11
  private _requestSubscription;
13
12
  private _onAbort$;
14
13
  private _currentPollConfig;
15
- /**
16
- * @internal
17
- */
18
- _isPollingPaused: boolean;
19
14
  private readonly _state$;
20
15
  private get _nextId();
21
16
  get state$(): Observable<QueryState<Data>>;
@@ -28,28 +23,21 @@ export declare class Query<Response, Arguments extends BaseArguments | undefined
28
23
  get rawState(): QueryState<Response>;
29
24
  get isExpired(): boolean;
30
25
  get isInUse(): boolean;
26
+ get _subscriberCount(): number;
31
27
  get isPolling(): boolean;
32
28
  get autoRefreshOnConfig(): Readonly<QueryAutoRefreshConfig>;
29
+ get store(): Store | null;
30
+ constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, Store, Data, Id> | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>,
33
31
  /**
34
32
  * @internal
35
33
  */
36
- get _enableSmartPolling(): boolean;
37
- /**
38
- * @internal
39
- */
40
- get _arguments(): Arguments;
41
- get store(): Store | null;
42
- constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, Store, Data, Id> | GqlQueryConfig<Route, Response, Arguments, Store, Data, Id>, _routeWithParams: Route, _args: Arguments);
34
+ _routeWithParams: Route, _args: Arguments);
43
35
  execute(options?: ExecuteQueryOptions): this;
44
36
  abort(): this;
45
37
  poll(config: PollConfig): this;
46
38
  stopPolling(): this;
47
39
  pausePolling(): this;
48
40
  resumePolling(): this;
49
- /**
50
- * @internal
51
- */
52
- _destroy(): void;
53
41
  private _getBearerAuthProvider;
54
42
  private _updateEntityState;
55
43
  private _transformState;
@@ -196,20 +196,6 @@ export interface ExecuteQueryOptions {
196
196
  * @default false
197
197
  */
198
198
  skipCache?: boolean;
199
- /**
200
- * The trigger type for this query.
201
- * - `program`: The query was triggered by the user.
202
- * - `poll`: The query was triggered by polling.
203
- * - `auto`: The query was triggered by an auto refresh event.
204
- * @default 'program'
205
- * @internal
206
- */
207
- _triggeredVia?: QueryTrigger;
208
- /**
209
- * Whether this is a retry of an unauthorized request.
210
- * @internal
211
- */
212
- _isUnauthorizedRetry?: boolean;
213
199
  }
214
200
  export type RouteType<Arguments extends BaseArguments | undefined> = Arguments extends {
215
201
  pathParams: infer PathParams;
@@ -6,7 +6,6 @@ import { RequestHeaders, RequestHeadersMethodMap } from '../request';
6
6
  import { QueryClientConfig } from './query-client.types';
7
7
  export declare class QueryClient {
8
8
  private _clientConfig;
9
- private readonly _store;
10
9
  get config(): QueryClientConfig;
11
10
  get authProvider(): AuthProvider | null;
12
11
  get authProvider$(): import("rxjs").Observable<AuthProvider | null>;
@@ -19,6 +19,11 @@ export interface QueryClientConfig {
19
19
  * Log query state garbage collector runs.
20
20
  */
21
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;
22
27
  };
23
28
  /**
24
29
  * Request options.
@@ -1,10 +1,11 @@
1
1
  import { AnyQuery } from '../query';
2
2
  export declare class QueryStore {
3
3
  private _config?;
4
- private readonly _store;
5
4
  private _garbageCollector;
6
5
  private _isInLowResourceMode;
7
6
  private _lastBlurTimestamp;
7
+ private _storeChange$;
8
+ readonly storeChange$: import("rxjs").Observable<string>;
8
9
  constructor(_config?: {
9
10
  enableChangeLogging?: boolean | undefined;
10
11
  enableGarbageCollectorLogging?: boolean | undefined;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ethlete/query",
3
- "version": "4.6.0",
3
+ "version": "4.7.0",
4
4
  "dependencies": {
5
5
  "tslib": "^2.5.0"
6
6
  },