@ethlete/query 0.1.0-next.21 → 0.1.0-next.22

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.
@@ -1,12 +1,13 @@
1
1
  import { ChangeDetectorRef, ErrorHandler, OnDestroy, OnInit, TemplateRef, ViewContainerRef } from '@angular/core';
2
2
  import { AnyQuery, AnyQueryCreatorCollection, AnyQueryOfCreatorCollection, QueryOf, QueryRawResponseType, QueryResponseType } from '../query';
3
- import { RequestError } from '../request';
3
+ import { RequestError, RequestProgress } from '../request';
4
4
  import * as i0 from "@angular/core";
5
5
  interface QueryContext<Q extends AnyQuery | null> {
6
6
  $implicit: QueryResponseType<Q>;
7
7
  query: QueryResponseType<Q>;
8
8
  raw: QueryRawResponseType<Q>;
9
9
  loading: boolean;
10
+ progress: RequestProgress | null;
10
11
  error: RequestError<unknown> | null;
11
12
  }
12
13
  export declare class QueryDirective<Q extends AnyQuery | AnyQueryOfCreatorCollection<AnyQueryCreatorCollection> | null> implements OnInit, OnDestroy {
@@ -4,10 +4,9 @@ import { BaseArguments, GqlQueryConfig, PollConfig, QueryState, RestQueryConfig,
4
4
  export declare class Query<Response, Arguments extends (BaseArguments & WithUseResultIn<Response, ResponseTransformer>) | undefined, Route extends RouteType<Arguments>, Method extends MethodType, ResponseTransformer extends ResponseTransformerType<Response> = DefaultResponseTransformer<Response>> {
5
5
  private _client;
6
6
  private _queryConfig;
7
- private _route;
7
+ private _routeWithParams;
8
8
  private _args;
9
9
  private _currentId;
10
- private _abortController;
11
10
  private _pollingSubscription;
12
11
  private _onAbort$;
13
12
  private readonly _state$;
@@ -15,12 +14,11 @@ export declare class Query<Response, Arguments extends (BaseArguments & WithUseR
15
14
  get state$(): import("rxjs").Observable<QueryState<ReturnType<ResponseTransformer>, Response>>;
16
15
  get state(): QueryState<ReturnType<ResponseTransformer>, Response>;
17
16
  get isExpired(): boolean;
18
- constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _route: Route, _args: Arguments | undefined);
17
+ constructor(_client: QueryClient, _queryConfig: RestQueryConfig<Route, Response, Arguments, ResponseTransformer> | GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, _routeWithParams: Route, _args: Arguments | undefined);
19
18
  clone(): import("../query-client").QueryCreator<Arguments, Method, Response, Route, ResponseTransformer>;
20
19
  execute<ComputedResponse extends ReturnType<ResponseTransformer>>(options?: RunQueryOptions): this;
21
20
  abort(): this;
22
21
  poll(config: PollConfig): this;
23
22
  stopPolling(): this;
24
23
  private _updateUseResultInDependencies;
25
- private _handleExecuteError;
26
24
  }
@@ -1,16 +1,12 @@
1
1
  import { Observable } from 'rxjs';
2
2
  import { AnyQueryCreator, QueryCreatorReturnType, ResponseTransformerType } from '../query-client';
3
- import { Method, PathParams, QueryParams, RequestError } from '../request';
3
+ import { Method, PathParams, QueryParams, RequestError, RequestProgress } from '../request';
4
4
  import { Query } from './query';
5
- export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
5
+ export interface QueryConfigBase<Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
6
6
  /**
7
7
  * The http method to use for the query.
8
8
  */
9
9
  method: Method;
10
- /**
11
- * The api route to use for the query.
12
- */
13
- route: Route;
14
10
  /**
15
11
  * Determines if the auth provider should be used for this query.
16
12
  * The query **will throw** if the query client's auth provider is unset.
@@ -21,6 +17,20 @@ export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, A
21
17
  * A function that transforms the response to the desired type.
22
18
  */
23
19
  responseTransformer?: ResponseTransformer;
20
+ /**
21
+ * Determines if the query should emit progress events.
22
+ */
23
+ reportProgress?: boolean;
24
+ /**
25
+ * Determines the query's response type.
26
+ * @default 'json'
27
+ */
28
+ responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
29
+ /**
30
+ * Whether this request should be sent with outgoing credentials (cookies).
31
+ * @default false
32
+ */
33
+ withCredentials?: boolean;
24
34
  /**
25
35
  * Object containing the query's type information.
26
36
  */
@@ -36,20 +46,26 @@ export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, A
36
46
  * - `queryParams`: The query parameters for the query. (after the ? in the url)
37
47
  * - `body`: The body for the query. Unavailable for GET, HEAD and OPTIONS requests.
38
48
  * - `headers`: The headers for the query.
49
+ * - `variables`: The variables for the query. (graphql only)
39
50
  */
40
51
  args?: Arguments;
41
52
  };
42
53
  }
