@afoures/http-client 0.1.0 → 0.2.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.
- package/README.md +5 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +2 -2
- package/dist/lib/endpoint.d.mts +3 -3
- package/dist/lib/endpoint.mjs +20 -20
- package/dist/lib/errors.d.mts +2 -2
- package/dist/lib/errors.mjs +3 -3
- package/dist/lib/http-client.d.mts +23 -23
- package/dist/lib/http-client.mjs +5 -5
- package/dist/lib/types.d.mts +12 -46
- package/docs/endpoint-definition.md +1 -1
- package/docs/error-handling.md +3 -3
- package/docs/http-client.md +5 -5
- package/docs/response-parsing.md +14 -10
- package/docs/retry-policy.md +1 -1
- package/docs/schema-integration.md +14 -5
- package/docs/serialization.md +13 -12
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -29,7 +29,7 @@ import { Endpoint, http_client } from '@afoures/http-client'
|
|
|
29
29
|
import { z } from 'zod'
|
|
30
30
|
|
|
31
31
|
const api = http_client({
|
|
32
|
-
|
|
32
|
+
base_url: 'https://api.example.com',
|
|
33
33
|
endpoints: {
|
|
34
34
|
users: {
|
|
35
35
|
list: new Endpoint({
|
|
@@ -43,6 +43,7 @@ const api = http_client({
|
|
|
43
43
|
},
|
|
44
44
|
data: {
|
|
45
45
|
schema: z.array(z.object({ id: z.string(), name: z.string() })),
|
|
46
|
+
parse: 'json',
|
|
46
47
|
},
|
|
47
48
|
}),
|
|
48
49
|
get: new Endpoint({
|
|
@@ -50,6 +51,7 @@ const api = http_client({
|
|
|
50
51
|
pathname: '/users/(:id)',
|
|
51
52
|
data: {
|
|
52
53
|
schema: z.object({ id: z.string(), name: z.string() }),
|
|
54
|
+
parse: 'json',
|
|
53
55
|
},
|
|
54
56
|
}),
|
|
55
57
|
create: new Endpoint({
|
|
@@ -57,9 +59,11 @@ const api = http_client({
|
|
|
57
59
|
pathname: '/users',
|
|
58
60
|
body: {
|
|
59
61
|
schema: z.object({ name: z.string(), email: z.string().email() }),
|
|
62
|
+
serialize: 'json',
|
|
60
63
|
},
|
|
61
64
|
data: {
|
|
62
65
|
schema: z.object({ id: z.string(), name: z.string() }),
|
|
66
|
+
parse: 'json',
|
|
63
67
|
},
|
|
64
68
|
}),
|
|
65
69
|
},
|
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AbortedError,
|
|
1
|
+
import { AbortedError, HttpClientError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError } from "./lib/errors.mjs";
|
|
2
2
|
import { HTTPFetch, HTTPMethod, HTTPStatus, Parser, Pathname, Schema, Serializer } from "./lib/types.mjs";
|
|
3
3
|
import { AnyEndpoint, Endpoint, EndpointDefinition } from "./lib/endpoint.mjs";
|
|
4
4
|
import { EndpointMap, HttpClientOptions, http_client } from "./lib/http-client.mjs";
|
|
5
|
-
export { AbortedError, type AnyEndpoint,
|
|
5
|
+
export { AbortedError, type AnyEndpoint, Endpoint, type EndpointDefinition, type EndpointMap, type HTTPFetch, type HTTPMethod, type HTTPStatus, HttpClientError, type HttpClientOptions, NetworkError, ParseError, type Parser, type Pathname, type Schema, SerializationError, type Serializer, TimeoutError, UnexpectedError, http_client };
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { AbortedError,
|
|
1
|
+
import { AbortedError, HttpClientError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError } from "./lib/errors.mjs";
|
|
2
2
|
import { Endpoint } from "./lib/endpoint.mjs";
|
|
3
3
|
import { http_client } from "./lib/http-client.mjs";
|
|
4
4
|
|
|
5
|
-
export { AbortedError,
|
|
5
|
+
export { AbortedError, Endpoint, HttpClientError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError, http_client };
|
package/dist/lib/endpoint.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ParseError, SerializationError } from "./errors.mjs";
|
|
2
2
|
import { ErrorMessage, HTTPFetch, HTTPMethod, Parser, Pathname, Pretty, Schema, Serializer } from "./types.mjs";
|
|
3
3
|
|
|
4
4
|
//#region src/lib/endpoint.d.ts
|
|
@@ -27,13 +27,13 @@ declare class Endpoint<http_method extends HTTPMethod.Any, pathname extends Path
|
|
|
27
27
|
get method(): http_method;
|
|
28
28
|
get options(): HTTPFetch.OptionalRequestInit & HTTPFetch.DefaultRequestInit;
|
|
29
29
|
generate_url(init: Pretty<{
|
|
30
|
-
|
|
30
|
+
base_url: string;
|
|
31
31
|
} & HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema>>): Promise<URL | SerializationError>;
|
|
32
32
|
serialize_body(init: Pretty<HTTPFetch.TypedBodyInit<body_schema>>): Promise<{
|
|
33
33
|
body: BodyInit | null;
|
|
34
34
|
content_type?: string;
|
|
35
35
|
} | SerializationError>;
|
|
36
|
-
parse_response(response: Response): Promise<HTTPFetch.ClientErrorResponse<Schema.infer_output<error_schema, string>> | HTTPFetch.ServerErrorResponse<Schema.infer_output<error_schema, string>> | HTTPFetch.SuccessfulResponse<Schema.infer_output<data_schema, void>> | HTTPFetch.RedirectMessage |
|
|
36
|
+
parse_response(response: Response): Promise<HTTPFetch.ClientErrorResponse<Schema.infer_output<error_schema, string>> | HTTPFetch.ServerErrorResponse<Schema.infer_output<error_schema, string>> | HTTPFetch.SuccessfulResponse<Schema.infer_output<data_schema, void>> | HTTPFetch.RedirectMessage | ParseError>;
|
|
37
37
|
}
|
|
38
38
|
type AnyEndpoint = Endpoint<any, any, any, any, any, any, any>;
|
|
39
39
|
//#endregion
|
package/dist/lib/endpoint.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ParseError, SerializationError } from "./errors.mjs";
|
|
2
2
|
import "./types.mjs";
|
|
3
3
|
import { RoutePattern } from "@remix-run/route-pattern";
|
|
4
4
|
|
|
@@ -38,7 +38,7 @@ var Endpoint = class {
|
|
|
38
38
|
cause: result.issues
|
|
39
39
|
});
|
|
40
40
|
const transformed_params = result.value;
|
|
41
|
-
if (this.#serializers.params.
|
|
41
|
+
if (this.#serializers.params.serialize) pathname_params = this.#serializers.params.serialize(transformed_params);
|
|
42
42
|
else pathname_params = Object.fromEntries(Object.entries(transformed_params).map(([key, value]) => [key, String(value)]));
|
|
43
43
|
} else pathname_params = Object.fromEntries(Object.entries(init.params).map(([key, value]) => [key, String(value)]));
|
|
44
44
|
const pathname = this.#pattern.href(pathname_params);
|
|
@@ -50,8 +50,8 @@ var Endpoint = class {
|
|
|
50
50
|
operation: "generate_url"
|
|
51
51
|
});
|
|
52
52
|
const transformed_query = result.value;
|
|
53
|
-
if (typeof this.#serializers.query.
|
|
54
|
-
else if (this.#serializers.query.
|
|
53
|
+
if (typeof this.#serializers.query.serialize === "function") search_params = this.#serializers.query.serialize(transformed_query);
|
|
54
|
+
else if (this.#serializers.query.serialize === "urlencoded") {
|
|
55
55
|
if (Array.isArray(transformed_query)) transformed_query.forEach((tuple, index) => {
|
|
56
56
|
if (Array.isArray(tuple)) tuple.forEach((value, tupleIndex) => {
|
|
57
57
|
search_params.append(`${index}[${tupleIndex}]`, String(value));
|
|
@@ -63,7 +63,7 @@ var Endpoint = class {
|
|
|
63
63
|
}
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
|
-
const url = new URL(pathname, init.
|
|
66
|
+
const url = new URL(pathname.startsWith("/") ? pathname.slice(1) : pathname, init.base_url);
|
|
67
67
|
const query_string = search_params.toString();
|
|
68
68
|
if (query_string) url.search = query_string;
|
|
69
69
|
return url;
|
|
@@ -83,7 +83,7 @@ var Endpoint = class {
|
|
|
83
83
|
cause: result.issues
|
|
84
84
|
});
|
|
85
85
|
const transformed_content = result.value;
|
|
86
|
-
if (typeof this.#serializers.body.
|
|
86
|
+
if (typeof this.#serializers.body.serialize === "function") return this.#serializers.body.serialize(transformed_content);
|
|
87
87
|
else return {
|
|
88
88
|
body: JSON.stringify(transformed_content),
|
|
89
89
|
content_type: "application/json"
|
|
@@ -106,11 +106,11 @@ var Endpoint = class {
|
|
|
106
106
|
if (this.#parsers.error) {
|
|
107
107
|
const parser = this.#parsers.error;
|
|
108
108
|
let parsed;
|
|
109
|
-
if (typeof parser.
|
|
110
|
-
else if (parser.
|
|
111
|
-
else if (parser.
|
|
109
|
+
if (typeof parser.parse === "function") parsed = await parser.parse(cloned_response.body);
|
|
110
|
+
else if (parser.parse === "json") parsed = await parse_as_json(cloned_response);
|
|
111
|
+
else if (parser.parse === "text") parsed = await cloned_response.text();
|
|
112
112
|
const result = await parser.schema["~standard"].validate(parsed);
|
|
113
|
-
if (result.issues !== void 0) return new
|
|
113
|
+
if (result.issues !== void 0) return new ParseError("Error parsing failed", {
|
|
114
114
|
cause: result.issues,
|
|
115
115
|
operation: "parse_response"
|
|
116
116
|
});
|
|
@@ -135,11 +135,11 @@ var Endpoint = class {
|
|
|
135
135
|
if (this.#parsers.data) {
|
|
136
136
|
const parser = this.#parsers.data;
|
|
137
137
|
let parsed;
|
|
138
|
-
if (typeof parser.
|
|
139
|
-
else if (parser.
|
|
140
|
-
else if (parser.
|
|
138
|
+
if (typeof parser.parse === "function") parsed = await parser.parse(cloned_response.body);
|
|
139
|
+
else if (parser.parse === "json") parsed = await parse_as_json(cloned_response);
|
|
140
|
+
else if (parser.parse === "text") parsed = await cloned_response.text();
|
|
141
141
|
const result = await parser.schema["~standard"].validate(parsed);
|
|
142
|
-
if (result.issues !== void 0) return new
|
|
142
|
+
if (result.issues !== void 0) return new ParseError("Response parsing failed", {
|
|
143
143
|
cause: result.issues,
|
|
144
144
|
operation: "parse_response"
|
|
145
145
|
});
|
|
@@ -170,19 +170,19 @@ async function parse_as_json(response) {
|
|
|
170
170
|
throw new Error(`Failed to parse response as JSON: ${e instanceof Error ? e.message : String(e)}`);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
function as_serializer(serializer,
|
|
173
|
+
function as_serializer(serializer, default_serialize) {
|
|
174
174
|
if (!serializer || typeof serializer !== "object" || !("schema" in serializer)) return null;
|
|
175
|
-
if (
|
|
175
|
+
if (default_serialize === void 0 || "serialize" in serializer && typeof serializer.serialize !== "undefined") return serializer;
|
|
176
176
|
return {
|
|
177
|
-
|
|
177
|
+
serialize: default_serialize,
|
|
178
178
|
...serializer
|
|
179
179
|
};
|
|
180
180
|
}
|
|
181
|
-
function as_parser(parser,
|
|
181
|
+
function as_parser(parser, default_parse) {
|
|
182
182
|
if (!parser || typeof parser !== "object" || !("schema" in parser)) return null;
|
|
183
|
-
if (
|
|
183
|
+
if (default_parse === void 0 || "parse" in parser && typeof parser.parse !== "undefined") return parser;
|
|
184
184
|
return {
|
|
185
|
-
|
|
185
|
+
parse: default_parse,
|
|
186
186
|
...parser
|
|
187
187
|
};
|
|
188
188
|
}
|
package/dist/lib/errors.d.mts
CHANGED
|
@@ -29,7 +29,7 @@ declare class SerializationError extends HttpClientError {
|
|
|
29
29
|
...context
|
|
30
30
|
}: ErrorCause & BaseContext);
|
|
31
31
|
}
|
|
32
|
-
declare class
|
|
32
|
+
declare class ParseError extends HttpClientError {
|
|
33
33
|
readonly context: BaseContext;
|
|
34
34
|
constructor(message: string, {
|
|
35
35
|
cause,
|
|
@@ -51,4 +51,4 @@ declare class UnexpectedError extends Error {
|
|
|
51
51
|
}: ErrorCause & BaseContext);
|
|
52
52
|
}
|
|
53
53
|
//#endregion
|
|
54
|
-
export { AbortedError,
|
|
54
|
+
export { AbortedError, HttpClientError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError };
|
package/dist/lib/errors.mjs
CHANGED
|
@@ -29,11 +29,11 @@ var SerializationError = class extends HttpClientError {
|
|
|
29
29
|
this.context = context;
|
|
30
30
|
}
|
|
31
31
|
};
|
|
32
|
-
var
|
|
32
|
+
var ParseError = class extends HttpClientError {
|
|
33
33
|
context;
|
|
34
34
|
constructor(message, { cause, ...context }) {
|
|
35
35
|
super(message, { cause });
|
|
36
|
-
this.name = "
|
|
36
|
+
this.name = "ParseError";
|
|
37
37
|
this.context = context;
|
|
38
38
|
}
|
|
39
39
|
};
|
|
@@ -55,4 +55,4 @@ var UnexpectedError = class extends Error {
|
|
|
55
55
|
};
|
|
56
56
|
|
|
57
57
|
//#endregion
|
|
58
|
-
export { AbortedError,
|
|
58
|
+
export { AbortedError, HttpClientError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AbortedError,
|
|
1
|
+
import { AbortedError, NetworkError, ParseError, SerializationError, TimeoutError, UnexpectedError } from "./errors.mjs";
|
|
2
2
|
import { HTTPFetch, HTTPMethod, HeadersInitWithReducer, MaybePromise, Schema } from "./types.mjs";
|
|
3
3
|
import { AnyEndpoint, Endpoint } from "./endpoint.mjs";
|
|
4
4
|
import * as _standard_schema_spec0 from "@standard-schema/spec";
|
|
@@ -9,56 +9,56 @@ interface EndpointMap {
|
|
|
9
9
|
}
|
|
10
10
|
type CustomFetch = (request: Request) => Promise<Response>;
|
|
11
11
|
type HttpClientOptions<endpoints extends EndpointMap> = {
|
|
12
|
-
|
|
12
|
+
base_url: string;
|
|
13
13
|
endpoints: endpoints;
|
|
14
14
|
options?: () => MaybePromise<HTTPFetch.OptionalRequestInit & HTTPFetch.DefaultRequestInit>;
|
|
15
15
|
fetch?: CustomFetch;
|
|
16
16
|
};
|
|
17
17
|
declare function http_client<const endpoints extends EndpointMap>({
|
|
18
|
-
|
|
18
|
+
base_url,
|
|
19
19
|
endpoints: all_endpoints,
|
|
20
20
|
options,
|
|
21
21
|
fetch: custom_fetch
|
|
22
22
|
}: HttpClientOptions<endpoints>): { [K in keyof { -readonly [name in keyof endpoints]: endpoints[name] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
23
23
|
headers?: HeadersInitWithReducer;
|
|
24
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K in keyof T]: T[K] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
24
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K in keyof T]: T[K] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : endpoints[name] extends EndpointMap ? (endpoints[name] extends infer T_1 extends EndpointMap ? { -readonly [name_2 in keyof T_1]: T_1[name_2] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
25
25
|
headers?: HeadersInitWithReducer;
|
|
26
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
26
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_1[name_2] extends EndpointMap ? (T_1[name_2] extends infer T_3 extends EndpointMap ? { -readonly [name_3 in keyof T_3]: T_3[name_3] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
27
27
|
headers?: HeadersInitWithReducer;
|
|
28
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_4 ? { [K_2 in keyof T_4]: T_4[K_2] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
28
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_4 ? { [K_2 in keyof T_4]: T_4[K_2] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_3[name_3] extends EndpointMap ? (T_3[name_3] extends infer T_5 extends EndpointMap ? { -readonly [name_4 in keyof T_5]: T_5[name_4] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
29
29
|
headers?: HeadersInitWithReducer;
|
|
30
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_6 ? { [K_3 in keyof T_6]: T_6[K_3] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
30
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_6 ? { [K_3 in keyof T_6]: T_6[K_3] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_5[name_4] extends EndpointMap ? (T_5[name_4] extends infer T_7 extends EndpointMap ? { -readonly [name_5 in keyof T_7]: T_7[name_5] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
31
31
|
headers?: HeadersInitWithReducer;
|
|
32
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_8 ? { [K_4 in keyof T_8]: T_8[K_4] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
32
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_8 ? { [K_4 in keyof T_8]: T_8[K_4] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_7[name_5] extends EndpointMap ? (T_7[name_5] extends infer T_9 extends EndpointMap ? { -readonly [name_6 in keyof T_9]: T_9[name_6] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
33
33
|
headers?: HeadersInitWithReducer;
|
|
34
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_10 ? { [K_5 in keyof T_10]: T_10[K_5] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
34
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_10 ? { [K_5 in keyof T_10]: T_10[K_5] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_9[name_6] extends EndpointMap ? (T_9[name_6] extends infer T_11 extends EndpointMap ? { -readonly [name_7 in keyof T_11]: T_11[name_7] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
35
35
|
headers?: HeadersInitWithReducer;
|
|
36
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_12 ? { [K_6 in keyof T_12]: T_12[K_6] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
36
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_12 ? { [K_6 in keyof T_12]: T_12[K_6] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_11[name_7] extends EndpointMap ? (T_11[name_7] extends infer T_13 extends EndpointMap ? { -readonly [name_8 in keyof T_13]: T_13[name_8] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
37
37
|
headers?: HeadersInitWithReducer;
|
|
38
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_14 ? { [K_7 in keyof T_14]: T_14[K_7] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
38
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_14 ? { [K_7 in keyof T_14]: T_14[K_7] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_13[name_8] extends EndpointMap ? (T_13[name_8] extends infer T_15 extends EndpointMap ? { -readonly [name_9 in keyof T_15]: T_15[name_9] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
39
39
|
headers?: HeadersInitWithReducer;
|
|
40
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_16 ? { [K_8 in keyof T_16]: T_16[K_8] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
40
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_16 ? { [K_8 in keyof T_16]: T_16[K_8] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_15[name_9] extends EndpointMap ? (T_15[name_9] extends infer T_17 extends EndpointMap ? { -readonly [name_10 in keyof T_17]: T_17[name_10] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
41
41
|
headers?: HeadersInitWithReducer;
|
|
42
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_18 ? { [K_9 in keyof T_18]: T_18[K_9] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
42
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_18 ? { [K_9 in keyof T_18]: T_18[K_9] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_17[name_10] extends EndpointMap ? (T_17[name_10] extends infer T_19 extends EndpointMap ? { -readonly [name_11 in keyof T_19]: T_19[name_11] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: /*elided*/any) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_19[name_11] extends EndpointMap ? /*elided*/any : never } : never) extends infer T_18 ? { [K_9 in keyof T_18]: T_18[K_9] } : never : never } : never) extends infer T_16 ? { [K_8 in keyof T_16]: T_16[K_8] } : never : never } : never) extends infer T_14 ? { [K_7 in keyof T_14]: T_14[K_7] } : never : never } : never) extends infer T_12 ? { [K_6 in keyof T_12]: T_12[K_6] } : never : never } : never) extends infer T_10 ? { [K_5 in keyof T_10]: T_10[K_5] } : never : never } : never) extends infer T_8 ? { [K_4 in keyof T_8]: T_8[K_4] } : never : never } : never) extends infer T_6 ? { [K_3 in keyof T_6]: T_6[K_3] } : never : never } : never) extends infer T_4 ? { [K_2 in keyof T_4]: T_4[K_2] } : never : never } : never) extends infer T_2 ? { [K_1 in keyof T_2]: T_2[K_1] } : never : never } : never) extends infer T ? { [K in keyof T]: T[K] } : never : never }]: { -readonly [name in keyof endpoints]: endpoints[name] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
43
43
|
headers?: HeadersInitWithReducer;
|
|
44
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K_2 in keyof T]: T[K_2] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
44
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K_2 in keyof T]: T[K_2] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : endpoints[name] extends EndpointMap ? (endpoints[name] extends infer T_1 extends EndpointMap ? { -readonly [name_2 in keyof T_1]: T_1[name_2] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
45
45
|
headers?: HeadersInitWithReducer;
|
|
46
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
46
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_1[name_2] extends EndpointMap ? (T_1[name_2] extends infer T_3 extends EndpointMap ? { -readonly [name_3 in keyof T_3]: T_3[name_3] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
47
47
|
headers?: HeadersInitWithReducer;
|
|
48
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_4 ? { [K_4 in keyof T_4]: T_4[K_4] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
48
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_4 ? { [K_4 in keyof T_4]: T_4[K_4] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_3[name_3] extends EndpointMap ? (T_3[name_3] extends infer T_5 extends EndpointMap ? { -readonly [name_4 in keyof T_5]: T_5[name_4] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
49
49
|
headers?: HeadersInitWithReducer;
|
|
50
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_6 ? { [K_5 in keyof T_6]: T_6[K_5] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
50
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_6 ? { [K_5 in keyof T_6]: T_6[K_5] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_5[name_4] extends EndpointMap ? (T_5[name_4] extends infer T_7 extends EndpointMap ? { -readonly [name_5 in keyof T_7]: T_7[name_5] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
51
51
|
headers?: HeadersInitWithReducer;
|
|
52
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_8 ? { [K_6 in keyof T_8]: T_8[K_6] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
52
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_8 ? { [K_6 in keyof T_8]: T_8[K_6] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_7[name_5] extends EndpointMap ? (T_7[name_5] extends infer T_9 extends EndpointMap ? { -readonly [name_6 in keyof T_9]: T_9[name_6] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
53
53
|
headers?: HeadersInitWithReducer;
|
|
54
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_10 ? { [K_7 in keyof T_10]: T_10[K_7] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
54
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_10 ? { [K_7 in keyof T_10]: T_10[K_7] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_9[name_6] extends EndpointMap ? (T_9[name_6] extends infer T_11 extends EndpointMap ? { -readonly [name_7 in keyof T_11]: T_11[name_7] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
55
55
|
headers?: HeadersInitWithReducer;
|
|
56
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_12 ? { [K_8 in keyof T_12]: T_12[K_8] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
56
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_12 ? { [K_8 in keyof T_12]: T_12[K_8] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_11[name_7] extends EndpointMap ? (T_11[name_7] extends infer T_13 extends EndpointMap ? { -readonly [name_8 in keyof T_13]: T_13[name_8] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
57
57
|
headers?: HeadersInitWithReducer;
|
|
58
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_14 ? { [K_9 in keyof T_14]: T_14[K_9] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
58
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_14 ? { [K_9 in keyof T_14]: T_14[K_9] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_13[name_8] extends EndpointMap ? (T_13[name_8] extends infer T_15 extends EndpointMap ? { -readonly [name_9 in keyof T_15]: T_15[name_9] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
59
59
|
headers?: HeadersInitWithReducer;
|
|
60
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_16 ? { [K_10 in keyof T_16]: T_16[K_10] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
60
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_16 ? { [K_10 in keyof T_16]: T_16[K_10] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_15[name_9] extends EndpointMap ? (T_15[name_9] extends infer T_17 extends EndpointMap ? { -readonly [name_10 in keyof T_17]: T_17[name_10] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema> & HTTPFetch.TypedBodyInit<body_schema> & HTTPFetch.OptionalRequestInit & {
|
|
61
61
|
headers?: HeadersInitWithReducer;
|
|
62
|
-
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_18 ? { [K_11 in keyof T_18]: T_18[K_11] } : never) => Promise<TimeoutError | AbortedError | SerializationError |
|
|
62
|
+
} & Omit<RequestInit, "body" | "method" | "headers"> extends infer T_18 ? { [K_11 in keyof T_18]: T_18[K_11] } : never) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_17[name_10] extends EndpointMap ? (T_17[name_10] extends infer T_19 extends EndpointMap ? { -readonly [name_11 in keyof T_19]: T_19[name_11] extends Endpoint<infer http_method extends HTTPMethod.Any, infer pathname extends `/${string}`, infer params_schema extends Schema._<unknown, unknown>, infer query_schema extends Schema._<unknown, unknown>, infer body_schema extends Schema._<unknown, unknown>, infer data_schema extends Schema._<unknown, unknown>, infer error_schema extends Schema._<unknown, unknown>> ? (input: /*elided*/any) => Promise<TimeoutError | AbortedError | SerializationError | ParseError | NetworkError | UnexpectedError | HTTPFetch.RedirectMessage | HTTPFetch.ClientErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.ServerErrorResponse<[error_schema] extends [never] ? string : _standard_schema_spec0.StandardSchemaV1.InferOutput<error_schema>> | HTTPFetch.SuccessfulResponse<[data_schema] extends [never] ? void : _standard_schema_spec0.StandardSchemaV1.InferOutput<data_schema>>> : T_19[name_11] extends EndpointMap ? /*elided*/any : never } : never) extends infer T_18 ? { [K_11 in keyof T_18]: T_18[K_11] } : never : never } : never) extends infer T_16 ? { [K_10 in keyof T_16]: T_16[K_10] } : never : never } : never) extends infer T_14 ? { [K_9 in keyof T_14]: T_14[K_9] } : never : never } : never) extends infer T_12 ? { [K_8 in keyof T_12]: T_12[K_8] } : never : never } : never) extends infer T_10 ? { [K_7 in keyof T_10]: T_10[K_7] } : never : never } : never) extends infer T_8 ? { [K_6 in keyof T_8]: T_8[K_6] } : never : never } : never) extends infer T_6 ? { [K_5 in keyof T_6]: T_6[K_5] } : never : never } : never) extends infer T_4 ? { [K_4 in keyof T_4]: T_4[K_4] } : never : never } : never) extends infer T_2 ? { [K_3 in keyof T_2]: T_2[K_3] } : never : never } : never) extends infer T ? { [K_2 in keyof T]: T[K_2] } : never : never }[K] };
|
|
63
63
|
//#endregion
|
|
64
64
|
export { EndpointMap, HttpClientOptions, http_client };
|
package/dist/lib/http-client.mjs
CHANGED
|
@@ -4,13 +4,13 @@ import { Endpoint } from "./endpoint.mjs";
|
|
|
4
4
|
import { extract_args, merge_options, remove_custom_options, sleep } from "./utils.mjs";
|
|
5
5
|
|
|
6
6
|
//#region src/lib/http-client.ts
|
|
7
|
-
function fetch_endpoint_factory({
|
|
7
|
+
function fetch_endpoint_factory({ base_url, endpoint, custom_fetch, get_default_options = () => ({}), hooks = {} }) {
|
|
8
8
|
async function fetch_endpoint(input) {
|
|
9
|
-
if (!URL.canParse(
|
|
9
|
+
if (!URL.canParse(base_url)) return new UnexpectedError(`Invalid base_url: ${base_url}`, { operation: "base_url_validation" });
|
|
10
10
|
const { args, options } = extract_args(input);
|
|
11
11
|
const { headers, ...merged_options } = merge_options(await get_default_options(), endpoint.options, options);
|
|
12
12
|
const url = await endpoint.generate_url({
|
|
13
|
-
|
|
13
|
+
base_url,
|
|
14
14
|
params: args.params,
|
|
15
15
|
query: args.query
|
|
16
16
|
}).catch((error) => new UnexpectedError("Failed to generate URL", {
|
|
@@ -115,12 +115,12 @@ function fetch_endpoint_factory({ origin, endpoint, custom_fetch, get_default_op
|
|
|
115
115
|
}
|
|
116
116
|
return fetch_endpoint;
|
|
117
117
|
}
|
|
118
|
-
function http_client({
|
|
118
|
+
function http_client({ base_url, endpoints: all_endpoints, options, fetch: custom_fetch = fetch }) {
|
|
119
119
|
function map(endpoints) {
|
|
120
120
|
return Object.fromEntries(Object.entries(endpoints).map(([key, endpoint_or_object]) => {
|
|
121
121
|
if (endpoint_or_object instanceof Endpoint) return [key, fetch_endpoint_factory({
|
|
122
122
|
endpoint: endpoint_or_object,
|
|
123
|
-
|
|
123
|
+
base_url,
|
|
124
124
|
custom_fetch,
|
|
125
125
|
get_default_options: options
|
|
126
126
|
})];
|
package/dist/lib/types.d.mts
CHANGED
|
@@ -133,85 +133,51 @@ declare namespace Schema {
|
|
|
133
133
|
type infer_input<schema extends Schema.Any, default_value extends unknown = never> = [default_value] extends [never] ? StandardSchemaV1.InferInput<schema> : [schema] extends [never] ? default_value : StandardSchemaV1.InferInput<schema>;
|
|
134
134
|
type infer_output<schema extends Schema.Any, default_value extends unknown = never> = [default_value] extends [never] ? StandardSchemaV1.InferOutput<schema> : [schema] extends [never] ? default_value : StandardSchemaV1.InferOutput<schema>;
|
|
135
135
|
}
|
|
136
|
-
declare namespace Json {
|
|
137
|
-
/**
|
|
138
|
-
Matches a JSON object.
|
|
139
|
-
@category JSON
|
|
140
|
-
*/
|
|
141
|
-
type Object = { [Key in string]: Json.Value };
|
|
142
|
-
/**
|
|
143
|
-
Matches a JSON array.
|
|
144
|
-
@category JSON
|
|
145
|
-
*/
|
|
146
|
-
type Array = Json.Value[] | readonly Json.Value[];
|
|
147
|
-
/**
|
|
148
|
-
Matches any valid JSON primitive value.
|
|
149
|
-
@category JSON
|
|
150
|
-
*/
|
|
151
|
-
type Primitive = string | number | boolean | null;
|
|
152
|
-
/**
|
|
153
|
-
Matches any valid JSON value.
|
|
154
|
-
@category JSON
|
|
155
|
-
*/
|
|
156
|
-
type Value = Json.Primitive | Json.Object | Json.Array;
|
|
157
|
-
}
|
|
158
136
|
declare namespace Serializer {
|
|
159
137
|
type Any = {
|
|
160
138
|
schema: Schema.Any;
|
|
161
|
-
|
|
139
|
+
serialize?: string | ((data: any) => any);
|
|
162
140
|
};
|
|
163
141
|
type Params<pathname extends Pathname.Relative, schema extends Schema._> = schema extends Schema._<any, Pathname.Params<pathname>> ? {
|
|
164
142
|
schema: schema;
|
|
165
|
-
|
|
143
|
+
serialize?: (data: Schema.infer_output<NoInfer<schema>>) => Pathname.Params<pathname>;
|
|
166
144
|
} : {
|
|
167
145
|
schema: schema;
|
|
168
|
-
|
|
146
|
+
serialize: (data: Schema.infer_output<NoInfer<schema>>) => Pathname.Params<pathname>;
|
|
169
147
|
};
|
|
170
148
|
type QueryString<schema extends Schema._> = schema extends Schema._<any, Array<Array<string>> | Record<string, string> | undefined> ? {
|
|
171
149
|
schema: schema;
|
|
172
|
-
|
|
150
|
+
serialize?: "urlencoded" | ((data: Schema.infer_output<NoInfer<schema>>) => URLSearchParams);
|
|
173
151
|
} : {
|
|
174
152
|
schema: schema;
|
|
175
|
-
|
|
153
|
+
serialize: (data: Schema.infer_output<NoInfer<schema>>) => URLSearchParams;
|
|
176
154
|
};
|
|
177
|
-
type Body<schema extends Schema._> =
|
|
155
|
+
type Body<schema extends Schema._> = {
|
|
178
156
|
schema: schema;
|
|
179
|
-
|
|
157
|
+
serialize: "json" | ((data: Schema.infer_output<NoInfer<schema>, any>) => {
|
|
180
158
|
body: BodyInit | null;
|
|
181
159
|
content_type: string;
|
|
182
160
|
});
|
|
183
|
-
} : {
|
|
184
|
-
schema: schema;
|
|
185
|
-
serialization: (data: Schema.infer_output<NoInfer<schema>>) => {
|
|
186
|
-
body: BodyInit | null;
|
|
187
|
-
content_type: string;
|
|
188
|
-
};
|
|
189
161
|
};
|
|
190
162
|
}
|
|
191
163
|
declare namespace Parser {
|
|
192
164
|
type Any = {
|
|
193
165
|
schema: Schema.Any;
|
|
194
|
-
|
|
166
|
+
parse: string | ((data: any) => any);
|
|
195
167
|
};
|
|
196
168
|
type Data<schema extends Schema._> = schema extends Schema._<string, any> ? {
|
|
197
169
|
schema: schema;
|
|
198
|
-
|
|
199
|
-
} : schema extends Schema._<Json.Value, any> ? {
|
|
200
|
-
schema: schema;
|
|
201
|
-
deserialization?: "json" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
170
|
+
parse: "text" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
202
171
|
} : {
|
|
203
172
|
schema: schema;
|
|
204
|
-
|
|
173
|
+
parse: "json" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
205
174
|
};
|
|
206
175
|
type Error<schema extends Schema._> = schema extends Schema._<string, any> ? {
|
|
207
176
|
schema: schema;
|
|
208
|
-
|
|
209
|
-
} : schema extends Schema._<Json.Value, any> ? {
|
|
210
|
-
schema: schema;
|
|
211
|
-
deserialization: "json" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
177
|
+
parse: "text" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
212
178
|
} : {
|
|
213
179
|
schema: schema;
|
|
214
|
-
|
|
180
|
+
parse: "json" | ((body: Response["body"]) => Promise<Schema.infer_input<NoInfer<schema>>>);
|
|
215
181
|
};
|
|
216
182
|
}
|
|
217
183
|
//#endregion
|
|
@@ -97,7 +97,7 @@ Generates a full URL with params and query serialized:
|
|
|
97
97
|
|
|
98
98
|
```typescript
|
|
99
99
|
const url = await endpoint.generate_url({
|
|
100
|
-
|
|
100
|
+
base_url: 'https://api.example.com',
|
|
101
101
|
params: { id: '123' },
|
|
102
102
|
query: { include: 'posts' },
|
|
103
103
|
})
|
package/docs/error-handling.md
CHANGED
|
@@ -74,15 +74,15 @@ if (result instanceof SerializationError) {
|
|
|
74
74
|
}
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
### `
|
|
77
|
+
### `ParseError`
|
|
78
78
|
|
|
79
79
|
Failed to parse response:
|
|
80
80
|
|
|
81
81
|
```typescript
|
|
82
82
|
const result = await api.users.get({ params: { id: '123' } })
|
|
83
83
|
|
|
84
|
-
if (result instanceof
|
|
85
|
-
console.log(result.kind) // "
|
|
84
|
+
if (result instanceof ParseError) {
|
|
85
|
+
console.log(result.kind) // "ParseError"
|
|
86
86
|
console.log(result.cause) // Schema validation issues
|
|
87
87
|
}
|
|
88
88
|
```
|
package/docs/http-client.md
CHANGED
|
@@ -9,12 +9,12 @@ import { Endpoint, http_client } from '@afoures/http-client'
|
|
|
9
9
|
import { z } from 'zod'
|
|
10
10
|
|
|
11
11
|
const api = http_client({
|
|
12
|
-
|
|
12
|
+
base_url: 'https://api.example.com',
|
|
13
13
|
endpoints: {
|
|
14
14
|
users: new Endpoint({
|
|
15
15
|
method: 'GET',
|
|
16
16
|
pathname: '/users',
|
|
17
|
-
data: { schema: z.array(z.object({ id: z.string() })) },
|
|
17
|
+
data: { schema: z.array(z.object({ id: z.string() })), parse: 'json' },
|
|
18
18
|
}),
|
|
19
19
|
},
|
|
20
20
|
})
|
|
@@ -28,7 +28,7 @@ Nest endpoints in objects for logical grouping:
|
|
|
28
28
|
|
|
29
29
|
```typescript
|
|
30
30
|
const api = http_client({
|
|
31
|
-
|
|
31
|
+
base_url: 'https://api.example.com',
|
|
32
32
|
endpoints: {
|
|
33
33
|
users: {
|
|
34
34
|
list: new Endpoint({ method: 'GET', pathname: '/users' }),
|
|
@@ -60,7 +60,7 @@ Provide sync or async default options for all requests:
|
|
|
60
60
|
|
|
61
61
|
```typescript
|
|
62
62
|
const api = http_client({
|
|
63
|
-
|
|
63
|
+
base_url: 'https://api.example.com',
|
|
64
64
|
endpoints: { /* ... */ },
|
|
65
65
|
options: async () => {
|
|
66
66
|
const token = await getAuthToken()
|
|
@@ -84,7 +84,7 @@ Provide a custom fetch function for proxying, logging, or modifying requests:
|
|
|
84
84
|
|
|
85
85
|
```typescript
|
|
86
86
|
const api = http_client({
|
|
87
|
-
|
|
87
|
+
base_url: 'https://api.example.com',
|
|
88
88
|
endpoints: { /* ... */ },
|
|
89
89
|
fetch: async (request) => {
|
|
90
90
|
console.log('Request:', request.url)
|
package/docs/response-parsing.md
CHANGED
|
@@ -56,7 +56,9 @@ type ServerErrorResponse<Error> = {
|
|
|
56
56
|
|
|
57
57
|
Define a `data` parser for successful responses:
|
|
58
58
|
|
|
59
|
-
### JSON
|
|
59
|
+
### JSON
|
|
60
|
+
|
|
61
|
+
Use `parse: 'json'` to parse the response body as JSON:
|
|
60
62
|
|
|
61
63
|
```typescript
|
|
62
64
|
const endpoint = new Endpoint({
|
|
@@ -67,6 +69,7 @@ const endpoint = new Endpoint({
|
|
|
67
69
|
id: z.string(),
|
|
68
70
|
name: z.string(),
|
|
69
71
|
}),
|
|
72
|
+
parse: 'json',
|
|
70
73
|
},
|
|
71
74
|
})
|
|
72
75
|
|
|
@@ -84,7 +87,7 @@ const endpoint = new Endpoint({
|
|
|
84
87
|
pathname: '/health',
|
|
85
88
|
data: {
|
|
86
89
|
schema: z.string(),
|
|
87
|
-
|
|
90
|
+
parse: 'text',
|
|
88
91
|
},
|
|
89
92
|
})
|
|
90
93
|
```
|
|
@@ -97,7 +100,7 @@ const endpoint = new Endpoint({
|
|
|
97
100
|
pathname: '/data',
|
|
98
101
|
data: {
|
|
99
102
|
schema: z.object({ value: z.number() }),
|
|
100
|
-
|
|
103
|
+
parse: async (body) => {
|
|
101
104
|
const text = await new Response(body).text()
|
|
102
105
|
return JSON.parse(text)
|
|
103
106
|
},
|
|
@@ -129,13 +132,13 @@ Define an `error` parser for error responses:
|
|
|
129
132
|
const endpoint = new Endpoint({
|
|
130
133
|
method: 'POST',
|
|
131
134
|
pathname: '/users',
|
|
132
|
-
body: { schema: z.object({ name: z.string() }) },
|
|
135
|
+
body: { schema: z.object({ name: z.string() }), serialize: 'json' },
|
|
133
136
|
error: {
|
|
134
137
|
schema: z.object({
|
|
135
138
|
message: z.string(),
|
|
136
139
|
code: z.string(),
|
|
137
140
|
}),
|
|
138
|
-
|
|
141
|
+
parse: 'json',
|
|
139
142
|
},
|
|
140
143
|
})
|
|
141
144
|
|
|
@@ -154,7 +157,7 @@ const endpoint = new Endpoint({
|
|
|
154
157
|
pathname: '/users/(:id)',
|
|
155
158
|
error: {
|
|
156
159
|
schema: z.string(),
|
|
157
|
-
|
|
160
|
+
parse: 'text',
|
|
158
161
|
},
|
|
159
162
|
})
|
|
160
163
|
|
|
@@ -193,6 +196,7 @@ const endpoint = new Endpoint({
|
|
|
193
196
|
name: z.string().transform(s => s.toUpperCase()),
|
|
194
197
|
createdAt: z.string().transform(s => new Date(s)),
|
|
195
198
|
}),
|
|
199
|
+
parse: 'json',
|
|
196
200
|
},
|
|
197
201
|
})
|
|
198
202
|
|
|
@@ -203,15 +207,15 @@ if (result.ok) {
|
|
|
203
207
|
}
|
|
204
208
|
```
|
|
205
209
|
|
|
206
|
-
##
|
|
210
|
+
## Parse Errors
|
|
207
211
|
|
|
208
|
-
If response parsing fails validation, a `
|
|
212
|
+
If response parsing fails validation, a `ParseError` is returned:
|
|
209
213
|
|
|
210
214
|
```typescript
|
|
211
215
|
const result = await endpoint.parse_response(response)
|
|
212
216
|
|
|
213
|
-
if (result instanceof
|
|
214
|
-
console.log(result.message) // "Response
|
|
217
|
+
if (result instanceof ParseError) {
|
|
218
|
+
console.log(result.message) // "Response parsing failed"
|
|
215
219
|
console.log(result.cause) // Schema validation issues
|
|
216
220
|
}
|
|
217
221
|
```
|
package/docs/retry-policy.md
CHANGED
|
@@ -15,6 +15,7 @@ const endpoint = new Endpoint({
|
|
|
15
15
|
name: z.string().min(1),
|
|
16
16
|
email: z.string().email(),
|
|
17
17
|
}),
|
|
18
|
+
serialize: 'json',
|
|
18
19
|
},
|
|
19
20
|
data: {
|
|
20
21
|
schema: z.object({
|
|
@@ -22,6 +23,7 @@ const endpoint = new Endpoint({
|
|
|
22
23
|
name: z.string(),
|
|
23
24
|
createdAt: z.string().datetime(),
|
|
24
25
|
}),
|
|
26
|
+
parse: 'json',
|
|
25
27
|
},
|
|
26
28
|
})
|
|
27
29
|
```
|
|
@@ -43,6 +45,7 @@ const endpoint = new Endpoint({
|
|
|
43
45
|
schema: z.object({
|
|
44
46
|
createdAt: z.string().transform(s => new Date(s)), // parse ISO to Date
|
|
45
47
|
}),
|
|
48
|
+
parse: 'json',
|
|
46
49
|
},
|
|
47
50
|
})
|
|
48
51
|
|
|
@@ -66,6 +69,7 @@ const endpoint = new Endpoint({
|
|
|
66
69
|
email: 'string',
|
|
67
70
|
age: 'number?',
|
|
68
71
|
}),
|
|
72
|
+
serialize: 'json',
|
|
69
73
|
},
|
|
70
74
|
data: {
|
|
71
75
|
schema: type({
|
|
@@ -73,6 +77,7 @@ const endpoint = new Endpoint({
|
|
|
73
77
|
name: 'string',
|
|
74
78
|
'email?': 'string',
|
|
75
79
|
}),
|
|
80
|
+
parse: 'json',
|
|
76
81
|
},
|
|
77
82
|
})
|
|
78
83
|
```
|
|
@@ -90,6 +95,7 @@ const endpoint = new Endpoint({
|
|
|
90
95
|
id: 'string',
|
|
91
96
|
'createdAt': 'string.parse(v => new Date(v))',
|
|
92
97
|
}),
|
|
98
|
+
parse: 'json',
|
|
93
99
|
},
|
|
94
100
|
})
|
|
95
101
|
```
|
|
@@ -107,12 +113,14 @@ const endpoint = new Endpoint({
|
|
|
107
113
|
name: v.pipe(v.string(), v.minLength(1)),
|
|
108
114
|
email: v.pipe(v.string(), v.email()),
|
|
109
115
|
}),
|
|
116
|
+
serialize: 'json',
|
|
110
117
|
},
|
|
111
118
|
data: {
|
|
112
119
|
schema: v.object({
|
|
113
120
|
id: v.string(),
|
|
114
121
|
name: v.string(),
|
|
115
122
|
}),
|
|
123
|
+
parse: 'json',
|
|
116
124
|
},
|
|
117
125
|
})
|
|
118
126
|
```
|
|
@@ -130,6 +138,7 @@ const endpoint = new Endpoint({
|
|
|
130
138
|
id: v.string(),
|
|
131
139
|
createdAt: v.pipe(v.string(), v.transform(s => new Date(s))),
|
|
132
140
|
}),
|
|
141
|
+
parse: 'json',
|
|
133
142
|
},
|
|
134
143
|
})
|
|
135
144
|
```
|
|
@@ -180,24 +189,24 @@ const UserSchema = z.object({
|
|
|
180
189
|
const CreateUserSchema = UserSchema.omit({ id: true })
|
|
181
190
|
|
|
182
191
|
const api = http_client({
|
|
183
|
-
|
|
192
|
+
base_url: 'https://api.example.com',
|
|
184
193
|
endpoints: {
|
|
185
194
|
users: {
|
|
186
195
|
list: new Endpoint({
|
|
187
196
|
method: 'GET',
|
|
188
197
|
pathname: '/users',
|
|
189
|
-
data: { schema: z.array(UserSchema) },
|
|
198
|
+
data: { schema: z.array(UserSchema), parse: 'json' },
|
|
190
199
|
}),
|
|
191
200
|
get: new Endpoint({
|
|
192
201
|
method: 'GET',
|
|
193
202
|
pathname: '/users/(:id)',
|
|
194
|
-
data: { schema: UserSchema },
|
|
203
|
+
data: { schema: UserSchema, parse: 'json' },
|
|
195
204
|
}),
|
|
196
205
|
create: new Endpoint({
|
|
197
206
|
method: 'POST',
|
|
198
207
|
pathname: '/users',
|
|
199
|
-
body: { schema: CreateUserSchema },
|
|
200
|
-
data: { schema: UserSchema },
|
|
208
|
+
body: { schema: CreateUserSchema, serialize: 'json' },
|
|
209
|
+
data: { schema: UserSchema, parse: 'json' },
|
|
201
210
|
}),
|
|
202
211
|
},
|
|
203
212
|
},
|
package/docs/serialization.md
CHANGED
|
@@ -17,7 +17,7 @@ const endpoint = new Endpoint({
|
|
|
17
17
|
})
|
|
18
18
|
|
|
19
19
|
const url = await endpoint.generate_url({
|
|
20
|
-
|
|
20
|
+
base_url: 'https://api.example.com',
|
|
21
21
|
params: { id: '123' },
|
|
22
22
|
})
|
|
23
23
|
// https://api.example.com/users/123
|
|
@@ -41,7 +41,7 @@ const endpoint = new Endpoint({
|
|
|
41
41
|
|
|
42
42
|
### Custom Serialization
|
|
43
43
|
|
|
44
|
-
Provide a `
|
|
44
|
+
Provide a `serialize` function to transform validated params:
|
|
45
45
|
|
|
46
46
|
```typescript
|
|
47
47
|
const endpoint = new Endpoint({
|
|
@@ -49,12 +49,12 @@ const endpoint = new Endpoint({
|
|
|
49
49
|
pathname: '/users/(:id)',
|
|
50
50
|
params: {
|
|
51
51
|
schema: z.object({ id: z.number() }),
|
|
52
|
-
|
|
52
|
+
serialize: (data) => ({ id: `user-${data.id}` }),
|
|
53
53
|
},
|
|
54
54
|
})
|
|
55
55
|
|
|
56
56
|
const url = await endpoint.generate_url({
|
|
57
|
-
|
|
57
|
+
base_url: 'https://api.example.com',
|
|
58
58
|
params: { id: 123 },
|
|
59
59
|
})
|
|
60
60
|
// https://api.example.com/users/user-123
|
|
@@ -79,7 +79,7 @@ const endpoint = new Endpoint({
|
|
|
79
79
|
})
|
|
80
80
|
|
|
81
81
|
const url = await endpoint.generate_url({
|
|
82
|
-
|
|
82
|
+
base_url: 'https://api.example.com',
|
|
83
83
|
query: { page: 1, search: 'john' },
|
|
84
84
|
})
|
|
85
85
|
// https://api.example.com/users?page=1&search=john
|
|
@@ -95,7 +95,7 @@ const endpoint = new Endpoint({
|
|
|
95
95
|
schema: z.object({
|
|
96
96
|
tags: z.array(z.string()),
|
|
97
97
|
}),
|
|
98
|
-
|
|
98
|
+
serialize: (data) => {
|
|
99
99
|
const params = new URLSearchParams()
|
|
100
100
|
params.set('tags', data.tags.join(','))
|
|
101
101
|
return params
|
|
@@ -104,7 +104,7 @@ const endpoint = new Endpoint({
|
|
|
104
104
|
})
|
|
105
105
|
|
|
106
106
|
const url = await endpoint.generate_url({
|
|
107
|
-
|
|
107
|
+
base_url: 'https://api.example.com',
|
|
108
108
|
query: { tags: ['admin', 'active'] },
|
|
109
109
|
})
|
|
110
110
|
// https://api.example.com/users?tags=admin,active
|
|
@@ -114,9 +114,9 @@ const url = await endpoint.generate_url({
|
|
|
114
114
|
|
|
115
115
|
Request bodies are serialized for POST, PUT, PATCH, and DELETE methods.
|
|
116
116
|
|
|
117
|
-
### JSON
|
|
117
|
+
### JSON
|
|
118
118
|
|
|
119
|
-
|
|
119
|
+
Use `serialize: 'json'` to serialize the body as JSON:
|
|
120
120
|
|
|
121
121
|
```typescript
|
|
122
122
|
const endpoint = new Endpoint({
|
|
@@ -127,6 +127,7 @@ const endpoint = new Endpoint({
|
|
|
127
127
|
name: z.string(),
|
|
128
128
|
email: z.string().email(),
|
|
129
129
|
}),
|
|
130
|
+
serialize: 'json',
|
|
130
131
|
},
|
|
131
132
|
})
|
|
132
133
|
|
|
@@ -150,7 +151,7 @@ const endpoint = new Endpoint({
|
|
|
150
151
|
file: z.instanceof(File),
|
|
151
152
|
name: z.string(),
|
|
152
153
|
}),
|
|
153
|
-
|
|
154
|
+
serialize: (data) => {
|
|
154
155
|
const formData = new FormData()
|
|
155
156
|
formData.append('file', data.file)
|
|
156
157
|
formData.append('name', data.name)
|
|
@@ -171,7 +172,7 @@ const endpoint = new Endpoint({
|
|
|
171
172
|
username: z.string(),
|
|
172
173
|
password: z.string(),
|
|
173
174
|
}),
|
|
174
|
-
|
|
175
|
+
serialize: (data) => {
|
|
175
176
|
const params = new URLSearchParams()
|
|
176
177
|
params.set('username', data.username)
|
|
177
178
|
params.set('password', data.password)
|
|
@@ -189,7 +190,7 @@ const endpoint = new Endpoint({
|
|
|
189
190
|
pathname: '/echo',
|
|
190
191
|
body: {
|
|
191
192
|
schema: z.string(),
|
|
192
|
-
|
|
193
|
+
serialize: (text) => ({
|
|
193
194
|
body: text,
|
|
194
195
|
content_type: 'text/plain',
|
|
195
196
|
}),
|