Skip to content

Commit 0eebf54

Browse files
authored
feat: backport improvements from @octokit-next (#595)
Backports some improvements from `@octokit-next`: - Simplify (flatten) the parameters - Add type support for 205 HTTP status code - Add types for the `data` parameter
1 parent 7269dcc commit 0eebf54

File tree

2 files changed

+54
-34
lines changed

2 files changed

+54
-34
lines changed

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

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ import type { OctokitResponse } from "../OctokitResponse";
44
import type { RequestHeaders } from "../RequestHeaders";
55
import type { RequestRequestOptions } from "../RequestRequestOptions";
66

7+
/**
8+
* @license (MIT OR CC0-1.0)
9+
* @source https://github.com/sindresorhus/type-fest/blob/570e27f8fdaee37ef5d5e0fbf241e0212ff8fc1a/source/simplify.d.ts
10+
*/
11+
export type Simplify<T> = {[KeyType in keyof T]: T[KeyType]} & {};
12+
713
// https://stackoverflow.com/a/50375286/206879
814
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
915
k: infer I
@@ -40,30 +46,34 @@ type ExtractRequestBody<T> = "requestBody" extends keyof T
4046
type ToOctokitParameters<T> = ExtractParameters<T> & ExtractRequestBody<Required<T>>;
4147

4248
type Operation<Url extends keyof paths, Method extends keyof paths[Url]> = {
43-
parameters: ToOctokitParameters<paths[Url][Method]>;
44-
request: {
45-
method: Method extends keyof MethodsMap ? MethodsMap[Method] : never;
46-
url: Url;
47-
headers: RequestHeaders;
48-
request: RequestRequestOptions;
49-
};
49+
parameters: Simplify<ToOctokitParameters<paths[Url][Method]>>;
50+
request: Method extends ReadOnlyMethods
51+
? {
52+
method: Method extends string ? Uppercase<Method> : never;
53+
url: Url;
54+
headers: RequestHeaders;
55+
request: RequestRequestOptions;
56+
}
57+
: {
58+
method: Method extends string ? Uppercase<Method> : never;
59+
url: Url;
60+
headers: RequestHeaders;
61+
request: RequestRequestOptions;
62+
data: ExtractRequestBody<paths[Url][Method]>;
63+
};
5064
response: ExtractOctokitResponse<paths[Url][Method]>;
5165
};
5266

53-
type MethodsMap = {
54-
delete: "DELETE";
55-
get: "GET";
56-
patch: "PATCH";
57-
post: "POST";
58-
put: "PUT";
59-
};
60-
type SuccessStatuses = 200 | 201 | 202 | 204;
67+
type ReadOnlyMethods = "get" | "head";
68+
type SuccessStatuses = 200 | 201 | 202 | 204 | 205;
6169
type RedirectStatuses = 301 | 302;
62-
type EmptyResponseStatuses = 201 | 204;
70+
type EmptyResponseStatuses = 201 | 204 | 205;
6371
type KnownJsonResponseTypes =
6472
| "application/json"
73+
| "application/octocat-stream" // GET /octocat
6574
| "application/scim+json"
66-
| "text/html";
75+
| "text/html"
76+
| "text/plain"; // GET /zen
6777

6878
type SuccessResponseDataType<Responses> = {
6979
[K in SuccessStatuses & keyof Responses]: GetContentKeyIfPresent<

src/generated/Endpoints.ts

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ import type { OctokitResponse } from "../OctokitResponse";
44
import type { RequestHeaders } from "../RequestHeaders";
55
import type { RequestRequestOptions } from "../RequestRequestOptions";
66

7+
/**
8+
* @license (MIT OR CC0-1.0)
9+
* @source https://github.com/sindresorhus/type-fest/blob/570e27f8fdaee37ef5d5e0fbf241e0212ff8fc1a/source/simplify.d.ts
10+
*/
11+
export type Simplify<T> = { [KeyType in keyof T]: T[KeyType] } & {};
12+
713
// https://stackoverflow.com/a/50375286/206879
814
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
915
k: infer I,
@@ -41,30 +47,34 @@ type ToOctokitParameters<T> = ExtractParameters<T> &
4147
ExtractRequestBody<Required<T>>;
4248

4349
type Operation<Url extends keyof paths, Method extends keyof paths[Url]> = {
44-
parameters: ToOctokitParameters<paths[Url][Method]>;
45-
request: {
46-
method: Method extends keyof MethodsMap ? MethodsMap[Method] : never;
47-
url: Url;
48-
headers: RequestHeaders;
49-
request: RequestRequestOptions;
50-
};
50+
parameters: Simplify<ToOctokitParameters<paths[Url][Method]>>;
51+
request: Method extends ReadOnlyMethods
52+
? {
53+
method: Method extends string ? Uppercase<Method> : never;
54+
url: Url;
55+
headers: RequestHeaders;
56+
request: RequestRequestOptions;
57+
}
58+
: {
59+
method: Method extends string ? Uppercase<Method> : never;
60+
url: Url;
61+
headers: RequestHeaders;
62+
request: RequestRequestOptions;
63+
data: ExtractRequestBody<paths[Url][Method]>;
64+
};
5165
response: ExtractOctokitResponse<paths[Url][Method]>;
5266
};
5367

54-
type MethodsMap = {
55-
delete: "DELETE";
56-
get: "GET";
57-
patch: "PATCH";
58-
post: "POST";
59-
put: "PUT";
60-
};
61-
type SuccessStatuses = 200 | 201 | 202 | 204;
68+
type ReadOnlyMethods = "get" | "head";
69+
type SuccessStatuses = 200 | 201 | 202 | 204 | 205;
6270
type RedirectStatuses = 301 | 302;
63-
type EmptyResponseStatuses = 201 | 204;
71+
type EmptyResponseStatuses = 201 | 204 | 205;
6472
type KnownJsonResponseTypes =
6573
| "application/json"
74+
| "application/octocat-stream" // GET /octocat
6675
| "application/scim+json"
67-
| "text/html";
76+
| "text/html"
77+
| "text/plain"; // GET /zen
6878

6979
type SuccessResponseDataType<Responses> = {
7080
[K in SuccessStatuses & keyof Responses]: GetContentKeyIfPresent<

0 commit comments

Comments
 (0)