43
- export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> {
44
- method: Method;
54
+ export interface RestQueryConfig<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
55
+ /**
56
+ * The api route to use for the query.
57
+ */
58
+ route: Route;
59
+ }
60
+ export interface GqlQueryConfig<Route extends RouteType<Arguments> | undefined, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> extends QueryConfigBase<Response, Arguments, ResponseTransformer> {
61
+ /**
62
+ * The graphql query to use for the query.
63
+ */
45
64
  query: string;
65
+ /**
66
+ * Subroute to use for the query.
67
+ */
46
68
  route?: Route;
47
- secure?: boolean;
48
- responseTransformer?: ResponseTransformer;
49
- types?: {
50
- response?: Response;
51
- args?: Arguments;
52
- };
53
69
  }
54
70
  export type QueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<RestQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
55
71
  export type GqlQueryConfigWithoutMethod<Route extends RouteType<Arguments>, Response, Arguments extends BaseArguments | undefined, ResponseTransformer extends ResponseTransformerType<Response> | undefined> = Omit<GqlQueryConfig<Route, Response, Arguments, ResponseTransformer>, 'method'>;
@@ -92,33 +108,35 @@ export declare const enum QueryStateType {
92
108
  Cancelled = "CANCELLED"
93
109
  }
94
110
  export interface Prepared {
95
- readonly type: QueryStateType.Prepared;
96
- readonly meta: QueryStateMeta;
111
+ type: QueryStateType.Prepared;
112
+ meta: QueryStateMeta;
97
113
  }
98
114
  export interface Success<Response = unknown, RawResponse = unknown> {
99
- readonly type: QueryStateType.Success;
100
- readonly response: Response;
101
- readonly rawResponse: RawResponse;
102
- readonly meta: QueryStateSuccessMeta;
115
+ type: QueryStateType.Success;
116
+ response: Response;
117
+ rawResponse: RawResponse;
118
+ meta: QueryStateSuccessMeta;
103
119
  }
104
120
  export interface Failure {
105
- readonly type: QueryStateType.Failure;
106
- readonly error: RequestError;
107
- readonly meta: QueryStateMeta;
121
+ type: QueryStateType.Failure;
122
+ error: RequestError;
123
+ meta: QueryStateMeta;
108
124
  }
109
125
  export interface Loading {
110
- readonly type: QueryStateType.Loading;
111
- readonly meta: QueryStateMeta;
126
+ type: QueryStateType.Loading;
127
+ meta: QueryStateMeta;
128
+ partialText?: string;
129
+ progress?: RequestProgress;
112
130
  }
113
131
  export interface Cancelled {
114
- readonly type: QueryStateType.Cancelled;
115
- readonly meta: QueryStateMeta;
132
+ type: QueryStateType.Cancelled;
133
+ meta: QueryStateMeta;
116
134
  }
117
135
  export interface QueryStateMeta {
118
- readonly id: number;
136
+ id: number;
119
137
  }
120
138
  export interface QueryStateSuccessMeta extends QueryStateMeta {
121
- readonly expiresAt: number | null;
139
+ expiresAt?: number;
122
140
  }
123
141
  export type QueryState<Response = unknown, RawResponse = unknown> = Loading | Success<Response, RawResponse> | Failure | Cancelled | Prepared;
124
142
  export type QueryStateData<T extends QueryState = QueryState> = T extends Success<infer Response> ? Response : never;
