Skip to content

Commit f11691a

Browse files
committed
Update openapi-fetch, add docs sitemap (openapi-ts#1108)
1 parent 29318b2 commit f11691a

File tree

5 files changed

+127
-5
lines changed

5 files changed

+127
-5
lines changed

CHANGELOG.md

+12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,17 @@
11
# openapi-fetch
22

3+
## 0.1.4
4+
5+
### Patch Changes
6+
7+
- 63ebe48: Fix request body type when optional (#48)
8+
9+
## 0.1.3
10+
11+
### Patch Changes
12+
13+
- 8c01480: Fix querySerializer signature
14+
315
## 0.1.2
416

517
### Patch Changes

src/index.test.ts

+36
Original file line numberDiff line numberDiff line change
@@ -351,6 +351,42 @@ describe("post()", () => {
351351
// assert error is empty
352352
expect(error).toBe(undefined);
353353
});
354+
355+
it("request body type when optional", async () => {
356+
fetchMocker.mockResponse(() => ({ status: 201, body: "{}" }));
357+
const client = createClient<paths>();
358+
359+
// expect error on wrong body type
360+
// @ts-expect-error
361+
await client.post("/post/optional", { body: { error: true } });
362+
363+
// (no error)
364+
await client.post("/post/optional", {
365+
body: {
366+
title: "",
367+
publish_date: 3,
368+
body: "",
369+
},
370+
});
371+
});
372+
373+
it("request body type when optional inline", async () => {
374+
fetchMocker.mockResponse(() => ({ status: 201, body: "{}" }));
375+
const client = createClient<paths>();
376+
377+
// expect error on wrong body type
378+
// @ts-expect-error
379+
await client.post("/post/optional/inline", { body: { error: true } });
380+
381+
// (no error)
382+
await client.post("/post/optional/inline", {
383+
body: {
384+
title: "",
385+
publish_date: 3,
386+
body: "",
387+
},
388+
});
389+
});
354390
});
355391

356392
describe("delete()", () => {

src/index.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -34,16 +34,19 @@ export type FilterKeys<Obj, Matchers> = { [K in keyof Obj]: K extends Matchers ?
3434
/** handle "application/json", "application/vnd.api+json", "appliacation/json;charset=utf-8" and more */
3535
export type JSONLike = `${string}json${string}`;
3636

37-
// fetch types
37+
// general purpose types
3838
export type Params<O> = O extends { parameters: any } ? { params: NonNullable<O["parameters"]> } : BaseParams;
39-
export type RequestBodyObj<O> = O extends { requestBody: any } ? O["requestBody"] : never;
39+
export type RequestBodyObj<O> = O extends { requestBody?: any } ? O["requestBody"] : never;
4040
export type RequestBodyContent<O> = undefined extends RequestBodyObj<O> ? FilterKeys<NonNullable<RequestBodyObj<O>>, "content"> | undefined : FilterKeys<RequestBodyObj<O>, "content">;
4141
export type RequestBodyJSON<O> = FilterKeys<RequestBodyContent<O>, JSONLike> extends never ? FilterKeys<NonNullable<RequestBodyContent<O>>, JSONLike> | undefined : FilterKeys<RequestBodyContent<O>, JSONLike>;
4242
export type RequestBody<O> = undefined extends RequestBodyJSON<O> ? { body?: RequestBodyJSON<O> } : { body: RequestBodyJSON<O> };
4343
export type QuerySerializer<O> = (query: O extends { parameters: { query: any } } ? O["parameters"]["query"] : Record<string, unknown>) => string;
44-
export type FetchOptions<T> = Params<T> & RequestBody<T> & Omit<RequestInit, "body"> & { querySerializer?: QuerySerializer<T> };
44+
export type RequestOptions<T> = Params<T> & RequestBody<T> & { querySerializer?: QuerySerializer<T> };
4545
export type Success<O> = FilterKeys<FilterKeys<O, OkStatus>, "content">;
4646
export type Error<O> = FilterKeys<FilterKeys<O, ErrorStatus>, "content">;
47+
48+
// fetch types
49+
export type FetchOptions<T> = RequestOptions<T> & Omit<RequestInit, "body">;
4750
export type FetchResponse<T> =
4851
| { data: T extends { responses: any } ? NonNullable<FilterKeys<Success<T["responses"]>, JSONLike>> : unknown; error?: never; response: Response }
4952
| { data?: never; error: T extends { responses: any } ? NonNullable<FilterKeys<Error<T["responses"]>, JSONLike>> : unknown; response: Response };

test/v1.d.ts

+31
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,28 @@ export interface paths {
2323
};
2424
};
2525
};
26+
"/post/optional": {
27+
post: {
28+
requestBody: components["requestBodies"]["CreatePostOptional"];
29+
responses: {
30+
201: components["responses"]["CreatePost"];
31+
500: components["responses"]["Error"];
32+
};
33+
};
34+
};
35+
"/post/optional/inline": {
36+
post: {
37+
requestBody?: {
38+
content: {
39+
"application/json": components["schemas"]["Post"];
40+
};
41+
};
42+
responses: {
43+
201: components["responses"]["CreatePost"];
44+
500: components["responses"]["Error"];
45+
};
46+
};
47+
};
2648
"/posts": {
2749
get: {
2850
responses: {
@@ -271,6 +293,15 @@ export interface components {
271293
};
272294
};
273295
};
296+
CreatePostOptional?: {
297+
content: {
298+
"application/json": {
299+
title: string;
300+
body: string;
301+
publish_date: number;
302+
};
303+
};
304+
};
274305
CreateTag?: {
275306
content: {
276307
"application/json": {

test/v1.yaml

+42-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
openapi:
2-
version: '3.1'
1+
openapi: 3.1
2+
info:
3+
title: Test Specification
4+
version: '1.0'
35
paths:
46
/comment:
57
put:
@@ -19,6 +21,27 @@ paths:
1921
$ref: '#/components/responses/CreatePost'
2022
500:
2123
$ref: '#/components/responses/Error'
24+
/post/optional:
25+
post:
26+
requestBody:
27+
$ref: '#/components/requestBodies/CreatePostOptional'
28+
responses:
29+
201:
30+
$ref: '#/components/responses/CreatePost'
31+
500:
32+
$ref: '#/components/responses/Error'
33+
/post/optional/inline:
34+
post:
35+
requestBody:
36+
content:
37+
application/json:
38+
schema:
39+
$ref: '#/components/schemas/Post'
40+
responses:
41+
201:
42+
$ref: '#/components/responses/CreatePost'
43+
500:
44+
$ref: '#/components/responses/Error'
2245
/posts:
2346
get:
2447
responses:
@@ -214,6 +237,23 @@ components:
214237
- title
215238
- body
216239
- publish_date
240+
CreatePostOptional:
241+
required: false
242+
content:
243+
application/json:
244+
schema:
245+
type: object
246+
properties:
247+
title:
248+
type: string
249+
body:
250+
type: string
251+
publish_date:
252+
type: number
253+
required:
254+
- title
255+
- body
256+
- publish_date
217257
CreateTag:
218258
content:
219259
application/json:

0 commit comments

Comments
 (0)