Skip to content

Commit 205ff6a

Browse files
authored
Merge pull request #55 from amotarao/feature/fetch-init
各リクエストで fetch の requestInit をカスタマイズできるようにする
2 parents 7077435 + fef12f3 commit 205ff6a

File tree

3 files changed

+212
-28
lines changed

3 files changed

+212
-28
lines changed

src/createClient.ts

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,7 @@ export const createClient = ({
5757
endpoint,
5858
contentId,
5959
queries = {},
60-
method,
61-
customHeaders,
62-
customBody,
60+
requestInit,
6361
}: MakeRequest) => {
6462
const fetchClient = generateFetchClient(apiKey, customFetch);
6563
const queryString = parseQuery(queries);
@@ -82,9 +80,8 @@ export const createClient = ({
8280
async (bail) => {
8381
try {
8482
const response = await fetchClient(url, {
85-
method: method || 'GET',
86-
headers: customHeaders,
87-
body: customBody,
83+
...requestInit,
84+
method: requestInit?.method ?? 'GET',
8885
});
8986

9087
// If a status code in the 400 range other than 429 is returned, do not retry.
@@ -117,7 +114,7 @@ export const createClient = ({
117114
);
118115
}
119116

120-
if (method === 'DELETE') return;
117+
if (requestInit?.method === 'DELETE') return;
121118

122119
return response.json();
123120
} catch (error) {
@@ -152,11 +149,17 @@ export const createClient = ({
152149
endpoint,
153150
contentId,
154151
queries = {},
152+
customRequestInit,
155153
}: GetRequest): Promise<T> => {
156154
if (!endpoint) {
157155
return Promise.reject(new Error('endpoint is required'));
158156
}
159-
return await makeRequest({ endpoint, contentId, queries });
157+
return await makeRequest({
158+
endpoint,
159+
contentId,
160+
queries,
161+
requestInit: customRequestInit,
162+
});
160163
};
161164

162165
/**
@@ -165,11 +168,16 @@ export const createClient = ({
165168
const getList = async <T = any>({
166169
endpoint,
167170
queries = {},
171+
customRequestInit,
168172
}: GetListRequest): Promise<MicroCMSListResponse<T>> => {
169173
if (!endpoint) {
170174
return Promise.reject(new Error('endpoint is required'));
171175
}
172-
return await makeRequest({ endpoint, queries });
176+
return await makeRequest({
177+
endpoint,
178+
queries,
179+
requestInit: customRequestInit,
180+
});
173181
};
174182

175183
/**
@@ -179,6 +187,7 @@ export const createClient = ({
179187
endpoint,
180188
contentId,
181189
queries = {},
190+
customRequestInit,
182191
}: GetListDetailRequest): Promise<T & MicroCMSListContent> => {
183192
if (!endpoint) {
184193
return Promise.reject(new Error('endpoint is required'));
@@ -187,6 +196,7 @@ export const createClient = ({
187196
endpoint,
188197
contentId,
189198
queries,
199+
requestInit: customRequestInit,
190200
});
191201
};
192202

@@ -196,13 +206,15 @@ export const createClient = ({
196206
const getObject = async <T = any>({
197207
endpoint,
198208
queries = {},
209+
customRequestInit,
199210
}: GetObjectRequest): Promise<T & MicroCMSObjectContent> => {
200211
if (!endpoint) {
201212
return Promise.reject(new Error('endpoint is required'));
202213
}
203214
return await makeRequest({
204215
endpoint,
205216
queries,
217+
requestInit: customRequestInit,
206218
});
207219
};
208220

@@ -214,25 +226,27 @@ export const createClient = ({
214226
contentId,
215227
content,
216228
isDraft = false,
229+
customRequestInit,
217230
}: CreateRequest<T>): Promise<WriteApiRequestResult> => {
218231
if (!endpoint) {
219232
return Promise.reject(new Error('endpoint is required'));
220233
}
221234

222235
const queries: MakeRequest['queries'] = isDraft ? { status: 'draft' } : {};
223-
const method: MakeRequest['method'] = contentId ? 'PUT' : 'POST';
224-
const customHeaders: MakeRequest['customHeaders'] = {
225-
'Content-Type': 'application/json',
236+
const requestInit: MakeRequest['requestInit'] = {
237+
...customRequestInit,
238+
method: contentId ? 'PUT' : 'POST',
239+
headers: {
240+
'Content-Type': 'application/json',
241+
},
242+
body: JSON.stringify(content),
226243
};
227-
const customBody: MakeRequest['customBody'] = JSON.stringify(content);
228244

229245
return makeRequest({
230246
endpoint,
231247
contentId,
232248
queries,
233-
method,
234-
customHeaders,
235-
customBody,
249+
requestInit,
236250
});
237251
};
238252

@@ -243,23 +257,25 @@ export const createClient = ({
243257
endpoint,
244258
contentId,
245259
content,
260+
customRequestInit,
246261
}: UpdateRequest<T>): Promise<WriteApiRequestResult> => {
247262
if (!endpoint) {
248263
return Promise.reject(new Error('endpoint is required'));
249264
}
250265

251-
const method: MakeRequest['method'] = 'PATCH';
252-
const customHeaders: MakeRequest['customHeaders'] = {
253-
'Content-Type': 'application/json',
266+
const requestInit: MakeRequest['requestInit'] = {
267+
...customRequestInit,
268+
method: 'PATCH',
269+
headers: {
270+
'Content-Type': 'application/json',
271+
},
272+
body: JSON.stringify(content),
254273
};
255-
const customBody: MakeRequest['customBody'] = JSON.stringify(content);
256274

257275
return makeRequest({
258276
endpoint,
259277
contentId,
260-
method,
261-
customHeaders,
262-
customBody,
278+
requestInit,
263279
});
264280
};
265281

@@ -269,6 +285,7 @@ export const createClient = ({
269285
const _delete = async ({
270286
endpoint,
271287
contentId,
288+
customRequestInit,
272289
}: DeleteRequest): Promise<void> => {
273290
if (!endpoint) {
274291
return Promise.reject(new Error('endpoint is required'));
@@ -278,9 +295,14 @@ export const createClient = ({
278295
return Promise.reject(new Error('contentId is required'));
279296
}
280297

281-
const method: MakeRequest['method'] = 'DELETE';
298+
const requestInit: MakeRequest['requestInit'] = {
299+
...customRequestInit,
300+
method: 'DELETE',
301+
headers: {},
302+
body: undefined,
303+
};
282304

283-
await makeRequest({ endpoint, contentId, method });
305+
await makeRequest({ endpoint, contentId, requestInit });
284306
};
285307

286308
return {

src/types.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,31 +81,38 @@ export interface MakeRequest {
8181
endpoint: string;
8282
contentId?: string;
8383
queries?: MicroCMSQueries & Record<string, any>;
84-
method?: 'GET' | 'POST' | 'PUT' | 'PATCH' | 'DELETE';
85-
customHeaders?: HeadersInit;
86-
customBody?: string;
84+
requestInit?: RequestInit;
8785
}
8886

87+
export type CustomRequestInit = Omit<
88+
RequestInit,
89+
'method' | 'headers' | 'body'
90+
>;
91+
8992
export interface GetRequest {
9093
endpoint: string;
9194
contentId?: string;
9295
queries?: MicroCMSQueries;
96+
customRequestInit?: CustomRequestInit;
9397
}
9498

9599
export interface GetListDetailRequest {
96100
endpoint: string;
97101
contentId: string;
98102
queries?: MicroCMSQueries;
103+
customRequestInit?: CustomRequestInit;
99104
}
100105

101106
export interface GetListRequest {
102107
endpoint: string;
103108
queries?: MicroCMSQueries;
109+
customRequestInit?: CustomRequestInit;
104110
}
105111

106112
export interface GetObjectRequest {
107113
endpoint: string;
108114
queries?: MicroCMSQueries;
115+
customRequestInit?: CustomRequestInit;
109116
}
110117

111118
export interface WriteApiRequestResult {
@@ -117,15 +124,18 @@ export interface CreateRequest<T> {
117124
contentId?: string;
118125
content: T;
119126
isDraft?: boolean;
127+
customRequestInit?: CustomRequestInit;
120128
}
121129

122130
export interface UpdateRequest<T> {
123131
endpoint: string;
124132
contentId?: string;
125133
content: Partial<T>;
134+
customRequestInit?: CustomRequestInit;
126135
}
127136

128137
export interface DeleteRequest {
129138
endpoint: string;
130139
contentId: string;
140+
customRequestInit?: CustomRequestInit;
131141
}

0 commit comments

Comments
 (0)