127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			127 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
|  | import { endpoint } from '@octokit/endpoint'; | ||
|  | import getUserAgent from 'universal-user-agent'; | ||
|  | import isPlainObject from 'is-plain-object'; | ||
|  | import nodeFetch from 'node-fetch'; | ||
|  | import { RequestError } from '@octokit/request-error'; | ||
|  | 
 | ||
|  | const VERSION = "0.0.0-development"; | ||
|  | 
 | ||
|  | function getBufferResponse(response) { | ||
|  |     return response.arrayBuffer(); | ||
|  | } | ||
|  | 
 | ||
|  | 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 getBufferResponse(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 | ||
|  |         }); | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | function withDefaults(oldEndpoint, newDefaults) { | ||
|  |     const endpoint = oldEndpoint.defaults(newDefaults); | ||
|  |     const newApi = function (route, parameters) { | ||
|  |         const endpointOptions = endpoint.merge(route, parameters); | ||
|  |         if (!endpointOptions.request || !endpointOptions.request.hook) { | ||
|  |             return fetchWrapper(endpoint.parse(endpointOptions)); | ||
|  |         } | ||
|  |         const request = (route, parameters) => { | ||
|  |             return fetchWrapper(endpoint.parse(endpoint.merge(route, parameters))); | ||
|  |         }; | ||
|  |         Object.assign(request, { | ||
|  |             endpoint, | ||
|  |             defaults: withDefaults.bind(null, endpoint) | ||
|  |         }); | ||
|  |         return endpointOptions.request.hook(request, endpointOptions); | ||
|  |     }; | ||
|  |     return Object.assign(newApi, { | ||
|  |         endpoint, | ||
|  |         defaults: withDefaults.bind(null, endpoint) | ||
|  |     }); | ||
|  | } | ||
|  | 
 | ||
|  | const request = withDefaults(endpoint, { | ||
|  |     headers: { | ||
|  |         "user-agent": `octokit-request.js/${VERSION} ${getUserAgent()}` | ||
|  |     } | ||
|  | }); | ||
|  | 
 | ||
|  | export { request }; |