Skip to content

Commit cf2782a

Browse files
committed
WIP: workaround for "Expression produces a union type that is too complex to represent" error
1 parent 5f51108 commit cf2782a

File tree

4 files changed

+3072
-3122
lines changed

4 files changed

+3072
-3122
lines changed

scripts/update-endpoints/templates/endpoints.ts.template

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,31 @@
22
import { OctokitResponse } from "../OctokitResponse";
33
import { RequestHeaders } from "../RequestHeaders";
44
import { RequestRequestOptions } from "../RequestRequestOptions";
5+
import { RequestParameters } from "../RequestParameters";
6+
import { RequestOptions } from "../RequestOptions";
57

68
type RequiredPreview<T> = {
79
mediaType: {
810
previews: [T, ...string[]];
911
};
1012
};
1113

14+
type Endpoint<
15+
Parameters extends RequestParameters,
16+
Request extends RequestOptions,
17+
Response extends OctokitResponse<any>
18+
> = {
19+
parameters: Parameters;
20+
request: Request;
21+
response: Response;
22+
};
23+
1224
export interface Endpoints {
1325
{{#each endpointsByRoute}}
1426
/**
1527
* @see {{documentationUrl}}
1628
*/
17-
"{{@key}}": {
18-
parameters: {{optionsTypeName}},
19-
request: {{requestOptionsTypeName}},
20-
response: OctokitResponse<{{responseTypeName}}>,
21-
},
29+
"{{@key}}": Endpoint<{{optionsTypeName}}, {{requestOptionsTypeName}}, OctokitResponse<{{responseTypeName}}>>,
2230
{{/each}}
2331
}
2432

src/EndpointInterface.ts

Lines changed: 43 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import { EndpointDefaults } from "./EndpointDefaults";
22
import { RequestOptions } from "./RequestOptions";
33
import { RequestParameters } from "./RequestParameters";
44
import { Route } from "./Route";
5+
import { Url } from "./Url";
56
import { RequestMethod } from "./RequestMethod";
67

78
import { Endpoints } from "./generated/Endpoints";
@@ -21,33 +22,35 @@ type EndpointsByUrlAndMethod = UnionToIntersection<
2122
url: TUrl;
2223
method: TMethod;
2324
};
24-
options: Endpoints[K]["parameters"] & {
25-
url: TUrl;
26-
method: TMethod;
27-
};
25+
parameters: Endpoints[K]["parameters"];
2826
request: Endpoints[K]["request"];
2927
};
3028
};
3129
};
3230
}[keyof Endpoints]
3331
>;
3432

35-
type UnknownEndpointParameters = RequestParameters & {
33+
type UnknownRouteObject = {
3634
method?: RequestMethod;
3735
url: string;
3836
};
37+
type UnknownEndpointParameters = RequestParameters & UnknownRouteObject;
3938

40-
type KnownOrUnknownEndpointParameters<
39+
type KnownOrUnknownEndpointsByUrlAndMethod<
4140
T extends UnknownEndpointParameters
4241
> = T["url"] extends keyof EndpointsByUrlAndMethod
4342
? T["method"] extends keyof EndpointsByUrlAndMethod[T["url"]]
4443
? EndpointsByUrlAndMethod[T["url"]][T["method"]] extends {
45-
parameters: infer TOpt;
44+
parameters: infer TParams;
45+
request: infer TRequest;
4646
}
47-
? TOpt
47+
? { parameters: TParams; request: TRequest }
4848
: never
4949
: never
50-
: UnknownEndpointParameters;
50+
: {
51+
parameters: UnknownEndpointParameters;
52+
request: RequestOptions;
53+
};
5154

5255
// https://stackoverflow.com/a/61281317/206879
5356
type KnownOptions<T> = T extends {
@@ -58,19 +61,44 @@ type KnownOptions<T> = T extends {
5861
? OptionValue
5962
: never;
6063

61-
type KnownEndpoints = KnownOptions<EndpointsByUrlAndMethod>["route"];
64+
type KnownRouteObjects = KnownOptions<EndpointsByUrlAndMethod>["route"];
65+
type KnownRouteObject = { method: RequestMethod; url: Url };
66+
type RouteObjectFrom<T extends KnownRouteObject> = {
67+
method: T["method"];
68+
url: T["url"];
69+
};
6270

6371
export interface EndpointInterface<D extends object = object> {
6472
/**
6573
* Transforms a GitHub REST API endpoint into generic request options
6674
*
6775
* @param {object} endpoint Must set `url` unless it's set defaults. Plus URL, query or body parameters, as well as `headers`, `mediaType.{format|previews}`, `request`, or `baseUrl`.
6876
*/
69-
<O extends KnownEndpoints | UnknownEndpointParameters>(
70-
options: O & KnownOrUnknownEndpointParameters<O>
71-
): O extends KnownEndpoints
72-
? EndpointsByUrlAndMethod[O["url"]][O["method"]]["request"]
73-
: RequestOptions;
77+
// WIP: does not allow optionsk for unknown routes, does not respect `D`
78+
<O extends KnownRouteObjects>(
79+
options: O &
80+
KnownOrUnknownEndpointsByUrlAndMethod<O>["parameters"] &
81+
RequestParameters
82+
): KnownOrUnknownEndpointsByUrlAndMethod<O>["request"];
83+
84+
// WIP: does not validate required parameters for known route:
85+
// <O extends RequestParameters>(
86+
// options: O extends KnownRouteObject
87+
// ? RouteObjectFrom<D & O> extends KnownRouteObjects
88+
// ? KnownOrUnknownEndpointsByUrlAndMethod<
89+
// RouteObjectFrom<D & O>
90+
// >["parameters"]
91+
// : O & { method?: string } & ("url" extends keyof D
92+
// ? { url?: string }
93+
// : { url: string })
94+
// : O & { method?: string } & ("url" extends keyof D
95+
// ? { url?: string }
96+
// : { url: string })
97+
// ): O extends KnownRouteObject
98+
// ? RouteObjectFrom<D & O> extends KnownRouteObjects
99+
// ? KnownOrUnknownEndpointsByUrlAndMethod<RouteObjectFrom<D & O>>["request"]
100+
// : RequestOptions & Pick<D & O, keyof RequestOptions>
101+
// : RequestOptions & Pick<D & O, keyof RequestOptions>;
74102

75103
/**
76104
* Transforms a GitHub REST API endpoint into generic request options

0 commit comments

Comments
 (0)