@@ -1,9 +1,3 @@
1
- import { CacheAdapterFn } from './request.types';
2
- export declare const request: <Response_1 = unknown>(options: {
3
- route: string;
4
- init?: RequestInit;
5
- cacheAdapter?: CacheAdapterFn;
6
- }) => Promise<{
7
- data: Response_1;
8
- expiresInTimestamp: number | null;
9
- }>;
1
+ import { Observable } from 'rxjs';
2
+ import { RequestConfig, RequestEvent } from './request.types';
3
+ export declare const request: <Response_1 = unknown>(config: RequestConfig) => Observable<RequestEvent<Response_1>>;
@@ -1,11 +1,9 @@
1
1
  export type Method = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS' | 'TRACE' | 'CONNECT' | 'PURGE' | 'LINK' | 'UNLINK' | 'GQL_QUERY' | 'GQL_MUTATE' | 'CUSTOM';
2
2
  export interface RequestError<Detail = unknown> {
3
- code: number;
4
- message: string;
5
- detail: Detail;
6
- raw: unknown;
7
- route: string;
8
- requestInit?: RequestInit;
3
+ url: string;
4
+ status: Detail;
5
+ statusText: string;
6
+ detail: unknown;
9
7
  }
10
8
  export type ParamPrimitive = string | number | boolean | null | undefined;
11
9
  export type Params = Record<string | number | symbol, ParamPrimitive | ParamArray>;
@@ -14,5 +12,51 @@ export type UnfilteredParamPrimitive = string | number | boolean | null | undefi
14
12
  export type QueryParams = Record<string | number | symbol, UnfilteredParamPrimitive | UnfilteredParamArray>;
15
13
  export type PathParams = Record<string, string | number>;
16
14
  export type UnfilteredParamArray = Array<UnfilteredParamPrimitive>;
17
- export type CacheAdapterFn = (headers: Headers) => number | null;
15
+ export type CacheAdapterFn = (headers: RequestHeaders) => number | null;
18
16
  export type RequestHeaders = Record<string, string>;
