89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import isPlainObject from "is-plain-object"; | ||
|  | import nodeFetch from "node-fetch"; | ||
|  | import { RequestError } from "@octokit/request-error"; | ||
|  | import getBuffer from "./get-buffer-response"; | ||
|  | export default function fetchWrapper(requestOptions) { | ||
|  |     if (isPlainObject(requestOptions.body) || | ||
|  |         Array.isArray(requestOptions.body)) { | ||
|  |         requestOptions.body = JSON.stringify(requestOptions.body); | ||
|  |     } | ||
|  |     let headers = {}; | ||
|  |     let status; | ||
|  |     let url; | ||
|  |     const fetch = (requestOptions.request && requestOptions.request.fetch) || nodeFetch; | ||
|  |     return fetch(requestOptions.url, Object.assign({ | ||
|  |         method: requestOptions.method, | ||
|  |         body: requestOptions.body, | ||
|  |         headers: requestOptions.headers, | ||
|  |         redirect: requestOptions.redirect | ||
|  |     }, requestOptions.request)) | ||
|  |         .then(response => { | ||
|  |         url = response.url; | ||
|  |         status = response.status; | ||
|  |         for (const keyAndValue of response.headers) { | ||
|  |             headers[keyAndValue[0]] = keyAndValue[1]; | ||
|  |         } | ||
|  |         if (status === 204 || status === 205) { | ||
|  |             return; | ||
|  |         } | ||
|  |         // GitHub API returns 200 for HEAD requsets
 | ||
|  |         if (requestOptions.method === "HEAD") { | ||
|  |             if (status < 400) { | ||
|  |                 return; | ||
|  |             } | ||
|  |             throw new RequestError(response.statusText, status, { | ||
|  |                 headers, | ||
|  |                 request: requestOptions | ||
|  |             }); | ||
|  |         } | ||
|  |         if (status === 304) { | ||
|  |             throw new RequestError("Not modified", status, { | ||
|  |                 headers, | ||
|  |                 request: requestOptions | ||
|  |             }); | ||
|  |         } | ||
|  |         if (status >= 400) { | ||
|  |             return response | ||
|  |                 .text() | ||
|  |                 .then(message => { | ||
|  |                 const error = new RequestError(message, status, { | ||
|  |                     headers, | ||
|  |                     request: requestOptions | ||
|  |                 }); | ||
|  |                 try { | ||
|  |                     Object.assign(error, JSON.parse(error.message)); | ||
|  |                 } | ||
|  |                 catch (e) { | ||
|  |                     // ignore, see octokit/rest.js#684
 | ||
|  |                 } | ||
|  |                 throw error; | ||
|  |             }); | ||
|  |         } | ||
|  |         const contentType = response.headers.get("content-type"); | ||
|  |         if (/application\/json/.test(contentType)) { | ||
|  |             return response.json(); | ||
|  |         } | ||
|  |         if (!contentType || /^text\/|charset=utf-8$/.test(contentType)) { | ||
|  |             return response.text(); | ||
|  |         } | ||
|  |         return getBuffer(response); | ||
|  |     }) | ||
|  |         .then(data => { | ||
|  |         return { | ||
|  |             status, | ||
|  |             url, | ||
|  |             headers, | ||
|  |             data | ||
|  |         }; | ||
|  |     }) | ||
|  |         .catch(error => { | ||
|  |         if (error instanceof RequestError) { | ||
|  |             throw error; | ||
|  |         } | ||
|  |         throw new RequestError(error.message, 500, { | ||
|  |             headers, | ||
|  |             request: requestOptions | ||
|  |         }); | ||
|  |     }); | ||
|  | } |