@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.
- package/esm2020/lib/directives/query.directive.mjs +4 -1
- package/esm2020/lib/query/query.mjs +76 -77
- package/esm2020/lib/query/query.types.mjs +1 -1
- package/esm2020/lib/query-form/query-form.mjs +2 -2
- package/esm2020/lib/request/request.mjs +168 -19
- package/esm2020/lib/request/request.types.mjs +1 -1
- package/esm2020/lib/request/request.util.mjs +66 -91
- package/fesm2015/ethlete-query.mjs +316 -191
- package/fesm2015/ethlete-query.mjs.map +1 -1
- package/fesm2020/ethlete-query.mjs +309 -184
- package/fesm2020/ethlete-query.mjs.map +1 -1
- package/lib/directives/query.directive.d.ts +2 -1
- package/lib/query/query.d.ts +2 -4
- package/lib/query/query.types.d.ts +47 -29
- package/lib/request/request.d.ts +3 -9
- package/lib/request/request.types.d.ts +51 -7
- package/lib/request/request.util.d.ts +74 -7
- package/package.json +2 -2
|
@@ -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 {
|
package/lib/query/query.d.ts
CHANGED
|
@@ -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
|
|
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>,
|
|
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
|
|
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
|
|
44
|
-
|
|
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
|
-
|
|
96
|
-
|
|
111
|
+
type: QueryStateType.Prepared;
|
|
112
|
+
meta: QueryStateMeta;
|
|
97
113
|
}
|
|
98
114
|
export interface Success<Response = unknown, RawResponse = unknown> {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
115
|
+
type: QueryStateType.Success;
|
|
116
|
+
response: Response;
|
|
117
|
+
rawResponse: RawResponse;
|
|
118
|
+
meta: QueryStateSuccessMeta;
|
|
103
119
|
}
|
|
104
120
|
export interface Failure {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
121
|
+
type: QueryStateType.Failure;
|
|
122
|
+
error: RequestError;
|
|
123
|
+
meta: QueryStateMeta;
|
|
108
124
|
}
|
|
109
125
|
export interface Loading {
|
|
110
|
-
|
|
111
|
-
|
|
126
|
+
type: QueryStateType.Loading;
|
|
127
|
+
meta: QueryStateMeta;
|
|
128
|
+
partialText?: string;
|
|
129
|
+
progress?: RequestProgress;
|
|
112
130
|
}
|
|
113
131
|
export interface Cancelled {
|
|
114
|
-
|
|
115
|
-
|
|
132
|
+
type: QueryStateType.Cancelled;
|
|
133
|
+
meta: QueryStateMeta;
|
|
116
134
|
}
|
|
117
135
|
export interface QueryStateMeta {
|
|
118
|
-
|
|
136
|
+
id: number;
|
|
119
137
|
}
|
|
120
138
|
export interface QueryStateSuccessMeta extends QueryStateMeta {
|
|
121
|
-
|
|
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;
|
package/lib/request/request.d.ts
CHANGED
|
@@ -1,9 +1,3 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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:
|
|
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<
|
|
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:
|
|
14
|
+
export declare const extractExpiresInSeconds: (headers: RequestHeaders) => number | null;
|
|
16
15
|
export declare const buildTimestampFromSeconds: (seconds: number | null) => number | null;
|
|
17
|
-
export declare const
|
|
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
|
|
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.
|
|
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.
|
|
10
|
+
"@ethlete/core": "0.2.0-next.19",
|
|
11
11
|
"@angular/forms": "15.1.4",
|
|
12
12
|
"@angular/router": "15.1.4"
|
|
13
13
|
},
|