2022-01-21 08:28:41 +00:00
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' ;
2022-07-15 07:58:48 +00:00
const VERSION = "6.2.0" ;
2022-01-21 08:28:41 +00:00
function getBufferResponse ( response ) {
return response . arrayBuffer ( ) ;
}
function fetchWrapper ( requestOptions ) {
const log = requestOptions . request && requestOptions . request . log
? requestOptions . request . log
: console ;
if ( isPlainObject ( requestOptions . body ) ||
Array . isArray ( requestOptions . body ) ) {
requestOptions . body = JSON . stringify ( requestOptions . body ) ;
}
let headers = { } ;
let status ;
let url ;
2022-07-15 07:58:48 +00:00
const fetch = ( requestOptions . request && requestOptions . request . fetch ) ||
globalThis . fetch ||
/* istanbul ignore next */ nodeFetch ;
2022-01-21 08:28:41 +00:00
return fetch ( requestOptions . url , Object . assign ( {
method : requestOptions . method ,
body : requestOptions . body ,
headers : requestOptions . headers ,
redirect : requestOptions . redirect ,
} ,
// `requestOptions.request.agent` type is incompatible
// see https://github.com/octokit/types.ts/pull/264
requestOptions . request ) )
. then ( async ( response ) => {
url = response . url ;
status = response . status ;
for ( const keyAndValue of response . headers ) {
headers [ keyAndValue [ 0 ] ] = keyAndValue [ 1 ] ;
}
if ( "deprecation" in headers ) {
const matches = headers . link && headers . link . match ( /<([^>]+)>; rel="deprecation"/ ) ;
const deprecationLink = matches && matches . pop ( ) ;
log . warn ( ` [@octokit/request] " ${ requestOptions . method } ${ requestOptions . url } " is deprecated. It is scheduled to be removed on ${ headers . sunset } ${ deprecationLink ? ` . See ${ deprecationLink } ` : "" } ` ) ;
}
if ( status === 204 || status === 205 ) {
return ;
}
// GitHub API returns 200 for HEAD requests
if ( requestOptions . method === "HEAD" ) {
if ( status < 400 ) {
return ;
}
throw new RequestError ( response . statusText , status , {
response : {
url ,
status ,
headers ,
data : undefined ,
} ,
request : requestOptions ,
} ) ;
}
if ( status === 304 ) {
throw new RequestError ( "Not modified" , status , {
response : {
url ,
status ,
headers ,
data : await getResponseData ( response ) ,
} ,
request : requestOptions ,
} ) ;
}
if ( status >= 400 ) {
const data = await getResponseData ( response ) ;
const error = new RequestError ( toErrorMessage ( data ) , status , {
response : {
url ,
status ,
headers ,
data ,
} ,
request : requestOptions ,
} ) ;
throw error ;
}
return getResponseData ( response ) ;
} )
. then ( ( data ) => {
return {
status ,
url ,
headers ,
data ,
} ;
} )
. catch ( ( error ) => {
if ( error instanceof RequestError )
throw error ;
2022-07-15 07:58:48 +00:00
else if ( error . name === "AbortError" )
throw error ;
2022-01-21 08:28:41 +00:00
throw new RequestError ( error . message , 500 , {
request : requestOptions ,
} ) ;
} ) ;
}
async function getResponseData ( response ) {
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 ) ;
}
function toErrorMessage ( data ) {
if ( typeof data === "string" )
return data ;
// istanbul ignore else - just in case
if ( "message" in data ) {
if ( Array . isArray ( data . errors ) ) {
return ` ${ data . message } : ${ data . errors . map ( JSON . stringify ) . join ( ", " ) } ` ;
}
return data . message ;
}
// istanbul ignore next - just in case
return ` Unknown error: ${ JSON . stringify ( data ) } ` ;
}
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 } ;
//# sourceMappingURL=index.js.map