|
import { request as Request } from "@octokit/request"; |
|
import { GraphqlResponseError } from "./error"; |
|
const NON_VARIABLE_OPTIONS = [ |
|
"method", |
|
"baseUrl", |
|
"url", |
|
"headers", |
|
"request", |
|
"query", |
|
"mediaType" |
|
]; |
|
const FORBIDDEN_VARIABLE_OPTIONS = ["query", "method", "url"]; |
|
const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; |
|
function graphql(request, query, options) { |
|
if (options) { |
|
if (typeof query === "string" && "query" in options) { |
|
return Promise.reject( |
|
new Error(`[@octokit/graphql] "query" cannot be used as variable name`) |
|
); |
|
} |
|
for (const key in options) { |
|
if (!FORBIDDEN_VARIABLE_OPTIONS.includes(key)) |
|
continue; |
|
return Promise.reject( |
|
new Error( |
|
`[@octokit/graphql] "${key}" cannot be used as variable name` |
|
) |
|
); |
|
} |
|
} |
|
const parsedOptions = typeof query === "string" ? Object.assign({ query }, options) : query; |
|
const requestOptions = Object.keys( |
|
parsedOptions |
|
).reduce((result, key) => { |
|
if (NON_VARIABLE_OPTIONS.includes(key)) { |
|
result[key] = parsedOptions[key]; |
|
return result; |
|
} |
|
if (!result.variables) { |
|
result.variables = {}; |
|
} |
|
result.variables[key] = parsedOptions[key]; |
|
return result; |
|
}, {}); |
|
const baseUrl = parsedOptions.baseUrl || request.endpoint.DEFAULTS.baseUrl; |
|
if (GHES_V3_SUFFIX_REGEX.test(baseUrl)) { |
|
requestOptions.url = baseUrl.replace(GHES_V3_SUFFIX_REGEX, "/api/graphql"); |
|
} |
|
return request(requestOptions).then((response) => { |
|
if (response.data.errors) { |
|
const headers = {}; |
|
for (const key of Object.keys(response.headers)) { |
|
headers[key] = response.headers[key]; |
|
} |
|
throw new GraphqlResponseError( |
|
requestOptions, |
|
headers, |
|
response.data |
|
); |
|
} |
|
return response.data.data; |
|
}); |
|
} |
|
export { |
|
graphql |
|
}; |
|
|