@afoures/http-client 0.0.0 → 0.1.1

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 CHANGED
@@ -1,4 +1,4 @@
1
- # @afoures/http-client
1
+ # http-client
2
2
 
3
3
  A typesafe and robust HTTP client with schema validation.
4
4
 
package/dist/index.d.mts CHANGED
@@ -1 +1,5 @@
1
- export { };
1
+ import { AbortedError, DeserializationError, HttpClientError, NetworkError, SerializationError, TimeoutError, UnexpectedError } from "./lib/errors.mjs";
2
+ import { HTTPFetch, HTTPMethod, HTTPStatus, Parser, Pathname, Schema, Serializer } from "./lib/types.mjs";
3
+ import { AnyEndpoint, Endpoint, EndpointDefinition } from "./lib/endpoint.mjs";
4
+ import { EndpointMap, HttpClientOptions, http_client } from "./lib/http-client.mjs";
5
+ export { AbortedError, type AnyEndpoint, DeserializationError, Endpoint, type EndpointDefinition, type EndpointMap, type HTTPFetch, type HTTPMethod, type HTTPStatus, HttpClientError, type HttpClientOptions, NetworkError, type Parser, type Pathname, type Schema, SerializationError, type Serializer, TimeoutError, UnexpectedError, http_client };
package/dist/index.mjs CHANGED
@@ -1 +1,5 @@
1
- export { };
1
+ import { AbortedError, DeserializationError, HttpClientError, NetworkError, SerializationError, TimeoutError, UnexpectedError } from "./lib/errors.mjs";
2
+ import { Endpoint } from "./lib/endpoint.mjs";
3
+ import { http_client } from "./lib/http-client.mjs";
4
+
5
+ export { AbortedError, DeserializationError, Endpoint, HttpClientError, NetworkError, SerializationError, TimeoutError, UnexpectedError, http_client };
@@ -0,0 +1,40 @@
1
+ import { DeserializationError, SerializationError } from "./errors.mjs";
2
+ import { ErrorMessage, HTTPFetch, HTTPMethod, Parser, Pathname, Pretty, Schema, Serializer } from "./types.mjs";
3
+
4
+ //#region src/lib/endpoint.d.ts
5
+ type EndpointDefinition<http_method extends HTTPMethod.Any, pathname extends Pathname.Relative, params_schema extends Schema._, query_schema extends Schema._, body_schema extends Schema._, data_schema extends Schema._, error_schema extends Schema._> = {
6
+ method: http_method;
7
+ pathname: pathname;
8
+ query?: Serializer.QueryString<query_schema>;
9
+ data?: Parser.Data<data_schema>;
10
+ error?: Parser.Error<error_schema>;
11
+ } & (pathname extends Pathname.WithParams ? {
12
+ params?: Serializer.Params<pathname, params_schema>;
13
+ } : [params_schema] extends [never] ? {
14
+ params?: never;
15
+ } : {
16
+ params?: ErrorMessage<"this url does not have dynamic params">;
17
+ }) & (http_method extends HTTPMethod.WithBody ? {
18
+ body?: Serializer.Body<body_schema>;
19
+ } : [body_schema] extends [never] ? {
20
+ body?: never;
21
+ } : {
22
+ body?: ErrorMessage<"this http method does not support body">;
23
+ });
24
+ declare class Endpoint<http_method extends HTTPMethod.Any, pathname extends Pathname.Relative, params_schema extends Schema._ = never, query_schema extends Schema._ = never, body_schema extends Schema._ = never, data_schema extends Schema._ = never, error_schema extends Schema._ = never> {
25
+ #private;
26
+ constructor(definition: EndpointDefinition<http_method, pathname, params_schema, query_schema, body_schema, data_schema, error_schema>, options?: HTTPFetch.OptionalRequestInit & HTTPFetch.DefaultRequestInit);
27
+ get method(): http_method;
28
+ get options(): HTTPFetch.OptionalRequestInit & HTTPFetch.DefaultRequestInit;
29
+ generate_url(init: Pretty<{
30
+ base_url: string;
31
+ } & HTTPFetch.TypedParamsInit<pathname, params_schema> & HTTPFetch.TypedQueryInit<query_schema>>): Promise<URL | SerializationError>;
32
+ serialize_body(init: Pretty<HTTPFetch.TypedBodyInit<body_schema>>): Promise<{
33
+ body: BodyInit | null;
34
+ content_type?: string;
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 | DeserializationError>;
37
+ }
38
+ type AnyEndpoint = Endpoint<any, any, any, any, any, any, any>;
39
+ //#endregion
40
+ export { AnyEndpoint, Endpoint, EndpointDefinition };
@@ -0,0 +1,191 @@
1
+ import { DeserializationError, SerializationError } from "./errors.mjs";
2
+ import "./types.mjs";
3
+ import { RoutePattern } from "@remix-run/route-pattern";
4
+
5
+ //#region src/lib/endpoint.ts
6
+ var Endpoint = class {
7
+ #method;
8
+ #pattern;
9
+ #serializers;
10
+ #parsers;
11
+ #options;
12
+ constructor(definition, options) {
13
+ this.#method = definition.method;
14
+ this.#pattern = new RoutePattern(definition.pathname, { ignoreCase: false });
15
+ this.#serializers = {
16
+ params: as_serializer(definition.params),
17
+ query: as_serializer(definition.query, "urlencoded"),
18
+ body: as_serializer(definition.body, "json")
19
+ };
20
+ this.#parsers = {
21
+ data: as_parser(definition.data, "json"),
22
+ error: as_parser(definition.error, "text")
23
+ };
24
+ this.#options = options ?? {};
25
+ }
26
+ get method() {
27
+ return this.#method;
28
+ }
29
+ get options() {
30
+ return this.#options;
31
+ }
32
+ async generate_url(init) {
33
+ let pathname_params = {};
34
+ if ("params" in init && init.params !== void 0) if (this.#serializers.params) {
35
+ const result = await this.#serializers.params.schema["~standard"].validate(init.params);
36
+ if (result.issues !== void 0) return new SerializationError("Params serialization failed", {
37
+ operation: "generate_url",
38
+ cause: result.issues
39
+ });
40
+ const transformed_params = result.value;
41
+ if (this.#serializers.params.serialization) pathname_params = this.#serializers.params.serialization(transformed_params);
42
+ else pathname_params = Object.fromEntries(Object.entries(transformed_params).map(([key, value]) => [key, String(value)]));
43
+ } else pathname_params = Object.fromEntries(Object.entries(init.params).map(([key, value]) => [key, String(value)]));
44
+ const pathname = this.#pattern.href(pathname_params);
45
+ let search_params = new URLSearchParams();
46
+ if ("query" in init && init.query !== void 0 && this.#serializers.query) {
47
+ const result = await this.#serializers.query.schema["~standard"].validate(init.query);
48
+ if (result.issues !== void 0) return new SerializationError("Query serialization failed", {
49
+ cause: result.issues,
50
+ operation: "generate_url"
51
+ });
52
+ const transformed_query = result.value;
53
+ if (typeof this.#serializers.query.serialization === "function") search_params = this.#serializers.query.serialization(transformed_query);
54
+ else if (this.#serializers.query.serialization === "urlencoded") {
55
+ if (Array.isArray(transformed_query)) transformed_query.forEach((tuple, index) => {
56
+ if (Array.isArray(tuple)) tuple.forEach((value, tupleIndex) => {
57
+ search_params.append(`${index}[${tupleIndex}]`, String(value));
58
+ });
59
+ else search_params.append(String(index), String(tuple));
60
+ });
61
+ else if (transformed_query !== null && typeof transformed_query === "object") {
62
+ for (const [key, value] of Object.entries(transformed_query)) if (value !== void 0 && value !== null) search_params.set(key, String(value));
63
+ }
64
+ }
65
+ }
66
+ const url = new URL(pathname.startsWith("/") ? pathname.slice(1) : pathname, init.base_url);
67
+ const query_string = search_params.toString();
68
+ if (query_string) url.search = query_string;
69
+ return url;
70
+ }
71
+ async serialize_body(init) {
72
+ if (!this.#serializers.body) return {
73
+ body: null,
74
+ content_type: void 0
75
+ };
76
+ if (!("body" in init) || init.body == void 0) return {
77
+ body: null,
78
+ content_type: void 0
79
+ };
80
+ const result = await this.#serializers.body.schema["~standard"].validate(init.body);
81
+ if (result.issues !== void 0) return new SerializationError("Body serialization failed", {
82
+ operation: "serialize_body",
83
+ cause: result.issues
84
+ });
85
+ const transformed_content = result.value;
86
+ if (typeof this.#serializers.body.serialization === "function") return this.#serializers.body.serialization(transformed_content);
87
+ else return {
88
+ body: JSON.stringify(transformed_content),
89
+ content_type: "application/json"
90
+ };
91
+ }
92
+ async parse_response(response) {
93
+ const raw_response = response;
94
+ const cloned_response = response.clone();
95
+ const status = cloned_response.status;
96
+ const headers = cloned_response.headers;
97
+ if (status >= 300 && status < 400) return {
98
+ ok: false,
99
+ status,
100
+ redirect_to: headers.get("Location") || null,
101
+ headers,
102
+ raw_response
103
+ };
104
+ if (status >= 400 && status < 600) {
105
+ let error;
106
+ if (this.#parsers.error) {
107
+ const parser = this.#parsers.error;
108
+ let parsed;
109
+ if (typeof parser.deserialization === "function") parsed = await parser.deserialization(cloned_response.body);
110
+ else if (parser.deserialization === "json") parsed = await parse_as_json(cloned_response);
111
+ else if (parser.deserialization === "text") parsed = await cloned_response.text();
112
+ const result = await parser.schema["~standard"].validate(parsed);
113
+ if (result.issues !== void 0) return new DeserializationError("Error deserialization failed", {
114
+ cause: result.issues,
115
+ operation: "parse_response"
116
+ });
117
+ error = result.value;
118
+ } else error = await cloned_response.text();
119
+ return {
120
+ ok: false,
121
+ status,
122
+ error,
123
+ headers,
124
+ raw_response
125
+ };
126
+ }
127
+ if (status >= 200 && status < 300) {
128
+ if (status === 204) return {
129
+ ok: true,
130
+ status: 204,
131
+ data: null,
132
+ headers,
133
+ raw_response
134
+ };
135
+ if (this.#parsers.data) {
136
+ const parser = this.#parsers.data;
137
+ let parsed;
138
+ if (typeof parser.deserialization === "function") parsed = await parser.deserialization(cloned_response.body);
139
+ else if (parser.deserialization === "json") parsed = await parse_as_json(cloned_response);
140
+ else if (parser.deserialization === "text") parsed = await cloned_response.text();
141
+ const result = await parser.schema["~standard"].validate(parsed);
142
+ if (result.issues !== void 0) return new DeserializationError("Response deserialization failed", {
143
+ cause: result.issues,
144
+ operation: "parse_response"
145
+ });
146
+ return {
147
+ ok: true,
148
+ status,
149
+ data: result.value,
150
+ headers,
151
+ raw_response
152
+ };
153
+ } else return {
154
+ ok: true,
155
+ status,
156
+ data: null,
157
+ headers,
158
+ raw_response
159
+ };
160
+ }
161
+ throw new Error(`Unhandled status code: ${status}`);
162
+ }
163
+ };
164
+ async function parse_as_json(response) {
165
+ const text = await response.text();
166
+ try {
167
+ if (text) return JSON.parse(text);
168
+ return null;
169
+ } catch (e) {
170
+ throw new Error(`Failed to parse response as JSON: ${e instanceof Error ? e.message : String(e)}`);
171
+ }
172
+ }
173
+ function as_serializer(serializer, default_serialization) {
174
+ if (!serializer || typeof serializer !== "object" || !("schema" in serializer)) return null;
175
+ if (default_serialization === void 0 || "serialization" in serializer && typeof serializer.serialization !== "undefined") return serializer;
176
+ return {
177
+ serialization: default_serialization,
178
+ ...serializer
179
+ };
180
+ }
181
+ function as_parser(parser, default_deserialization) {
182
+ if (!parser || typeof parser !== "object" || !("schema" in parser)) return null;
183
+ if (default_deserialization === void 0 || "deserialization" in parser && typeof parser.deserialization !== "undefined") return parser;
184
+ return {
185
+ deserialization: default_deserialization,
186
+ ...parser
187
+ };
188
+ }
189
+
190
+ //#endregion
191
+ export { Endpoint };
@@ -0,0 +1,54 @@
1
+ //#region src/lib/errors.d.ts
2
+ type BaseContext = {
3
+ operation: string;
4
+ };
5
+ type ErrorCause = {
6
+ cause?: unknown;
7
+ };
8
+ declare class HttpClientError extends Error {
9
+ constructor(message: string, options: ErrorCause);
10
+ }
11
+ declare class TimeoutError extends HttpClientError {
12
+ readonly context: BaseContext;
13
+ constructor(message: string, {
14
+ cause,
15
+ ...context
16
+ }: ErrorCause & BaseContext);
17
+ }
18
+ declare class AbortedError extends HttpClientError {
19
+ readonly context: BaseContext;
20
+ constructor(message: string, {
21
+ cause,
22
+ ...context
23
+ }: ErrorCause & BaseContext);
24
+ }
25
+ declare class SerializationError extends HttpClientError {
26
+ readonly context: BaseContext;
27
+ constructor(message: string, {
28
+ cause,
29
+ ...context
30
+ }: ErrorCause & BaseContext);
31
+ }
32
+ declare class DeserializationError extends HttpClientError {
33
+ readonly context: BaseContext;
34
+ constructor(message: string, {
35
+ cause,
36
+ ...context
37
+ }: ErrorCause & BaseContext);
38
+ }
39
+ declare class NetworkError extends HttpClientError {
40
+ readonly context: BaseContext;
41
+ constructor(message: string, {
42
+ cause,
43
+ ...context
44
+ }: ErrorCause & BaseContext);
45
+ }
46
+ declare class UnexpectedError extends Error {
47
+ readonly context: BaseContext;
48
+ constructor(message: string, {
49
+ cause,
50
+ ...context
51
+ }: ErrorCause & BaseContext);
52
+ }
53
+ //#endregion
54
+ export { AbortedError, DeserializationError, HttpClientError, NetworkError, SerializationError, TimeoutError, UnexpectedError };
@@ -0,0 +1,58 @@
1
+ //#region src/lib/errors.ts
2
+ var HttpClientError = class extends Error {
3
+ constructor(message, options) {
4
+ super(message, options);
5
+ this.name = "HttpClientError";
6
+ }
7
+ };
8
+ var TimeoutError = class extends HttpClientError {
9
+ context;
10
+ constructor(message, { cause, ...context }) {
11
+ super(message, { cause });
12
+ this.name = "TimeoutError";
13
+ this.context = context;
14
+ }
15
+ };
16
+ var AbortedError = class extends HttpClientError {
17
+ context;
18
+ constructor(message, { cause, ...context }) {
19
+ super(message, { cause });
20
+ this.name = "AbortedError";
21
+ this.context = context;
22
+ }
23
+ };
24
+ var SerializationError = class extends HttpClientError {
25
+ context;
26
+ constructor(message, { cause, ...context }) {
27
+ super(message, { cause });
28
+ this.name = "SerializationError";
29
+ this.context = context;
30
+ }
31
+ };
32
+ var DeserializationError = class extends HttpClientError {
33
+ context;
34
+ constructor(message, { cause, ...context }) {
35
+ super(message, { cause });
36
+ this.name = "DeserializationError";
37
+ this.context = context;
38
+ }
39
+ };
40
+ var NetworkError = class extends HttpClientError {
41
+ context;
42
+ constructor(message, { cause, ...context }) {
43
+ super(message, { cause });
44
+ this.name = "NetworkError";
45
+ this.context = context;
46
+ }
47
+ };
48
+ var UnexpectedError = class extends Error {
49
+ context;
50
+ constructor(message, { cause, ...context }) {
51
+ super(message, { cause });
52
+ this.name = "UnexpectedError";
53
+ this.context = context;
54
+ }
55
+ };
56
+
57
+ //#endregion
58
+ export { AbortedError, DeserializationError, HttpClientError, NetworkError, SerializationError, TimeoutError, UnexpectedError };
@@ -0,0 +1,64 @@
1
+ import { AbortedError, DeserializationError, NetworkError, SerializationError, TimeoutError, UnexpectedError } from "./errors.mjs";
2
+ import { HTTPFetch, HTTPMethod, HeadersInitWithReducer, MaybePromise, Schema } from "./types.mjs";
3
+ import { AnyEndpoint, Endpoint } from "./endpoint.mjs";
4
+ import * as _standard_schema_spec0 from "@standard-schema/spec";
5
+
6
+ //#region src/lib/http-client.d.ts
7
+ interface EndpointMap {
8
+ [name: string]: AnyEndpoint | EndpointMap;
9
+ }
10
+ type CustomFetch = (request: Request) => Promise<Response>;
11
+ type HttpClientOptions<endpoints extends EndpointMap> = {
12
+ base_url: string;
13
+ endpoints: endpoints;
14
+ options?: () => MaybePromise<HTTPFetch.OptionalRequestInit & HTTPFetch.DefaultRequestInit>;
15
+ fetch?: CustomFetch;
16
+ };
17
+ declare function http_client<const endpoints extends EndpointMap>({
18
+ base_url,
19
+ endpoints: all_endpoints,
20
+ options,
21
+ fetch: custom_fetch
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
+ headers?: HeadersInitWithReducer;
24
+ } & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K in keyof T]: T[K] } : never) => Promise<TimeoutError | AbortedError | SerializationError | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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 | DeserializationError | 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
+ headers?: HeadersInitWithReducer;
44
+ } & Omit<RequestInit, "body" | "method" | "headers"> extends infer T ? { [K_2 in keyof T]: T[K_2] } : never) => Promise<TimeoutError | AbortedError | SerializationError | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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
+ 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 | DeserializationError | 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 | DeserializationError | 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
+ //#endregion
64
+ export { EndpointMap, HttpClientOptions, http_client };
@@ -0,0 +1,134 @@
1
+ import { AbortedError, NetworkError, TimeoutError, UnexpectedError } from "./errors.mjs";
2
+ import "./types.mjs";
3
+ import { Endpoint } from "./endpoint.mjs";
4
+ import { extract_args, merge_options, remove_custom_options, sleep } from "./utils.mjs";
5
+
6
+ //#region src/lib/http-client.ts
7
+ function fetch_endpoint_factory({ base_url, endpoint, custom_fetch, get_default_options = () => ({}), hooks = {} }) {
8
+ async function fetch_endpoint(input) {
9
+ if (!URL.canParse(base_url)) return new UnexpectedError(`Invalid base_url: ${base_url}`, { operation: "base_url_validation" });
10
+ const { args, options } = extract_args(input);
11
+ const { headers, ...merged_options } = merge_options(await get_default_options(), endpoint.options, options);
12
+ const url = await endpoint.generate_url({
13
+ base_url,
14
+ params: args.params,
15
+ query: args.query
16
+ }).catch((error) => new UnexpectedError("Failed to generate URL", {
17
+ cause: error,
18
+ operation: "generate_url"
19
+ }));
20
+ if (url instanceof Error) return url;
21
+ const serialized = await endpoint.serialize_body({ body: args.body }).catch((error) => new UnexpectedError("Failed to serialize body", {
22
+ cause: error,
23
+ operation: "serialize_body"
24
+ }));
25
+ if (serialized instanceof Error) return serialized;
26
+ headers.delete("Content-Type");
27
+ if (serialized.content_type) headers.set("Content-Type", serialized.content_type);
28
+ const retry_policy = {
29
+ when: options.retry?.when ?? ((ctx) => ctx.response?.ok === false),
30
+ attempts: options.retry?.attempts ?? 0,
31
+ delay: options.retry?.delay ?? 0
32
+ };
33
+ let attempt = 0;
34
+ let request;
35
+ let response;
36
+ let error;
37
+ do {
38
+ const signals = [];
39
+ if (options.signal) signals.push(options.signal);
40
+ if (options.timeout) signals.push(AbortSignal.timeout(options.timeout));
41
+ const abort_signal = signals.length > 0 ? AbortSignal.any(signals) : void 0;
42
+ try {
43
+ request = new Request(url, {
44
+ ...remove_custom_options(merged_options),
45
+ method: endpoint.method,
46
+ body: serialized.body,
47
+ headers,
48
+ signal: abort_signal
49
+ });
50
+ } catch (local_error) {
51
+ error = new UnexpectedError("Failed to create request", {
52
+ cause: local_error,
53
+ operation: "create_request"
54
+ });
55
+ break;
56
+ }
57
+ try {
58
+ attempt++;
59
+ hooks.on_request?.(request);
60
+ response = await custom_fetch(request);
61
+ error = void 0;
62
+ } catch (local_error) {
63
+ if (local_error instanceof Error && local_error.name === "TimeoutError") error = new TimeoutError(local_error.message, {
64
+ cause: local_error,
65
+ operation: "fetch"
66
+ });
67
+ else if (local_error instanceof Error && local_error.name === "AbortError") error = new AbortedError(local_error.message, {
68
+ cause: local_error,
69
+ operation: "fetch"
70
+ });
71
+ else error = new NetworkError("Network error", {
72
+ cause: local_error,
73
+ operation: "fetch"
74
+ });
75
+ }
76
+ try {
77
+ if (!await retry_policy.when({
78
+ request,
79
+ response,
80
+ error
81
+ })) break;
82
+ const max_attempts = typeof retry_policy.attempts === "function" ? await retry_policy.attempts({ request }) : retry_policy.attempts;
83
+ if (attempt >= max_attempts) break;
84
+ const delay = typeof retry_policy.delay === "function" ? await retry_policy.delay({
85
+ request,
86
+ response,
87
+ error,
88
+ attempt
89
+ }) : retry_policy.delay;
90
+ if (delay > 0) await sleep(delay, abort_signal);
91
+ } catch (local_error) {
92
+ error = new UnexpectedError("Failed to check retry policy", {
93
+ cause: local_error,
94
+ operation: "retry_policy"
95
+ });
96
+ break;
97
+ }
98
+ } while (true);
99
+ if (error) return error;
100
+ if (!response) return new UnexpectedError("", {
101
+ cause: "No response received",
102
+ operation: "parse_response"
103
+ });
104
+ hooks.on_response?.(response);
105
+ return await endpoint.parse_response(response).catch((error) => {
106
+ if (error instanceof Error && error.name === "AbortError") return new AbortedError(error.message, {
107
+ cause: error,
108
+ operation: "parse_response"
109
+ });
110
+ return new UnexpectedError("Failed to parse response", {
111
+ cause: error,
112
+ operation: "parse_response"
113
+ });
114
+ });
115
+ }
116
+ return fetch_endpoint;
117
+ }
118
+ function http_client({ base_url, endpoints: all_endpoints, options, fetch: custom_fetch = fetch }) {
119
+ function map(endpoints) {
120
+ return Object.fromEntries(Object.entries(endpoints).map(([key, endpoint_or_object]) => {
121
+ if (endpoint_or_object instanceof Endpoint) return [key, fetch_endpoint_factory({
122
+ endpoint: endpoint_or_object,
123
+ base_url,
124
+ custom_fetch,
125
+ get_default_options: options
126
+ })];
127
+ return [key, map(endpoint_or_object)];
128
+ }));
129
+ }
130
+ return map(all_endpoints);
131
+ }
132
+
133
+ //#endregion
134
+ export { http_client };