| 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 | |
| }; | |