diff --git a/src/graphql.ts b/src/graphql.ts index bc2da58c..dfd5fa3a 100644 --- a/src/graphql.ts +++ b/src/graphql.ts @@ -18,6 +18,8 @@ const NON_VARIABLE_OPTIONS = [ "mediaType", ]; +const GHES_V3_SUFFIX_REGEX = /\/api\/v3\/?$/; + export function graphql( request: typeof Request, query: string | RequestParameters, @@ -45,6 +47,13 @@ export function graphql( {} as GraphQlEndpointOptions ); + // workaround for GitHub Enterprise baseUrl set with /api/v3 suffix + // https://github.com/octokit/auth-app.js/issues/111#issuecomment-657610451 + const baseUrl = options.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: ResponseHeaders = {}; diff --git a/test/defaults.test.ts b/test/defaults.test.ts index 8a26e27c..d0d6cbfd 100644 --- a/test/defaults.test.ts +++ b/test/defaults.test.ts @@ -121,4 +121,30 @@ describe("graphql.defaults()", () => { expect(result).toStrictEqual(mockData); }); }); + + it("handle baseUrl set with /api/v3 suffix", () => { + const ghesGraphQl = graphql.defaults({ + baseUrl: "https://github.acme-inc.com/api/v3", + headers: { + authorization: `token secret123`, + }, + request: { + fetch: fetchMock.sandbox().post( + "https://github.acme-inc.com/api/graphql", + { data: { ok: true } }, + { + headers: { + authorization: "token secret123", + }, + } + ), + }, + }); + + return ghesGraphQl(`query { + viewer { + login + } + }`); + }); });