@@ -2,6 +2,7 @@ import { EndpointDefaults } from "./EndpointDefaults";
22import { RequestOptions } from "./RequestOptions" ;
33import { RequestParameters } from "./RequestParameters" ;
44import { Route } from "./Route" ;
5+ import { Url } from "./Url" ;
56import { RequestMethod } from "./RequestMethod" ;
67
78import { 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
5356type 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
6371export 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