17
+ export interface PartialXhrState {
18
+ headers: RequestHeaders;
19
+ status: number;
20
+ statusText: string;
21
+ url: string;
22
+ }
23
+ export interface RequestConfig {
24
+ method: Method;
25
+ urlWithParams: string;
26
+ body?: unknown;
27
+ reportProgress?: boolean;
28
+ withCredentials?: boolean;
29
+ responseType?: 'arraybuffer' | 'blob' | 'json' | 'text';
30
+ headers?: RequestHeaders;
31
+ cacheAdapter?: CacheAdapterFn;
32
+ }
33
+ export type RequestProgress = {
34
+ current: number;
35
+ percentage?: number;
36
+ total?: number;
37
+ };
38
+ export type RequestEvent<Response = unknown> = {
39
+ type: 'start';
40
+ headers: RequestHeaders;
41
+ } | {
42
+ type: 'download-progress';
43
+ headers: RequestHeaders;
44
+ progress: RequestProgress;
45
+ partialText?: string;
46
+ } | {
47
+ type: 'upload-progress';
48
+ headers: RequestHeaders;
49
+ progress: RequestProgress;
50
+ } | {
51
+ type: 'success';
52
+ headers: RequestHeaders;
53
+ response: Response;
54
+ expiresInTimestamp?: number;
55
+ } | {
56
+ type: 'failure';
57
+ headers: RequestHeaders;
58
+ error: RequestError;
59
+ } | {
60
+ type: 'cancel';
61
+ headers: RequestHeaders;
62
+ };
@@ -1,6 +1,5 @@
1
- import { Method, ParamArray, Params, QueryParams, RequestError, UnfilteredParamPrimitive } 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>;
1
+ import { Method, ParamArray, Params, QueryParams, RequestError, RequestHeaders, UnfilteredParamPrimitive } from './request.types';
2
+ export declare const isRequestError: <T = unknown>(error: unknown) => error is RequestError<T>;
4
3
  export declare const buildRoute: (options: {
5
4
  base: string;
6
5
  route: string | ((args: Record<string, unknown>) => string) | null | undefined;
@@ -12,9 +11,77 @@ export declare const buildQueryArrayString: (key: string, array: ParamArray) =>
12
11
  export declare const isFetchResponse: (response: unknown) => response is Response;
13
12
  export declare const filterInvalidParams: (params: QueryParams) => Params;
14
13
  export declare const isParamValid: (primitive: UnfilteredParamPrimitive) => boolean;
15
- export declare const extractExpiresInSeconds: (headers: Headers) => number | null;
14
+ export declare const extractExpiresInSeconds: (headers: RequestHeaders) => number | null;
16
15
  export declare const buildTimestampFromSeconds: (seconds: number | null) => number | null;
17
- export declare const buildRequestError: <ErrorResponse = unknown>(error: unknown, route: string, requestInit?: RequestInit) => Promise<RequestError<null> | RequestError<ErrorResponse>>;
18
- export declare const buildBody: (body: unknown) => string | FormData | null;
16
+ export declare const serializeBody: (body: unknown) => ArrayBuffer | Blob | FormData | string | null;
19
17
  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;
18
+ export declare const detectContentTypeHeader: (body: unknown) => string | null;
19
+ export declare const hasHeader: (headers: RequestHeaders, header: string) => boolean;
20
+ export declare const forEachHeader: (headers: RequestHeaders, callback: (value: string, key: string) => void) => void;
21
+ export declare const parseAllXhrResponseHeaders: (xhr: XMLHttpRequest) => RequestHeaders;
22
+ export declare const getResponseUrl: (xhr: XMLHttpRequest) => string | null;
23
+ export declare const enum HttpStatusCode {
24
+ Continue = 100,
25
+ SwitchingProtocols = 101,
26
+ Processing = 102,
27
+ EarlyHints = 103,
28
+ Ok = 200,
29
+ Created = 201,
30
+ Accepted = 202,
31
+ NonAuthoritativeInformation = 203,
32
+ NoContent = 204,
33
+ ResetContent = 205,
34
+ PartialContent = 206,
35
+ MultiStatus = 207,
36
+ AlreadyReported = 208,
37
+ ImUsed = 226,
38
+ MultipleChoices = 300,
39
+ MovedPermanently = 301,
40
+ Found = 302,
41
+ SeeOther = 303,
42
+ NotModified = 304,
43
+ UseProxy = 305,
44
+ Unused = 306,
45
+ TemporaryRedirect = 307,
46
+ PermanentRedirect = 308,
47
+ BadRequest = 400,
48
+ Unauthorized = 401,
49
+ PaymentRequired = 402,
50
+ Forbidden = 403,
51
+ NotFound = 404,
52
+ MethodNotAllowed = 405,
53
+ NotAcceptable = 406,
54
+ ProxyAuthenticationRequired = 407,
55
+ RequestTimeout = 408,
56
+ Conflict = 409,
57
+ Gone = 410,
58
+ LengthRequired = 411,
59
+ PreconditionFailed = 412,
60
+ PayloadTooLarge = 413,
61
+ UriTooLong = 414,
62
+ UnsupportedMediaType = 415,
63
+ RangeNotSatisfiable = 416,
64
+ ExpectationFailed = 417,
65
+ ImATeapot = 418,
66
+ MisdirectedRequest = 421,
67
+ UnprocessableEntity = 422,
68
+ Locked = 423,
69
+ FailedDependency = 424,
70
+ TooEarly = 425,
71
+ UpgradeRequired = 426,
72
+ PreconditionRequired = 428,
73
+ TooManyRequests = 429,
74
+ RequestHeaderFieldsTooLarge = 431,
75
+ UnavailableForLegalReasons = 451,
76
+ InternalServerError = 500,
77
+ NotImplemented = 501,
78
+ BadGateway = 502,
79
+ ServiceUnavailable = 503,
80
+ GatewayTimeout = 504,
81
+ HttpVersionNotSupported = 505,
82
+ VariantAlsoNegotiates = 506,
83
+ InsufficientStorage = 507,
84
+ LoopDetected = 508,
85
+ NotExtended = 510,
86
+ NetworkAuthenticationRequired = 511
87
+ }
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@ethlete/query",
3
- "version": "0.1.0-next.21",
3
+ "version": "0.1.0-next.22",
4
4
  "dependencies": {
5
5
  "tslib": "^2.3.0"
6
6
  },
7
7
  "peerDependencies": {
8
8
  "@angular/common": "^14.2.0 || ^15.0.0",
9
9
  "@angular/core": "^14.2.0 || ^15.0.0",
10
- "@ethlete/core": "0.2.0-next.18",
10
+ "@ethlete/core": "0.2.0-next.19",
11
11
  "@angular/forms": "15.1.4",
12
12
  "@angular/router": "15.1.4"
13
13
  },